76 lines
3.0 KiB
JavaScript
76 lines
3.0 KiB
JavaScript
const test = require('node:test');
|
|
const assert = require('node:assert/strict');
|
|
|
|
const Machine = require('../../src/specificClass');
|
|
const { makeMachineConfig, makeStateConfig } = require('../helpers/factories');
|
|
|
|
test('flow drift is assessed with NRMSE and exposed in output', () => {
|
|
const machine = new Machine(makeMachineConfig(), makeStateConfig({ state: { current: 'operational' } }));
|
|
|
|
machine.updateMeasuredPressure(700, 'upstream', { timestamp: Date.now(), unit: 'mbar', childName: 'pt-up' });
|
|
machine.updateMeasuredPressure(1100, 'downstream', { timestamp: Date.now(), unit: 'mbar', childName: 'pt-down' });
|
|
machine.updatePosition();
|
|
|
|
const predictedFlow = machine.measurements
|
|
.type('flow')
|
|
.variant('predicted')
|
|
.position('downstream')
|
|
.getCurrentValue('m3/h');
|
|
|
|
for (let i = 0; i < 10; i += 1) {
|
|
machine.updateMeasuredFlow(predictedFlow * 0.92, 'downstream', {
|
|
timestamp: Date.now() + i,
|
|
unit: 'm3/h',
|
|
childName: 'ft-down',
|
|
});
|
|
}
|
|
|
|
const output = machine.getOutput();
|
|
assert.ok(Number.isFinite(output.flowNrmse));
|
|
assert.equal(typeof output.flowImmediateLevel, 'number');
|
|
assert.equal(typeof output.flowLongTermLevel, 'number');
|
|
assert.ok(['high', 'medium', 'low', 'invalid'].includes(output.predictionQuality));
|
|
assert.ok(Number.isFinite(output.predictionConfidence));
|
|
assert.equal(output.predictionPressureSource, 'differential');
|
|
assert.ok(Array.isArray(output.predictionFlags));
|
|
});
|
|
|
|
test('power drift is assessed when measured power is provided', () => {
|
|
const machine = new Machine(makeMachineConfig(), makeStateConfig({ state: { current: 'operational' } }));
|
|
|
|
machine.updateMeasuredPressure(700, 'upstream', { timestamp: Date.now(), unit: 'mbar', childName: 'pt-up' });
|
|
machine.updateMeasuredPressure(1100, 'downstream', { timestamp: Date.now(), unit: 'mbar', childName: 'pt-down' });
|
|
machine.updatePosition();
|
|
|
|
const predictedPower = machine.measurements
|
|
.type('power')
|
|
.variant('predicted')
|
|
.position('atEquipment')
|
|
.getCurrentValue('kW');
|
|
|
|
for (let i = 0; i < 10; i += 1) {
|
|
machine.updateMeasuredPower(predictedPower * 1.08, 'atEquipment', {
|
|
timestamp: Date.now() + i,
|
|
unit: 'kW',
|
|
childName: 'power-meter',
|
|
});
|
|
}
|
|
|
|
const output = machine.getOutput();
|
|
assert.ok(Number.isFinite(output.powerNrmse));
|
|
assert.equal(typeof output.powerImmediateLevel, 'number');
|
|
assert.equal(typeof output.powerLongTermLevel, 'number');
|
|
});
|
|
|
|
test('single-side pressure lowers prediction confidence category', () => {
|
|
const machine = new Machine(makeMachineConfig(), makeStateConfig({ state: { current: 'operational' } }));
|
|
machine.updateMeasuredPressure(950, 'downstream', { timestamp: Date.now(), unit: 'mbar', childName: 'pt-down' });
|
|
|
|
const output = machine.getOutput();
|
|
assert.equal(output.predictionPressureSource, 'downstream');
|
|
assert.ok(output.predictionConfidence < 0.9);
|
|
assert.equal(output.pressureDriftLevel, 1);
|
|
assert.ok(Array.isArray(output.predictionFlags));
|
|
assert.ok(output.predictionFlags.includes('single_side_pressure'));
|
|
});
|