test_enum.py 4.05 KB
Newer Older
1
2
3
4
5
6
7
8
9
import pytest


def test_unscoped_enum():
    from pybind11_tests import UnscopedEnum, EOne

    assert str(UnscopedEnum.EOne) == "UnscopedEnum.EOne"
    assert str(UnscopedEnum.ETwo) == "UnscopedEnum.ETwo"
    assert str(EOne) == "UnscopedEnum.EOne"
10
11
12
13
14
15
16
17
18
    # __members__ property
    assert UnscopedEnum.__members__ == {"EOne": UnscopedEnum.EOne, "ETwo": UnscopedEnum.ETwo}
    # __members__ readonly
    with pytest.raises(AttributeError):
        UnscopedEnum.__members__ = {}
    # __members__ returns a copy
    foo = UnscopedEnum.__members__
    foo["bar"] = "baz"
    assert UnscopedEnum.__members__ == {"EOne": UnscopedEnum.EOne, "ETwo": UnscopedEnum.ETwo}
19
20
21
22
23
24
25
26
27

    # no TypeError exception for unscoped enum ==/!= int comparisons
    y = UnscopedEnum.ETwo
    assert y == 2
    assert y != 3

    assert int(UnscopedEnum.ETwo) == 2
    assert str(UnscopedEnum(2)) == "UnscopedEnum.ETwo"

Pim Schellart's avatar
Pim Schellart committed
28
29
30
31
32
33
34
35
36
37
38
39
40
41
    # order
    assert UnscopedEnum.EOne < UnscopedEnum.ETwo
    assert UnscopedEnum.EOne < 2
    assert UnscopedEnum.ETwo > UnscopedEnum.EOne
    assert UnscopedEnum.ETwo > 1
    assert UnscopedEnum.ETwo <= 2
    assert UnscopedEnum.ETwo >= 2
    assert UnscopedEnum.EOne <= UnscopedEnum.ETwo
    assert UnscopedEnum.EOne <= 2
    assert UnscopedEnum.ETwo >= UnscopedEnum.EOne
    assert UnscopedEnum.ETwo >= 1
    assert not (UnscopedEnum.ETwo < UnscopedEnum.EOne)
    assert not (2 < UnscopedEnum.EOne)

42
43
44
45
46
47
48
49
50
51
52
53
54
55

def test_scoped_enum():
    from pybind11_tests import ScopedEnum, test_scoped_enum

    assert test_scoped_enum(ScopedEnum.Three) == "ScopedEnum::Three"
    z = ScopedEnum.Two
    assert test_scoped_enum(z) == "ScopedEnum::Two"

    # expected TypeError exceptions for scoped enum ==/!= int comparisons
    with pytest.raises(TypeError):
        assert z == 2
    with pytest.raises(TypeError):
        assert z != 3

Pim Schellart's avatar
Pim Schellart committed
56
57
58
59
60
61
62
    # order
    assert ScopedEnum.Two < ScopedEnum.Three
    assert ScopedEnum.Three > ScopedEnum.Two
    assert ScopedEnum.Two <= ScopedEnum.Three
    assert ScopedEnum.Two <= ScopedEnum.Two
    assert ScopedEnum.Two >= ScopedEnum.Two
    assert ScopedEnum.Three >= ScopedEnum.Two
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
def test_implicit_conversion():
    from pybind11_tests import ClassWithUnscopedEnum

    assert str(ClassWithUnscopedEnum.EMode.EFirstMode) == "EMode.EFirstMode"
    assert str(ClassWithUnscopedEnum.EFirstMode) == "EMode.EFirstMode"

    f = ClassWithUnscopedEnum.test_function
    first = ClassWithUnscopedEnum.EFirstMode
    second = ClassWithUnscopedEnum.ESecondMode

    assert f(first) == 1

    assert f(first) == f(first)
    assert not f(first) != f(first)

    assert f(first) != f(second)
    assert not f(first) == f(second)

    assert f(first) == int(f(first))
    assert not f(first) != int(f(first))

    assert f(first) != int(f(second))
    assert not f(first) == int(f(second))

    # noinspection PyDictCreation
    x = {f(first): 1, f(second): 2}
    x[f(first)] = 3
    x[f(second)] = 4
    # Hashing test
    assert str(x) == "{EMode.EFirstMode: 3, EMode.ESecondMode: 4}"
Pim Schellart's avatar
Pim Schellart committed
95

96

Pim Schellart's avatar
Pim Schellart committed
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
def test_binary_operators():
    from pybind11_tests import Flags

    assert int(Flags.Read) == 4
    assert int(Flags.Write) == 2
    assert int(Flags.Execute) == 1
    assert int(Flags.Read | Flags.Write | Flags.Execute) == 7
    assert int(Flags.Read | Flags.Write) == 6
    assert int(Flags.Read | Flags.Execute) == 5
    assert int(Flags.Write | Flags.Execute) == 3
    assert int(Flags.Write | 1) == 3

    state = Flags.Read | Flags.Write
    assert (state & Flags.Read) != 0
    assert (state & Flags.Write) != 0
    assert (state & Flags.Execute) == 0
    assert (state & 1) == 0

    state2 = ~state
    assert state2 == -7
    assert int(state ^ state2) == -1
118
119
120
121
122
123
124
125
126
127
128

def test_enum_to_int():
    from pybind11_tests import Flags, ClassWithUnscopedEnum
    from pybind11_tests import test_enum_to_int, test_enum_to_uint, test_enum_to_long_long

    test_enum_to_int(Flags.Read)
    test_enum_to_int(ClassWithUnscopedEnum.EMode.EFirstMode)
    test_enum_to_uint(Flags.Read)
    test_enum_to_uint(ClassWithUnscopedEnum.EMode.EFirstMode)
    test_enum_to_long_long(Flags.Read)
    test_enum_to_long_long(ClassWithUnscopedEnum.EMode.EFirstMode)