const assert = require('node:assert/strict'); const test = require('node:test'); const { getProcessingDelay, isDangerousCommand, matchesOfficialSyntax, normalizeCommand } = require('../api/ezo-command-service'); test('accepts official calibration commands by sensor', () => { assert.equal(matchesOfficialSyntax('rtd', 'Cal,25.00'), true); assert.equal(matchesOfficialSyntax('ph', 'Cal,mid,7.00'), true); assert.equal(matchesOfficialSyntax('ph', 'Cal,low,4.00'), true); assert.equal(matchesOfficialSyntax('ph', 'Cal,high,10.00'), true); assert.equal(matchesOfficialSyntax('do', 'Cal'), true); assert.equal(matchesOfficialSyntax('do', 'Cal,0'), true); assert.equal(matchesOfficialSyntax('ec', 'Cal,dry'), true); assert.equal(matchesOfficialSyntax('ec', 'Cal,1413'), true); assert.equal(matchesOfficialSyntax('ec', 'Cal,low,12880'), true); assert.equal(matchesOfficialSyntax('ec', 'Cal,high,80000'), true); }); test('rejects commands assigned to the wrong sensor', () => { assert.equal(matchesOfficialSyntax('do', 'Cal,atm'), false); assert.equal(matchesOfficialSyntax('rtd', 'Cal,mid,7'), false); assert.equal(matchesOfficialSyntax('ph', 'Cal,dry'), false); assert.equal(matchesOfficialSyntax('rtd', 'T,25'), false); assert.equal(matchesOfficialSyntax('ec', 'K,0'), false); assert.equal(matchesOfficialSyntax('ec', 'K,10.3'), false); assert.equal(matchesOfficialSyntax('ec', 'TDS,0'), false); assert.equal(matchesOfficialSyntax('ec', 'TDS,1.01'), false); }); test('uses Atlas processing delays for critical commands', () => { assert.equal(getProcessingDelay('rtd', 'R'), 600); assert.equal(getProcessingDelay('ph', 'R'), 900); assert.equal(getProcessingDelay('do', 'R'), 600); assert.equal(getProcessingDelay('ec', 'R'), 600); assert.equal(getProcessingDelay('do', 'Cal'), 1300); assert.equal(getProcessingDelay('do', 'Cal,0'), 1300); assert.equal(getProcessingDelay('ph', 'Cal,mid,7'), 900); assert.equal(getProcessingDelay('ec', 'Cal,low,12880'), 600); assert.equal(getProcessingDelay('ec', 'K,1.0'), 600); assert.equal(getProcessingDelay('rtd', 'Status'), 300); }); test('accepts RTD data logger and memory commands from the datasheet', () => { assert.equal(matchesOfficialSyntax('rtd', 'D,1'), true); assert.equal(matchesOfficialSyntax('rtd', 'D,32000'), true); assert.equal(matchesOfficialSyntax('rtd', 'D,32001'), false); assert.equal(matchesOfficialSyntax('rtd', 'M'), true); assert.equal(matchesOfficialSyntax('rtd', 'M,?'), true); assert.equal(matchesOfficialSyntax('rtd', 'M,clear'), true); }); test('preserves the hexadecimal spacing required by Import', () => { const command = normalizeCommand(' Import, 59 6F 75 20 61 72 '); assert.equal(command, 'Import,59 6F 75 20 61 72'); assert.equal(matchesOfficialSyntax('ph', command), true); assert.equal(matchesOfficialSyntax('ph', 'Export,'), false); }); test('requires confirmation for destructive calibration and memory commands', () => { assert.equal(isDangerousCommand('Cal,clear'), true); assert.equal(isDangerousCommand('M,clear'), true); assert.equal(isDangerousCommand('Import,59 6F'), true); assert.equal(isDangerousCommand('Cal,mid,7'), false); });