Skip to content

Commit db22827

Browse files
committed
Add test_named_namespace_a, test_named_namespace_b
1 parent 282eb72 commit db22827

10 files changed

+79
-12
lines changed

include/pybind11/detail/internals.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,10 @@ struct internals {
210210
}
211211
#endif
212212

213-
std::unordered_map<std::type_index, std::vector<std::string>> std_type_index_registry;
213+
std::unordered_map<std::type_index, std::vector<std::string>>
214+
std_type_index_registry_unnamed_namespace;
215+
std::unordered_map<std::type_index, std::vector<std::string>>
216+
std_type_index_registry_named_namespace;
214217
};
215218

216219
/// Additional type information which does not fit into the PyTypeObject.

tests/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ set(PYBIND11_TEST_FILES
142142
test_methods_and_attributes
143143
test_modules
144144
test_multiple_inheritance
145+
test_named_namespace_a.py
146+
test_named_namespace_b.py
145147
test_numpy_array
146148
test_numpy_dtypes
147149
test_numpy_vectorize
@@ -221,6 +223,8 @@ tests_extra_targets("test_exceptions.py;test_local_bindings.py;test_stl.py;test_
221223
# And add additional targets for other tests.
222224
tests_extra_targets("test_exceptions.py" "cross_module_interleaved_error_already_set")
223225
tests_extra_targets("test_gil_scoped.py" "cross_module_gil_utils")
226+
tests_extra_targets("test_named_namespace_a.py" "named_namespace_a")
227+
tests_extra_targets("test_named_namespace_b.py" "named_namespace_b")
224228

225229
set(PYBIND11_EIGEN_REPO
226230
"https://gitlab.com/libeigen/eigen.git"

tests/named_namespace_a.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#include <pybind11/stl.h>
2+
3+
#include "pybind11_tests.h"
4+
5+
namespace test_named_namespace {
6+
struct any_struct {};
7+
} // namespace test_named_namespace
8+
9+
PYBIND11_MODULE(named_namespace_a, m) {
10+
m.attr("name") = "NA";
11+
12+
py::detail::get_internals()
13+
.std_type_index_registry_named_namespace[std::type_index(
14+
typeid(test_named_namespace::any_struct))]
15+
.push_back("NA");
16+
17+
m.def("std_type_index_registry_dump", []() {
18+
py::list items;
19+
for (const auto &it :
20+
py::detail::get_internals().std_type_index_registry_named_namespace) {
21+
items.append(py::make_tuple(it.first.name(), it.second));
22+
}
23+
return items;
24+
});
25+
}

tests/named_namespace_b.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#include "pybind11_tests.h"
2+
3+
namespace test_named_namespace {
4+
struct any_struct {};
5+
} // namespace test_named_namespace
6+
7+
PYBIND11_MODULE(named_namespace_b, m) {
8+
m.attr("name") = "NB";
9+
10+
py::detail::get_internals()
11+
.std_type_index_registry_named_namespace[std::type_index(
12+
typeid(test_named_namespace::any_struct))]
13+
.push_back("NB");
14+
}

tests/test_named_namespace_a.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import named_namespace_a as m
2+
import pytest
3+
4+
5+
def test_inspect():
6+
assert m.name == "NA"
7+
reg = m.std_type_index_registry_dump()
8+
if len(reg) == 1:
9+
assert tuple(sorted(reg[0][1])) == ("NA", "NB")
10+
pytest.skip("std::type_index-EQ-GOOD")
11+
if len(reg) == 2:
12+
assert reg[0][0] == reg[1][0]
13+
assert tuple(sorted(reg[0][1] + reg[1][1])) == ("NA", "NB")
14+
pytest.skip("std::type_index-NE-BAD")
15+
assert reg is None # Sure to fail.

tests/test_named_namespace_b.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import named_namespace_b as m
2+
3+
4+
def test_inspect():
5+
assert m.name == "NB"

tests/test_unnamed_namespace_a.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,16 @@ struct any_struct {};
77
} // namespace
88

99
TEST_SUBMODULE(unnamed_namespace_a, m) {
10-
m.attr("name") = "A";
10+
m.attr("name") = "UA";
1111

1212
py::detail::get_internals()
13-
.std_type_index_registry[std::type_index(typeid(any_struct))]
14-
.push_back("A");
13+
.std_type_index_registry_unnamed_namespace[std::type_index(typeid(any_struct))]
14+
.push_back("UA");
1515

1616
m.def("std_type_index_registry_dump", []() {
1717
py::list items;
18-
for (const auto &it : py::detail::get_internals().std_type_index_registry) {
18+
for (const auto &it :
19+
py::detail::get_internals().std_type_index_registry_unnamed_namespace) {
1920
items.append(py::make_tuple(it.first.name(), it.second));
2021
}
2122
return items;

tests/test_unnamed_namespace_a.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44

55

66
def test_inspect():
7-
assert m.name == "A"
7+
assert m.name == "UA"
88
reg = m.std_type_index_registry_dump()
99
if len(reg) == 1:
10-
assert tuple(sorted(reg[0][1])) == ("A", "B")
10+
assert tuple(sorted(reg[0][1])) == ("UA", "UB")
1111
pytest.skip("std::type_index-EQ-BAD")
1212
if len(reg) == 2:
13-
assert tuple(sorted([reg[0][1][0], reg[1][1][0]])) == ("A", "B")
13+
assert tuple(sorted([reg[0][1][0], reg[1][1][0]])) == ("UA", "UB")
1414
pytest.skip("std::type_index-NE-GOOD")
1515
assert reg is None # Sure to fail.

tests/test_unnamed_namespace_b.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ struct any_struct {};
55
} // namespace
66

77
TEST_SUBMODULE(unnamed_namespace_b, m) {
8-
m.attr("name") = "B";
8+
m.attr("name") = "UB";
99

1010
py::detail::get_internals()
11-
.std_type_index_registry[std::type_index(typeid(any_struct))]
12-
.push_back("B");
11+
.std_type_index_registry_unnamed_namespace[std::type_index(typeid(any_struct))]
12+
.push_back("UB");
1313
}

tests/test_unnamed_namespace_b.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33

44
def test_inspect():
5-
assert m.name == "B"
5+
assert m.name == "UB"

0 commit comments

Comments
 (0)