@@ -224,6 +224,56 @@ test("callbacks are ordered correctly", function() {
224224
225225//-----------------------------------------------------------------------------
226226
227+ test ( "callbacks are ordered correctly - for same state transition" , function ( ) {
228+
229+ var called = [ ] ;
230+
231+ var fsm = StateMachine . create ( {
232+ initial : 'waiting' ,
233+ events : [
234+ { name : 'data' , from : [ 'waiting' , 'receipt' ] , to : 'receipt' } ,
235+ { name : 'nothing' , from : [ 'waiting' , 'receipt' ] , to : 'waiting' } ,
236+ { name : 'error' , from : [ 'waiting' , 'receipt' ] , to : 'error' } // bad practice to have event name same as state name - but I'll let it slide just this once
237+ ] ,
238+ callbacks : {
239+ onchangestate : function ( event , from , to ) { called . push ( 'onchange from ' + from + ' to ' + to ) ; } ,
240+
241+ onenterwaiting : function ( ) { called . push ( 'onenterwaiting' ) ; } ,
242+ onenterreceipt : function ( ) { called . push ( 'onenterreceipt' ) ; } ,
243+ onentererror : function ( ) { called . push ( 'onentererror' ) ; } ,
244+ onleavewaiting : function ( ) { called . push ( 'onleavewaiting' ) ; } ,
245+ onleavereceipt : function ( ) { called . push ( 'onleavereceipt' ) ; } ,
246+ onleaveerror : function ( ) { called . push ( 'onleaveerror' ) ; } ,
247+
248+ onbeforedata : function ( ) { called . push ( 'onbeforedata' ) ; } ,
249+ onbeforenothing : function ( ) { called . push ( 'onbeforenothing' ) ; } ,
250+ onbeforeerror : function ( ) { called . push ( 'onbeforeerror' ) ; } ,
251+ onafterdata : function ( ) { called . push ( 'onafterdata' ) ; } ,
252+ onafternothing : function ( ) { called . push ( 'onafternothing' ) ; } ,
253+ onaftereerror : function ( ) { called . push ( 'onaftererror' ) ; } ,
254+ }
255+ } ) ;
256+
257+ called = [ ] ;
258+ fsm . data ( ) ;
259+ deepEqual ( called , [ 'onbeforedata' , 'onleavewaiting' , 'onenterreceipt' , 'onchange from waiting to receipt' , 'onafterdata' ] ) ;
260+
261+ called = [ ] ;
262+ fsm . data ( ) ; // same-state transition
263+ deepEqual ( called , [ 'onbeforedata' , 'onafterdata' ] ) ; // so now enter/leave/change state callbacks are fired
264+
265+ called = [ ] ;
266+ fsm . data ( ) ; // same-state transition
267+ deepEqual ( called , [ 'onbeforedata' , 'onafterdata' ] ) ; // so now enter/leave/change state callbacks are fired
268+
269+ called = [ ] ;
270+ fsm . nothing ( ) ;
271+ deepEqual ( called , [ 'onbeforenothing' , 'onleavereceipt' , 'onenterwaiting' , 'onchange from receipt to waiting' , 'onafternothing' ] ) ;
272+
273+ } ) ;
274+
275+ //-----------------------------------------------------------------------------
276+
227277test ( "callback arguments are correct" , function ( ) {
228278
229279 var expected = { event : 'startup' , from : 'none' , to : 'green' } ; // first expected callback
0 commit comments