111986Sandreas.sandberg@arm.com/*
211986Sandreas.sandberg@arm.com    tests/test_enums.cpp -- enumerations
311986Sandreas.sandberg@arm.com
411986Sandreas.sandberg@arm.com    Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
511986Sandreas.sandberg@arm.com
611986Sandreas.sandberg@arm.com    All rights reserved. Use of this source code is governed by a
711986Sandreas.sandberg@arm.com    BSD-style license that can be found in the LICENSE file.
811986Sandreas.sandberg@arm.com*/
911986Sandreas.sandberg@arm.com
1011986Sandreas.sandberg@arm.com#include "pybind11_tests.h"
1111986Sandreas.sandberg@arm.com
1212391Sjason@lowepower.comTEST_SUBMODULE(enums, m) {
1312391Sjason@lowepower.com    // test_unscoped_enum
1412391Sjason@lowepower.com    enum UnscopedEnum {
1512391Sjason@lowepower.com        EOne = 1,
1614299Sbbruce@ucdavis.edu        ETwo,
1714299Sbbruce@ucdavis.edu        EThree
1811986Sandreas.sandberg@arm.com    };
1914299Sbbruce@ucdavis.edu    py::enum_<UnscopedEnum>(m, "UnscopedEnum", py::arithmetic(), "An unscoped enumeration")
2014299Sbbruce@ucdavis.edu        .value("EOne", EOne, "Docstring for EOne")
2114299Sbbruce@ucdavis.edu        .value("ETwo", ETwo, "Docstring for ETwo")
2214299Sbbruce@ucdavis.edu        .value("EThree", EThree, "Docstring for EThree")
2311986Sandreas.sandberg@arm.com        .export_values();
2411986Sandreas.sandberg@arm.com
2512391Sjason@lowepower.com    // test_scoped_enum
2612391Sjason@lowepower.com    enum class ScopedEnum {
2712391Sjason@lowepower.com        Two = 2,
2812391Sjason@lowepower.com        Three
2912391Sjason@lowepower.com    };
3011986Sandreas.sandberg@arm.com    py::enum_<ScopedEnum>(m, "ScopedEnum", py::arithmetic())
3111986Sandreas.sandberg@arm.com        .value("Two", ScopedEnum::Two)
3211986Sandreas.sandberg@arm.com        .value("Three", ScopedEnum::Three);
3311986Sandreas.sandberg@arm.com
3412391Sjason@lowepower.com    m.def("test_scoped_enum", [](ScopedEnum z) {
3512391Sjason@lowepower.com        return "ScopedEnum::" + std::string(z == ScopedEnum::Two ? "Two" : "Three");
3612391Sjason@lowepower.com    });
3712391Sjason@lowepower.com
3812391Sjason@lowepower.com    // test_binary_operators
3912391Sjason@lowepower.com    enum Flags {
4012391Sjason@lowepower.com        Read = 4,
4112391Sjason@lowepower.com        Write = 2,
4212391Sjason@lowepower.com        Execute = 1
4312391Sjason@lowepower.com    };
4411986Sandreas.sandberg@arm.com    py::enum_<Flags>(m, "Flags", py::arithmetic())
4511986Sandreas.sandberg@arm.com        .value("Read", Flags::Read)
4611986Sandreas.sandberg@arm.com        .value("Write", Flags::Write)
4711986Sandreas.sandberg@arm.com        .value("Execute", Flags::Execute)
4811986Sandreas.sandberg@arm.com        .export_values();
4911986Sandreas.sandberg@arm.com
5012391Sjason@lowepower.com    // test_implicit_conversion
5112391Sjason@lowepower.com    class ClassWithUnscopedEnum {
5212391Sjason@lowepower.com    public:
5312391Sjason@lowepower.com        enum EMode {
5412391Sjason@lowepower.com            EFirstMode = 1,
5512391Sjason@lowepower.com            ESecondMode
5612391Sjason@lowepower.com        };
5712391Sjason@lowepower.com
5812391Sjason@lowepower.com        static EMode test_function(EMode mode) {
5912391Sjason@lowepower.com            return mode;
6012391Sjason@lowepower.com        }
6112391Sjason@lowepower.com    };
6211986Sandreas.sandberg@arm.com    py::class_<ClassWithUnscopedEnum> exenum_class(m, "ClassWithUnscopedEnum");
6311986Sandreas.sandberg@arm.com    exenum_class.def_static("test_function", &ClassWithUnscopedEnum::test_function);
6411986Sandreas.sandberg@arm.com    py::enum_<ClassWithUnscopedEnum::EMode>(exenum_class, "EMode")
6511986Sandreas.sandberg@arm.com        .value("EFirstMode", ClassWithUnscopedEnum::EFirstMode)
6611986Sandreas.sandberg@arm.com        .value("ESecondMode", ClassWithUnscopedEnum::ESecondMode)
6711986Sandreas.sandberg@arm.com        .export_values();
6812391Sjason@lowepower.com
6912391Sjason@lowepower.com    // test_enum_to_int
7012391Sjason@lowepower.com    m.def("test_enum_to_int", [](int) { });
7112391Sjason@lowepower.com    m.def("test_enum_to_uint", [](uint32_t) { });
7212391Sjason@lowepower.com    m.def("test_enum_to_long_long", [](long long) { });
7314299Sbbruce@ucdavis.edu
7414299Sbbruce@ucdavis.edu    // test_duplicate_enum_name
7514299Sbbruce@ucdavis.edu    enum SimpleEnum
7614299Sbbruce@ucdavis.edu    {
7714299Sbbruce@ucdavis.edu        ONE, TWO, THREE
7814299Sbbruce@ucdavis.edu    };
7914299Sbbruce@ucdavis.edu
8014299Sbbruce@ucdavis.edu    m.def("register_bad_enum", [m]() {
8114299Sbbruce@ucdavis.edu        py::enum_<SimpleEnum>(m, "SimpleEnum")
8214299Sbbruce@ucdavis.edu            .value("ONE", SimpleEnum::ONE)          //NOTE: all value function calls are called with the same first parameter value
8314299Sbbruce@ucdavis.edu            .value("ONE", SimpleEnum::TWO)
8414299Sbbruce@ucdavis.edu            .value("ONE", SimpleEnum::THREE)
8514299Sbbruce@ucdavis.edu            .export_values();
8614299Sbbruce@ucdavis.edu    });
8712391Sjason@lowepower.com}
88