diff --git a/tests/test_track_obj.cc b/tests/test_track_obj.cc index 0680508..9c20b30 100644 --- a/tests/test_track_obj.cc +++ b/tests/test_track_obj.cc @@ -36,6 +36,7 @@ #include "testutilities.h" #include #include +#include #include namespace @@ -112,6 +113,18 @@ foo_group4(bar_group4&) result_stream << "foo_group4(bar_group4&)"; } +struct foo_data +{ + ~foo_data() { magic = -42; } + int magic = 42; +}; + +int foo_fun(const foo_data& data, bar_group4* bar) +{ + delete bar; + return data.magic; +} + } // end anonymous namespace int @@ -213,5 +226,34 @@ main(int argc, char* argv[]) util->check_result(result_stream, ""); } + { + // Free trackable object from inside the slot which tracks it + auto bar = new bar_group4(); + foo_data data; + auto lambda = [data, bar]() { delete bar; return data.magic; }; + sigc::slot sl = sigc::track_obj(lambda, *bar); + result_stream<check_result(result_stream, "42"); + } + + { + // Free trackable object from inside the slot which tracks it + auto bar = new bar_group4(); + foo_data data; + sigc::slot sl = sigc::track_obj(sigc::bind(sigc::ptr_fun(foo_fun), data, bar), *bar); + result_stream<check_result(result_stream, "42"); + } + + { + // Disconnect a slot from inside itself + sigc::slot sl; + foo_data data; + auto lambda = [data, &sl]() { sl.disconnect(); return data.magic; }; + sl = lambda; + result_stream<check_result(result_stream, "42"); + } + return util->get_result_and_delete_instance() ? EXIT_SUCCESS : EXIT_FAILURE; }