43 lines
1.3 KiB
TypeScript
43 lines
1.3 KiB
TypeScript
import { expect, test } from "@playwright/test";
|
|
|
|
import { evaluateParameterExpression } from "../../src/parameterExpression";
|
|
|
|
function expectExpressionValue(expression: string, expected: number) {
|
|
const result = evaluateParameterExpression(expression);
|
|
expect(result.ok, result.ok ? undefined : result.message).toBe(true);
|
|
if (result.ok) {
|
|
expect(result.value).toBeCloseTo(expected, 10);
|
|
}
|
|
}
|
|
|
|
test("安全解析 AMESim 风格的算术、幂与科学计数等式", () => {
|
|
expectExpressionValue("=3.14*10^2/4", 78.5);
|
|
expectExpressionValue("(2+3)*4", 20);
|
|
expectExpressionValue("2^3^2", 512);
|
|
expectExpressionValue("-2^2", -4);
|
|
expectExpressionValue("2.5E-3", 0.0025);
|
|
});
|
|
|
|
test("支持有限的数学常量与白名单函数", () => {
|
|
expectExpressionValue("sqrt(16)+abs(-2)", 6);
|
|
expectExpressionValue("sin(pi/2)+ln(e)", 2);
|
|
expectExpressionValue("max(1, 5, 3)+pow(2, 3)", 13);
|
|
});
|
|
|
|
test("拒绝除零、非法定义域、未知变量和任意代码", () => {
|
|
for (const expression of [
|
|
"1/0",
|
|
"sqrt(-1)",
|
|
"unknown+1",
|
|
"window.alert(1)",
|
|
"1+*2",
|
|
"1e309",
|
|
]) {
|
|
const result = evaluateParameterExpression(expression);
|
|
expect(result.ok, expression).toBe(false);
|
|
if (!result.ok) {
|
|
expect(result.message.length).toBeGreaterThan(0);
|
|
}
|
|
}
|
|
});
|