import pytest

from genesis.persona.persona import Persona


def test_create_and_derive_behavior():
    p = Persona(name="林动", age=28, mbti="INTP", occupation="programmer", hobbies=["coding"])
    assert p.behavior.social_initiative < 0.5  # I
    assert p.behavior.novelty_seeking > 0.5  # N


def test_from_dict_ignores_unknown_fields():
    p = Persona.from_dict(
        {"name": "Alice", "age": 30, "mbti": "ESFJ", "occupation": "cook", "extra": 123}
    )
    assert p.name == "Alice"
    assert p.behavior.agreeableness > 0.5  # F


def test_relationships_preserved():
    p = Persona.from_dict(
        {
            "name": "Bob",
            "age": 40,
            "mbti": "ENTJ",
            "occupation": "mayor",
            "relationships": {"Alice": "妻子"},
        }
    )
    assert p.relationships["Alice"] == "妻子"


@pytest.mark.parametrize(
    "bad",
    [
        {"name": "", "age": 30, "mbti": "INTP", "occupation": "x"},
        {"name": "A", "age": 0, "mbti": "INTP", "occupation": "x"},
        {"name": "A", "age": 200, "mbti": "INTP", "occupation": "x"},
        {"name": "A", "age": 30, "mbti": "ZZZZ", "occupation": "x"},
        {"name": "A", "age": 30, "mbti": "INTP", "occupation": ""},
    ],
)
def test_validation_rejects_bad_input(bad):
    with pytest.raises(ValueError):
        Persona.from_dict(bad)
