@danielkalen/simplybind
Version:
Magically simple, framework-less one-way/two-way data binding for frontend/backend in ~5kb.
145 lines (101 loc) • 4.36 kB
text/coffeescript
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 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()