58 lines
1.8 KiB
TypeScript
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)
|
|
})
|