Skip to content

Commit 8d1f30b

Browse files
committed
fix(smart_holder): Add unit tests for the default constructible deleter.
1 parent 4cdd8bb commit 8d1f30b

File tree

2 files changed

+28
-4
lines changed

2 files changed

+28
-4
lines changed

tests/test_class_sh_basic.cpp

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,11 @@ struct uconsumer { // unique_ptr consumer
2828
const std::unique_ptr<atyp> &rtrn_cref() const { return held; }
2929
};
3030

31+
/// Custom deleter that is default constructible.
3132
struct custom_deleter {
3233
std::string trace_txt;
3334

34-
custom_deleter() = delete;
35+
custom_deleter() = default;
3536
explicit custom_deleter(const std::string &trace_txt_) : trace_txt(trace_txt_) {}
3637

3738
custom_deleter(const custom_deleter &other) { trace_txt = other.trace_txt + "_CpCtor"; }
@@ -55,6 +56,14 @@ struct custom_deleter {
5556
void operator()(atyp *p) const { std::default_delete<atyp>()(p); }
5657
void operator()(const atyp *p) const { std::default_delete<const atyp>()(p); }
5758
};
59+
static_assert(std::is_default_constructible<custom_deleter>::value);
60+
61+
/// Custom deleter that is not default constructible.
62+
struct custom_deleter_nd : custom_deleter {
63+
custom_deleter_nd() = delete;
64+
explicit custom_deleter_nd(const std::string &trace_txt_) : custom_deleter(trace_txt_) {}
65+
};
66+
static_assert(!std::is_default_constructible<custom_deleter_nd>::value);
5867

5968
// clang-format off
6069

@@ -92,13 +101,18 @@ std::unique_ptr<atyp const, sddc> rtrn_udcp() { return std::unique_ptr<atyp cons
92101
std::string pass_udmp(std::unique_ptr<atyp, sddm> obj) { return "pass_udmp:" + obj->mtxt; }
93102
std::string pass_udcp(std::unique_ptr<atyp const, sddc> obj) { return "pass_udcp:" + obj->mtxt; }
94103

95-
96104
std::unique_ptr<atyp, custom_deleter> rtrn_udmp_del() { return std::unique_ptr<atyp, custom_deleter>(new atyp{"rtrn_udmp_del"}, custom_deleter{"udmp_deleter"}); }
97105
std::unique_ptr<atyp const, custom_deleter> rtrn_udcp_del() { return std::unique_ptr<atyp const, custom_deleter>(new atyp{"rtrn_udcp_del"}, custom_deleter{"udcp_deleter"}); }
98106

99107
std::string pass_udmp_del(std::unique_ptr<atyp, custom_deleter> obj) { return "pass_udmp_del:" + obj->mtxt + "," + obj.get_deleter().trace_txt; }
100108
std::string pass_udcp_del(std::unique_ptr<atyp const, custom_deleter> obj) { return "pass_udcp_del:" + obj->mtxt + "," + obj.get_deleter().trace_txt; }
101109

110+
std::unique_ptr<atyp, custom_deleter_nd> rtrn_udmp_del_nd() { return std::unique_ptr<atyp, custom_deleter_nd>(new atyp{"rtrn_udmp_del_nd"}, custom_deleter_nd{"udmp_deleter_nd"}); }
111+
std::unique_ptr<atyp const, custom_deleter_nd> rtrn_udcp_del_nd() { return std::unique_ptr<atyp const, custom_deleter_nd>(new atyp{"rtrn_udcp_del_nd"}, custom_deleter_nd{"udcp_deleter_nd"}); }
112+
113+
std::string pass_udmp_del_nd(std::unique_ptr<atyp, custom_deleter_nd> obj) { return "pass_udmp_del_nd:" + obj->mtxt + "," + obj.get_deleter().trace_txt; }
114+
std::string pass_udcp_del_nd(std::unique_ptr<atyp const, custom_deleter_nd> obj) { return "pass_udcp_del_nd:" + obj->mtxt + "," + obj.get_deleter().trace_txt; }
115+
102116
// clang-format on
103117

104118
// Helpers for testing.
@@ -171,6 +185,12 @@ TEST_SUBMODULE(class_sh_basic, m) {
171185
m.def("pass_udmp_del", pass_udmp_del);
172186
m.def("pass_udcp_del", pass_udcp_del);
173187

188+
m.def("rtrn_udmp_del_nd", rtrn_udmp_del_nd);
189+
m.def("rtrn_udcp_del_nd", rtrn_udcp_del_nd);
190+
191+
m.def("pass_udmp_del_nd", pass_udmp_del_nd);
192+
m.def("pass_udcp_del_nd", pass_udcp_del_nd);
193+
174194
py::classh<uconsumer>(m, "uconsumer")
175195
.def(py::init<>())
176196
.def("valid", &uconsumer::valid)

tests/test_class_sh_basic.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,12 @@ def test_load_with_rtrn_f(pass_f, rtrn_f, expected):
6868
@pytest.mark.parametrize(
6969
("pass_f", "rtrn_f", "expected"),
7070
[
71-
(m.pass_udmp_del, m.rtrn_udmp_del, "pass_udmp_del:rtrn_udmp_del,udmp_deleter_MvCtorTo_MvCtorTo_MvCtorTo_MvCtorTo_MvCtorTo_MvCtorTo"),
72-
(m.pass_udcp_del, m.rtrn_udcp_del, "pass_udcp_del:rtrn_udcp_del,udcp_deleter_MvCtorTo_MvCtorTo_MvCtorTo_MvCtorTo_MvCtorTo_MvCtorTo_MvCtorTo_MvCtorTo"),
71+
(m.pass_udmp_del, m.rtrn_udmp_del, "pass_udmp_del:rtrn_udmp_del,udmp_deleter_" + "_".join(["MvCtorTo"] * 6)),
72+
(m.pass_udcp_del, m.rtrn_udcp_del, "pass_udcp_del:rtrn_udcp_del,udcp_deleter_" + "_".join(["MvCtorTo"] * 8)),
73+
(m.pass_udmp_del_nd, m.rtrn_udmp_del_nd,
74+
"pass_udmp_del_nd:rtrn_udmp_del_nd,udmp_deleter_nd_" + "_".join(["MvCtorTo"] * 6)),
75+
(m.pass_udcp_del_nd, m.rtrn_udcp_del_nd,
76+
"pass_udcp_del_nd:rtrn_udcp_del_nd,udcp_deleter_nd_" + "_".join(["MvCtorTo"] * 8)),
7377
],
7478
)
7579
def test_deleter_roundtrip(pass_f, rtrn_f, expected):

0 commit comments

Comments
 (0)