blossom
Version:
Modern, Cross-Platform Application Framework
148 lines (126 loc) • 5.05 kB
JavaScript
// ==========================================================================
// SC.Statechart Unit Test
// ==========================================================================
/*globals SC */
/**
@author Michael Cohen
*/
var basic;
var advanced;
var sequence;
// ..........................................................
// CONTENT CHANGING
//
suite("SC.Statechart Mixin: Transient States", {
setup: function() {
sequence = [];
basic = SC.Object.create(SC.Statechart, {
startStates: {'default': 'a'},
startOnInit: false,
a: SC.Statechart.registerState({
enterState: function() { sequence.push('enter:a'); },
exitState: function() { sequence.push('exit:a'); },
foo: function() { this.goState('b'); }
}),
b: SC.Statechart.registerState({
enterState: function() { sequence.push('enter:b'); this.goState('c'); },
exitState: function() { sequence.push('exit:b'); }
}),
c: SC.Statechart.registerState({
enterState: function() { sequence.push('enter:c'); this.goState('d'); },
exitState: function() { sequence.push('exit:c'); }
}),
d: SC.Statechart.registerState({
enterState: function() { sequence.push('enter:d'); },
exitState: function() { sequence.push('exit:d'); }
})
});
advanced = SC.Object.create(SC.Statechart, {
startStates: {'default': 'a'},
startOnInit: false,
a: SC.Statechart.registerState({
initialSubState: 'b',
enterState: function() { sequence.push('enter:a'); },
exitState: function() { sequence.push('exit:a'); }
}),
b: SC.Statechart.registerState({
parentState: 'a',
initialSubState: 'c',
enterState: function() { sequence.push('enter:b'); },
exitState: function() { sequence.push('exit:b'); }
}),
c: SC.Statechart.registerState({
parentState: 'b',
enterState: function() { sequence.push('enter:c'); },
exitState: function() { sequence.push('exit:c'); },
foo: function() { this.goState('d'); }
}),
d: SC.Statechart.registerState({
parentState: 'b',
enterState: function() { sequence.push('enter:d'); this.goState('e'); },
exitState: function() { sequence.push('exit:d'); }
}),
e: SC.Statechart.registerState({
initialSubState: 'f',
enterState: function() { sequence.push('enter:e'); },
exitState: function() { sequence.push('exit:e'); }
}),
f: SC.Statechart.registerState({
parentState: 'e',
enterState: function() { sequence.push('enter:f'); this.goState('g'); },
exitState: function() { sequence.push('exit:f'); }
}),
g: SC.Statechart.registerState({
parentState: 'e',
enterState: function() { sequence.push('enter:g'); },
exitState: function() { sequence.push('exit:g'); }
})
});
},
teardown: function() {
basic.destroy();
advanced.destroy();
sequence = null;
}
});
test("basic state transition", function() {
sequence = [];
basic.startupStatechart();
equals(basic.currentState(), basic.a, "current state should be a");
equals(sequence.length, 1, "should be length 1");
equals(sequence[0], 'enter:a', "should be 'enter:a'");
sequence = [];
basic.sendEvent('foo');
equals(basic.currentState(), basic.d, "current state should be d");
equals(sequence.length, 6, "should be length 6");
equals(sequence[0], 'exit:a', "should be 'exit:a'");
equals(sequence[1], 'enter:b', "should be 'enter:b'");
equals(sequence[2], 'exit:b', "should be 'exit:b'");
equals(sequence[3], 'enter:c', "should be 'enter:c'");
equals(sequence[4], 'exit:c', "should be 'exit:c'");
equals(sequence[5], 'enter:d', "should be 'enter:d'");
console.log(sequence);
});
test("advanced state transition", function() {
sequence = [];
advanced.startupStatechart();
equals(advanced.currentState(), advanced.c, "current state should be c");
equals(sequence.length, 3, "should be length 3");
equals(sequence[0], 'enter:a', "should be 'enter:a'");
equals(sequence[1], 'enter:b', "should be 'enter:b'");
equals(sequence[2], 'enter:c', "should be 'enter:c'");
sequence = [];
advanced.sendEvent('foo');
equals(advanced.currentState(), advanced.g, "current state should be c");
equals(sequence.length, 9, "should be length 9");
equals(sequence[0], 'exit:c', "should be 'exit:c'");
equals(sequence[1], 'enter:d', "should be 'enter:d'");
equals(sequence[2], 'exit:d', "should be 'exit:d'");
equals(sequence[3], 'exit:b', "should be 'exit:b'");
equals(sequence[4], 'exit:a', "should be 'exit:a'");
equals(sequence[5], 'enter:e', "should be 'enter:c'");
equals(sequence[6], 'enter:f', "should be 'enter:f'");
equals(sequence[7], 'exit:f', "should be 'exit:f'");
equals(sequence[8], 'enter:g', "should be 'enter:g'");
console.log(sequence);
});