@danielkalen/simplybind
Version:
Magically simple, framework-less one-way/two-way data binding for frontend/backend in ~5kb.
189 lines (133 loc) • 5.32 kB
text/coffeescript
suite "Will unBind all bindings in both directions if passed true as the second argument", ()->
suiteSetup(restartSandbox)
test "ObjectProp", ()->
SimplyBind('prop1').of(objectA)
.to('prop1').of(objectB).bothWays()
SimplyBind('prop2').of(objectA)
.to('prop2').of(objectB).bothWays()
objectA.prop1 = 'objectA.prop1'
expect(objectA.prop1).to.equal 'objectA.prop1'
expect(objectB.prop1).to.equal 'objectA.prop1'
objectB.prop2 = 'objectB.prop2'
expect(objectA.prop2).to.equal 'objectB.prop2'
expect(objectB.prop2).to.equal 'objectB.prop2'
objectB.prop1 = 'reset'
objectB.prop2 = 'reset'
SimplyBind.unBindAll(objectA, true)
objectA.prop1 = 'objectA.prop1'
expect(objectA.prop1).to.equal 'objectA.prop1'
expect(objectB.prop1).to.equal 'reset'
objectA.prop2 = 'objectA.prop2'
expect(objectA.prop2).to.equal 'objectA.prop2'
expect(objectB.prop2).to.equal 'reset'
objectB.prop2 = 'objectB.prop2'
expect(objectA.prop2).to.equal 'objectA.prop2'
expect(objectB.prop2).to.equal 'objectB.prop2'
expect(objectA._sb_map).to.be.undefined
expect(objectB._sb_map).to.be.undefined
restartSandbox()
test "DOMText", ()-> if not isBrowser then @skip() else
SimplyBind('textContent').of(regA)
.to('textContent').of(regB).bothWays()
SimplyBind('textContent').of(regA).set 'regA.textContent'
expect(regA.textContent).to.equal 'regA.textContent'
expect(regB.textContent).to.equal 'regA.textContent'
SimplyBind('textContent').of(regB).set 'reset'
SimplyBind.unBindAll(regA, true)
expect(regA._sb_map).to.be.undefined
expect(regB._sb_map).to.be.undefined
SimplyBind('textContent').of(regA).set 'regA.textContent'
expect(regA.textContent).to.equal 'regA.textContent'
expect(regB.textContent).to.equal 'reset'
SimplyBind('textContent').of(regB).set 'regB.textContent'
expect(regA.textContent).to.equal 'regA.textContent'
expect(regB.textContent).to.equal 'regB.textContent'
restartSandbox()
test "DOMValue", ()-> if not isBrowser then @skip() else
SimplyBind('value').of(inputA)
.to('value').of(inputB).bothWays()
inputA.value = 'inputA.value'
inputA.emit 'change'
expect(inputA.value).to.equal 'inputA.value'
expect(inputB.value).to.equal 'inputA.value'
inputB.value = 'reset'
SimplyBind.unBindAll(inputA, true)
inputA.value = 'inputA.value'
inputA.emit 'change'
expect(inputA.value).to.equal 'inputA.value'
expect(inputB.value).to.equal 'reset'
inputB.value = 'inputB.value'
inputB.emit 'change'
expect(inputA.value).to.equal 'inputA.value'
expect(inputB.value).to.equal 'inputB.value'
expect(inputA._sb_map).to.be.undefined
expect(inputB._sb_map).to.be.undefined
restartSandbox()
test "Function", ()->
passedValue = null
valueToPass = 1
takeFromReceiver = false
fn = (fromReceiver)-> passedValue = if takeFromReceiver then fromReceiver else valueToPass
invoker = 'prop':'value'
receiver = 'prop':undefined
SimplyBind('prop').of(invoker).to(fn)
SimplyBind(fn).to('prop').of(receiver).bothWays()
expect(receiver.prop).to.equal 1
expect(passedValue).to.equal 1
valueToPass = 5
invoker.prop = 'anotherValue'
expect(receiver.prop).to.equal 5
expect(passedValue).to.equal 5
takeFromReceiver = true
receiver.prop = 10
takeFromReceiver = false
expect(passedValue).to.equal 10
SimplyBind.unBindAll(fn, true)
valueToPass = 15
invoker.prop = 'newValue'
expect(receiver.prop).to.equal 10
expect(passedValue).to.equal 15
takeFromReceiver = true
receiver.prop = 20
takeFromReceiver = false
expect(passedValue).to.equal 15
SimplyBind.unBindAll(fn, true)
expect(fn._sb_ID).not.to.be.undefined
SimplyBind.unBindAll(invoker, true)
expect(fn._sb_ID).to.be.undefined
test "Event", ()->
eventInvokeCount = 0
eventObject = null
objectA.prop = objectB.prop = 'someValue'
eventEmitterA.on 'someEvent', (event)-> eventObject = event or @
binding = SimplyBind('event:someEvent').of(eventEmitterA).transformSelf ()-> eventObject
.to('prop').of(objectA).bothWays()
.and.to('prop').of(objectB).bothWays()
.and.to ()-> eventInvokeCount++
eventEmitterA.emit 'someEvent'
expect(objectA.prop).to.equal eventObject
expect(objectB.prop).to.equal(objectA.prop)
expect(eventInvokeCount).to.equal 1
objectA.prop = 'different value'
expect(objectA.prop).to.equal 'different value'
# expect(objectB.prop).to.equal eventObject
expect(eventInvokeCount).to.equal 2
objectB.prop = 'different value2'
expect(eventInvokeCount).to.equal 3
SimplyBind.unBindAll(eventEmitterA, true)
objectA.prop = 'different value'
eventEmitterA.emit 'someEvent'
eventEmitterA.on 'someEvent', ()-> eventInvokeCount++
expect(objectA.prop).to.equal 'different value'
expect(objectB.prop).to.equal 'different value2'
expect(eventInvokeCount).to.equal 3
objectA.prop = 'another value'
expect(objectA.prop).to.equal 'another value'
expect(objectB.prop).to.equal 'different value2'
objectB.prop = 'another value2'
expect(objectA.prop).to.equal 'another value'
expect(objectB.prop).to.equal 'another value2'
expect(eventInvokeCount).to.equal 3
expect(binding._.subs.length).to.equal 0
expect(eventEmitterA._sb_map).to.be.undefined
restartSandbox()