11import { describe , expect , it } from "@effect/vitest"
22import { Deferred , Effect , Exit , Fiber } from "effect"
33
4- import { awaitTerminalFontReadiness } from "../../src/web/terminal-font-readiness.js"
4+ import { awaitTerminalFontReadiness , type DelayScheduler } from "../../src/web/terminal-font-readiness.js"
55
66type DeferredHandle < A > = {
77 readonly deferred : Deferred . Deferred < A , Error >
@@ -51,8 +51,9 @@ const createFontsMock = (
5151 rejectReady : ( ) => Deferred . fail ( readyHandle . deferred , new Error ( "fonts ready failed" ) ) . pipe ( Effect . asVoid ) ,
5252 resolveLoads : ( ) =>
5353 Effect . gen ( function * ( _ ) {
54+ const emptyResult : ReadonlyArray < object > = [ ]
5455 for ( const handle of loadHandles ) {
55- yield * _ ( Deferred . succeed ( handle . deferred , [ ] as ReadonlyArray < object > ) )
56+ yield * _ ( Deferred . succeed ( handle . deferred , emptyResult ) )
5657 }
5758 } ) ,
5859 resolveReady : ( ) => Deferred . succeed ( readyHandle . deferred , { } ) . pipe ( Effect . asVoid )
@@ -65,34 +66,35 @@ const makeFontsMock = (): Effect.Effect<FontFaceSetMock> =>
6566 return createFontsMock ( readyHandle , ( ) => makeDeferredHandle < ReadonlyArray < object > > ( ) )
6667 } )
6768
68- type TimersMock = {
69- readonly cleared : ReadonlyArray < object >
70- readonly clearTimeoutImpl : typeof globalThis . clearTimeout
69+ type SchedulerMock = {
70+ readonly cancelCount : ( ) => number
7171 readonly fire : ( ) => void
72- readonly setTimeoutImpl : typeof globalThis . setTimeout
72+ readonly scheduler : DelayScheduler
7373}
7474
75- const createTimers = ( ) : TimersMock => {
75+ const createScheduler = ( ) : SchedulerMock => {
7676 const handlers : Array < { readonly callback : ( ) => void ; readonly id : object } > = [ ]
77- const cleared : Array < object > = [ ]
78- return {
79- cleared,
80- clearTimeoutImpl : ( ( id : object ) => {
81- cleared . push ( id )
82- const index = handlers . findIndex ( ( handler ) => handler . id === id )
83- if ( index !== - 1 ) {
84- handlers . splice ( index , 1 )
77+ let cancelCount = 0
78+ const scheduler : DelayScheduler = {
79+ schedule : ( callback ) => {
80+ const id = { }
81+ handlers . push ( { callback, id } )
82+ return ( ) => {
83+ cancelCount += 1
84+ const index = handlers . findIndex ( ( handler ) => handler . id === id )
85+ if ( index !== - 1 ) {
86+ handlers . splice ( index , 1 )
87+ }
8588 }
86- } ) as typeof globalThis . clearTimeout ,
89+ }
90+ }
91+ return {
92+ cancelCount : ( ) => cancelCount ,
8793 fire : ( ) => {
8894 const next = handlers . shift ( )
8995 next ?. callback ( )
9096 } ,
91- setTimeoutImpl : ( ( callback : ( ) => void ) => {
92- const id = { }
93- handlers . push ( { callback, id } )
94- return id as ReturnType < typeof globalThis . setTimeout >
95- } ) as typeof globalThis . setTimeout
97+ scheduler
9698 }
9799}
98100
@@ -105,7 +107,7 @@ const yieldThrice = Effect.gen(function*(_) {
105107type FontReadinessFixture = {
106108 readonly fiber : Fiber . RuntimeFiber < void >
107109 readonly fonts : FontFaceSetMock
108- readonly timers : TimersMock
110+ readonly timers : SchedulerMock
109111}
110112
111113const startFontReadinessFixture = (
@@ -114,12 +116,11 @@ const startFontReadinessFixture = (
114116) : Effect . Effect < FontReadinessFixture > =>
115117 Effect . gen ( function * ( _ ) {
116118 const fonts = yield * _ ( makeFontsMock ( ) )
117- const timers = createTimers ( )
119+ const timers = createScheduler ( )
118120 const baseArgs = {
119- clearTimeoutImpl : timers . clearTimeoutImpl ,
120121 descriptors,
121122 fonts,
122- setTimeoutImpl : timers . setTimeoutImpl
123+ scheduler : timers . scheduler
123124 }
124125 const args = timeoutMs === undefined ? baseArgs : { ...baseArgs , timeoutMs }
125126 const fiber = yield * _ ( Effect . fork ( awaitTerminalFontReadiness ( args ) ) )
@@ -144,7 +145,7 @@ describe("terminal font readiness", () => {
144145 yield * _ ( fonts . resolveReady ( ) )
145146 yield * _ ( fonts . resolveLoads ( ) )
146147 yield * _ ( Fiber . join ( fiber ) )
147- expect ( timers . cleared . length ) . toBe ( 1 )
148+ expect ( timers . cancelCount ( ) ) . toBe ( 1 )
148149 } ) )
149150
150151 it . effect ( "swallows load failures so callers still proceed" , ( ) =>
0 commit comments