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)


