You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
3.2 KiB

  1. import pytest
  2. def test_unscoped_enum():
  3. from pybind11_tests import UnscopedEnum, EOne
  4. assert str(UnscopedEnum.EOne) == "UnscopedEnum.EOne"
  5. assert str(UnscopedEnum.ETwo) == "UnscopedEnum.ETwo"
  6. assert str(EOne) == "UnscopedEnum.EOne"
  7. # no TypeError exception for unscoped enum ==/!= int comparisons
  8. y = UnscopedEnum.ETwo
  9. assert y == 2
  10. assert y != 3
  11. assert int(UnscopedEnum.ETwo) == 2
  12. assert str(UnscopedEnum(2)) == "UnscopedEnum.ETwo"
  13. # order
  14. assert UnscopedEnum.EOne < UnscopedEnum.ETwo
  15. assert UnscopedEnum.EOne < 2
  16. assert UnscopedEnum.ETwo > UnscopedEnum.EOne
  17. assert UnscopedEnum.ETwo > 1
  18. assert UnscopedEnum.ETwo <= 2
  19. assert UnscopedEnum.ETwo >= 2
  20. assert UnscopedEnum.EOne <= UnscopedEnum.ETwo
  21. assert UnscopedEnum.EOne <= 2
  22. assert UnscopedEnum.ETwo >= UnscopedEnum.EOne
  23. assert UnscopedEnum.ETwo >= 1
  24. assert not (UnscopedEnum.ETwo < UnscopedEnum.EOne)
  25. assert not (2 < UnscopedEnum.EOne)
  26. def test_scoped_enum():
  27. from pybind11_tests import ScopedEnum, test_scoped_enum
  28. assert test_scoped_enum(ScopedEnum.Three) == "ScopedEnum::Three"
  29. z = ScopedEnum.Two
  30. assert test_scoped_enum(z) == "ScopedEnum::Two"
  31. # expected TypeError exceptions for scoped enum ==/!= int comparisons
  32. with pytest.raises(TypeError):
  33. assert z == 2
  34. with pytest.raises(TypeError):
  35. assert z != 3
  36. # order
  37. assert ScopedEnum.Two < ScopedEnum.Three
  38. assert ScopedEnum.Three > ScopedEnum.Two
  39. assert ScopedEnum.Two <= ScopedEnum.Three
  40. assert ScopedEnum.Two <= ScopedEnum.Two
  41. assert ScopedEnum.Two >= ScopedEnum.Two
  42. assert ScopedEnum.Three >= ScopedEnum.Two
  43. def test_implicit_conversion():
  44. from pybind11_tests import ClassWithUnscopedEnum
  45. assert str(ClassWithUnscopedEnum.EMode.EFirstMode) == "EMode.EFirstMode"
  46. assert str(ClassWithUnscopedEnum.EFirstMode) == "EMode.EFirstMode"
  47. f = ClassWithUnscopedEnum.test_function
  48. first = ClassWithUnscopedEnum.EFirstMode
  49. second = ClassWithUnscopedEnum.ESecondMode
  50. assert f(first) == 1
  51. assert f(first) == f(first)
  52. assert not f(first) != f(first)
  53. assert f(first) != f(second)
  54. assert not f(first) == f(second)
  55. assert f(first) == int(f(first))
  56. assert not f(first) != int(f(first))
  57. assert f(first) != int(f(second))
  58. assert not f(first) == int(f(second))
  59. # noinspection PyDictCreation
  60. x = {f(first): 1, f(second): 2}
  61. x[f(first)] = 3
  62. x[f(second)] = 4
  63. # Hashing test
  64. assert str(x) == "{EMode.EFirstMode: 3, EMode.ESecondMode: 4}"
  65. def test_binary_operators():
  66. from pybind11_tests import Flags
  67. assert int(Flags.Read) == 4
  68. assert int(Flags.Write) == 2
  69. assert int(Flags.Execute) == 1
  70. assert int(Flags.Read | Flags.Write | Flags.Execute) == 7
  71. assert int(Flags.Read | Flags.Write) == 6
  72. assert int(Flags.Read | Flags.Execute) == 5
  73. assert int(Flags.Write | Flags.Execute) == 3
  74. assert int(Flags.Write | 1) == 3
  75. state = Flags.Read | Flags.Write
  76. assert (state & Flags.Read) != 0
  77. assert (state & Flags.Write) != 0
  78. assert (state & Flags.Execute) == 0
  79. assert (state & 1) == 0
  80. state2 = ~state
  81. assert state2 == -7
  82. assert int(state ^ state2) == -1