test_enum.cpp revision 12391:ceeca8b41e4b
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
12TEST_SUBMODULE(enums, m) {
13    // test_unscoped_enum
14    enum UnscopedEnum {
15        EOne = 1,
16        ETwo
17    };
18    py::enum_<UnscopedEnum>(m, "UnscopedEnum", py::arithmetic())
19        .value("EOne", EOne)
20        .value("ETwo", ETwo)
21        .export_values();
22
23    // test_scoped_enum
24    enum class ScopedEnum {
25        Two = 2,
26        Three
27    };
28    py::enum_<ScopedEnum>(m, "ScopedEnum", py::arithmetic())
29        .value("Two", ScopedEnum::Two)
30        .value("Three", ScopedEnum::Three);
31
32    m.def("test_scoped_enum", [](ScopedEnum z) {
33        return "ScopedEnum::" + std::string(z == ScopedEnum::Two ? "Two" : "Three");
34    });
35
36    // test_binary_operators
37    enum Flags {
38        Read = 4,
39        Write = 2,
40        Execute = 1
41    };
42    py::enum_<Flags>(m, "Flags", py::arithmetic())
43        .value("Read", Flags::Read)
44        .value("Write", Flags::Write)
45        .value("Execute", Flags::Execute)
46        .export_values();
47
48    // test_implicit_conversion
49    class ClassWithUnscopedEnum {
50    public:
51        enum EMode {
52            EFirstMode = 1,
53            ESecondMode
54        };
55
56        static EMode test_function(EMode mode) {
57            return mode;
58        }
59    };
60    py::class_<ClassWithUnscopedEnum> exenum_class(m, "ClassWithUnscopedEnum");
61    exenum_class.def_static("test_function", &ClassWithUnscopedEnum::test_function);
62    py::enum_<ClassWithUnscopedEnum::EMode>(exenum_class, "EMode")
63        .value("EFirstMode", ClassWithUnscopedEnum::EFirstMode)
64        .value("ESecondMode", ClassWithUnscopedEnum::ESecondMode)
65        .export_values();
66
67    // test_enum_to_int
68    m.def("test_enum_to_int", [](int) { });
69    m.def("test_enum_to_uint", [](uint32_t) { });
70    m.def("test_enum_to_long_long", [](long long) { });
71}
72