import pytest

from reflex.base import Base


@pytest.fixture
def child() -> Base:
    """A child class.

    Returns:
        A child class.
    """

    class Child(Base):
        num: float
        key: str

    return Child(num=3.14, key="pi")


def test_get_fields(child):
    """Test that the fields are set correctly.

    Args:
        child: A child class.
    """
    assert child.get_fields().keys() == {"num", "key"}


def test_set(child):
    """Test setting fields.

    Args:
        child: A child class.
    """
    child.set(num=1, key="a")
    assert child.num == 1
    assert child.key == "a"


def test_json(child):
    """Test converting to json.

    Args:
        child: A child class.
    """
    assert child.json().replace(" ", "") == '{"num":3.14,"key":"pi"}'


@pytest.fixture
def complex_child() -> Base:
    """A child class.

    Returns:
        A child class.
    """

    class Child(Base):
        num: float
        key: str
        name: str
        age: int
        active: bool

    return Child(num=3.14, key="pi", name="John Doe", age=30, active=True)


def test_complex_get_fields(complex_child):
    """Test that the fields are set correctly.

    Args:
        complex_child: A child class.
    """
    assert complex_child.get_fields().keys() == {"num", "key", "name", "age", "active"}


def test_complex_set(complex_child):
    """Test setting fields.

    Args:
        complex_child: A child class.
    """
    complex_child.set(num=1, key="a", name="Jane Doe", age=28, active=False)
    assert complex_child.num == 1
    assert complex_child.key == "a"
    assert complex_child.name == "Jane Doe"
    assert complex_child.age == 28
    assert complex_child.active is False


def test_complex_json(complex_child):
    """Test converting to json.

    Args:
        complex_child: A child class.
    """
    assert (
        complex_child.json().replace(" ", "")
        == '{"num":3.14,"key":"pi","name":"JohnDoe","age":30,"active":true}'
    )