// ========================================================================== // SC.Statechart Unit Test // ========================================================================== /*globals SC statechart State */ var obj1, rootState1, stateA, stateB, stateX, stateY, stateZ; var obj2, rootState2, stateC, stateD; var obj3, rootState3, stateE, stateF; var owner, owner2; var TestObject, TestState; module("SC.Statechart: Change Statechart Owner Property Tests", { setup: function() { owner = SC.Object.create({ toString: function() { return "owner"; } }); owner2 = SC.Object.create({ toString: function() { return "owner2"; } }); TestState = SC.State.extend({ accessedOwner: null, reset: function() { this.set('accessedOwner', null); }, render: function() { this.set('accessedOwner', this.get('owner')); } }); TestObject = SC.Object.extend(SC.StatechartManager, { render: function() { this.invokeStateMethod('render'); } }); obj1 = TestObject.extend({ initialState: 'stateA', stateA: TestState.design({ foo: function() { this.gotoState('stateB'); } }), stateB: TestState.design({ bar: function() { this.gotoState('stateA'); } }), stateX: TestState.design({ initialSubstate: 'stateY', stateY: TestState.design({ initialSubstate: 'stateZ', stateZ: TestState.design() }) }) }); obj1 = obj1.create(); rootState1 = obj1.get('rootState'); stateA = obj1.getState('stateA'); stateB = obj1.getState('stateB'); stateX = obj1.getState('stateX'); stateY = obj1.getState('stateY'); stateZ = obj1.getState('stateZ'); obj2 = TestObject.extend({ owner: owner, initialState: 'stateC', stateC: TestState.design({ foo: function() { this.gotoState('stateD'); } }), stateD: TestState.design({ bar: function() { this.gotoState('stateC'); } }) }); obj2 = obj2.create(); rootState2 = obj2.get('rootState'); stateC = obj2.getState('stateC'); stateD = obj2.getState('stateD'); obj3 = TestObject.extend({ statechartOwnerKey: 'fooOwner', fooOwner: owner, initialState: 'stateE', stateE: TestState.design({ foo: function() { this.gotoState('stateF'); } }), stateF: TestState.design({ bar: function() { this.gotoState('stateE'); } }) }); obj3 = obj3.create(); rootState3 = obj3.get('rootState'); stateE = obj3.getState('stateE'); stateF = obj3.getState('stateF'); }, teardown: function() { obj1 = rootState1 = stateA = stateB = stateX = stateY = stateZ = null; obj2 = rootState2 = stateC = stateD = null; obj3 = rootState3 = stateE = stateF = null; owner = owner2 = null; TestObject = TestState = null; } }); test("check obj1 -- basic owner get and set", function() { equals(rootState1.get('owner'), obj1, "root state's owner should be obj"); equals(stateA.get('owner'), obj1, "state A's owner should be obj"); equals(stateB.get('owner'), obj1, "state B's owner should be obj"); equals(stateX.get('owner'), obj1, "state X's owner should be obj"); equals(stateY.get('owner'), obj1, "state Y's owner should be obj"); equals(stateZ.get('owner'), obj1, "state Z's owner should be obj"); obj1.set('owner', owner); equals(rootState1.get('owner'), owner, "root state's owner should be owner"); equals(stateA.get('owner'), owner, "state A's owner should be owner"); equals(stateB.get('owner'), owner, "state B's owner should be owner"); equals(stateX.get('owner'), owner, "state X's owner should be owner"); equals(stateY.get('owner'), owner, "state Y's owner should be owner"); equals(stateZ.get('owner'), owner, "state Z's owner should be owner"); obj1.set('owner', null); equals(rootState1.get('owner'), obj1, "root state's owner should be obj"); equals(stateA.get('owner'), obj1, "state A's owner should be obj"); equals(stateB.get('owner'), obj1, "state B's owner should be obj"); equals(stateX.get('owner'), obj1, "state X's owner should be obj"); equals(stateY.get('owner'), obj1, "state Y's owner should be obj"); equals(stateZ.get('owner'), obj1, "state Z's owner should be obj"); }); test("check stateA -- access owner via invokeStateMethod", function() { ok(stateA.get('isCurrentState')); equals(stateA.get('accessedOwner'), null); obj1.render(); equals(stateA.get('accessedOwner'), obj1); stateA.reset(); obj1.set('owner', owner); obj1.render(); equals(stateA.get('accessedOwner'), owner); }); test("check stateZ -- access owner via invokeStateMethod", function() { obj1.gotoState(stateZ); ok(stateZ.get('isCurrentState')); equals(stateZ.get('accessedOwner'), null); obj1.render(); equals(stateZ.get('accessedOwner'), obj1); stateA.reset(); obj1.set('owner', owner); obj1.render(); equals(stateZ.get('accessedOwner'), owner); }); test("check obj2 -- statechartOwnerKey", function() { equals(rootState2.get('owner'), owner, "root state's owner should be owner"); equals(stateC.get('owner'), owner, "state C's owner should be owner"); equals(stateD.get('owner'), owner, "state D's owner should be owner"); obj2.set('owner', null); equals(rootState2.get('owner'), obj2, "root state's owner should be obj"); equals(stateC.get('owner'), obj2, "state C's owner should be obj"); equals(stateD.get('owner'), obj2, "state D's owner should be obj"); }); test("check obj3 -- basic owner get and set", function() { equals(obj3.get('statechartOwnerKey'), 'fooOwner', "obj's statechartOwnerKey should be fooOwner"); equals(obj3.get('fooOwner'), owner, "obj's fooOwner should be owner"); equals(rootState3.get('owner'), owner, "root state's owner should be owner"); equals(stateE.get('owner'), owner, "state E's owner should be owner"); equals(stateF.get('owner'), owner, "state F's owner should be owner"); obj3.set('fooOwner', null); equals(rootState3.get('owner'), obj3, "root state's owner should be obj"); equals(stateE.get('owner'), obj3, "state E's owner should be obj"); equals(stateF.get('owner'), obj3, "state F's owner should be obj"); obj3.set('fooOwner', owner2); equals(rootState3.get('owner'), owner2, "root state's owner2 should be owner2"); equals(stateE.get('owner'), owner2, "state E's owner2 should be owner2"); equals(stateF.get('owner'), owner2, "state F's owner2 should be owner2"); ok(obj3.hasObserverFor('fooOwner')); equals(rootState3.get('owner'), owner2); obj3.destroy(); ok(!obj3.hasObserverFor('fooOwner')); equals(rootState3.get('owner'), null); });