Skip to content

Commit 59a9beb

Browse files
ILer32kris-jusiak
authored andcommitted
improve struct test to prevent dangling string
1 parent f709ea9 commit 59a9beb

1 file changed

Lines changed: 24 additions & 16 deletions

File tree

include/boost/ut.hpp

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2240,9 +2240,17 @@ struct test_location {
22402240

22412241
struct test {
22422242
std::string_view type{};
2243+
std::optional<std::string> backingName;
22432244
std::string_view name{};
22442245
std::vector<std::string_view> tag{};
22452246

2247+
test(std::string_view t, std::string_view sv) : type(t), name(sv) {}
2248+
test(std::string_view t, const std::string& s) : type(t), name(s) {}
2249+
test(std::string_view t, const char* s) : type(t), name(s) {}
2250+
template <std::size_t N>
2251+
test(std::string_view t, const char (&s)[N]) : type(t), name(s) {}
2252+
test(std::string_view t, std::string&& s) : type(t), backingName(std::move(s)), name(*backingName) {}
2253+
22462254
template <class... Ts>
22472255
constexpr auto operator=(test_location<void (*)()> _test) {
22482256
on<Ts...>(events::test<void (*)()>{.type = type,
@@ -3078,8 +3086,8 @@ struct suite {
30783086

30793087
[[maybe_unused]] inline auto log = detail::log{};
30803088
[[maybe_unused]] inline auto that = detail::that_{};
3081-
[[maybe_unused]] constexpr auto test = [](const auto& name) {
3082-
return detail::test{"test", name};
3089+
[[maybe_unused]] constexpr auto test = [](auto&& name) {
3090+
return detail::test{"test", std::forward<decltype(name)>(name)};
30833091
};
30843092
[[maybe_unused]] constexpr auto should = test;
30853093
[[maybe_unused]] inline auto tag = [](const auto& name) {
@@ -3139,20 +3147,20 @@ template <class T>
31393147
}
31403148

31413149
namespace bdd {
3142-
[[maybe_unused]] constexpr auto feature = [](const auto& name) {
3143-
return detail::test{"feature", name};
3150+
[[maybe_unused]] constexpr auto feature = [](auto&& name) {
3151+
return detail::test{"feature", std::forward<decltype(name)>(name)};
31443152
};
3145-
[[maybe_unused]] constexpr auto scenario = [](const auto& name) {
3146-
return detail::test{"scenario", name};
3153+
[[maybe_unused]] constexpr auto scenario = [](auto&& name) {
3154+
return detail::test{"scenario", std::forward<decltype(name)>(name)};
31473155
};
3148-
[[maybe_unused]] constexpr auto given = [](const auto& name) {
3149-
return detail::test{"given", name};
3156+
[[maybe_unused]] constexpr auto given = [](auto&& name) {
3157+
return detail::test{"given", std::forward<decltype(name)>(name)};
31503158
};
3151-
[[maybe_unused]] constexpr auto when = [](const auto& name) {
3152-
return detail::test{"when", name};
3159+
[[maybe_unused]] constexpr auto when = [](auto&& name) {
3160+
return detail::test{"when", std::forward<decltype(name)>(name)};
31533161
};
3154-
[[maybe_unused]] constexpr auto then = [](const auto& name) {
3155-
return detail::test{"then", name};
3162+
[[maybe_unused]] constexpr auto then = [](auto&& name) {
3163+
return detail::test{"then", std::forward<decltype(name)>(name)};
31563164
};
31573165

31583166
namespace gherkin {
@@ -3283,11 +3291,11 @@ class steps {
32833291
} // namespace bdd
32843292

32853293
namespace spec {
3286-
[[maybe_unused]] constexpr auto describe = [](const auto& name) {
3287-
return detail::test{"describe", name};
3294+
[[maybe_unused]] constexpr auto describe = [](auto&& name) {
3295+
return detail::test{"describe", std::forward<decltype(name)>(name)};
32883296
};
3289-
[[maybe_unused]] constexpr auto it = [](const auto& name) {
3290-
return detail::test{"it", name};
3297+
[[maybe_unused]] constexpr auto it = [](auto&& name) {
3298+
return detail::test{"it", std::forward<decltype(name)>(name)};
32913299
};
32923300
} // namespace spec
32933301

0 commit comments

Comments
 (0)