UNPKG

@wiz-code/async-fsm

Version:

Finite StateMachine JavaScript Library

210 lines (172 loc) 6.23 kB
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();