111 lines
3.1 KiB
TypeScript
111 lines
3.1 KiB
TypeScript
import { Timer } from './timer.ts';
|
|
import * as cli from './cli.ts';
|
|
|
|
describe('Timer', () => {
|
|
beforeEach(() => {
|
|
vi.spyOn(cli.log, 'debug');
|
|
// Mock Date.now to have predictable timestamps
|
|
vi.useFakeTimers();
|
|
});
|
|
|
|
afterEach(() => {
|
|
vi.restoreAllMocks();
|
|
vi.useRealTimers();
|
|
});
|
|
|
|
describe('constructor', () => {
|
|
it('should initialize with current timestamp', () => {
|
|
const mockTime = 1000000;
|
|
vi.setSystemTime(mockTime);
|
|
|
|
const timer = new Timer();
|
|
timer.checkpoint('test');
|
|
|
|
expect(cli.log.debug).toHaveBeenCalledWith(
|
|
expect.stringContaining('test')
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('checkpoint', () => {
|
|
it('should log duration from initial timestamp on first checkpoint', () => {
|
|
const startTime = 1000000;
|
|
vi.setSystemTime(startTime);
|
|
const timer = new Timer();
|
|
|
|
const checkpointTime = startTime + 100;
|
|
vi.setSystemTime(checkpointTime);
|
|
timer.checkpoint('first');
|
|
|
|
expect(cli.log.debug).toHaveBeenCalledWith('» first: 100ms');
|
|
});
|
|
|
|
it('should log duration from last checkpoint on subsequent checkpoints', () => {
|
|
const startTime = 1000000;
|
|
vi.setSystemTime(startTime);
|
|
const timer = new Timer();
|
|
|
|
// First checkpoint
|
|
const firstCheckpointTime = startTime + 50;
|
|
vi.setSystemTime(firstCheckpointTime);
|
|
timer.checkpoint('first');
|
|
|
|
// Second checkpoint
|
|
const secondCheckpointTime = firstCheckpointTime + 75;
|
|
vi.setSystemTime(secondCheckpointTime);
|
|
timer.checkpoint('second');
|
|
|
|
expect(cli.log.debug).toHaveBeenCalledTimes(2);
|
|
expect(cli.log.debug).toHaveBeenNthCalledWith(1, '» first: 50ms');
|
|
expect(cli.log.debug).toHaveBeenNthCalledWith(2, '» second: 75ms');
|
|
});
|
|
|
|
it('should handle multiple checkpoints correctly', () => {
|
|
const startTime = 1000000;
|
|
vi.setSystemTime(startTime);
|
|
const timer = new Timer();
|
|
|
|
// First checkpoint
|
|
vi.setSystemTime(startTime + 10);
|
|
timer.checkpoint('step1');
|
|
|
|
// Second checkpoint
|
|
vi.setSystemTime(startTime + 25);
|
|
timer.checkpoint('step2');
|
|
|
|
// Third checkpoint
|
|
vi.setSystemTime(startTime + 45);
|
|
timer.checkpoint('step3');
|
|
|
|
expect(cli.log.debug).toHaveBeenCalledTimes(3);
|
|
expect(cli.log.debug).toHaveBeenNthCalledWith(1, '» step1: 10ms');
|
|
expect(cli.log.debug).toHaveBeenNthCalledWith(2, '» step2: 15ms');
|
|
expect(cli.log.debug).toHaveBeenNthCalledWith(3, '» step3: 20ms');
|
|
});
|
|
|
|
it('should handle zero duration correctly', () => {
|
|
const startTime = 1000000;
|
|
vi.setSystemTime(startTime);
|
|
const timer = new Timer();
|
|
|
|
// Checkpoint immediately
|
|
timer.checkpoint('immediate');
|
|
|
|
expect(cli.log.debug).toHaveBeenCalledWith('» immediate: 0ms');
|
|
});
|
|
|
|
it('should handle custom checkpoint names', () => {
|
|
const startTime = 1000000;
|
|
vi.setSystemTime(startTime);
|
|
const timer = new Timer();
|
|
|
|
vi.setSystemTime(startTime + 200);
|
|
timer.checkpoint('Custom Checkpoint Name');
|
|
|
|
expect(cli.log.debug).toHaveBeenCalledWith(
|
|
'» Custom Checkpoint Name: 200ms'
|
|
);
|
|
});
|
|
});
|
|
});
|