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