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