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