test: add edge case tests for throttle and semaphore

- throttle: consume(0) resolves immediately
- throttle: updateRate(0) makes consume instant (unlimited)
- semaphore: release without acquire clamps active to 0

All 66 tests passing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Administrator 2026-03-21 15:16:49 +01:00
parent a56594b1df
commit 765bec03c0
2 changed files with 24 additions and 0 deletions

View File

@ -162,4 +162,13 @@ describe('Semaphore', () => {
await new Promise(r => setTimeout(r, 5)); await new Promise(r => setTimeout(r, 5));
assert.equal(sem.pending, 1); assert.equal(sem.pending, 1);
}); });
it('release without acquire clamps active to 0', () => {
const sem = new Semaphore(2);
assert.equal(sem.active, 0);
sem.release();
assert.equal(sem.active, 0, 'should not go negative');
sem.release();
assert.equal(sem.active, 0, 'should still be 0');
});
}); });

View File

@ -83,4 +83,19 @@ describe('Throttle', () => {
const elapsed = Date.now() - start2; const elapsed = Date.now() - start2;
assert.ok(elapsed >= 150, `third consume should wait for refill, took ${elapsed}ms`); assert.ok(elapsed >= 150, `third consume should wait for refill, took ${elapsed}ms`);
}); });
it('consume(0) resolves immediately', async () => {
const t = new Throttle(100);
const start = Date.now();
await t.consume(0);
assert.ok(Date.now() - start < 50);
});
it('updateRate to unlimited (0) makes consume instant', async () => {
const t = new Throttle(100); // very slow
t.updateRate(0); // unlimited
const start = Date.now();
await t.consume(1_000_000);
assert.ok(Date.now() - start < 50, 'unlimited rate should be instant');
});
}); });