"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const vitest_1 = require("vitest");
const if_expr_evaluator_1 = require("../if-expr-evaluator");
const if_expr_parser_1 = require("../if-expr-parser");
function evalStr(src, scope) {
    return (0, if_expr_evaluator_1.evaluateIfExpr)((0, if_expr_parser_1.parseIfExpr)(src), scope);
}
(0, vitest_1.describe)('evaluateIfExpr', () => {
    (0, vitest_1.it)('字面量 true / false', () => {
        (0, vitest_1.expect)(evalStr('true', {})).toBe(true);
        (0, vitest_1.expect)(evalStr('false', {})).toBe(false);
    });
    (0, vitest_1.it)('变量为 true', () => {
        (0, vitest_1.expect)(evalStr('x', { x: true })).toBe(true);
        (0, vitest_1.expect)(evalStr('x', { x: false })).toBe(false);
    });
    (0, vitest_1.it)('未定义变量当 null 处理', () => {
        (0, vitest_1.expect)(evalStr('x == null', {})).toBe(true);
        (0, vitest_1.expect)(evalStr('x == true', {})).toBe(false);
    });
    (0, vitest_1.it)('null 安全比较：x == null / null == null', () => {
        (0, vitest_1.expect)(evalStr('x == null', { x: null })).toBe(true);
        (0, vitest_1.expect)(evalStr('x != null', { x: 5 })).toBe(true);
    });
    (0, vitest_1.it)('null 与非 null 比较返 false（不抛错）', () => {
        (0, vitest_1.expect)(evalStr('x == true', { x: null })).toBe(false);
        (0, vitest_1.expect)(evalStr('x > 5', { x: null })).toBe(false);
        (0, vitest_1.expect)(evalStr('x < 5', { x: null })).toBe(false);
    });
    (0, vitest_1.it)('类型不匹配返 false（不抛错）', () => {
        (0, vitest_1.expect)(evalStr('"abc" > 5', {})).toBe(false);
        (0, vitest_1.expect)(evalStr('true == 1', {})).toBe(false);
    });
    (0, vitest_1.it)('数字比较', () => {
        (0, vitest_1.expect)(evalStr('x > 5', { x: 10 })).toBe(true);
        (0, vitest_1.expect)(evalStr('x > 5', { x: 3 })).toBe(false);
        (0, vitest_1.expect)(evalStr('x >= 5', { x: 5 })).toBe(true);
        (0, vitest_1.expect)(evalStr('x <= 5', { x: 5 })).toBe(true);
    });
    (0, vitest_1.it)('字符串相等', () => {
        (0, vitest_1.expect)(evalStr('s == "hello"', { s: 'hello' })).toBe(true);
        (0, vitest_1.expect)(evalStr('s == "world"', { s: 'hello' })).toBe(false);
    });
    (0, vitest_1.it)('AND 短路', () => {
        (0, vitest_1.expect)(evalStr('true && true', {})).toBe(true);
        (0, vitest_1.expect)(evalStr('true && false', {})).toBe(false);
        (0, vitest_1.expect)(evalStr('false && true', {})).toBe(false);
    });
    (0, vitest_1.it)('null && x → false（null 视为 falsy）', () => {
        (0, vitest_1.expect)(evalStr('x && true', { x: null })).toBe(false);
    });
    (0, vitest_1.it)('OR 短路 + null || x', () => {
        (0, vitest_1.expect)(evalStr('false || true', {})).toBe(true);
        // spec §5.4: null || x → 视 null 为 falsy，返 x（如果 x truthy 才返 true）
        (0, vitest_1.expect)(evalStr('x || true', { x: null })).toBe(true);
        (0, vitest_1.expect)(evalStr('x || false', { x: null })).toBe(false);
    });
    (0, vitest_1.it)('用户例子：has_error == true（null 时返 false 走 else 分支）', () => {
        (0, vitest_1.expect)(evalStr('has_error == true', { has_error: null })).toBe(false);
        (0, vitest_1.expect)(evalStr('has_error == true', { has_error: true })).toBe(true);
        (0, vitest_1.expect)(evalStr('has_error == true', { has_error: false })).toBe(false);
    });
});
//# sourceMappingURL=if-expr-evaluator.test.js.map