41 lines
1.3 KiB
TypeScript
41 lines
1.3 KiB
TypeScript
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
|
|
import { aggregateWorkEffort, roundHalfHour } from './work-effort-engine';
|
|
|
|
test('roundHalfHour rounds to nearest half hour', () => {
|
|
assert.equal(roundHalfHour(0.24), 0);
|
|
assert.equal(roundHalfHour(0.25), 0.5);
|
|
assert.equal(roundHalfHour(1.24), 1);
|
|
assert.equal(roundHalfHour(1.25), 1.5);
|
|
});
|
|
|
|
test('aggregateWorkEffort calculates weighted progress by estimate', () => {
|
|
const result = aggregateWorkEffort([
|
|
{ estimateHours: 1, actualHours: 0, progress: 0 },
|
|
{ estimateHours: 3, actualHours: 1.25, progress: 100 },
|
|
]);
|
|
|
|
assert.equal(result.estimateHours, 4);
|
|
assert.equal(result.actualHours, 1.5);
|
|
assert.equal(result.progress, 75);
|
|
});
|
|
|
|
test('aggregateWorkEffort preserves sub-half-hour AI estimates', () => {
|
|
const result = aggregateWorkEffort([
|
|
{ estimateHours: 0.2, actualHours: 0, progress: 50 },
|
|
]);
|
|
|
|
assert.equal(result.estimateHours, 0.2);
|
|
assert.equal(result.progress, 50);
|
|
});
|
|
|
|
test('aggregateWorkEffort falls back to item average when estimates are zero', () => {
|
|
const result = aggregateWorkEffort([
|
|
{ estimateHours: 0, actualHours: 0, progress: 50 },
|
|
{ estimateHours: 0, actualHours: 0, progress: 100 },
|
|
]);
|
|
|
|
assert.equal(result.progress, 75);
|
|
});
|