File: test_enum.py

package info (click to toggle)
python-asusrouter 1.21.3-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,856 kB
  • sloc: python: 20,497; makefile: 3
file content (116 lines) | stat: -rw-r--r-- 2,928 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
"""Tests for the enum tools."""

from enum import IntEnum, StrEnum
from typing import Any

import pytest

from asusrouter.tools.enum import FromIntMixin, FromStrMixin


class FakeStrEnum(FromStrMixin, StrEnum):
    """String-based enum for testing."""

    UNKNOWN = "unknown_value"
    FOO = "foo_value"
    BAR = "bar_value"


class FakeStrEnumNoUnknown(FromStrMixin, StrEnum):
    """String-based enum for testing without unknown."""

    FOO = "foo_value"
    BAR = "bar_value"


class FakeIntEnum(FromIntMixin, IntEnum):
    """Integer-based enum for testing."""

    UNKNOWN = -999
    ONE = 1
    TWO = 2


class FakeIntEnumNoUnknown(FromIntMixin, IntEnum):
    """Integer-based enum for testing without unknown."""

    ONE = 1
    TWO = 2


@pytest.mark.parametrize(
    ("value", "member"),
    [
        (FakeStrEnum.FOO, FakeStrEnum.FOO),
        ("unknown_value", FakeStrEnum.UNKNOWN),
        ("  foo_value  ", FakeStrEnum.FOO),
        ("foo", FakeStrEnum.FOO),
        ("  bar  ", FakeStrEnum.BAR),
        ("none", FakeStrEnum.UNKNOWN),
        (None, FakeStrEnum.UNKNOWN),
        (123, FakeStrEnum.UNKNOWN),
        (object(), FakeStrEnum.UNKNOWN),
    ],
    ids=[
        "actual_enum",
        "from_correct_value",
        "from_parsed_value",
        "from_correct_key",
        "from_parsed_key",
        "not_value_not_key",
        "not_a_string",
        "wrong_type",
        "object",
    ],
)
def test_fromstr(value: Any, member: FakeStrEnum) -> None:
    """Test string-based enum resolution."""

    assert FakeStrEnum.from_value(value) is member


def test_fromstr_no_unknown() -> None:
    """Test string-based enum resolution without unknowns."""

    with pytest.raises(ValueError, match="no `UNKNOWN` member is defined"):
        FakeStrEnumNoUnknown.from_value("unknown_value")


@pytest.mark.parametrize(
    ("value", "member"),
    [
        (FakeIntEnum.ONE, FakeIntEnum.ONE),
        (1, FakeIntEnum.ONE),
        ("2", FakeIntEnum.TWO),
        ("one", FakeIntEnum.ONE),
        ("  two  ", FakeIntEnum.TWO),
        ("three", FakeIntEnum.UNKNOWN),
        (4, FakeIntEnum.UNKNOWN),
        (None, FakeIntEnum.UNKNOWN),
        ((1,), FakeIntEnum.UNKNOWN),
        (object(), FakeIntEnum.UNKNOWN),
    ],
    ids=[
        "actual_enum",
        "from_correct_value",
        "from_parsed_value",
        "from_correct_key",
        "from_parsed_key",
        "value_does_not_exist",
        "not_value_not_key",
        "not_compatible",
        "wrong_type",
        "object",
    ],
)
def test_fromint(value: Any, member: FakeIntEnum) -> None:
    """Test integer-based enum resolution."""

    assert FakeIntEnum.from_value(value) is member


def test_fromint_no_unknown() -> None:
    """Test integer-based enum resolution without unknowns."""

    with pytest.raises(ValueError, match="no `UNKNOWN` member is defined"):
        FakeIntEnumNoUnknown.from_value("unknown_value")