const test = require('node:test'); const assert = require('node:assert/strict'); const Diffuser = require('../src/specificClass'); function makeConfig(overrides = {}) { return { general: { name: 'Zone_1', logging: { enabled: false, logLevel: 'error', }, }, functionality: { softwareType: 'diffuser', role: 'aeration diffuser', }, diffuser: { number: 1, elements: 4, density: 2.4, waterHeight: 4.5, alfaFactor: 0.7, headerPressure: 0, localAtmPressure: 1013.25, waterDensity: 997, ...overrides, }, }; } test('diffuser starts idle with zero production', () => { const diffuser = new Diffuser(makeConfig()); const output = diffuser.getOutput(); 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); });