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

