This commit is contained in:
znetsixe
2026-03-11 11:13:05 +01:00
parent c60aa40666
commit 27a6d3c709
20 changed files with 1555 additions and 229 deletions

View File

@@ -13,6 +13,11 @@ test('MSE and RMSE calculations are correct', () => {
assert.ok(Math.abs(m.rootMeanSquaredError(predicted, measured) - Math.sqrt(5 / 3)) < 1e-9);
});
test('MSE throws for mismatched series lengths in strict mode', () => {
const m = new ErrorMetrics({}, makeLogger());
assert.throws(() => m.meanSquaredError([1, 2], [1]), /same length/);
});
test('normalizeUsingRealtime throws when range is zero', () => {
const m = new ErrorMetrics({}, makeLogger());
assert.throws(() => m.normalizeUsingRealtime([1, 1, 1], [1, 1, 1]), /Invalid process range/);
@@ -35,3 +40,17 @@ test('assessDrift returns expected result envelope', () => {
assert.ok('immediateLevel' in out);
assert.ok('longTermLevel' in out);
});
test('assessPoint keeps per-metric state and returns metric id', () => {
const m = new ErrorMetrics({}, makeLogger());
m.registerMetric('flow', { windowSize: 5, minSamplesForLongTerm: 3, strictValidation: true });
m.assessPoint('flow', 100, 99, { processMin: 0, processMax: 200, timestamp: Date.now() - 2000 });
m.assessPoint('flow', 101, 100, { processMin: 0, processMax: 200, timestamp: Date.now() - 1000 });
const out = m.assessPoint('flow', 102, 101, { processMin: 0, processMax: 200, timestamp: Date.now() });
assert.equal(out.metricId, 'flow');
assert.equal(out.valid, true);
assert.equal(typeof out.nrmse, 'number');
assert.equal(typeof out.sampleCount, 'number');
});