Files
calculator/web/engine.test.js

84 lines
3.1 KiB
JavaScript

"use strict";
/* Паритет-тест JS-движка против Python: одинаковые выражения -> одинаковые результаты/ошибки. */
const Calc = require("./engine.js");
const cases = [
"2 + 3 * (4 - 1)", // 11
"-5 + +3", // -2
"2 ** 3 ** 2", // 512 (правосторонняя)
"50%", // 0.5
"2 * 50 %", // 1
"7 % 3", // 1
"-7 % 3", // 2 (floor-остаток как в Python)
"10 // 3", // 3
"-10 // 3", // -4
"1e3 + 2.5E-4", // 1000.00025
"1_000_000", // 1000000
"pi", "PI", "e", "tau", "inf",
"round(2.567, 2)", // 2.57
"round(2.5)", // 2 (банковское)
"round(3.5)", // 4
"sqrt(3**2+4**2)", // 5
"ln(e)", "log(8, 2)", "log2(1024)", "log10(1000)",
"0.1 + 0.2", // 0.3 (формат .12g)
"abs(-42)", "floor(-1.5)", "ceil(1.5)",
"sin(0)", "cos(0)", "atan(1)",
"ans", // требует env
"1 / 0", // ошибка
"sqrt(-1)", // ошибка
"(2 + 3", // ошибка
"foo + 1", // ошибка
"sqrt 4", // ошибка
"sqrt(1, 2)", // ошибка
"sqrt()", // ошибка
"2 & 3", // ошибка
"", // ошибка (пустое)
];
const envCases = [["1 + ans", { ans: 41 }], ["e", { e: 1.0 }]];
let fail = 0;
for (const c of cases) {
let js;
try { js = Calc.format(Calc.evaluate(c, { ans: 42 })); }
catch (e) { js = "ERR:" + e.message; }
console.log(JSON.stringify(c) + " -> " + js);
}
for (const [c, env] of envCases) {
let js;
try { js = Calc.format(Calc.evaluate(c, env)); }
catch (e) { js = "ERR:" + e.message; }
console.log(JSON.stringify(c) + " env=" + JSON.stringify(env) + " -> " + js);
}
// жёсткие проверки ожидаемого
const expect = {
"2 + 3 * (4 - 1)": "11",
"2 ** 3 ** 2": "512",
"-7 % 3": "2",
"-10 // 3": "-4",
"0.1 + 0.2": "0.3",
"round(2.5)": "2",
"round(3.5)": "4",
"round(2.567, 2)": "2.57",
"2 * 50 %": "1",
"1e3 + 2.5E-4": "1000.00025",
};
for (const [c, want] of Object.entries(expect)) {
let got;
try { got = Calc.format(Calc.evaluate(c, {})); }
catch (e) { got = "ERR:" + e.message; }
if (got !== want) { console.log(`MISMATCH ${c}: want ${want}, got ${got}`); fail++; }
}
const errCases = ["1 / 0", "sqrt(-1)", "(2 + 3", "foo + 1", "sqrt 4", "sqrt(1, 2)", "sqrt()", "2 & 3", ""];
for (const c of errCases) {
try { Calc.evaluate(c, {}); console.log(`SHOULD-THROW: ${JSON.stringify(c)}`); fail++; }
catch (e) { /* ok */ }
}
// env override
if (Calc.format(Calc.evaluate("1 + ans", { ans: 41 })) !== "42") { console.log("ans env broken"); fail++; }
if (Calc.format(Calc.evaluate("e", { e: 1.0 })) !== "1") { console.log("env-over-const broken"); fail++; }
console.log(fail === 0 ? "PARITY OK" : `PARITY FAIL: ${fail}`);
process.exit(fail === 0 ? 0 : 1);