suite "Event", ()->
	test "A number can be provided in the selector with a # prefix to indicate which argument index of the event emitter callback should be used as the binding's value", ()->
		emptyObj = {}
		receiver = 'default':emptyObj, 'custom':emptyObj
		invokeCount = 'default':0, 'custom':0

		SimplyBind('event:focus').of(eventEmitterA)
			.to('default').of receiver
			.and.to ()-> invokeCount.default++

		SimplyBind('event:focus#1').of(eventEmitterA)
			.to('custom').of receiver
			.and.to ()-> invokeCount.custom++
		
		expect(receiver.default).to.equal emptyObj
		expect(receiver.custom).to.equal emptyObj
		expect(invokeCount.default).to.equal 0
		expect(invokeCount.custom).to.equal 0
		
		eventEmitterA.emit 'focus', eventEmitterA
		expect(if isBrowser then receiver.default.target else receiver.default).to.equal eventEmitterA
		expect(receiver.custom).to.be.undefined
		expect(invokeCount.default).to.equal 1
		expect(invokeCount.custom).to.equal 1

		restartSandbox()




	test "Custom events will behave exactly like regular events", ()->
		emptyObj = {}
		receiver = 'default':emptyObj, 'custom':emptyObj
		invokeCount = 'default':0, 'custom':0

		SimplyBind('event:somethingCustom').of(eventEmitterA)
			.to('default').of receiver
			.and.to ()-> invokeCount.default++

		SimplyBind('event:somethingCustom#1').of(eventEmitterA)
			.to('custom').of receiver
			.and.to ()-> invokeCount.custom++
		
		expect(receiver.default).to.equal emptyObj
		expect(receiver.custom).to.equal emptyObj
		expect(invokeCount.default).to.equal 0
		expect(invokeCount.custom).to.equal 0
		
		eventEmitterA.emit 'somethingCustom', eventEmitterA
		expect(if isBrowser then receiver.default.target else receiver.default).to.equal eventEmitterA
		expect(receiver.custom).to.be.undefined
		expect(invokeCount.default).to.equal 1
		expect(invokeCount.custom).to.equal 1

		restartSandbox()




	test "Custom listener/emitter methods can be used", ()->
		emitCount = 0
		receiveCount = 0
		eventEmitterA.customListener 'someEvent', ()-> emitCount++

		SimplyBind('prop2').of(objectA)
			.to('event:someEvent', {emitMethod:'customEmitter', listenMethod:'customListener'}).of(eventEmitterA).bothWays ()-> ++receiveCount
		expect(emitCount).to.equal 1
		expect(receiveCount).to.equal 0
		
		objectA.prop2 = 'whatever'
		expect(emitCount).to.equal 2
		
		eventEmitterA.customEmitter 'someEvent'
		expect(receiveCount).to.equal 1
		expect(objectA.prop2).to.equal 1
		expect(emitCount).to.equal 3
		
		objectA.prop2 = 'whatever again'
		expect(emitCount).to.equal 4
		
		eventEmitterA.customEmitter 'someEvent'
		expect(receiveCount).to.equal 2
		expect(objectA.prop2).to.equal 2
		restartSandbox()




	test "jQuery listener/emitter methods can be used", ()-> if not isBrowser then @skip() else
		emitCount = 0
		receiveCount = 0
		$eventEmitterA.on 'someEvent', ()-> emitCount++

		SimplyBind('prop2').of(objectA)
			.to('event:someEvent', {listenMethod:'on', emitMethod:'trigger'}).of($eventEmitterA).bothWays ()-> ++receiveCount
		expect(emitCount).to.equal 1
		expect(receiveCount).to.equal 0
		
		objectA.prop2 = 'whatever'
		expect(emitCount).to.equal 2
		
		$eventEmitterA.trigger 'someEvent'
		expect(receiveCount).to.equal 1
		expect(objectA.prop2).to.equal 1
		expect(emitCount).to.equal 3
		
		objectA.prop2 = 'whatever again'
		expect(emitCount).to.equal 4
		
		$eventEmitterA.trigger 'someEvent'
		expect(receiveCount).to.equal 2
		expect(objectA.prop2).to.equal 2
		restartSandbox()




	test "Default listener/emitter methods will be used if custom listener/emitter methods don't exist on the target object", ()->
		emitCount = 0
		receiveCount = 0
		eventEmitterA.customListener 'click', ()-> emitCount++

		SimplyBind('prop2').of(objectA)
			.to('event:click', {listenMethod:'nonexistentListener', emitMethod:'nonexistentDispatcher'}).of(eventEmitterA).bothWays ()-> ++receiveCount
		expect(emitCount).to.equal 1
		expect(receiveCount).to.equal 0
		
		objectA.prop2 = 'whatever'
		expect(emitCount).to.equal 2
		
		eventEmitterA.customEmitter 'click'
		expect(receiveCount).to.equal 1
		expect(objectA.prop2).to.equal 1
		expect(emitCount).to.equal 3
		
		objectA.prop2 = 'whatever again'
		expect(emitCount).to.equal 4
		
		eventEmitterA.customEmitter 'click'
		expect(receiveCount).to.equal 2
		expect(objectA.prop2).to.equal 2
		restartSandbox()


