@ -34,17 +34,17 @@ vi.mock("@/scene/SceneManager", () => {
} ) ;
} ) ;
describe ( "RuntimeEvents" , ( ) = > {
describe ( "RuntimeEvents" , ( ) = > {
it ( "supports on/off/emit" , ( ) = > {
it ( "supports on/off/emit with variadic args " , ( ) = > {
const events = new RuntimeEvents ( ) ;
const events = new RuntimeEvents ( ) ;
const handler = vi . fn ( ) ;
const handler = vi . fn ( ) ;
events . on ( "runtime:ready" , handler ) ;
events . on ( "runtime:ready" , handler ) ;
events . emit ( "runtime:ready" , { startedAt : 1 } ) ;
events . emit ( "runtime:ready" , { startedAt : 1 } , "extra" , 42 ) ;
events . off ( "runtime:ready" , handler ) ;
events . off ( "runtime:ready" , handler ) ;
events . emit ( "runtime:ready" , { startedAt : 2 } ) ;
events . emit ( "runtime:ready" , { startedAt : 2 } ) ;
expect ( handler ) . toHaveBeenCalledTimes ( 1 ) ;
expect ( handler ) . toHaveBeenCalledTimes ( 1 ) ;
expect ( handler ) . toHaveBeenCalledWith ( { startedAt : 1 } ) ;
expect ( handler ) . toHaveBeenCalledWith ( { startedAt : 1 } , "extra" , 42 ) ;
} ) ;
} ) ;
it ( "supports once subscriptions" , ( ) = > {
it ( "supports once subscriptions" , ( ) = > {
@ -58,6 +58,39 @@ describe("RuntimeEvents", () => {
expect ( handler ) . toHaveBeenCalledTimes ( 1 ) ;
expect ( handler ) . toHaveBeenCalledTimes ( 1 ) ;
expect ( handler ) . toHaveBeenCalledWith ( { current : "a" , previous : undefined } ) ;
expect ( handler ) . toHaveBeenCalledWith ( { current : "a" , previous : undefined } ) ;
} ) ;
} ) ;
it ( "keeps dispatching when one listener throws" , ( ) = > {
const events = new RuntimeEvents ( ) ;
const bad = vi . fn ( ( ) = > {
throw new Error ( "boom" ) ;
} ) ;
const good = vi . fn ( ) ;
events . on ( "scene:changed" , bad ) ;
events . on ( "scene:changed" , good ) ;
events . emit ( "scene:changed" , { current : "x" } ) ;
expect ( bad ) . toHaveBeenCalledTimes ( 1 ) ;
expect ( good ) . toHaveBeenCalledTimes ( 1 ) ;
expect ( good ) . toHaveBeenCalledWith ( { current : "x" } ) ;
} ) ;
it ( "unsubscribes once listener even when callback throws" , ( ) = > {
const events = new RuntimeEvents ( ) ;
const throwing = vi . fn ( ( ) = > {
throw new Error ( "once failed" ) ;
} ) ;
const after = vi . fn ( ) ;
events . once ( "runtime:ready" , throwing ) ;
events . on ( "runtime:ready" , after ) ;
events . emit ( "runtime:ready" , { startedAt : 1 } ) ;
events . emit ( "runtime:ready" , { startedAt : 2 } ) ;
expect ( throwing ) . toHaveBeenCalledTimes ( 1 ) ;
expect ( after ) . toHaveBeenCalledTimes ( 2 ) ;
} ) ;
} ) ;
} ) ;
describe ( "AppRuntime plugin lifecycle" , ( ) = > {
describe ( "AppRuntime plugin lifecycle" , ( ) = > {