libcruft-util/test/signal.cpp

138 lines
3.8 KiB
C++
Raw Normal View History

#include "signal.hpp"
2015-04-13 16:45:56 +10:00
2019-01-03 15:48:34 +11:00
#include "except.hpp"
2015-04-13 16:45:56 +10:00
#include "tap.hpp"
//-----------------------------------------------------------------------------
void
test_null (cruft::TAP::logger &tap)
{
2016-01-19 18:31:49 +11:00
tap.expect_nothrow ([] {
2019-03-13 12:08:57 +11:00
cruft::signal<void(*)(void)> void_signal;
2016-01-19 18:31:49 +11:00
void_signal ();
}, "void signal");
}
///////////////////////////////////////////////////////////////////////////////
void
increment_uint (unsigned int &val)
{
++val;
}
//-----------------------------------------------------------------------------
void
test_single (cruft::TAP::logger &tap)
{
unsigned int val = 0;
2019-03-13 12:08:57 +11:00
cruft::signal<void(*)(unsigned int&)> void_signal;
2016-01-19 18:31:49 +11:00
auto cookie = void_signal.connect (increment_uint);
void_signal (val);
2016-01-19 18:31:49 +11:00
tap.expect_eq (val, 1u, "single listener");
}
//-----------------------------------------------------------------------------
void
test_double (cruft::TAP::logger &tap)
{
unsigned int val = 0;
2019-03-13 12:08:57 +11:00
cruft::signal<void(*)(unsigned int&)> void_signal;
2016-01-19 18:31:49 +11:00
auto cookie0 = void_signal.connect (increment_uint);
auto cookie1 = void_signal.connect (increment_uint);
void_signal (val);
2016-01-19 18:31:49 +11:00
tap.expect_eq (val, 2u, "double listener");
}
///////////////////////////////////////////////////////////////////////////////
void
test_value_signal (cruft::TAP::logger &tap)
{
cruft::value_signal<unsigned> val;
2016-01-19 18:31:49 +11:00
unsigned passed = 0;
2016-01-19 18:31:49 +11:00
auto cookie = val.connect ([&] (unsigned v) { passed = v; });
2015-02-19 13:27:47 +11:00
val = 42u;
2016-01-19 18:31:49 +11:00
tap.expect_eq (passed, 42u, "value signal, passed value");
2015-02-19 13:27:47 +11:00
unsigned check = val;
2016-01-19 18:31:49 +11:00
tap.expect_eq (check, 42u, "value signal, read value");
2015-02-19 13:27:47 +11:00
}
2015-03-10 22:52:38 +11:00
///////////////////////////////////////////////////////////////////////////////
void
test_combiner (cruft::TAP::logger &tap)
2015-03-10 22:52:38 +11:00
{
{
2019-03-13 12:08:57 +11:00
cruft::signal<std::function<bool(void)>, cruft::reduce::logical_and> sig;
2015-03-10 22:52:38 +11:00
unsigned count = 0;
2016-01-19 18:31:49 +11:00
auto cookie0 = sig.connect ([&] (void) { ++count; return true; });
auto cookie1 = sig.connect ([&] (void) { ++count; return true; });
auto cookie2 = sig.connect ([&] (void) { ++count; return true; });
2015-03-10 22:52:38 +11:00
2016-01-19 18:31:49 +11:00
tap.expect (sig (), "bool signal, success");
tap.expect_eq (count, 3u, "bool signal, success, count");
2015-03-10 22:52:38 +11:00
}
{
2019-03-13 12:08:57 +11:00
cruft::signal<std::function<bool(void)>, cruft::reduce::logical_and> sig;
2015-03-10 22:52:38 +11:00
unsigned count = 0;
2016-01-19 18:31:49 +11:00
auto cookie0 = sig.connect ([&] (void) { ++count; return true; });
auto cookie1 = sig.connect ([&] (void) { ++count; return false; });
auto cookie2 = sig.connect ([&] (void) { ++count; return true; });
tap.expect (!sig (), "bool signal, failure");
2015-03-10 22:52:38 +11:00
2016-01-19 18:31:49 +11:00
// ordering of signals is not guaranteed so we can't say for sure how
// many callbacks will be triggered; it will _probably_ be in order
// though.
tap.expect_le (count, 3u, "bool signal, failure, count");
2015-03-10 22:52:38 +11:00
}
}
///////////////////////////////////////////////////////////////////////////////
void
test_disconnect (cruft::TAP::logger &tap)
2015-03-10 22:52:38 +11:00
{
2016-01-19 18:31:49 +11:00
tap.expect_nothrow ([] {
2019-03-13 12:08:57 +11:00
using function_t = std::function<void(void)>;
cruft::signal<function_t> sig;
2015-03-10 22:52:38 +11:00
2019-03-13 12:08:57 +11:00
cruft::signal<function_t>::cookie a = sig.connect ([&] (void) { sig.disconnect (a); });
cruft::signal<function_t>::cookie b = sig.connect ([&] (void) { sig.disconnect (b); });
cruft::signal<function_t>::cookie c = sig.connect ([&] (void) { sig.disconnect (c); });
cruft::signal<function_t>::cookie d = sig.connect ([&] (void) { sig.disconnect (d); });
2015-03-10 22:52:38 +11:00
2016-01-19 18:31:49 +11:00
sig ();
}, "parallel disconnect in invocation");
2015-03-10 22:52:38 +11:00
}
///////////////////////////////////////////////////////////////////////////////
int
main (int, char **)
{
2019-01-03 15:48:34 +11:00
return cruft::TAP::logger::run ([] (auto &tap) {
test_null (tap);
test_single (tap);
test_double (tap);
test_value_signal (tap);
test_combiner (tap);
test_disconnect (tap);
});
}