import test from 'node:test'; import assert from 'node:assert/strict'; import { TokenRateWindow } from '../src/token-rate.mjs'; test('token rate excludes prefill and waits for a measurable decode interval', () => { const meter = new TokenRateWindow(); assert.equal(meter.rate(5000), null); meter.add(1, 5000); assert.equal(meter.rate(5100), null); meter.add(8, 5250); assert.equal(meter.rate(5250), 32); meter.add(8, 5500); assert.equal(meter.rate(5500), 32); }); test('rolling rate follows recent throughput, decays during stalls and keeps bounded history', () => { const meter = new TokenRateWindow(); meter.add(1, 0); for (let at = 100; at <= 1000; at += 100) meter.add(4, at); assert.equal(meter.rate(1000), 40); assert.equal(meter.rate(1500), 20); assert.equal(meter.rate(2000), 0); meter.add(5, 2100); assert.equal(meter.rate(2100), 5); for (let at = 2200; at <= 100000; at += 100) meter.add(1, at); assert.equal(meter.rate(100000), 10); assert(meter.points.length <= 11); assert.equal(new TokenRateWindow().rate(100000), null); });