@danielkalen/simplybind
Version:
Magically simple, framework-less one-way/two-way data binding for frontend/backend in ~5kb.
251 lines (196 loc) • 7.6 kB
text/coffeescript
suite ".disallowFrom()", ()->
test "Updates to subscribers can be prevented if the the update is coming from a specific publisher", ()->
SimplyBind.defaultOptions.updateOnBind = false
SimplyBind.defaultOptions.updateEvenIfSame = true
invokeCount = 0
currentValue = 1
receiver = 'value':null
publisherA = 'prop':1
publisherB = 'prop':1
publisherProxy = 'prop':1
publisherMaster = 'prop':1
SimplyBind('prop').of(publisherMaster)
.to('prop').of(publisherA)
.and.to('prop').of(publisherB)
SimplyBind('prop').of(publisherA)
.to('prop').of(publisherProxy)
SimplyBind('prop').of(publisherB)
.to('prop').of(publisherProxy)
SimplyBind('prop').of(publisherProxy)
.to('value').of(receiver)
.transform (value)-> invokeCount++; value
.disallowFrom('prop').of(publisherB)
expect(publisherMaster.prop).to.equal 1
expect(publisherA.prop).to.equal 1
expect(publisherB.prop).to.equal 1
expect(receiver.value).to.equal null
expect(invokeCount).to.equal 0
publisherA.prop = ++currentValue
expect(publisherMaster.prop).to.equal 1
expect(publisherA.prop).to.equal 2
expect(publisherB.prop).to.equal 1
expect(receiver.value).to.equal 2
expect(invokeCount).to.equal 1
publisherB.prop = ++currentValue
expect(publisherMaster.prop).to.equal 1
expect(publisherA.prop).to.equal 2
expect(publisherB.prop).to.equal 3
expect(receiver.value).to.equal 2
expect(invokeCount).to.equal 1
publisherMaster.prop = ++currentValue
expect(publisherMaster.prop).to.equal 4
expect(publisherA.prop).to.equal 4
expect(publisherB.prop).to.equal 4
expect(receiver.value).to.equal 4
expect(invokeCount).to.equal 3
publisherMaster.prop = ++currentValue
expect(publisherMaster.prop).to.equal 5
expect(publisherA.prop).to.equal 5
expect(publisherB.prop).to.equal 5
expect(receiver.value).to.equal 5
expect(invokeCount).to.equal 5
SimplyBind('prop').of(publisherMaster).to('prop').of(publisherA).unBind()
publisherMaster.prop = ++currentValue
expect(publisherMaster.prop).to.equal 6
expect(publisherA.prop).to.equal 5
expect(publisherB.prop).to.equal 6
expect(receiver.value).to.equal 6
expect(invokeCount).to.equal 6
SimplyBind.defaultOptions.updateOnBind = true
SimplyBind.defaultOptions.updateEvenIfSame = false
test "Disallowing updated from an ObjectProp will only disallow updates form that prop and not any other props", ()->
SimplyBind.defaultOptions.updateOnBind = false
SimplyBind.defaultOptions.updateEvenIfSame = true
invokeCount = 0
currentValue = 1
receiver = 'value':null
publisher = 'propA':1, 'propB':1, 'propC':1
proxy = 'prop':1
SimplyBind('propA').of(publisher).to('prop').of(proxy)
SimplyBind('propB').of(publisher).to('prop').of(proxy)
SimplyBind('propC').of(publisher).to('prop').of(proxy)
SimplyBind('prop').of(proxy)
.to('value').of(receiver)
.transform (value)-> invokeCount++; value
.disallowFrom('propB').of(publisher)
expect(publisher.propA).to.equal 1
expect(publisher.propB).to.equal 1
expect(publisher.propC).to.equal 1
expect(proxy.prop).to.equal 1
expect(receiver.value).to.equal null
expect(invokeCount).to.equal 0
publisher.propA = ++currentValue
expect(publisher.propA).to.equal 2
expect(publisher.propB).to.equal 1
expect(publisher.propC).to.equal 1
expect(proxy.prop).to.equal 2
expect(receiver.value).to.equal 2
expect(invokeCount).to.equal 1
publisher.propB = ++currentValue
expect(publisher.propA).to.equal 2
expect(publisher.propB).to.equal 3
expect(publisher.propC).to.equal 1
expect(proxy.prop).to.equal 3
expect(receiver.value).to.equal 2
expect(invokeCount).to.equal 1
publisher.propC = ++currentValue
expect(publisher.propA).to.equal 2
expect(publisher.propB).to.equal 3
expect(publisher.propC).to.equal 4
expect(proxy.prop).to.equal 4
expect(receiver.value).to.equal 4
expect(invokeCount).to.equal 2
SimplyBind.defaultOptions.updateOnBind = true
SimplyBind.defaultOptions.updateEvenIfSame = false
test "Multiple disallows can be specified", ()->
SimplyBind.defaultOptions.updateOnBind = false
SimplyBind.defaultOptions.updateEvenIfSame = true
invokeCount = 0
currentValue = 1
receiver = 'value':null
publisherA = 'propA':1, 'propB':1, 'propC':1
publisherB = 'propA':1, 'propB':1, 'propC':1
proxy = 'prop':1
SimplyBind('propA').of(publisherA).to('prop').of(proxy)
SimplyBind('propB').of(publisherA).to('prop').of(proxy)
SimplyBind('propC').of(publisherA).to('prop').of(proxy)
SimplyBind('propA').of(publisherB).to('prop').of(proxy)
SimplyBind('propB').of(publisherB).to('prop').of(proxy)
SimplyBind('propC').of(publisherB).to('prop').of(proxy)
SimplyBind('prop').of(proxy)
.to('value').of(receiver)
.transform (value)-> invokeCount++; value
.disallowFrom('propB').of(publisherA)
.disallowFrom('propA').of(publisherB)
.disallowFrom('propC').of(publisherB)
expect(publisherA.propA).to.equal 1
expect(publisherA.propB).to.equal 1
expect(publisherA.propC).to.equal 1
expect(publisherB.propA).to.equal 1
expect(publisherB.propB).to.equal 1
expect(publisherB.propC).to.equal 1
expect(proxy.prop).to.equal 1
expect(receiver.value).to.equal null
expect(invokeCount).to.equal 0
publisherA.propA = ++currentValue
expect(publisherA.propA).to.equal 2
expect(publisherA.propB).to.equal 1
expect(publisherA.propC).to.equal 1
expect(publisherB.propA).to.equal 1
expect(publisherB.propB).to.equal 1
expect(publisherB.propC).to.equal 1
expect(proxy.prop).to.equal 2
expect(receiver.value).to.equal 2
expect(invokeCount).to.equal 1
publisherA.propB = ++currentValue
expect(publisherA.propA).to.equal 2
expect(publisherA.propB).to.equal 3
expect(publisherA.propC).to.equal 1
expect(publisherB.propA).to.equal 1
expect(publisherB.propB).to.equal 1
expect(publisherB.propC).to.equal 1
expect(proxy.prop).to.equal 3
expect(receiver.value).to.equal 2
expect(invokeCount).to.equal 1
publisherA.propC = ++currentValue
expect(publisherA.propA).to.equal 2
expect(publisherA.propB).to.equal 3
expect(publisherA.propC).to.equal 4
expect(publisherB.propA).to.equal 1
expect(publisherB.propB).to.equal 1
expect(publisherB.propC).to.equal 1
expect(proxy.prop).to.equal 4
expect(receiver.value).to.equal 4
expect(invokeCount).to.equal 2
publisherB.propA = ++currentValue
expect(publisherA.propA).to.equal 2
expect(publisherA.propB).to.equal 3
expect(publisherA.propC).to.equal 4
expect(publisherB.propA).to.equal 5
expect(publisherB.propB).to.equal 1
expect(publisherB.propC).to.equal 1
expect(proxy.prop).to.equal 5
expect(receiver.value).to.equal 4
expect(invokeCount).to.equal 2
publisherB.propB = ++currentValue
expect(publisherA.propA).to.equal 2
expect(publisherA.propB).to.equal 3
expect(publisherA.propC).to.equal 4
expect(publisherB.propA).to.equal 5
expect(publisherB.propB).to.equal 6
expect(publisherB.propC).to.equal 1
expect(proxy.prop).to.equal 6
expect(receiver.value).to.equal 6
expect(invokeCount).to.equal 3
publisherB.propC = ++currentValue
expect(publisherA.propA).to.equal 2
expect(publisherA.propB).to.equal 3
expect(publisherA.propC).to.equal 4
expect(publisherB.propA).to.equal 5
expect(publisherB.propB).to.equal 6
expect(publisherB.propC).to.equal 7
expect(proxy.prop).to.equal 7
expect(receiver.value).to.equal 6
expect(invokeCount).to.equal 3
SimplyBind.defaultOptions.updateOnBind = true
SimplyBind.defaultOptions.updateEvenIfSame = false