@wiz-code/async-fsm
Version:
Finite StateMachine JavaScript Library
210 lines (172 loc) • 6.23 kB
JavaScript
var _ = require('underscore');
var assert = require('assert');
var Machine = require('../src/machines').Machine;
var State = require('../src/states').State;
var Transition = require('../src/transition');
var Region = require('../src/region');
var HistoryPseudoState = require('../src/pseudo-states').HistoryPseudoState;
var machine = new Machine('my-machine');
var state1 = new State('state-1', {
data: {
once: false,
},
entryAction: function () {
console.log('entryAction::', this.getName());
},
doActivity: function () {
console.log('doActivity::', this.getName());
//this.completion();
/*if (!this.get('once')) {
this.set('once', true);
transit4.trigger();
}*/
//transit2.trigger();
}
});
var s1SubA = new State('s1-sub-a', {
entryAction: function () {
console.log('entryAction::', this.getName());
},
doActivity: function () {
console.log('doActivity::', this.getName());
transitAToB.trigger();
}
});
var s1SubB = new State('s1-sub-b', {
data: {
once: false,
},
entryAction: function () {
console.log('entryAction::', this.getName());
},
doActivity: function () {
console.log('doActivity::', this.getName());
if (!this.get('once')) {
this.set('once', true);
transit4.trigger();
}
}
});
var state2 = new State('state-2', {
entryAction: function () {
console.log('entryAction::', this.getName());
},
doActivity: function () {
console.log('doActivity::', this.getName());
transitS2ToS1.trigger();
}
});
var s2Region2 = new Region(false);
var s2Sub1 = new State('s2-sub-1', {
entryAction: function () {
console.log('entryAction::', this.getName());
},
doActivity: function () {
console.log('doActivity::', this.getName());
}
});
var s2Sub1Sub1 = new State('s2-sub-1-sub-1', {
entryAction: function () {
console.log('entryAction::', this.getName());
},
doActivity: function () {
console.log('doActivity::', this.getName());
}
});
var s2Sub2 = new State('s2-sub-2', {
entryAction: function () {
console.log('entryAction::', this.getName());
},
doActivity: function () {
console.log('doActivity::', this.getName());
}
});
var s2Sub2Sub1 = new State('s2-sub-2-sub-1', {
entryAction: function () {
console.log('entryAction::', this.getName());
},
doActivity: function () {
console.log('doActivity::', this.getName());
}
});
var history = new HistoryPseudoState(true);
var transitA = new Transition(false, false, s1SubA);
var transitAToB = new Transition(false, s1SubA, s1SubB);
var transit1 = new Transition(false, false, state1);
var transit2 = new Transition(false, state1, state2, {
data: {
value: 'state2 entered.'
},
props: {
value: 'props value.',
},
methods: {
getValue: function () {
return this.props.value;
}
},
effect: function (param) {
console.log('effect::', param, this.get('value'));
},
locked: false
});
var transit3 = new Transition(false, false, s2Sub2, {
});
var transit4 = new Transition(false, state1, s2Sub2, {
});
var transit5 = new Transition(false, false, s2Sub1, {});
var transit6 = new Transition(false, false, s2Sub2Sub1, {});
var transit7 = new Transition(false, false, s2Sub1Sub1, {});
var transitS2ToS1 = new Transition(false, state2, state1, {});
var completedTests = 0;
function test() {
machine.addState(state1, state2);
machine.removeState(state1, state2);
machine.addState(state1, state2);
state1.addState(s1SubA, s1SubB, history);////
state2.addState(s2Sub1);
s2Sub1.addState(s2Sub1Sub1);
s2Region2.addState(s2Sub2);
state2.appendRegion(s2Region2)
s2Sub2.addState(s2Sub2Sub1);
machine.addTransition(transit1, transit2, transit4, transitS2ToS1);
state1.addTransition(transitA, transitAToB);
state2.addTransition(transit5);
s2Sub2.addTransition(transit6);
s2Region2.addTransition(transit3);
s2Sub1.addTransition(transit7);
console.log(s2Region2._initialPseudo.getName());
state2.removeRegion(s2Region2);
console.log(s2Region2._initialPseudo.getName());
machine.deploy();
//console.log(s2Region2.getStateByName('s2-sub-2'));
//console.log(s2Region2.getTransitionByName(transit3.getName()));
//machine.start();
var mr = machine.region;
assert.strictEqual(machine.getRegionById(mr.getId()), machine.region, 'result must be machine.region.');
assert.strictEqual(mr.getStateById(state1.getId()), state1, 'result must be state1.');
assert.strictEqual(mr.getTransitionById(transit1.getId()), transit1, 'result must be transit1.');
assert.strictEqual(state1.root, machine, 'result must be machine.');
assert.strictEqual(state2._getParentState(), state2.parent, 'result must be machine.');
assert.strictEqual(machine.getRegion(), machine.region, 'result must be machine.region.');
assert.strictEqual(state1.getCurrentDepth(), 1, 'result must be 1.');
/*assert.strictEqual(state.getId(), entity._id, 'result must be ' + entity._id + '.');
assert.strictEqual(entity.getName(), entity._name, 'result must be ' + entity._name + '.');
entity.setName('fuga');
assert.strictEqual(entity.getName(), entity._name, 'result must be ' + entity._name + '.');
assert.strictEqual(entity.isActive(), false, 'result must be false.');
entity._activate();
assert.strictEqual(entity.isActive(), true, 'result must be true.');
entity._deactivate();
assert.strictEqual(entity.isActive(), false, 'result must be false.');
completedTests++;
assert.strictEqual(elem.getCurrentDepth(), 0, 'result must be \'0\'');
assert.strictEqual(elem.getCurrentDepth(), 0, 'result must be \'0\'');
elem._entry();
assert.strictEqual(elem.isActive(), true, 'result must be true.');
elem._exit();
assert.strictEqual(elem.isActive(), false, 'result must be false.');
completedTests++;*/
//console.log('completedTests: ', completedTests);
}
test();