UNPKG

@danielkalen/simplybind

Version:

Magically simple, framework-less one-way/two-way data binding for frontend/backend in ~5kb.

266 lines (185 loc) 7.23 kB
suite "Will unBind all bindings, but only in one direction", ()-> 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) 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 'objectB.prop2' expect(objectB.prop2).to.equal 'objectB.prop2' restartSandbox() test "ObjectProp + placeholder", ()-> objectB.prop1 = objectB.prop2 = 'inner {{value}} here' SimplyBind('prop1').of(objectA) .to('prop1.value').of(objectB).bothWays() SimplyBind('prop2').of(objectA) .to('prop2.value').of(objectB).bothWays() objectA.prop1 = 'objectA' expect(objectA.prop1).to.equal 'objectA' expect(objectB.prop1).to.equal 'inner objectA here' SimplyBind('prop1.value').of(objectB).set 'objectB' SimplyBind('prop2.value').of(objectB).set 'objectB' expect(objectA.prop2).to.equal 'objectB' expect(objectB.prop2).to.equal 'inner objectB here' SimplyBind.unBindAll(objectB) objectA.prop1 = 'objectA1' expect(objectA.prop1).to.equal 'objectA1' expect(objectB.prop1).to.equal 'inner objectA1 here' objectA.prop2 = 'objectA2' expect(objectA.prop2).to.equal 'objectA2' expect(objectB.prop2).to.equal 'inner objectA2 here' SimplyBind('prop1.value').of(objectB).set 'objectB' SimplyBind('prop2.value').of(objectB).set 'objectB' expect(objectA.prop1).to.equal 'objectA1' expect(objectA.prop2).to.equal 'objectA2' 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) 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 'regB.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) 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 'inputB.value' expect(inputB.value).to.equal 'inputB.value' restartSandbox() test "Array", ()-> SimplyBind('array:list').of(objectA) .to('prop1').of(objectB) .and.to('prop1').of(objectC) expect(objectB.prop1).to.equal objectA.list expect(objectC.prop1).to.equal objectA.list objectB.prop1 = 'reset' objectC.prop1 = 'reset' objectA.list.push(1) expect(objectB.prop1).to.equal objectA.list expect(objectC.prop1).to.equal objectA.list objectB.prop1 = 'reset' objectC.prop1 = 'reset' SimplyBind.unBindAll(objectA) objectA.list.push(1) expect(objectB.prop1).to.equal 'reset' expect(objectC.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) 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) 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", ()-> 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) 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 5 expect(binding._.subs.length).to.equal 0 restartSandbox() test "Proxy", ()-> invokeCount = fromOriginal:0, fromBinding:0 window.obj = base:10, test: originalFn = (a,b)-> invokeCount.fromOriginal++ return (a+b)*@base SimplyBind('func:test').of(obj) .transformSelf (args)-> [args[0]/3, args[1]/3] .to (value)-> expect(value.result).to.equal 50 expect(value.args).to.eql [2,3] invokeCount.fromBinding++ obj.test(6,9) expect(invokeCount.fromBinding).to.equal(1) expect(invokeCount.fromOriginal).to.equal(1) expect(obj.test).not.to.equal(originalFn) SimplyBind.unBindAll(obj) obj.test(6,9) expect(invokeCount.fromBinding).to.equal(1) expect(invokeCount.fromOriginal).to.equal(2) expect(obj.test).to.equal(originalFn)