@@ -30,19 +30,35 @@ describe('createMachine — introspection (the swingset seam)', () => {
3030} ) ;
3131
3232describe ( 'createActor — pre-start safety' , ( ) => {
33- it ( 'send() is a no-op before start() — does not run transitions without entry actions ' , ( ) => {
33+ it ( 'send() before start() runs no transition until start() ' , ( ) => {
3434 const actor = createActor ( createDeleteOrgMachine ( ( ) => Promise . resolve ( ) ) ) ;
3535 const before = actor . getSnapshot ( ) ;
3636
3737 actor . send ( { type : 'OPEN' } ) ;
3838
3939 expect ( actor . getSnapshot ( ) ) . toBe ( before ) ;
40- expect ( actor . getSnapshot ( ) . value ) . toBe ( 'idle' ) ;
40+ actor . start ( ) ;
41+ expect ( actor . getSnapshot ( ) . value ) . toBe ( 'confirming' ) ;
4142 } ) ;
4243
43- it ( 'can() returns false before start()' , ( ) => {
44+ it ( 'can() before start() answers for the initial state ' , ( ) => {
4445 const actor = createActor ( createDeleteOrgMachine ( ( ) => Promise . resolve ( ) ) ) ;
45- expect ( actor . can ( { type : 'OPEN' } ) ) . toBe ( false ) ;
46+ expect ( actor . can ( { type : 'OPEN' } ) ) . toBe ( true ) ;
47+ expect ( actor . can ( { type : 'CANCEL' } ) ) . toBe ( false ) ;
48+ } ) ;
49+
50+ it ( 'can() before start() answers for the initial state resolved from setContext()' , ( ) => {
51+ const actor = createActor (
52+ createMachine < { done : boolean } , { type : 'GO' } > ( {
53+ initial : context => ( context . done ? 'end' : 'start' ) ,
54+ context : { done : false } ,
55+ states : { start : { on : { GO : 'end' } } , end : { } } ,
56+ } ) ,
57+ ) ;
58+
59+ actor . setContext ( { done : true } ) ;
60+
61+ expect ( actor . can ( { type : 'GO' } ) ) . toBe ( false ) ;
4662 } ) ;
4763} ) ;
4864
@@ -854,12 +870,47 @@ describe('actor restart — stop/start resumes the current state', () => {
854870 expect ( actor . getSnapshot ( ) . value ) . toBe ( 'idle' ) ;
855871 } ) ;
856872
857- it ( 'ignores send before the first start' , ( ) => {
858- const actor = createActor ( createDeleteOrgMachine ( ( ) => Promise . resolve ( ) ) ) ;
859- actor . send ( { type : 'OPEN' } ) ;
873+ it ( 'applies events sent before the first start in order, after entering the initial state' , ( ) => {
874+ const entered : string [ ] = [ ] ;
875+ const actor = createActor (
876+ createMachine < object , { type : 'NEXT' } > ( {
877+ initial : 'a' ,
878+ states : {
879+ a : { entry : ( ) => entered . push ( 'a' ) , on : { NEXT : 'b' } } ,
880+ b : { entry : ( ) => entered . push ( 'b' ) , on : { NEXT : 'c' } } ,
881+ c : { entry : ( ) => entered . push ( 'c' ) } ,
882+ } ,
883+ } ) ,
884+ ) ;
885+ actor . send ( { type : 'NEXT' } ) ;
886+ actor . send ( { type : 'NEXT' } ) ;
887+
888+ expect ( entered ) . toEqual ( [ ] ) ;
860889 actor . start ( ) ;
861890
862- expect ( actor . getSnapshot ( ) . value ) . toBe ( 'idle' ) ;
891+ expect ( entered ) . toEqual ( [ 'a' , 'b' , 'c' ] ) ;
892+ expect ( actor . getSnapshot ( ) . value ) . toBe ( 'c' ) ;
893+ } ) ;
894+
895+ it ( 'keeps events sent before the first start when the initial entry stops the actor' , ( ) => {
896+ let stopOnEntry = ( ) => { } ;
897+ const actor = createActor (
898+ createMachine < object , { type : 'NEXT' } > ( {
899+ initial : 'a' ,
900+ states : { a : { entry : ( ) => stopOnEntry ( ) , on : { NEXT : 'b' } } , b : { } } ,
901+ } ) ,
902+ ) ;
903+ stopOnEntry = ( ) => {
904+ stopOnEntry = ( ) => { } ;
905+ actor . stop ( ) ;
906+ } ;
907+ actor . send ( { type : 'NEXT' } ) ;
908+
909+ actor . start ( ) ;
910+ expect ( actor . getSnapshot ( ) . value ) . toBe ( 'a' ) ;
911+ actor . start ( ) ;
912+
913+ expect ( actor . getSnapshot ( ) . value ) . toBe ( 'b' ) ;
863914 } ) ;
864915
865916 it ( 'keeps a teleported actor inert across a restart' , ( ) => {
0 commit comments