mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-13 09:03:54 +00:00
check for already existing enum value added; added test (#1453)
* check for already existing enum value added; added test * added enum value name to exception message * test for defining enum with multiple identical names moved to test_enum.cpp/py
This commit is contained in:
parent
35c82c7250
commit
5c8746ff13
@ -1463,7 +1463,10 @@ public:
|
|||||||
enum_& value(char const* name, Type value, const char *doc = nullptr) {
|
enum_& value(char const* name, Type value, const char *doc = nullptr) {
|
||||||
auto v = pybind11::cast(value, return_value_policy::copy);
|
auto v = pybind11::cast(value, return_value_policy::copy);
|
||||||
this->attr(name) = v;
|
this->attr(name) = v;
|
||||||
m_entries[pybind11::str(name)] = std::make_pair(v, doc);
|
auto name_converted = pybind11::str(name);
|
||||||
|
if (m_entries.contains(name_converted))
|
||||||
|
throw value_error("Enum error - element with name: " + std::string(name) + " already exists");
|
||||||
|
m_entries[name_converted] = std::make_pair(v, doc);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,4 +68,18 @@ TEST_SUBMODULE(enums, m) {
|
|||||||
m.def("test_enum_to_int", [](int) { });
|
m.def("test_enum_to_int", [](int) { });
|
||||||
m.def("test_enum_to_uint", [](uint32_t) { });
|
m.def("test_enum_to_uint", [](uint32_t) { });
|
||||||
m.def("test_enum_to_long_long", [](long long) { });
|
m.def("test_enum_to_long_long", [](long long) { });
|
||||||
|
|
||||||
|
// test_duplicate_enum_name
|
||||||
|
enum SimpleEnum
|
||||||
|
{
|
||||||
|
ONE, TWO, THREE
|
||||||
|
};
|
||||||
|
|
||||||
|
m.def("register_bad_enum", [m]() {
|
||||||
|
py::enum_<SimpleEnum>(m, "SimpleEnum")
|
||||||
|
.value("ONE", SimpleEnum::ONE) //NOTE: all value function calls are called with the same first parameter value
|
||||||
|
.value("ONE", SimpleEnum::TWO)
|
||||||
|
.value("ONE", SimpleEnum::THREE)
|
||||||
|
.export_values();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
@ -148,3 +148,9 @@ def test_enum_to_int():
|
|||||||
m.test_enum_to_uint(m.ClassWithUnscopedEnum.EMode.EFirstMode)
|
m.test_enum_to_uint(m.ClassWithUnscopedEnum.EMode.EFirstMode)
|
||||||
m.test_enum_to_long_long(m.Flags.Read)
|
m.test_enum_to_long_long(m.Flags.Read)
|
||||||
m.test_enum_to_long_long(m.ClassWithUnscopedEnum.EMode.EFirstMode)
|
m.test_enum_to_long_long(m.ClassWithUnscopedEnum.EMode.EFirstMode)
|
||||||
|
|
||||||
|
|
||||||
|
def test_duplicate_enum_name():
|
||||||
|
with pytest.raises(ValueError) as excinfo:
|
||||||
|
m.register_bad_enum()
|
||||||
|
assert str(excinfo.value) == "Enum error - element with name: ONE already exists"
|
||||||
|
Loading…
Reference in New Issue
Block a user