Skip to content

Commit 901a810

Browse files
committed
updated test script
1 parent 6f0d86a commit 901a810

File tree

1 file changed

+75
-57
lines changed

1 file changed

+75
-57
lines changed

Timing-Functions/test/IntervalTimer.test.js

Lines changed: 75 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -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', () => {
254272
describe('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

Comments
 (0)