Refine diffuser runtime and tests

This commit is contained in:
root
2026-03-31 14:26:08 +02:00
parent 22927d24c4
commit 3ccac81acf
6 changed files with 126 additions and 69 deletions

View File

@@ -1,3 +1,6 @@
const test = require('node:test');
const assert = require('node:assert/strict');
const Diffuser = require('../src/specificClass');
function makeConfig(overrides = {}) {
@@ -27,46 +30,51 @@ function makeConfig(overrides = {}) {
};
}
describe('diffuser specificClass', () => {
it('starts idle with zero production', () => {
const diffuser = new Diffuser(makeConfig());
test('diffuser starts idle with zero production', () => {
const diffuser = new Diffuser(makeConfig());
const output = diffuser.getOutput();
expect(diffuser.idle).toBe(true);
expect(diffuser.getOutput()).toEqual(expect.objectContaining({
oKgo2H: 0,
oPLoss: expect.any(Number),
}));
});
it('calculates oxygen transfer and pressure once airflow is applied', () => {
const diffuser = new Diffuser(makeConfig());
diffuser.setFlow(24);
const output = diffuser.getOutput();
expect(diffuser.idle).toBe(false);
expect(output.oFlowElement).toBeGreaterThan(0);
expect(output.oOtr).toBeGreaterThan(0);
expect(output.oPLoss).toBeGreaterThan(diffuser.o_p_water);
expect(output.oKgo2H).toBeGreaterThan(0);
});
it('increases total pressure when water height rises', () => {
const diffuser = new Diffuser(makeConfig());
diffuser.setFlow(24);
const lowHeadLoss = diffuser.getOutput().oPLoss;
diffuser.setWaterHeight(6);
const highHeadLoss = diffuser.getOutput().oPLoss;
expect(highHeadLoss).toBeGreaterThan(lowHeadLoss);
});
it('raises warnings and alarms when flow per element is too low', () => {
const diffuser = new Diffuser(makeConfig({ elements: 1, waterHeight: 3 }));
diffuser.setFlow(0.5);
expect(diffuser.warning.state).toBe(true);
expect(diffuser.alarm.state).toBe(true);
expect(diffuser.getStatus().fill).toBe('red');
});
assert.equal(diffuser.idle, true);
assert.equal(output.oKgo2H, 0);
assert.equal(typeof output.oPLoss, 'number');
});
test('diffuser calculates oxygen transfer and pressure once airflow is applied', () => {
const diffuser = new Diffuser(makeConfig());
diffuser.setFlow(24);
const output = diffuser.getOutput();
assert.equal(diffuser.idle, false);
assert.ok(output.oFlowElement > 0);
assert.ok(output.oOtr > 0);
assert.ok(output.oPLoss > diffuser.o_p_water);
assert.ok(output.oKgo2H > 0);
});
test('diffuser increases total pressure when water height rises', () => {
const diffuser = new Diffuser(makeConfig());
diffuser.setFlow(24);
const lowHeadLoss = diffuser.getOutput().oPLoss;
diffuser.setWaterHeight(6);
const highHeadLoss = diffuser.getOutput().oPLoss;
assert.ok(highHeadLoss > lowHeadLoss);
});
test('diffuser raises warnings and alarms when flow per element is too low', () => {
const diffuser = new Diffuser(makeConfig({ elements: 1, waterHeight: 3 }));
diffuser.setFlow(0.5);
assert.equal(diffuser.warning.state, true);
assert.equal(diffuser.alarm.state, true);
assert.equal(diffuser.getStatus().fill, 'red');
});
test('diffuser converts oxygen output to reactor OTR per zone volume', () => {
const diffuser = new Diffuser(makeConfig({ waterHeight: 4.5 }));
diffuser.setFlow(24);
const expected = diffuser.getOutput().oKgo2H * 1000 * 24 / 500;
assert.ok(Math.abs(diffuser.getReactorOtr(500) - expected) < 1e-8);
});