| |
| |
| |
| |
| |
|
|
| import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; |
| import { DeadlineTimer } from './deadlineTimer.js'; |
|
|
| describe('DeadlineTimer', () => { |
| beforeEach(() => { |
| vi.useFakeTimers(); |
| }); |
|
|
| afterEach(() => { |
| vi.restoreAllMocks(); |
| }); |
|
|
| it('should abort when timeout is reached', () => { |
| const timer = new DeadlineTimer(1000); |
| const signal = timer.signal; |
| expect(signal.aborted).toBe(false); |
|
|
| vi.advanceTimersByTime(1000); |
| expect(signal.aborted).toBe(true); |
| expect(signal.reason).toBeInstanceOf(Error); |
| expect((signal.reason as Error).message).toBe('Timeout exceeded.'); |
| }); |
|
|
| it('should allow extending the deadline', () => { |
| const timer = new DeadlineTimer(1000); |
| const signal = timer.signal; |
|
|
| vi.advanceTimersByTime(500); |
| expect(signal.aborted).toBe(false); |
|
|
| timer.extend(1000); |
|
|
| vi.advanceTimersByTime(600); |
| expect(signal.aborted).toBe(false); |
|
|
| vi.advanceTimersByTime(900); |
| expect(signal.aborted).toBe(true); |
| }); |
|
|
| it('should allow pausing and resuming the timer', () => { |
| const timer = new DeadlineTimer(1000); |
| const signal = timer.signal; |
|
|
| vi.advanceTimersByTime(500); |
| timer.pause(); |
|
|
| vi.advanceTimersByTime(2000); |
| expect(signal.aborted).toBe(false); |
|
|
| timer.resume(); |
| vi.advanceTimersByTime(400); |
| expect(signal.aborted).toBe(false); |
|
|
| vi.advanceTimersByTime(200); |
| expect(signal.aborted).toBe(true); |
| }); |
|
|
| it('should abort immediately when abort() is called', () => { |
| const timer = new DeadlineTimer(1000); |
| const signal = timer.signal; |
|
|
| timer.abort('cancelled'); |
| expect(signal.aborted).toBe(true); |
| expect(signal.reason).toBe('cancelled'); |
| }); |
|
|
| it('should not fire timeout if aborted manually', () => { |
| const timer = new DeadlineTimer(1000); |
| const signal = timer.signal; |
|
|
| timer.abort(); |
| vi.advanceTimersByTime(1000); |
| |
| expect(signal.aborted).toBe(true); |
| }); |
| }); |
|
|