Commit afdcaf79 authored by Dominik Charousset's avatar Dominik Charousset

More cppcheck fixes, reimplement `test_match_expr`

parent b47702ee
......@@ -226,7 +226,6 @@ void deserialize_impl(channel& ptrref, deserializer* source) {
}
void serialize_impl(const message& tup, serializer* sink) {
std::string dynamic_name; // used if tup holds an object_array
// ttn can be nullptr even if tuple is not empty (in case of object_array)
std::string tname = tup.empty() ? "@<>" : tup.tuple_type_names();
auto uti_map = detail::singletons::get_uniform_type_info_map();
......@@ -485,8 +484,7 @@ protected:
class default_meta_message : public uniform_type_info {
public:
default_meta_message(const std::string& tname) {
m_name = tname;
default_meta_message(const std::string& tname) : m_name(tname) {
std::vector<std::string> elements;
split(elements, tname, is_any_of("+"));
auto uti_map = detail::singletons::get_uniform_type_info_map();
......@@ -555,11 +553,11 @@ template <class Iterator>
struct builtin_types_helper {
Iterator pos;
builtin_types_helper(Iterator first) : pos(first) {}
inline void operator()() {
void operator()() const {
// end of recursion
}
template <class T, class... Ts>
inline void operator()(T& arg, Ts&... args) {
void operator()(T& arg, Ts&... args) {
*pos++ = &arg;
(*this)(args...);
}
......
......@@ -408,7 +408,6 @@ namespace network {
struct fd_event {
native_socket fd; // our file descriptor
short mask; // the event mask returned by poll()
short fd_mask; // the mask associated with fd
event_handler* ptr; // nullptr in case of a pipe event
};
std::vector<fd_event> poll_res;
......@@ -449,7 +448,7 @@ namespace network {
if (pfd.revents != 0) {
CAF_LOG_DEBUG("event on socket " << pfd.fd
<< ", revents = " << pfd.revents);
poll_res.push_back({pfd.fd, pfd.revents, pfd.events, m_shadow[i]});
poll_res.push_back({pfd.fd, pfd.revents, m_shadow[i]});
pfd.revents = 0;
--presult; // stop as early as possible
}
......
......@@ -21,6 +21,7 @@ add_unit_test(atom)
add_unit_test(metaprogramming)
add_unit_test(intrusive_containers)
add_unit_test(match)
add_unit_test(match_expr)
add_unit_test(message)
add_unit_test(serialization)
add_unit_test(uniform_type)
......
#include "test.hpp"
#include "cppa/variant.hpp"
#include "cppa/all.hpp"
#include "cppa/detail/demangle.hpp"
#include "caf/all.hpp"
#include "caf/detail/safe_equal.hpp"
using std::cout;
using std::endl;
using boost::get;
using boost::none;
using boost::none_t;
using boost::variant;
using namespace cppa;
using namespace caf;
#define CPPA_CHECK_VARIANT(Call, Type, Expected) \
#define CAF_CHECK_VARIANT(Handler, Message, Type, Expected) \
{ \
auto res = Call; \
auto msg = Message; \
auto res = Handler(msg); \
if (get<Type>(&res) == nullptr) { \
CPPA_FAILURE("result has invalid type"); \
} else if (*get<Type>(&res) != Expected) { \
CPPA_FAILURE("expected " << Expected << " found " \
<< *get<Type>(&res)); \
CAF_FAILURE("result has invalid type"); \
} else if (!caf::detail::safe_equal(*get<Type>(&res), Expected)) { \
CAF_FAILURE("expected " << Expected << " found " << *get<Type>(&res)); \
} else { \
CPPA_CHECKPOINT(); \
CAF_CHECKPOINT(); \
} \
} \
static_cast<void>(0)
#define CPPA_CHECK_VARIANT_UNIT(Call) \
#define CAF_CHECK_VARIANT_UNIT(Handler, Message) \
{ \
auto res = Call; \
auto msg = Message; \
auto res = Handler(msg); \
if (get<unit_t>(&res) == nullptr) { \
CPPA_FAILURE("result has invalid type"); \
CAF_FAILURE("result has invalid type"); \
} else { \
CPPA_CHECKPOINT(); \
CAF_CHECKPOINT(); \
} \
} \
static_cast<void>(0)
#define CPPA_CHECK_OPT_MSG(Call, Type, Expected) \
#define CAF_CHECK_OPT_MSG(Handler, Message, Type, Expected) \
{ \
auto res = Call; \
auto msg = Message; \
auto res = Handler(msg); \
if (!res) { \
CPPA_FAILURE("result is none"); \
} else if (res->type_at(0) != uniform_typeid<Type>()) { \
CPPA_FAILURE("result has invalid type: expected: " \
<< cppa::detail::demangle(typeid(Expected).name()) \
<< ", found: " \
<< cppa::detail::demangle(typeid(Type).name())); \
} else if (res->get_as<Type>(0) != Expected) { \
CPPA_FAILURE("expected " << Expected << " found " \
CAF_FAILURE("result is none"); \
} else if (!res->match_element<Type>(0)) { \
CAF_FAILURE("result has invalid type: expected: " \
<< typeid(Expected).name() \
<< ", found: " << typeid(Type).name()); \
} else if (!caf::detail::safe_equal(res->get_as<Type>(0), Expected)) { \
CAF_FAILURE("expected " << Expected << " found " \
<< res->get_as<Type>(0)); \
} else { \
CPPA_CHECKPOINT(); \
CAF_CHECKPOINT(); \
} \
} \
static_cast<void>(0)
#define CPPA_CHECK_OPT_MSG_VOID(Call) \
#define CAF_CHECK_OPT_MSG_VOID(Call) \
{ \
auto res = Call; \
if (!res) { \
CPPA_FAILURE("result has invalid type: optional is none"); \
CAF_FAILURE("result has invalid type: optional is none"); \
} else if (!res->empty()) { \
CPPA_FAILURE("result has invalid type: tuple is not empty"); \
CAF_FAILURE("result has invalid type: tuple is not empty"); \
} else { \
CPPA_CHECKPOINT(); \
CAF_CHECKPOINT(); \
} \
} \
static_cast<void>(0)
#define CPPA_CHECK_OPT_MSG_NONE(Call) \
#define CAF_CHECK_OPT_MSG_NONE(Call) \
{ \
auto res = Call; \
if (res) { \
if (res->empty()) { \
CPPA_FAILURE("result has invalid type: expected none, " \
<< "found: an empty tuple"); \
CAF_FAILURE("result has invalid type: expected none, " \
<< "found an empty tuple"); \
} else { \
CPPA_FAILURE("result has invalid type: expected none, " \
<< "found: " \
<< detail::demangle(res->type_token()->name())); \
CAF_FAILURE("result has invalid type: expected none, " \
<< "found a non-empty tuple "); \
} \
} else { \
CPPA_CHECKPOINT(); \
CAF_CHECKPOINT(); \
} \
} \
static_cast<void>(0)
struct printer {
inline void operator()() { cout << endl; }
template<typename T, typename... Ts>
void operator()(const boost::optional<T>& v, const Ts&... vs) {
if (v)
inline void operator()() const{
cout << endl;
}
template<typename V, typename... Vs>
void operator()(const optional<V>& v, const Vs&... vs) const {
if (v) {
cout << *v << " ";
else
} else {
cout << "[none] ";
}
(*this)(vs...);
}
template<typename T, typename... Ts>
void operator()(const T& v, const Ts&... vs) {
template<typename V, typename... Vs>
void operator()(const V& v, const Vs&... vs) const {
cout << v << " ";
(*this)(vs...);
}
......@@ -109,7 +105,7 @@ struct printer {
};
int main() {
CPPA_TEST(test_match_expr);
CAF_TEST(test_match_expr);
auto g = guarded(std::equal_to<int>{}, 5);
auto t0 = std::make_tuple(unit, g, unit);
......@@ -118,7 +114,6 @@ int main() {
detail::lifted_fun_zipper zip;
auto is = detail::get_indices(t2);
auto r0 = detail::tuple_zip(zip, is, t0, t1);
cout << "typeid(r0) = " << detail::demangle(typeid(r0).name()) << endl;
printer p;
detail::apply_args(p, is, r0);
......@@ -126,80 +121,80 @@ int main() {
// check on() usage
auto m0 = on<int>() >> [](int) {};
// auto m0r0 = m0(make_message(1));
CPPA_CHECK_VARIANT_UNIT(m0(make_message(1)));
CAF_CHECK_VARIANT_UNIT(m0, make_message(1));
// check lifted functor
auto m1 = detail::lift_to_match_expr([](float) {});
CPPA_CHECK_VARIANT_UNIT(m1(make_message(1.f)));
CAF_CHECK_VARIANT_UNIT(m1, make_message(1.f));
// check _.or_else(_)
auto m2 = m0.or_else(m1);
CPPA_CHECK_VARIANT_UNIT(m2(make_message(1)));
CPPA_CHECK_VARIANT_UNIT(m2(make_message(1.f)));
CAF_CHECK_VARIANT_UNIT(m2, make_message(1));
CAF_CHECK_VARIANT_UNIT(m2, make_message(1.f));
// check use of match_expr_concat
auto m3 = detail::match_expr_concat(
m0, m1, detail::lift_to_match_expr([](double) {}));
CPPA_CHECK_OPT_MSG_VOID(m3->invoke(make_message(1)));
CPPA_CHECK_OPT_MSG_VOID(m3->invoke(make_message(1.f)));
CPPA_CHECK_OPT_MSG_VOID(m3->invoke(make_message(1.)));
CPPA_CHECK_OPT_MSG_NONE(m3->invoke(make_message("1")));
CAF_CHECK_OPT_MSG_VOID(m3->invoke(make_message(1)));
CAF_CHECK_OPT_MSG_VOID(m3->invoke(make_message(1.f)));
CAF_CHECK_OPT_MSG_VOID(m3->invoke(make_message(1.)));
CAF_CHECK_OPT_MSG_NONE(m3->invoke(make_message("1")));
}
{ // --- same with guards ---
auto m0 = on(1) >> [](int i) { CPPA_CHECK_EQUAL(i, 1); };
CPPA_CHECK_VARIANT_UNIT(m0(make_message(1)));
auto m0 = on(1) >> [](int i) { CAF_CHECK_EQUAL(i, 1); };
CAF_CHECK_VARIANT_UNIT(m0, make_message(1));
// check lifted functor
auto m1 = on(1.f) >> [](float) {};
CPPA_CHECK_VARIANT_UNIT(m1(make_message(1.f)));
CAF_CHECK_VARIANT_UNIT(m1, make_message(1.f));
// check _.or_else(_)
auto m2 = m0.or_else(m1);
CPPA_CHECK_VARIANT_UNIT(m2(make_message(1)));
CPPA_CHECK_VARIANT_UNIT(m2(make_message(1.f)));
CAF_CHECK_VARIANT_UNIT(m2, make_message(1));
CAF_CHECK_VARIANT_UNIT(m2, make_message(1.f));
// check use of match_expr_concat
auto m3 = detail::match_expr_concat(m0, m1, on(1.) >> [](double) {});
CPPA_CHECK_OPT_MSG_VOID(m3->invoke(make_message(1)));
CPPA_CHECK_OPT_MSG_NONE(m3->invoke(make_message(2)));
CPPA_CHECK_OPT_MSG_VOID(m3->invoke(make_message(1.f)));
CPPA_CHECK_OPT_MSG_NONE(m3->invoke(make_message(2.f)));
CPPA_CHECK_OPT_MSG_VOID(m3->invoke(make_message(1.)));
CPPA_CHECK_OPT_MSG_NONE(m3->invoke(make_message(2.)));
CPPA_CHECK_OPT_MSG_NONE(m3->invoke(make_message("1")));
CAF_CHECK_OPT_MSG_VOID(m3->invoke(make_message(1)));
CAF_CHECK_OPT_MSG_NONE(m3->invoke(make_message(2)));
CAF_CHECK_OPT_MSG_VOID(m3->invoke(make_message(1.f)));
CAF_CHECK_OPT_MSG_NONE(m3->invoke(make_message(2.f)));
CAF_CHECK_OPT_MSG_VOID(m3->invoke(make_message(1.)));
CAF_CHECK_OPT_MSG_NONE(m3->invoke(make_message(2.)));
CAF_CHECK_OPT_MSG_NONE(m3->invoke(make_message("1")));
}
{ // --- mixin it up with message_handler
// check on() usage
message_handler m0{on<int>() >> [](int) {}};
CPPA_CHECK_OPT_MSG_VOID(m0(make_message(1)));
CAF_CHECK_OPT_MSG_VOID(m0(make_message(1)));
// check lifted functor
auto m1 = detail::lift_to_match_expr([](float) {});
CPPA_CHECK_VARIANT_UNIT(m1(make_message(1.f)));
CAF_CHECK_VARIANT_UNIT(m1, make_message(1.f));
// check _.or_else(_)
auto m2 = m0.or_else(m1);
CPPA_CHECK_OPT_MSG_VOID(m2(make_message(1)));
CPPA_CHECK_OPT_MSG_VOID(m2(make_message(1.f)));
CAF_CHECK_OPT_MSG_VOID(m2(make_message(1)));
CAF_CHECK_OPT_MSG_VOID(m2(make_message(1.f)));
// check use of match_expr_concat
auto m3 = detail::match_expr_concat(
m0, m1, detail::lift_to_match_expr([](double) {}));
CPPA_CHECK_OPT_MSG_VOID(m3->invoke(make_message(1)));
CPPA_CHECK_OPT_MSG_VOID(m3->invoke(make_message(1.)));
CPPA_CHECK_OPT_MSG_VOID(m3->invoke(make_message(1.f)));
CAF_CHECK_OPT_MSG_VOID(m3->invoke(make_message(1)));
CAF_CHECK_OPT_MSG_VOID(m3->invoke(make_message(1.)));
CAF_CHECK_OPT_MSG_VOID(m3->invoke(make_message(1.f)));
}
{ // --- use match_expr with result ---
auto m4 = on<int>() >> [](int i) { return i; };
CPPA_CHECK_VARIANT(m4(make_message(42)), int, 42);
CAF_CHECK_VARIANT(m4, make_message(42), int, 42);
auto m5 = on<float>() >> [](float f) { return f; };
CPPA_CHECK_VARIANT(m5(make_message(4.2f)), float, 4.2f);
CAF_CHECK_VARIANT(m5, make_message(4.2f), float, 4.2f);
auto m6 = m4.or_else(m5);
CPPA_CHECK_VARIANT(m6(make_message(4.2f)), float, 4.2f);
CPPA_CHECK_VARIANT(m6(make_message(42)), int, 42);
CAF_CHECK_VARIANT(m6, make_message(4.2f), float, 4.2f);
CAF_CHECK_VARIANT(m6, make_message(42), int, 42);
}
{ // --- storing some match_expr in a behavior ---
behavior m5{on(1) >> [] { return 2; }, on(1.f) >> [] { return 2.f; },
on(1.) >> [] { return 2.; }};
CPPA_CHECK_OPT_MSG(m5(make_message(1)), int, 2);
CPPA_CHECK_OPT_MSG(m5(make_message(1.)), double, 2.);
CPPA_CHECK_OPT_MSG(m5(make_message(1.f)), float, 2.f);
CAF_CHECK_OPT_MSG(m5, make_message(1), int, 2);
CAF_CHECK_OPT_MSG(m5, make_message(1.), double, 2.);
CAF_CHECK_OPT_MSG(m5, make_message(1.f), float, 2.f);
}
return CPPA_TEST_RESULT();
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