test_enum.py revision 12391:ceeca8b41e4b
1import pytest 2from pybind11_tests import enums as m 3 4 5def test_unscoped_enum(): 6 assert str(m.UnscopedEnum.EOne) == "UnscopedEnum.EOne" 7 assert str(m.UnscopedEnum.ETwo) == "UnscopedEnum.ETwo" 8 assert str(m.EOne) == "UnscopedEnum.EOne" 9 # __members__ property 10 assert m.UnscopedEnum.__members__ == \ 11 {"EOne": m.UnscopedEnum.EOne, "ETwo": m.UnscopedEnum.ETwo} 12 # __members__ readonly 13 with pytest.raises(AttributeError): 14 m.UnscopedEnum.__members__ = {} 15 # __members__ returns a copy 16 foo = m.UnscopedEnum.__members__ 17 foo["bar"] = "baz" 18 assert m.UnscopedEnum.__members__ == \ 19 {"EOne": m.UnscopedEnum.EOne, "ETwo": m.UnscopedEnum.ETwo} 20 21 # no TypeError exception for unscoped enum ==/!= int comparisons 22 y = m.UnscopedEnum.ETwo 23 assert y == 2 24 assert y != 3 25 26 assert int(m.UnscopedEnum.ETwo) == 2 27 assert str(m.UnscopedEnum(2)) == "UnscopedEnum.ETwo" 28 29 # order 30 assert m.UnscopedEnum.EOne < m.UnscopedEnum.ETwo 31 assert m.UnscopedEnum.EOne < 2 32 assert m.UnscopedEnum.ETwo > m.UnscopedEnum.EOne 33 assert m.UnscopedEnum.ETwo > 1 34 assert m.UnscopedEnum.ETwo <= 2 35 assert m.UnscopedEnum.ETwo >= 2 36 assert m.UnscopedEnum.EOne <= m.UnscopedEnum.ETwo 37 assert m.UnscopedEnum.EOne <= 2 38 assert m.UnscopedEnum.ETwo >= m.UnscopedEnum.EOne 39 assert m.UnscopedEnum.ETwo >= 1 40 assert not (m.UnscopedEnum.ETwo < m.UnscopedEnum.EOne) 41 assert not (2 < m.UnscopedEnum.EOne) 42 43 44def test_scoped_enum(): 45 assert m.test_scoped_enum(m.ScopedEnum.Three) == "ScopedEnum::Three" 46 z = m.ScopedEnum.Two 47 assert m.test_scoped_enum(z) == "ScopedEnum::Two" 48 49 # expected TypeError exceptions for scoped enum ==/!= int comparisons 50 with pytest.raises(TypeError): 51 assert z == 2 52 with pytest.raises(TypeError): 53 assert z != 3 54 55 # order 56 assert m.ScopedEnum.Two < m.ScopedEnum.Three 57 assert m.ScopedEnum.Three > m.ScopedEnum.Two 58 assert m.ScopedEnum.Two <= m.ScopedEnum.Three 59 assert m.ScopedEnum.Two <= m.ScopedEnum.Two 60 assert m.ScopedEnum.Two >= m.ScopedEnum.Two 61 assert m.ScopedEnum.Three >= m.ScopedEnum.Two 62 63 64def test_implicit_conversion(): 65 assert str(m.ClassWithUnscopedEnum.EMode.EFirstMode) == "EMode.EFirstMode" 66 assert str(m.ClassWithUnscopedEnum.EFirstMode) == "EMode.EFirstMode" 67 68 f = m.ClassWithUnscopedEnum.test_function 69 first = m.ClassWithUnscopedEnum.EFirstMode 70 second = m.ClassWithUnscopedEnum.ESecondMode 71 72 assert f(first) == 1 73 74 assert f(first) == f(first) 75 assert not f(first) != f(first) 76 77 assert f(first) != f(second) 78 assert not f(first) == f(second) 79 80 assert f(first) == int(f(first)) 81 assert not f(first) != int(f(first)) 82 83 assert f(first) != int(f(second)) 84 assert not f(first) == int(f(second)) 85 86 # noinspection PyDictCreation 87 x = {f(first): 1, f(second): 2} 88 x[f(first)] = 3 89 x[f(second)] = 4 90 # Hashing test 91 assert str(x) == "{EMode.EFirstMode: 3, EMode.ESecondMode: 4}" 92 93 94def test_binary_operators(): 95 assert int(m.Flags.Read) == 4 96 assert int(m.Flags.Write) == 2 97 assert int(m.Flags.Execute) == 1 98 assert int(m.Flags.Read | m.Flags.Write | m.Flags.Execute) == 7 99 assert int(m.Flags.Read | m.Flags.Write) == 6 100 assert int(m.Flags.Read | m.Flags.Execute) == 5 101 assert int(m.Flags.Write | m.Flags.Execute) == 3 102 assert int(m.Flags.Write | 1) == 3 103 104 state = m.Flags.Read | m.Flags.Write 105 assert (state & m.Flags.Read) != 0 106 assert (state & m.Flags.Write) != 0 107 assert (state & m.Flags.Execute) == 0 108 assert (state & 1) == 0 109 110 state2 = ~state 111 assert state2 == -7 112 assert int(state ^ state2) == -1 113 114 115def test_enum_to_int(): 116 m.test_enum_to_int(m.Flags.Read) 117 m.test_enum_to_int(m.ClassWithUnscopedEnum.EMode.EFirstMode) 118 m.test_enum_to_uint(m.Flags.Read) 119 m.test_enum_to_uint(m.ClassWithUnscopedEnum.EMode.EFirstMode) 120 m.test_enum_to_long_long(m.Flags.Read) 121 m.test_enum_to_long_long(m.ClassWithUnscopedEnum.EMode.EFirstMode) 122