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