Files
SystemSimulationApp/frontend/tests/e2e/parameter-expression.spec.ts

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);
}
}
});