@@ -53,7 +53,7 @@ describe('IntervalTimer', () => {
5353 timerInstances . push ( timer1 )
5454 const timer2 = new IntervalTimer ( 30 )
5555 timerInstances . push ( timer2 )
56-
56+
5757 // The implementation sets this.instance = this for each instance
5858 // Note: This is not a true singleton pattern as each new instance creates a separate object
5959 expect ( timer1 . instance ) . toBe ( timer1 )
@@ -64,33 +64,39 @@ describe('IntervalTimer', () => {
6464 } )
6565
6666 describe ( 'startTimer' , ( ) => {
67- it ( 'should start the timer interval' , ( done ) => {
67+ it ( 'should start the timer interval' , async ( ) => {
68+ let callbackCalled = false
6869 const mockCallback = vi . fn ( ( ) => {
69- mockCallback . mockClear ( )
70+ callbackCalled = true
7071 } )
7172 const timer = new IntervalTimer ( 10 , mockCallback )
7273 timerInstances . push ( timer )
73-
74+
7475 timer . startTimer ( )
75-
76- // Wait for callback to be called
77- setTimeout ( ( ) => {
78- expect ( mockCallback ) . toHaveBeenCalled ( )
79- clearInterval ( timer . timer )
80- done ( )
81- } , 15 )
76+
77+ // Wait for callback to be called - use a longer timeout to ensure it fires
78+ // In Node.js, the minimum delay might be larger, so we wait longer
79+ await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) )
80+
81+ // Verify timer is running
82+ expect ( timer . timer ) . toBeDefined ( )
83+ // Callback should have been called at least once
84+ expect ( callbackCalled || mockCallback . mock . calls . length > 0 ) . toBe ( true )
85+ clearInterval ( timer . timer )
8286 } )
8387
8488 it ( 'should store the timer ID' , ( ) => {
8589 const timer = new IntervalTimer ( )
8690 timerInstances . push ( timer )
8791 timer . startTimer ( )
88-
92+
8993 expect ( timer . timer ) . toBeDefined ( )
9094 // In Node.js, setInterval returns a Timeout object, not a number
9195 // In browsers, it returns a number. Both are valid.
92- expect ( typeof timer . timer === 'number' || typeof timer . timer === 'object' ) . toBe ( true )
93-
96+ expect (
97+ typeof timer . timer === 'number' || typeof timer . timer === 'object'
98+ ) . toBe ( true )
99+
94100 clearInterval ( timer . timer )
95101 } )
96102 } )
@@ -100,40 +106,40 @@ describe('IntervalTimer', () => {
100106 const timer = new IntervalTimer ( )
101107 timerInstances . push ( timer )
102108 timer . startTimer ( )
103-
109+
104110 // getElapsedTime uses timer ID arithmetic which may not work as expected
105111 // but we test the actual behavior
106112 const elapsed = timer . getElapsedTime ( )
107-
113+
108114 expect ( typeof elapsed ) . toBe ( 'number' )
109-
115+
110116 clearInterval ( timer . timer )
111117 } )
112118
113119 it ( 'should subtract offset from elapsed time' , ( ) => {
114120 const timer = new IntervalTimer ( )
115121 timerInstances . push ( timer )
116122 timer . startTimer ( )
117-
123+
118124 const offset = 100
119125 const elapsed = timer . getElapsedTime ( offset )
120-
126+
121127 expect ( typeof elapsed ) . toBe ( 'number' )
122-
128+
123129 clearInterval ( timer . timer )
124130 } )
125131
126132 it ( 'should update prevInterval on each call' , ( ) => {
127133 const timer = new IntervalTimer ( )
128134 timerInstances . push ( timer )
129135 timer . startTimer ( )
130-
136+
131137 const prevIntervalBefore = timer . prevInterval
132138 timer . getElapsedTime ( )
133139 const prevIntervalAfter = timer . prevInterval
134-
140+
135141 expect ( prevIntervalAfter ) . not . toBe ( prevIntervalBefore )
136-
142+
137143 clearInterval ( timer . timer )
138144 } )
139145 } )
@@ -143,43 +149,46 @@ describe('IntervalTimer', () => {
143149 const timer = new IntervalTimer ( )
144150 timerInstances . push ( timer )
145151 timer . startTimer ( )
146-
152+
147153 const runTime = timer . getRunTime ( )
148-
154+
149155 expect ( runTime ) . toBe ( timer . timer )
150156 // In Node.js, setInterval returns a Timeout object, not a number
151157 // In browsers, it returns a number. Both are valid.
152- expect ( typeof runTime === 'number' || typeof runTime === 'object' ) . toBe ( true )
153-
158+ expect ( typeof runTime === 'number' || typeof runTime === 'object' ) . toBe (
159+ true
160+ )
161+
154162 clearInterval ( timer . timer )
155163 } )
156164 } )
157165
158166 describe ( 'resetTimer' , ( ) => {
159- it ( 'should clear the timer interval' , ( done ) => {
167+ it ( 'should clear the timer interval' , async ( ) => {
160168 const mockCallback = vi . fn ( )
161169 const timer = new IntervalTimer ( 10 , mockCallback )
162170 timerInstances . push ( timer )
163171 timer . startTimer ( )
164-
172+
165173 timer . resetTimer ( )
166-
174+
167175 // Verify timer was cleared - callback should not be called after reset
168176 mockCallback . mockClear ( )
169- setTimeout ( ( ) => {
170- expect ( mockCallback ) . not . toHaveBeenCalled ( )
171- done ( )
172- } , 20 )
177+
178+ // Wait a bit to ensure no more callbacks are called
179+ await new Promise ( ( resolve ) => setTimeout ( resolve , 30 ) )
180+
181+ expect ( mockCallback ) . not . toHaveBeenCalled ( )
173182 } )
174183
175184 it ( 'should reset the callback to empty function' , ( ) => {
176185 const mockCallback = vi . fn ( )
177186 const timer = new IntervalTimer ( 10 , mockCallback )
178187 timerInstances . push ( timer )
179188 timer . startTimer ( )
180-
189+
181190 timer . resetTimer ( )
182-
191+
183192 expect ( timer . callBack ) . not . toBe ( mockCallback )
184193 expect ( typeof timer . callBack ) . toBe ( 'function' )
185194 } )
@@ -188,29 +197,38 @@ describe('IntervalTimer', () => {
188197 const timer = new IntervalTimer ( )
189198 timerInstances . push ( timer )
190199 timer . startTimer ( )
191-
200+
192201 const elapsed = timer . resetTimer ( )
193-
202+
194203 expect ( typeof elapsed ) . toBe ( 'number' )
195204 } )
196205
197- it ( 'should allow timer to be started again after reset' , ( done ) => {
198- const mockCallback = vi . fn ( )
206+ it ( 'should allow timer to be started again after reset' , async ( ) => {
207+ let callbackCalled = false
208+ const mockCallback = vi . fn ( ( ) => {
209+ callbackCalled = true
210+ } )
199211 const timer = new IntervalTimer ( 10 , mockCallback )
200212 timerInstances . push ( timer )
201-
213+
202214 timer . startTimer ( )
203215 timer . resetTimer ( )
204-
216+
217+ // Reset the flag
218+ callbackCalled = false
219+ mockCallback . mockClear ( )
220+
205221 // Set new callback and start again
206222 timer . callBack = mockCallback
207223 timer . startTimer ( )
208-
209- setTimeout ( ( ) => {
210- expect ( mockCallback ) . toHaveBeenCalled ( )
211- clearInterval ( timer . timer )
212- done ( )
213- } , 15 )
224+
225+ // Wait for callback to be called - use a longer timeout to ensure it fires
226+ await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) )
227+
228+ expect ( timer . timer ) . toBeDefined ( )
229+ // Callback should have been called at least once
230+ expect ( callbackCalled || mockCallback . mock . calls . length > 0 ) . toBe ( true )
231+ clearInterval ( timer . timer )
214232 } )
215233 } )
216234
@@ -219,15 +237,15 @@ describe('IntervalTimer', () => {
219237 const timer = new IntervalTimer ( 10 )
220238 timerInstances . push ( timer )
221239 timer . startTimer ( )
222-
240+
223241 // Simulate initialization
224242 const initOffset = timer . getRunTime ( )
225-
243+
226244 // Simulate some work
227245 const elapsed = timer . getElapsedTime ( initOffset )
228-
246+
229247 expect ( typeof elapsed ) . toBe ( 'number' )
230-
248+
231249 // Reset
232250 const finalElapsed = timer . resetTimer ( )
233251 expect ( typeof finalElapsed ) . toBe ( 'number' )
@@ -237,15 +255,15 @@ describe('IntervalTimer', () => {
237255 const timer = new IntervalTimer ( )
238256 timerInstances . push ( timer )
239257 timer . startTimer ( )
240-
258+
241259 const elapsed1 = timer . getElapsedTime ( )
242260 const elapsed2 = timer . getElapsedTime ( )
243261 const elapsed3 = timer . getElapsedTime ( )
244-
262+
245263 expect ( typeof elapsed1 ) . toBe ( 'number' )
246264 expect ( typeof elapsed2 ) . toBe ( 'number' )
247265 expect ( typeof elapsed3 ) . toBe ( 'number' )
248-
266+
249267 clearInterval ( timer . timer )
250268 } )
251269 } )
@@ -254,11 +272,11 @@ describe('IntervalTimer', () => {
254272describe ( 'ExampleIntervalTimer' , ( ) => {
255273 it ( 'should execute without errors' , ( ) => {
256274 const mockOutput = vi . fn ( )
257-
275+
258276 expect ( ( ) => {
259277 ExampleIntervalTimer ( mockOutput )
260278 } ) . not . toThrow ( )
261-
279+
262280 // Clean up - the ExampleIntervalTimer creates a timer instance
263281 // We need to access it through the singleton pattern
264282 const timer = new IntervalTimer ( )
0 commit comments