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