// ========================================================================== // 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');

});