// ========================================================================== // SC.Statechart Unit Test // ========================================================================== /*globals SC */

var statechart = null;

// .….….….….….….….….….….….….….….. // CONTENT CHANGING //

module(“SC.Statechart: No Concurrent States - Goto History State Tests”, {

setup: function() {

  statechart = SC.Statechart.create({

    monitorIsActive: YES,

    rootState: SC.State.design({

      initialSubstate: 'a',

      a: SC.State.design({

        initialSubstate: 'c',

        c: SC.State.design({
          initialSubstate: 'g',
          g: SC.State.design(),
          h: SC.State.design()
        }),

        d: SC.State.design({
          initialSubstate: 'i',
          i: SC.State.design(),
          j: SC.State.design()
        })

      }),

      b: SC.State.design({

        initialSubstate: 'e',

        e: SC.State.design({
          initialSubstate: 'k',
          k: SC.State.design(),
          l: SC.State.design()
        }),

        f: SC.State.design({
          initialSubstate: 'm',
          m: SC.State.design(),
          n: SC.State.design()
        })

      })

    })

  });

  statechart.initStatechart();
},

teardown: function() {
  statechart.destroy();
}

});

test(“check initial statechart history states”, function() {

equals(statechart.get('rootState').get('historyState'), statechart.getState('a'), 'root state\'s history state should be state a');

equals(statechart.getState('a').get('historyState'), statechart.getState('c'), 'state a\'s history state should be state c');
equals(statechart.getState('c').get('historyState'), statechart.getState('g'), 'state c\'s history state should be state g');
equals(statechart.getState('g').get('historyState'), null, 'state g\'s history state should be null');

equals(statechart.getState('h').get('historyState'), null, 'state h\'s history state should be null');
equals(statechart.getState('d').get('historyState'), null, 'state d\'s history state should be null');

equals(statechart.getState('b').get('historyState'), null, 'state b\'s history state should be null');
equals(statechart.getState('e').get('historyState'), null, 'state e\'s history state should be null');
equals(statechart.getState('f').get('historyState'), null, 'state f\'s history state should be null');

});

test(“go to state h and check history states”, function() {

var monitor = statechart.get('monitor');
monitor.reset();

statechart.gotoState('h');
equals(monitor.matchSequence().begin().exited('g').entered('h').end(), true, 'sequence should be exited[f], entered[h]');

equals(statechart.getState('a').get('historyState'), statechart.getState('c'), 'state a\'s history state should be state c');
equals(statechart.getState('c').get('historyState'), statechart.getState('h'), 'state c\'s history state should be state h');
equals(statechart.getState('h').get('historyState'), null, 'state h\'s history state should be null');
equals(statechart.getState('g').get('historyState'), null, 'state g\'s history state should be null');

equals(statechart.getState('d').get('historyState'), null, 'state d\'s history state should be null');
equals(statechart.getState('b').get('historyState'), null, 'state b\'s history state should be null');

});

test(“go to state d and check history states”, function() {

var monitor = statechart.get('monitor');
monitor.reset();

statechart.gotoState('d');
equals(monitor.matchSequence().begin().exited('g', 'c').entered('d', 'i').end(), true, 'sequence should be exited[g, c], entered[d, i]');

equals(statechart.getState('a').get('historyState'), statechart.getState('d'), 'state a\'s history state should be state d');
equals(statechart.getState('d').get('historyState'), statechart.getState('i'), 'state d\'s history state should be state i');
equals(statechart.getState('c').get('historyState'), statechart.getState('g'), 'state c\'s history state should be state g');
equals(statechart.getState('h').get('historyState'), null, 'state h\'s history state should be null');
equals(statechart.getState('g').get('historyState'), null, 'state g\'s history state should be null');
equals(statechart.getState('i').get('historyState'), null, 'state i\'s history state should be null');
equals(statechart.getState('j').get('historyState'), null, 'state j\'s history state should be null');

equals(statechart.getState('b').get('historyState'), null, 'state b\'s history state should be null');

});

test(“go to state b and check history states”, function() {

var monitor = statechart.get('monitor');
monitor.reset();

statechart.gotoState('b');
equals(monitor.matchSequence().begin().exited('g', 'c', 'a').entered('b', 'e', 'k').end(), true, 'sequence should be exited[g, c, a], entered[b, e, k]');

equals(statechart.get('rootState').get('historyState'), statechart.getState('b'), 'root state\'s history state should be state b');
equals(statechart.getState('b').get('historyState'), statechart.getState('e'), 'state b\'s history state should be e');
equals(statechart.getState('e').get('historyState'), statechart.getState('k'), 'state e\'s history state should be k');
equals(statechart.getState('a').get('historyState'), statechart.getState('c'), 'state a\'s history state should be state c');
equals(statechart.getState('c').get('historyState'), statechart.getState('g'), 'state c\'s history state should be state g');

});

test(“go to state j, then state m, then go to state a's history state (non-recursive)”, function() {

var monitor = statechart.get('monitor');

statechart.gotoState('j');
statechart.gotoState('m');

monitor.reset();
statechart.gotoHistoryState('a');

equals(monitor.get('length'), 6, 'initial state sequence should be of length 6');
equals(monitor.matchSequence().begin().exited('m', 'f', 'b').entered('a', 'd', 'i').end(), true, 'sequence should be exited[m, f, b], entered[a, d, i]');
equals(statechart.get('currentStateCount'), 1, 'current state count should be 1');
equals(statechart.stateIsCurrentState('i'), true, 'current state should be i');
equals(statechart.get('rootState').get('historyState'), statechart.getState('a'), 'root state\'s history state should be state a');
equals(statechart.getState('a').get('historyState'), statechart.getState('d'), 'state a\'s history state should be state d');
equals(statechart.getState('d').get('historyState'), statechart.getState('i'), 'state d\'s history state should be state i');

});

test(“go to state j, then state m, then go to state a's history state (recursive)”, function() {

var monitor = statechart.get('monitor');

statechart.gotoState('j');
statechart.gotoState('m');

monitor.reset();
statechart.gotoHistoryState('a', null, YES);

equals(monitor.get('length'), 6, 'initial state sequence should be of length 6');
equals(monitor.matchSequence().begin().exited('m', 'f', 'b').entered('a', 'd', 'j').end(), true, 'sequence should be exited[m, f, b], entered[a, d, j]');
equals(statechart.get('currentStateCount'), 1, 'current state count should be 1');
equals(statechart.stateIsCurrentState('j'), true, 'current state should be j');
equals(statechart.get('rootState').get('historyState'), statechart.getState('a'), 'root state\'s history state should be state a');
equals(statechart.getState('a').get('historyState'), statechart.getState('d'), 'state a\'s history state should be state d');
equals(statechart.getState('d').get('historyState'), statechart.getState('j'), 'state d\'s history state should be state j');

});

test(“go to state b's history state (non-recursive)”, function() {

var monitor = statechart.get('monitor');
monitor.reset();

statechart.gotoHistoryState('b');

equals(monitor.get('length'), 6, 'initial state sequence should be of length 6');
equals(monitor.matchSequence().begin().exited('g', 'c', 'a').entered('b', 'e', 'k').end(), true, 'sequence should be exited[g, c, a], entered[b, e, k]');
equals(statechart.get('currentStateCount'), 1, 'current state count should be 1');
equals(statechart.stateIsCurrentState('k'), true, 'current state should be k');
equals(statechart.get('rootState').get('historyState'), statechart.getState('b'), 'root state\'s history state should be state b');
equals(statechart.getState('b').get('historyState'), statechart.getState('e'), 'state b\'s history state should be state e');
equals(statechart.getState('e').get('historyState'), statechart.getState('k'), 'state e\'s history state should be state k');

});

test(“go to state b's history state (recursive)”, function() {

var monitor = statechart.get('monitor');
monitor.reset();

statechart.gotoHistoryState('b', null, YES);

equals(monitor.get('length'), 6, 'initial state sequence should be of length 6');
equals(monitor.matchSequence().begin().exited('g', 'c', 'a').entered('b', 'e', 'k').end(), true, 'sequence should be exited[g, c, a], entered[b, e, k]');
equals(statechart.get('currentStateCount'), 1, 'current state count should be 1');
equals(statechart.stateIsCurrentState('k'), true, 'current state should be k');
equals(statechart.get('rootState').get('historyState'), statechart.getState('b'), 'root state\'s history state should be state b');
equals(statechart.getState('b').get('historyState'), statechart.getState('e'), 'state b\'s history state should be state e');
equals(statechart.getState('e').get('historyState'), statechart.getState('k'), 'state e\'s history state should be state k');

});