Commit d162ba49 authored by Dominik Charousset's avatar Dominik Charousset

Extend match unit test

parent 38e87948
......@@ -62,24 +62,38 @@ void reset() {
fill(begin(s_invoked), end(s_invoked), false);
}
template <class Expr, class... Ts>
bool invoked(int idx, Expr& expr, Ts&&... args) {
expr(make_message(forward<Ts>(args)...));
auto res = s_invoked[idx];
s_invoked[idx] = false;
auto e = end(s_invoked);
res = res && find(begin(s_invoked), e, true) == e;
reset();
return res;
void fill_mb(message_builder&) {
// end of recursion
}
template <class T, class... Ts>
void fill_mb(message_builder& mb, const T& v, const Ts&... vs) {
fill_mb(mb.append(v), vs...);
}
template <class Expr, class... Ts>
bool not_invoked(Expr& expr, Ts&&... args) {
expr(make_message(forward<Ts>(args)...));
auto e = end(s_invoked);
auto res = find(begin(s_invoked), e, true) == e;
fill(begin(s_invoked), end(s_invoked), false);
return res;
ptrdiff_t invoked(Expr& expr, const Ts&... args) {
vector<message> msgs;
msgs.push_back(make_message(args...));
message_builder mb;
fill_mb(mb, args...);
msgs.push_back(mb.to_message());
set<ptrdiff_t> results;
for (auto& msg : msgs) {
expr(msg);
auto first = begin(s_invoked);
auto last = end(s_invoked);
auto i = find(begin(s_invoked), last, true);
results.insert(i != last && count(i, last, true) == 1 ? distance(first, i)
: -1);
reset();
}
if (results.size() > 1) {
CAF_FAILURE("make_message() yielded a different result than "
"message_builder(...).to_message()");
return -2;
}
return *results.begin();
}
function<void()> f(int idx) {
......@@ -90,9 +104,20 @@ function<void()> f(int idx) {
void test_atoms() {
auto expr = on(hi_atom::value) >> f(0);
CAF_CHECK(invoked(0, expr, hi_atom::value));
CAF_CHECK(not_invoked(expr, ho_atom::value));
CAF_CHECK(not_invoked(expr, hi_atom::value, hi_atom::value));
CAF_CHECK_EQUAL(invoked(expr, hi_atom::value), 0);
CAF_CHECK_EQUAL(invoked(expr, ho_atom::value), -1);
CAF_CHECK_EQUAL(invoked(expr, hi_atom::value, hi_atom::value), -1);
message_handler expr2{
[](hi_atom) {
s_invoked[0] = true;
},
[](ho_atom) {
s_invoked[1] = true;
}
};
CAF_CHECK_EQUAL(invoked(expr2, ok_atom::value), -1);
CAF_CHECK_EQUAL(invoked(expr2, hi_atom::value), 0);
CAF_CHECK_EQUAL(invoked(expr2, ho_atom::value), 1);
}
void test_custom_projections() {
......@@ -106,8 +131,8 @@ void test_custom_projections() {
auto expr = (
on(guard) >> f(0)
);
CAF_CHECK(invoked(0, expr, 42));
CAF_CHECK(guard_called);
CAF_CHECK_EQUAL(invoked(expr, 42), 0);
CAF_CHECK_EQUAL(guard_called, true);
}
// check forwarding optional<const string&> from guard
{
......@@ -117,10 +142,10 @@ void test_custom_projections() {
s_invoked[0] = true;
}
);
CAF_CHECK(invoked(0, expr, "--help"));
CAF_CHECK(not_invoked(expr, "-help"));
CAF_CHECK(not_invoked(expr, "--help", "--help"));
CAF_CHECK(not_invoked(expr, 42));
CAF_CHECK_EQUAL(invoked(expr, "--help"), 0);
CAF_CHECK_EQUAL(invoked(expr, "-help"), -1);
CAF_CHECK_EQUAL(invoked(expr, "--help", "--help"), -1);
CAF_CHECK_EQUAL(invoked(expr, 42), -1);
}
// check projection
{
......@@ -130,16 +155,53 @@ void test_custom_projections() {
s_invoked[0] = true;
}
);
CAF_CHECK(invoked(0, expr, "42"));
CAF_CHECK(not_invoked(expr, "42f"));
CAF_CHECK(not_invoked(expr, "42", "42"));
CAF_CHECK(not_invoked(expr, 42));
CAF_CHECK_EQUAL(invoked(expr, "42"), 0);
CAF_CHECK_EQUAL(invoked(expr, "42f"), -1);
CAF_CHECK_EQUAL(invoked(expr, "42", "42"), -1);
CAF_CHECK_EQUAL(invoked(expr, 42), -1);
}
}
struct wrapped_int {
int value;
};
inline bool operator==(const wrapped_int& lhs, const wrapped_int& rhs) {
return lhs.value == rhs.value;
}
void test_arg_match() {
announce<wrapped_int>("wrapped_int", &wrapped_int::value);
auto expr = on(42, arg_match) >> [](int i) {
s_invoked[0] = true;
CAF_CHECK_EQUAL(i, 1);
};
CAF_CHECK_EQUAL(invoked(expr, 42, 1.f), -1);
CAF_CHECK_EQUAL(invoked(expr, 42), -1);
CAF_CHECK_EQUAL(invoked(expr, 1, 42), -1);
CAF_CHECK_EQUAL(invoked(expr, 42, 1), 0);
auto expr2 = on("-a", arg_match) >> [](const string& value) {
s_invoked[0] = true;
CAF_CHECK_EQUAL(value, "b");
};
CAF_CHECK_EQUAL(invoked(expr2, "b", "-a"), -1);
CAF_CHECK_EQUAL(invoked(expr2, "-a"), -1);
CAF_CHECK_EQUAL(invoked(expr2, "-a", "b"), 0);
auto expr3 = on(wrapped_int{42}, arg_match) >> [](wrapped_int i) {
s_invoked[0] = true;
CAF_CHECK_EQUAL(i.value, 1);
};
CAF_CHECK_EQUAL(invoked(expr3, wrapped_int{42}, 1.f), -1);
CAF_CHECK_EQUAL(invoked(expr3, 42), -1);
CAF_CHECK_EQUAL(invoked(expr3, wrapped_int{1}, wrapped_int{42}), -1);
CAF_CHECK_EQUAL(invoked(expr3, 42, 1), -1);
CAF_CHECK_EQUAL(invoked(expr3, wrapped_int{42}, wrapped_int{1}), 0);
}
int main() {
CAF_TEST(test_match);
test_atoms();
test_custom_projections();
test_arg_match();
return CAF_TEST_RESULT();
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment