From e56cf8d9846e51ae88fa72c8b0992d81da6fd7d5 Mon Sep 17 00:00:00 2001 From: Serge Aleynikov Date: Sat, 14 Feb 2015 17:19:17 -0500 Subject: Add ?assertReceive(Guard, Timeout) macro to eunit A convenience macro used for testing message passing logic by allowing to fail if a message matching a `Guard` is not received in the mailbox of the current process. --- lib/eunit/doc/overview.edoc | 15 +++++++++++++++ lib/eunit/include/eunit.hrl | 20 ++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/lib/eunit/doc/overview.edoc b/lib/eunit/doc/overview.edoc index df716cdeea..eb60f673ef 100644 --- a/lib/eunit/doc/overview.edoc +++ b/lib/eunit/doc/overview.edoc @@ -572,6 +572,21 @@ Examples:
`assertNotMatch(GuardedPattern, Expr)'
The inverse case of assertMatch, for convenience.
+
`assertReceive(GuardedPattern, Timeout)'
+
Waits for up to the `Timeout' milliseconds for a message to arrive +in the mailbox of the current process that matches against the +`GuardedPattern' if testing is enabled. +If no message matching the `GuardedPattern' is received in the specified +`Timeout' interval, the assertion fails and an informative exception will +be generated; see the `assert' macro for further details. `GuardedPattern' +can be anything that you can write on the left hand side of the `->' +symbol in a case-clause, except that it cannot contain comma-separated +guard tests. + +Examples: +```?assertReceive(done, 1000)''' +```?assertReceive(Bin when byte_size(Bin) > 10, 1000)''' +
`assertEqual(Expect, Expr)'
Evaluates the expressions `Expect' and `Expr' and compares the results for equality, if testing is enabled. If the values are not diff --git a/lib/eunit/include/eunit.hrl b/lib/eunit/include/eunit.hrl index 53d291430d..8a829396ec 100644 --- a/lib/eunit/include/eunit.hrl +++ b/lib/eunit/include/eunit.hrl @@ -163,6 +163,26 @@ -define(_assertNot(BoolExpr), ?_assert(not (BoolExpr))). +%% This is mostly a convenience which gives more detailed reports. +%% Note: Guard is a guarded pattern, and can not be used for value. +-ifdef(NOASSERT). +-define(assertReceive(Guard, Timeout), ok). +-else. +-define(assertReceive(Guard, Timeout), + begin + ((fun () -> + receive (Guard) -> ok + after Timeout -> erlang:error({assertReceive_timedout, + [{module, ?MODULE}, + {line, ?LINE}, + {pattern, (??Guard)}, + {timeout, __V}]}) + end + end)()) + end). +-endif. +-define(_assertReceive(Guard, Timeout), ?_test(?assertReceive(Guard, Timeout))). + %% This is mostly a convenience which gives more detailed reports. %% Note: Guard is a guarded pattern, and can not be used for value. -ifdef(NOASSERT). -- cgit v1.2.3