// ========================================================================== // SC.Statechart Unit Test // ========================================================================== /*globals SC */ var statechart = null; // .......................................................... // CONTENT CHANGING // module("SC.Statechart: No Concurrent States - Send Event Tests", { setup: function() { statechart = SC.Statechart.create({ monitorIsActive: YES, rootState: SC.State.design({ initialSubstate: 'a', a: SC.State.design({ initialSubstate: 'c', eventB: function() { this.gotoState('b'); }, c: SC.State.design({ eventA: function() { this.gotoState('d'); } }), d: SC.State.design({ sender: null, context: null, eventC: function(sender, context) { this.set('sender', sender); this.set('context', context); this.gotoState('f'); } }) }), b: SC.State.design({ initialSubstate: 'e', e: SC.State.design(), f: SC.State.design() }) }) }); statechart.initStatechart(); }, teardown: function() { statechart.destroy(); } }); test("send event eventA while in state C", function() { var monitor = statechart.get('monitor'); monitor.reset(); statechart.sendEvent('eventA'); equals(monitor.get('length'), 2, 'state sequence should be of length 2'); equals(monitor.matchSequence().begin().exited('c').entered('d').end(), true, 'sequence should be exited[c], entered[d]'); equals(statechart.stateIsCurrentState('d'), true, 'current state should be d'); }); test("send event eventB while in parent state A", function() { var monitor = statechart.get('monitor'); monitor.reset(); statechart.sendEvent('eventB'); equals(monitor.get('length'), 4, 'state sequence should be of length 4'); equals(monitor.matchSequence().begin().exited('c', 'a').entered('b', 'e').end(), true, 'sequence should be exited[c, a], entered[b, e]'); equals(statechart.stateIsCurrentState('e'), true, 'current state should be e'); }); test("send event eventC while in state D", function() { var monitor = statechart.get('monitor'), stateD = statechart.getState('d'); statechart.gotoState('d'); monitor.reset(); statechart.sendEvent('eventC', statechart, 'foobar'); equals(monitor.get('length'), 4, 'state sequence should be of length 4'); equals(monitor.matchSequence().begin().exited('d', 'a').entered('b', 'f').end(), true, 'sequence should be exited[d, a], entered[b, f]'); equals(statechart.stateIsCurrentState('f'), true, 'current state should be f'); equals(stateD.get('sender'), statechart); equals(stateD.get('context'), 'foobar'); }); test("send event eventC while in state C", function() { var monitor = statechart.get('monitor'); monitor.reset(); statechart.sendEvent('eventC'); equals(monitor.get('length'), 0, 'state sequence should be of length 0'); equals(statechart.stateIsCurrentState('c'), true, 'current state should be c'); }); test("send event eventD while in state C", function() { var monitor = statechart.get('monitor'); monitor.reset(); statechart.sendEvent('eventD'); equals(monitor.get('length'), 0, 'state sequence should be of length 0'); equals(statechart.stateIsCurrentState('c'), true, 'current state should be c'); });