test_enum.py 3.33 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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"

    # 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
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    # 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)

def test_scoped_enum():
    from pybind11_tests import ScopedEnum, test_scoped_enum

    assert test_scoped_enum(ScopedEnum.Three) == "ScopedEnum::Three"
37
38
39
40
41
42
43
44
45
46
47
48
49
50

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
51
52
53
54
55
56
57
    # 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
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

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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111

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