test_enum.cpp revision 14299
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