"""calculator 模块的 pytest 测试用例。

演示要点：
1. 基本断言            -> test_add / test_subtract / test_multiply
2. 异常断言            -> test_divide_by_zero
3. 参数化（一组数据跑多次） -> test_is_even
4. fixture（共享前置数据） -> calc_data
"""

import pytest
from src.calculator import add, divide, is_even, multiply, subtract


# ---------- 1. 基本断言 ----------
def test_add():
    assert add(2, 3) == 5
    assert add(-1, 1) == 0


def test_subtract():
    assert subtract(10, 4) == 6


def test_multiply():
    assert multiply(3, 4) == 12


# ---------- 2. 异常断言 ----------
def test_divide():
    assert divide(10, 2) == 5


def test_divide_by_zero():
    # 期望抛出 ValueError，并校验错误信息
    with pytest.raises(ValueError, match="除数不能为 0"):
        divide(1, 0)


# ---------- 3. 参数化 ----------
@pytest.mark.parametrize(
    "number, expected",
    [
        (2, True),
        (3, False),
        (0, True),
        (-4, True),
        (7, False),
    ],
)
def test_is_even(number, expected):
    assert is_even(number) == expected


# ---------- 4. fixture ----------
@pytest.fixture
def calc_data():
    """提供一组共享的测试数据。"""
    return {"a": 8, "b": 2}


def test_with_fixture(calc_data):
    assert add(calc_data["a"], calc_data["b"]) == 10
    assert divide(calc_data["a"], calc_data["b"]) == 4
