const EventEmitter = require('node:events'); function makeUiConfig(overrides = {}) { return { name: 'reactor-test', reactor_type: 'CSTR', volume: 100, length: 10, resolution_L: 5, alpha: 0, n_inlets: 1, kla: NaN, S_O_init: 0, S_I_init: 30, S_S_init: 100, S_NH_init: 16, S_N2_init: 0, S_NO_init: 0, S_HCO_init: 5, X_I_init: 25, X_S_init: 75, X_H_init: 30, X_STO_init: 0, X_A_init: 0.001, X_TS_init: 125, timeStep: 1, enableLog: false, logLevel: 'error', positionVsParent: 'atEquipment', ...overrides, }; } function makeReactorConfig(overrides = {}) { const ui = makeUiConfig(overrides); return { general: { id: 'reactor-node-1', name: ui.name, unit: null, logging: { enabled: ui.enableLog, logLevel: ui.logLevel, }, }, functionality: { positionVsParent: ui.positionVsParent || 'atEquipment', softwareType: 'reactor', }, reactor_type: ui.reactor_type, volume: Number(ui.volume), length: Number(ui.length), resolution_L: Number(ui.resolution_L), alpha: Number(ui.alpha), n_inlets: Number(ui.n_inlets), kla: Number(ui.kla), initialState: [ Number(ui.S_O_init), Number(ui.S_I_init), Number(ui.S_S_init), Number(ui.S_NH_init), Number(ui.S_N2_init), Number(ui.S_NO_init), Number(ui.S_HCO_init), Number(ui.X_I_init), Number(ui.X_S_init), Number(ui.X_H_init), Number(ui.X_STO_init), Number(ui.X_A_init), Number(ui.X_TS_init), ], timeStep: Number(ui.timeStep), }; } function makeNodeStub() { const handlers = {}; const sent = []; const warns = []; const errors = []; const statuses = []; return { id: 'reactor-node-1', source: null, on(event, cb) { handlers[event] = cb; }, send(msg) { sent.push(msg); }, warn(msg) { warns.push(msg); }, error(msg) { errors.push(msg); }, status(msg) { statuses.push(msg); }, _handlers: handlers, _sent: sent, _warns: warns, _errors: errors, _statuses: statuses, }; } function makeREDStub(nodeMap = {}) { return { nodes: { getNode(id) { return nodeMap[id] || null; }, createNode() {}, registerType() {}, }, httpAdmin: { get() {}, }, }; } function makeMeasurementChild({ id = 'measurement-1', name = 'temp-sensor-1', distance = 'atEquipment', positionVsParent = 'atEquipment', type = 'temperature', } = {}) { return { config: { general: { id, name }, functionality: { distance, positionVsParent, softwareType: 'measurement' }, asset: { type }, }, measurements: { emitter: new EventEmitter(), }, }; } module.exports = { makeUiConfig, makeReactorConfig, makeNodeStub, makeREDStub, makeMeasurementChild, };