/** * 表达式求值器单测(Node 内置 test runner)。 */ import { test } from 'node:test' import assert from 'node:assert/strict' import { evaluateExpression } from './calc.ts' test('四则运算与优先级', () => { assert.equal(evaluateExpression('1+2*3'), 7) assert.equal(evaluateExpression('2*(3+4)'), 14) assert.equal(evaluateExpression('10-2-3'), 5) }) test('除法与取模', () => { assert.equal(evaluateExpression('10/4'), 2.5) assert.equal(evaluateExpression('10%3'), 1) }) test('小数与边界写法', () => { assert.equal(evaluateExpression('0.1+0.2'), 0.30000000000000004) assert.equal(evaluateExpression('.5+.5'), 1) assert.equal(evaluateExpression('5.'), 5) }) test('一元正负号', () => { assert.equal(evaluateExpression('-5+3'), -2) assert.equal(evaluateExpression('-(2+3)'), -5) assert.equal(evaluateExpression('2*-3'), -6) assert.equal(evaluateExpression('+5'), 5) assert.equal(evaluateExpression('--5'), 5) }) test('括号嵌套', () => { assert.equal(evaluateExpression('(1+2)*(3+4)'), 21) assert.equal(evaluateExpression('((1+2))'), 3) }) test('空白容忍', () => { assert.equal(evaluateExpression(' 1 + 2 '), 3) assert.equal(evaluateExpression(' '), null) }) test('非法输入返回 null', () => { assert.equal(evaluateExpression(''), null) assert.equal(evaluateExpression('abc'), null) assert.equal(evaluateExpression('1/'), null) assert.equal(evaluateExpression('((1+2)'), null) assert.equal(evaluateExpression('1+2)'), null) assert.equal(evaluateExpression('1 2'), null) assert.equal(evaluateExpression('%3'), null) assert.equal(evaluateExpression('1.2.3'), null) }) test('非有限结果返回 null(除零)', () => { assert.equal(evaluateExpression('1/0'), null) assert.equal(evaluateExpression('5%0'), null) })