Skip to content

Commit

Permalink
Added support for passing from states as an array
Browse files Browse the repository at this point in the history
  • Loading branch information
kernow committed Apr 22, 2009
1 parent 6c5c396 commit 75fee57
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 5 deletions.
3 changes: 0 additions & 3 deletions lib/state_machine/event.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,15 @@ SM.Event.prototype = {
return this;
},
can_fire: function(){
// console.log("can_fire called");
return this.guards.match(this.name, this.machine.state()) ? true : false;
},
fire: function(){
// console.log("fire called");
var transition = this.transition_for();
if( transition ){
return transition.perform();
}
else{
// transition failed
// console.log("********* transition failed");
return false;
}
},
Expand Down
15 changes: 14 additions & 1 deletion lib/state_machine/guard.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ SM.Guard = function(name, object, options){

SM.Guard.prototype = {
match: function(name, from){
if(name == this.name && (from == this.from || this.from == 'any')){
if(name == this.name && (this.match_from_state(from) || this.from == 'any')){
if(this.run_callbacks()){
return true;
}
Expand All @@ -22,6 +22,19 @@ SM.Guard.prototype = {
return false;
}
},
match_from_state: function(from){
if(typeof this.from == 'string'){
return from == this.from
}
else{
for(var i=0;i<this.from.length;i++){
if(from == this.from[i]){
return true;
}
}
return false;
}
},
run_callbacks: function(){
var success = true;
if(this.options.when){
Expand Down
26 changes: 26 additions & 0 deletions test/js/event_tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,32 @@ jsStateMachineTests.EventTests = function(Y) {
Y.Assert.areEqual('idling', this.car.state);
Y.Assert.isFalse(this.car.can_start());
Y.Assert.isTrue(this.car.can_stop());
},
testCanSupportMultipleFromStatesAsArray : function () {
new SM.StateMachine('state', this.car, { initial: 'parked' }, function(machine){
machine.event('start', {}, function(event){
event.transition({ from: 'parked', to: 'idling' });
});
machine.event('stop', {}, function(event){
event.transition({ from: ['idling', 'first_gear', 'second_gear', 'third_gear'], to: 'parked' });
});
machine.event('gear_up', {}, function(event){
event.transition({ from: 'idling', to: 'first_gear' });
event.transition({ from: 'first_gear', to: 'second_gear' });
event.transition({ from: 'second_gear', to: 'third_gear' });
});
});
this.car.start();
Y.Assert.areEqual('idling', this.car.state);
Y.Assert.isTrue(this.car.can_stop());
Y.Assert.isTrue(this.car.can_gear_up());
this.car.gear_up();
Y.Assert.areEqual('first_gear', this.car.state);
this.car.gear_up();
Y.Assert.areEqual('second_gear', this.car.state);
Y.Assert.isTrue(this.car.can_stop());
this.car.stop();
Y.Assert.areEqual('parked', this.car.state);
}
}));

Expand Down
22 changes: 21 additions & 1 deletion test/js/state_machine_tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,27 @@ jsStateMachineTests.StateMachineTests = function(Y) {
Y.Assert.isTrue(contains(this.car.state_states, 'parked'));
Y.Assert.isTrue(contains(this.car.state_states, 'idling'));
Y.Assert.isTrue(contains(this.car.state_states, 'first_gear'));
}
},
testCanGetListOfStatesUsingFromStatesAsArray : function () {
new SM.StateMachine('state', this.car, { initial: 'parked' }, function(machine){
machine.event('start', {}, function(event){
event.transition({ from: 'parked', to: 'idling' });
});
machine.event('stop', {}, function(event){
event.transition({ from: ['idling', 'first_gear', 'second_gear', 'third_gear'], to: 'parked' });
});
machine.event('gear_up', {}, function(event){
event.transition({ from: 'idling', to: 'first_gear' });
event.transition({ from: 'first_gear', to: 'second_gear' });
event.transition({ from: 'second_gear', to: 'third_gear' });
});
});
Y.Assert.isTrue(contains(this.car.state_states, 'parked'));
Y.Assert.isTrue(contains(this.car.state_states, 'idling'));
Y.Assert.isTrue(contains(this.car.state_states, 'first_gear'));
Y.Assert.isTrue(contains(this.car.state_states, 'second_gear'));
Y.Assert.isTrue(contains(this.car.state_states, 'third_gear'));
}
}));

testSuite.add(new Y.Test.Case({
Expand Down

0 comments on commit 75fee57

Please sign in to comment.