@danielkalen/simplybind
Version:
Magically simple, framework-less one-way/two-way data binding for frontend/backend in ~5kb.
386 lines (256 loc) • 9.77 kB
text/coffeescript
suite ".unBind()", ()->
suiteSetup(restartSandbox)
suite "Will unbind from the all defined proxied subscribers one-way", ()->
test "ObjectProp", ()->
binding = SimplyBind('prop1').of(objectA)
.to('prop1').of(objectB).bothWays()
objectA.prop1 = 1
expect(objectB.prop1).to.equal 1
objectB.prop1 = 2
expect(objectA.prop1).to.equal 2
binding.unBind()
objectA.prop1 = 3
expect(objectB.prop1).to.equal 2
objectB.prop1 = 4
expect(objectA.prop1).to.equal 4
restartSandbox()
test "DOMText", ()-> if not isBrowser then @skip() else
binding = SimplyBind('textContent').of(regA)
.to('textContent').of(regB).bothWays()
SimplyBind('textContent').of(regA).set '1'
expect(regB.textContent).to.equal '1'
SimplyBind('textContent').of(regB).set '2'
expect(regA.textContent).to.equal '2'
binding.unBind()
SimplyBind('textContent').of(regA).set '3'
expect(regB.textContent).to.equal '2'
SimplyBind('textContent').of(regB).set '4'
expect(regA.textContent).to.equal '4'
restartSandbox()
test "DOMAttr", ()-> if not isBrowser then @skip() else
binding = SimplyBind('attr:someattr').of(regA)
.to('attr:someattr').of(regB).bothWays()
SimplyBind('attr:someattr').of(regA).set '1'
expect(regB.getAttribute 'someattr').to.equal '1'
SimplyBind('attr:someattr').of(regB).set '2'
expect(regA.getAttribute 'someattr').to.equal '2'
binding.unBind()
SimplyBind('attr:someattr').of(regA).set '3'
expect(regB.getAttribute 'someattr').to.equal '2'
SimplyBind('attr:someattr').of(regB).set '4'
expect(regA.getAttribute 'someattr').to.equal '4'
restartSandbox()
test "DOMValue", ()-> if not isBrowser then @skip() else
binding = SimplyBind('value').of(inputA)
.to('value').of(inputB).bothWays()
inputA.value = '1'
inputA.emit 'change'
expect(inputB.value).to.equal '1'
inputB.value = '2'
inputB.emit 'change'
expect(inputA.value).to.equal '2'
binding.unBind()
inputA.value = '3'
inputA.emit 'change'
expect(inputB.value).to.equal '2'
inputB.value = '4'
inputB.emit 'change'
expect(inputA.value).to.equal '4'
restartSandbox()
test "Array", ()->
expect(objectA.list.sort).to.equal Array::sort
binding = SimplyBind('array:list').of(objectA)
.to('prop1').of(objectA)
expect(objectA.prop1).to.equal objectA.list
objectA.prop1 = 'reset'
objectA.list.push(1)
expect(objectA.prop1).to.equal objectA.list
objectA.prop1 = 'reset'
binding.unBind()
expect(objectA.list.sort).to.equal Array::sort
objectA.list.push(1)
expect(objectA.prop1).to.equal 'reset'
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)
binding = 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
binding.unBind()
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 20
test "Event", ()->
eventDispatchCount = 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 ()-> eventDispatchCount++
eventEmitterA.emit 'someEvent'
expect(objectA.prop).to.equal eventObject
expect(objectB.prop).to.equal(objectA.prop)
expect(eventDispatchCount).to.equal 1
objectA.prop = 'different value'
expect(objectA.prop).to.equal 'different value'
# expect(objectB.prop).to.equal eventObject
expect(eventDispatchCount).to.equal 2
objectB.prop = 'different value2'
expect(eventDispatchCount).to.equal 3
binding.unBind()
objectA.prop = 'different value'
eventEmitterA.emit 'someEvent'
eventEmitterA.on 'someEvent', ()-> eventDispatchCount++
expect(objectA.prop).to.equal 'different value'
expect(objectB.prop).to.equal 'different value2'
expect(eventDispatchCount).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(eventDispatchCount).to.equal 5
expect(binding._.subs.length).to.equal 0
restartSandbox()
suite "Will unbind from the all defined proxied subscribers both-ways", ()->
test "ObjectProp", ()->
binding = SimplyBind('prop1').of(objectA)
.to('prop1').of(objectB).bothWays()
objectA.prop1 = 1
expect(objectB.prop1).to.equal 1
objectB.prop1 = 2
expect(objectA.prop1).to.equal 2
binding.unBind(true)
objectA.prop1 = 3
expect(objectB.prop1).to.equal 2
objectB.prop1 = 4
expect(objectA.prop1).to.equal 3
restartSandbox()
test "DOMText", ()-> if not isBrowser then @skip() else
binding = SimplyBind('textContent').of(regA)
.to('textContent').of(regB).bothWays()
SimplyBind('textContent').of(regA).set '1'
expect(regB.textContent).to.equal '1'
SimplyBind('textContent').of(regB).set '2'
expect(regA.textContent).to.equal '2'
binding.unBind(true)
SimplyBind('textContent').of(regA).set '3'
expect(regB.textContent).to.equal '2'
SimplyBind('textContent').of(regB).set '4'
expect(regA.textContent).to.equal '3'
restartSandbox()
test "DOMAttr", ()-> if not isBrowser then @skip() else
binding = SimplyBind('attr:someattr').of(regA)
.to('attr:someattr').of(regB).bothWays()
SimplyBind('attr:someattr').of(regA).set '1'
expect(regB.getAttribute 'someattr').to.equal '1'
SimplyBind('attr:someattr').of(regB).set '2'
expect(regA.getAttribute 'someattr').to.equal '2'
binding.unBind(true)
SimplyBind('attr:someattr').of(regA).set '3'
expect(regB.getAttribute 'someattr').to.equal '2'
SimplyBind('attr:someattr').of(regB).set '4'
expect(regA.getAttribute 'someattr').to.equal '3'
restartSandbox()
test "DOMValue", ()-> if not isBrowser then @skip() else
binding = SimplyBind('value').of(inputA)
.to('value').of(inputB).bothWays()
inputA.value = '1'
inputA.emit 'change'
expect(inputB.value).to.equal '1'
inputB.value = '2'
inputB.emit 'change'
expect(inputA.value).to.equal '2'
binding.unBind(true)
inputA.value = '3'
inputA.emit 'change'
expect(inputB.value).to.equal '2'
inputB.value = '4'
inputB.emit 'change'
expect(inputA.value).to.equal '3'
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)
binding = 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
binding.unBind(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
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
binding.unBind(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
restartSandbox()