import pytest

from acpi_backlight.evaluate import evaluate_expression


@pytest.mark.parametrize(
    ("expr_str", "names", "expected"),
    [
        ("0", {}, 0),
        ("0.0", {}, 0),
        ("1.0", {}, 1),
        ("-1", {}, -1),
        ("0.1 + 0.2", {}, 0.3),
        ("0.3 - 0.2", {}, 0.1),
        ("0.2 * 3", {}, 0.6),
        ("0.6 / 3", {}, 0.2),
        ("0.6 / 3 + 0.1", {}, 0.3),
        ("(0.6 - 0.2) / 2", {}, 0.2),
        ("b", {"b": 0.4}, 0.4),
        ("-b", {"b": 0.3}, -0.3),
        ("0.1 + b", {"b": 0.2}, 0.3),
    ],
)
def test_evaluate_expression(expr_str, names, expected):
    assert expected == pytest.approx(evaluate_expression(expr_str, names))


@pytest.mark.parametrize(
    "expr_str",
    [
        'read("/proc/cpuinfo")',
        "os.exit(42)",
        'os.system("echo evil")',
        "0.__class__",
        "None.__class__",
        'eval("1")',
    ],
)
def test_evaluate_expression_fail(expr_str):
    with pytest.raises(Exception):
        evaluate_expression(expr_str, {})