@wiz-code/async-fsm
Version:
Finite StateMachine JavaScript Library
198 lines (157 loc) • 5.16 kB
JavaScript
;
var assert = require('assert');
var Promise = require('es6-promise');
var FSM = require('../../src');
var sinon = require('sinon');
FSM.globalize();
FSM.logger.setLogLevel('error');
describe('State', function () {
describe('#$setProp()', function () {
var state, subState;
before(function () {
state = new State('state', {
props: {
value: 0,
},
});
subState = new State('sub-state');
state.addState(subState);
});
it('should set 100 to parent element "value" prop', function (done) {
subState.$setProp('value', 100);
if (state.getProp('value') === 100) {
done();
}
});
});
describe('#$setMethod()', function () {
var state, subState;
before(function () {
state = new State('state', {
methods: {
func: function () {
return 100;
},
},
});
subState = new State('sub-state');
state.addState(subState);
});
it('should invoke parent element "func" method and return 100', function (done) {
var func = subState.$getMethod('func');
if (func() === 100) {
done();
}
});
});
describe('#setMethod()', function () {
var state;
before(function () {
state = new State('state', {
methods: {
init: function (done) {
if (this.getName() === 'state') {
done();
}
},
},
});
});
it('should bind "self" with "this", when init() invoked', function (done) {
state.methods.init(done);
});
});
describe('#entryAction()', function () {
var machine, state, transit, spy;
before(function () {
machine = new Machine('my-machine');
state = new State('state', {
data: {
done: false,
},
entryAction: function () {
this.set('done', true);
},
});
transit = new Transition(false, false, state);
machine.addState(state);
machine.addTransition(transit);
machine.deploy();
});
after(function () {
machine.finish();
});
it('entry action should occur always once', function (done) {
//spy = sinon.spy(state, 'entryAction');
state.watch('done', function (e) {
done();
});
machine.start();
});
});
describe('#doActivity()', function () {
var machine, state, transit, spy;
before(function () {
machine = new Machine('my-machine');
state = new State('state', {
data: {
done: false,
},
doActivity: function () {
if (this.getTicks() >= 10) {
this.set('done', true);
this.completion();
}
},
loop: true,
useRAF: true,
});
transit = new Transition(false, false, state);
machine.addState(state);
machine.addTransition(transit);
machine.deploy();
});
after(function () {
machine.finish();
});
it('do activity should occur 10 times', function (done) {
//spy = sinon.spy(state, 'doActivity');
state.watch('done', function (e) {
done();
});
machine.start();
});
});
describe('#exitAction()', function () {
var machine, state1, state2, transit1, transit2, spy;
before(function () {
machine = new Machine('my-machine');
state1 = new State('state1', {
data: {
done: false,
},
exitAction: function () {
console.log('exit');
this.set('done', true);
},
autoTransition: true,
});
state2 = new State('state2');
transit1 = new Transition(false, false, state1);
transit2 = new Transition(false, state1, state2, {unlocked: true});
machine.addState(state1, state2);
machine.addTransition(transit1, transit2);
machine.deploy();
});
after(function () {
machine.finish();
});
it('exit action should occur always once', function (done) {
//spy = sinon.spy(state2, 'exitAction');
state1.watch('done', function (e) {
done();
});
machine.start();
});
});
});