UNPKG

@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
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()