test_enum.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /*
  2. tests/test_enums.cpp -- enumerations
  3. Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
  4. All rights reserved. Use of this source code is governed by a
  5. BSD-style license that can be found in the LICENSE file.
  6. */
  7. #include "pybind11_tests.h"
  8. TEST_SUBMODULE(enums, m) {
  9. // test_unscoped_enum
  10. enum UnscopedEnum {
  11. EOne = 1,
  12. ETwo,
  13. EThree
  14. };
  15. py::enum_<UnscopedEnum>(m, "UnscopedEnum", py::arithmetic(), "An unscoped enumeration")
  16. .value("EOne", EOne, "Docstring for EOne")
  17. .value("ETwo", ETwo, "Docstring for ETwo")
  18. .value("EThree", EThree, "Docstring for EThree")
  19. .export_values();
  20. // test_scoped_enum
  21. enum class ScopedEnum {
  22. Two = 2,
  23. Three
  24. };
  25. py::enum_<ScopedEnum>(m, "ScopedEnum", py::arithmetic())
  26. .value("Two", ScopedEnum::Two)
  27. .value("Three", ScopedEnum::Three);
  28. m.def("test_scoped_enum", [](ScopedEnum z) {
  29. return "ScopedEnum::" + std::string(z == ScopedEnum::Two ? "Two" : "Three");
  30. });
  31. // test_binary_operators
  32. enum Flags {
  33. Read = 4,
  34. Write = 2,
  35. Execute = 1
  36. };
  37. py::enum_<Flags>(m, "Flags", py::arithmetic())
  38. .value("Read", Flags::Read)
  39. .value("Write", Flags::Write)
  40. .value("Execute", Flags::Execute)
  41. .export_values();
  42. // test_implicit_conversion
  43. class ClassWithUnscopedEnum {
  44. public:
  45. enum EMode {
  46. EFirstMode = 1,
  47. ESecondMode
  48. };
  49. static EMode test_function(EMode mode) {
  50. return mode;
  51. }
  52. };
  53. py::class_<ClassWithUnscopedEnum> exenum_class(m, "ClassWithUnscopedEnum");
  54. exenum_class.def_static("test_function", &ClassWithUnscopedEnum::test_function);
  55. py::enum_<ClassWithUnscopedEnum::EMode>(exenum_class, "EMode")
  56. .value("EFirstMode", ClassWithUnscopedEnum::EFirstMode)
  57. .value("ESecondMode", ClassWithUnscopedEnum::ESecondMode)
  58. .export_values();
  59. // test_enum_to_int
  60. m.def("test_enum_to_int", [](int) { });
  61. m.def("test_enum_to_uint", [](uint32_t) { });
  62. m.def("test_enum_to_long_long", [](long long) { });
  63. // test_duplicate_enum_name
  64. enum SimpleEnum
  65. {
  66. ONE, TWO, THREE
  67. };
  68. m.def("register_bad_enum", [m]() {
  69. py::enum_<SimpleEnum>(m, "SimpleEnum")
  70. .value("ONE", SimpleEnum::ONE) //NOTE: all value function calls are called with the same first parameter value
  71. .value("ONE", SimpleEnum::TWO)
  72. .value("ONE", SimpleEnum::THREE)
  73. .export_values();
  74. });
  75. }