Scarab  v2.11.1
Project 8 C++ Utility Library
test_enum.py
Go to the documentation of this file.
1 import pytest
2 from pybind11_tests import enums as m
3 
4 
6  assert str(m.UnscopedEnum.EOne) == "UnscopedEnum.EOne"
7  assert str(m.UnscopedEnum.ETwo) == "UnscopedEnum.ETwo"
8  assert str(m.EOne) == "UnscopedEnum.EOne"
9 
10  # name property
11  assert m.UnscopedEnum.EOne.name == "EOne"
12  assert m.UnscopedEnum.ETwo.name == "ETwo"
13  assert m.EOne.name == "EOne"
14  # name readonly
15  with pytest.raises(AttributeError):
16  m.UnscopedEnum.EOne.name = ""
17  # name returns a copy
18  foo = m.UnscopedEnum.EOne.name
19  foo = "bar"
20  assert m.UnscopedEnum.EOne.name == "EOne"
21 
22  # __members__ property
23  assert m.UnscopedEnum.__members__ == \
24  {"EOne": m.UnscopedEnum.EOne, "ETwo": m.UnscopedEnum.ETwo}
25  # __members__ readonly
26  with pytest.raises(AttributeError):
27  m.UnscopedEnum.__members__ = {}
28  # __members__ returns a copy
29  foo = m.UnscopedEnum.__members__
30  foo["bar"] = "baz"
31  assert m.UnscopedEnum.__members__ == \
32  {"EOne": m.UnscopedEnum.EOne, "ETwo": m.UnscopedEnum.ETwo}
33 
34  assert m.UnscopedEnum.__doc__ == \
35  '''An unscoped enumeration
36 
37 Members:
38 
39  EOne : Docstring for EOne
40 
41  ETwo : Docstring for ETwo''' or m.UnscopedEnum.__doc__ == \
42  '''An unscoped enumeration
43 
44 Members:
45 
46  ETwo : Docstring for ETwo
47 
48  EOne : Docstring for EOne'''
49 
50  # Unscoped enums will accept ==/!= int comparisons
51  y = m.UnscopedEnum.ETwo
52  assert y == 2
53  assert 2 == y
54  assert y != 3
55  assert 3 != y
56 
57  assert int(m.UnscopedEnum.ETwo) == 2
58  assert str(m.UnscopedEnum(2)) == "UnscopedEnum.ETwo"
59 
60  # order
61  assert m.UnscopedEnum.EOne < m.UnscopedEnum.ETwo
62  assert m.UnscopedEnum.EOne < 2
63  assert m.UnscopedEnum.ETwo > m.UnscopedEnum.EOne
64  assert m.UnscopedEnum.ETwo > 1
65  assert m.UnscopedEnum.ETwo <= 2
66  assert m.UnscopedEnum.ETwo >= 2
67  assert m.UnscopedEnum.EOne <= m.UnscopedEnum.ETwo
68  assert m.UnscopedEnum.EOne <= 2
69  assert m.UnscopedEnum.ETwo >= m.UnscopedEnum.EOne
70  assert m.UnscopedEnum.ETwo >= 1
71  assert not (m.UnscopedEnum.ETwo < m.UnscopedEnum.EOne)
72  assert not (2 < m.UnscopedEnum.EOne)
73 
74 
76  assert m.test_scoped_enum(m.ScopedEnum.Three) == "ScopedEnum::Three"
77  z = m.ScopedEnum.Two
78  assert m.test_scoped_enum(z) == "ScopedEnum::Two"
79 
80  # Scoped enums will *NOT* accept ==/!= int comparisons (Will always return False)
81  assert not z == 3
82  assert not 3 == z
83  assert z != 3
84  assert 3 != z
85  # Scoped enums will *NOT* accept >, <, >= and <= int comparisons (Will throw exceptions)
86  with pytest.raises(TypeError):
87  z > 3
88  with pytest.raises(TypeError):
89  z < 3
90  with pytest.raises(TypeError):
91  z >= 3
92  with pytest.raises(TypeError):
93  z <= 3
94 
95  # order
96  assert m.ScopedEnum.Two < m.ScopedEnum.Three
97  assert m.ScopedEnum.Three > m.ScopedEnum.Two
98  assert m.ScopedEnum.Two <= m.ScopedEnum.Three
99  assert m.ScopedEnum.Two <= m.ScopedEnum.Two
100  assert m.ScopedEnum.Two >= m.ScopedEnum.Two
101  assert m.ScopedEnum.Three >= m.ScopedEnum.Two
102 
103 
105  assert str(m.ClassWithUnscopedEnum.EMode.EFirstMode) == "EMode.EFirstMode"
106  assert str(m.ClassWithUnscopedEnum.EFirstMode) == "EMode.EFirstMode"
107 
108  f = m.ClassWithUnscopedEnum.test_function
109  first = m.ClassWithUnscopedEnum.EFirstMode
110  second = m.ClassWithUnscopedEnum.ESecondMode
111 
112  assert f(first) == 1
113 
114  assert f(first) == f(first)
115  assert not f(first) != f(first)
116 
117  assert f(first) != f(second)
118  assert not f(first) == f(second)
119 
120  assert f(first) == int(f(first))
121  assert not f(first) != int(f(first))
122 
123  assert f(first) != int(f(second))
124  assert not f(first) == int(f(second))
125 
126  # noinspection PyDictCreation
127  x = {f(first): 1, f(second): 2}
128  x[f(first)] = 3
129  x[f(second)] = 4
130  # Hashing test
131  assert str(x) == "{EMode.EFirstMode: 3, EMode.ESecondMode: 4}"
132 
133 
135  assert int(m.Flags.Read) == 4
136  assert int(m.Flags.Write) == 2
137  assert int(m.Flags.Execute) == 1
138  assert int(m.Flags.Read | m.Flags.Write | m.Flags.Execute) == 7
139  assert int(m.Flags.Read | m.Flags.Write) == 6
140  assert int(m.Flags.Read | m.Flags.Execute) == 5
141  assert int(m.Flags.Write | m.Flags.Execute) == 3
142  assert int(m.Flags.Write | 1) == 3
143 
144  state = m.Flags.Read | m.Flags.Write
145  assert (state & m.Flags.Read) != 0
146  assert (state & m.Flags.Write) != 0
147  assert (state & m.Flags.Execute) == 0
148  assert (state & 1) == 0
149 
150  state2 = ~state
151  assert state2 == -7
152  assert int(state ^ state2) == -1
153 
154 
156  m.test_enum_to_int(m.Flags.Read)
157  m.test_enum_to_int(m.ClassWithUnscopedEnum.EMode.EFirstMode)
158  m.test_enum_to_uint(m.Flags.Read)
159  m.test_enum_to_uint(m.ClassWithUnscopedEnum.EMode.EFirstMode)
160  m.test_enum_to_long_long(m.Flags.Read)
161  m.test_enum_to_long_long(m.ClassWithUnscopedEnum.EMode.EFirstMode)
162 
163 
165  with pytest.raises(ValueError) as excinfo:
166  m.register_bad_enum()
167  assert str(excinfo.value) == 'SimpleEnum: element "ONE" already exists!'
def test_enum_to_int()
Definition: test_enum.py:155
def test_binary_operators()
Definition: test_enum.py:134
return os str()
def test_duplicate_enum_name()
Definition: test_enum.py:164
def test_scoped_enum()
Definition: test_enum.py:75
def test_implicit_conversion()
Definition: test_enum.py:104
def test_unscoped_enum()
Definition: test_enum.py:5