Skip to content

Commit 6319311

Browse files
committed
Added optional final state(s) and isFinished() helper method (issue jakesgordon#23)
1 parent 131af49 commit 6319311

4 files changed

Lines changed: 52 additions & 1 deletion

File tree

RELEASE_NOTES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
Version 2.2.0 (unreleased)
22
--------------------------
33

4+
* Added optional `final` state(s) and `isFinished()` helper method (issue #23)
45
* extended `fsm.is()` to accept an array of states (in addition to a single state)
56
* Added generic event callbacks 'onbeforeevent' and 'onafterevent' (issue #28)
67
* Added generic state callbacks 'onleavestate' and 'onenterstate' (issue #28)

state-machine.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
create: function(cfg, target) {
3939

4040
var initial = (typeof cfg.initial == 'string') ? { state: cfg.initial } : cfg.initial; // allow for a simple string, or an object with { state: 'foo', event: 'setup', defer: true|false }
41+
var terminal = cfg.terminal || cfg['final'];
4142
var fsm = target || cfg.target || {};
4243
var events = cfg.events || [];
4344
var callbacks = cfg.callbacks || {};
@@ -74,6 +75,8 @@
7475
fsm.cannot = function(event) { return !this.can(event); };
7576
fsm.error = cfg.error || function(name, from, to, args, error, msg, e) { throw e || msg; }; // default behavior when something unexpected happens is to throw an exception, but caller can override this behavior if desired (see github issue #3 and #17)
7677

78+
fsm.isFinished = function() { return this.is(terminal); };
79+
7780
if (initial && !initial.defer)
7881
fsm[initial.event]();
7982

state-machine.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/test_basics.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,53 @@ test("is", function() {
111111

112112
//-----------------------------------------------------------------------------
113113

114+
test("isFinished", function() {
115+
116+
var fsm = StateMachine.create({
117+
initial: 'green', terminal: 'red',
118+
events: [
119+
{ name: 'warn', from: 'green', to: 'yellow' },
120+
{ name: 'panic', from: 'yellow', to: 'red' }
121+
]});
122+
123+
equals(fsm.current, 'green');
124+
equals(fsm.isFinished(), false);
125+
126+
fsm.warn();
127+
equals(fsm.current, 'yellow');
128+
equals(fsm.isFinished(), false);
129+
130+
fsm.panic();
131+
equals(fsm.current, 'red');
132+
equals(fsm.isFinished(), true);
133+
134+
});
135+
136+
//-----------------------------------------------------------------------------
137+
138+
test("isFinished - without specifying terminal state", function() {
139+
140+
var fsm = StateMachine.create({
141+
initial: 'green',
142+
events: [
143+
{ name: 'warn', from: 'green', to: 'yellow' },
144+
{ name: 'panic', from: 'yellow', to: 'red' }
145+
]});
146+
147+
equals(fsm.current, 'green');
148+
equals(fsm.isFinished(), false);
149+
150+
fsm.warn();
151+
equals(fsm.current, 'yellow');
152+
equals(fsm.isFinished(), false);
153+
154+
fsm.panic();
155+
equals(fsm.current, 'red');
156+
equals(fsm.isFinished(), false);
157+
158+
});
159+
//-----------------------------------------------------------------------------
160+
114161
test("inappropriate events", function() {
115162

116163
var fsm = StateMachine.create({

0 commit comments

Comments
 (0)