84 lines
3.1 KiB
JavaScript
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);
|