45 lines
2.0 KiB
JavaScript
45 lines
2.0 KiB
JavaScript
|
|
'use strict';
|
||
|
|
|
||
|
|
// Locks in the contract that `config.timeStep` is interpreted as SECONDS by
|
||
|
|
// the reactor kinetics engine. Before 2026-05-19 the schema labelled the field
|
||
|
|
// `unit: "h"` while reactor.html labelled it `[s]` and baseEngine divided by
|
||
|
|
// 86400 (seconds-per-day) to convert to internal days. A 0.001 schema default
|
||
|
|
// — read as hours — would have produced a 3.6 s step; read as seconds it is a
|
||
|
|
// 1 ms step. The fix aligned the schema to seconds. This test prevents the
|
||
|
|
// drift from reappearing.
|
||
|
|
|
||
|
|
const test = require('node:test');
|
||
|
|
const assert = require('node:assert/strict');
|
||
|
|
|
||
|
|
const { Reactor_CSTR } = require('../../src/specificClass');
|
||
|
|
const { makeReactorConfig } = require('../helpers/factories');
|
||
|
|
|
||
|
|
const SECONDS_PER_DAY = 24 * 60 * 60;
|
||
|
|
|
||
|
|
function makeEngine(timeStepSeconds) {
|
||
|
|
return new Reactor_CSTR(makeReactorConfig({ reactor_type: 'CSTR', n_inlets: 1, timeStep: timeStepSeconds }));
|
||
|
|
}
|
||
|
|
|
||
|
|
test('engine stores timeStep in days, treating input as seconds', () => {
|
||
|
|
const eng = makeEngine(1);
|
||
|
|
assert.ok(Math.abs(eng.timeStep - 1 / SECONDS_PER_DAY) < 1e-15,
|
||
|
|
`engine.timeStep should be 1/86400 days for a 1-second config; got ${eng.timeStep}`);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('engine timeStep scales linearly with config.timeStep (seconds in)', () => {
|
||
|
|
const a = makeEngine(1);
|
||
|
|
const b = makeEngine(10);
|
||
|
|
assert.ok(Math.abs(b.timeStep - 10 * a.timeStep) < 1e-15,
|
||
|
|
'engine.timeStep must scale linearly with config.timeStep; broke the seconds→days conversion');
|
||
|
|
});
|
||
|
|
|
||
|
|
test('schema default for timeStep matches the seconds convention', () => {
|
||
|
|
const path = require('node:path');
|
||
|
|
const gfRoot = path.dirname(require.resolve('generalFunctions'));
|
||
|
|
const schema = require(path.join(gfRoot, 'src/configs/reactor.json'));
|
||
|
|
assert.equal(schema.reactor.timeStep.rules.unit, 's',
|
||
|
|
'schema timeStep.unit must be "s" — engine treats input as seconds');
|
||
|
|
assert.equal(schema.reactor.timeStep.default, 1,
|
||
|
|
'schema timeStep.default must be 1 (1 second), matching reactor.html');
|
||
|
|
});
|