Files
Thing/src/lib/calc.test.ts
T
2026-08-06 10:33:16 +08:00

58 lines
1.8 KiB
TypeScript

/**
* 表达式求值器单测(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)
})