File: message_builder.cpp

package info (click to toggle)
actor-framework 0.18.7-1~exp1
  • links: PTS
  • area: main
  • in suites: experimental
  • size: 8,740 kB
  • sloc: cpp: 85,162; sh: 491; python: 187; makefile: 11
file content (83 lines) | stat: -rw-r--r-- 3,031 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// This file is part of CAF, the C++ Actor Framework. See the file LICENSE in
// the main distribution directory for license terms and copyright or visit
// https://github.com/actor-framework/actor-framework/blob/master/LICENSE.

#define CAF_SUITE message_builder

#include "caf/message_builder.hpp"

#include "core-test.hpp"

#include <map>
#include <numeric>
#include <string>
#include <vector>

#include "caf/message.hpp"
#include "caf/type_id_list.hpp"

using namespace std::literals;

using namespace caf;

#define STEP(message)                                                          \
  MESSAGE(message);                                                            \
  if (true)

SCENARIO("message builders can build messages incrementally") {
  GIVEN("a default-constructed message builder") {
    WHEN("calling append and to_message multiple times") {
      THEN("each message contains the values added so far") {
        message_builder builder;
        CHECK(builder.empty());
        CHECK(builder.to_message().empty());
        CHECK_EQ(builder.size(), 0u);
        STEP("after adding 1, the message is (1)") {
          builder.append(int32_t{1});
          auto msg = builder.to_message();
          CHECK_EQ(builder.size(), 1u);
          CHECK_EQ(msg.types(), make_type_id_list<int32_t>());
          CHECK_EQ(to_string(msg.types()), "[int32_t]");
          CHECK_EQ(to_string(msg), "message(1)");
        }
        STEP("after adding [2, 3], the message is (1, 2, 3)") {
          std::vector<int32_t> xs{2, 3};
          builder.append(xs.begin(), xs.end());
          CHECK_EQ(builder.size(), 3u);
          auto msg = builder.to_message();
          CHECK_EQ(msg.types(),
                   (make_type_id_list<int32_t, int32_t, int32_t>()));
          CHECK_EQ(to_string(msg.types()), "[int32_t, int32_t, int32_t]");
          CHECK_EQ(to_string(msg), "message(1, 2, 3)");
        }
        STEP("move_to_message produces the same message again") {
          auto msg = builder.move_to_message();
          CHECK_EQ(msg.types(),
                   (make_type_id_list<int32_t, int32_t, int32_t>()));
          CHECK_EQ(to_string(msg.types()), "[int32_t, int32_t, int32_t]");
          CHECK_EQ(to_string(msg), "message(1, 2, 3)");
        }
      }
    }
  }
}

SCENARIO("message builders allows RAII types") {
  GIVEN("a default-constructed message builder") {
    WHEN("calling append with a string") {
      THEN("to_message copies the string content into a message") {
        message_builder builder;
        std::string quote = "He who laughs at himself "
                            "never runs out of things to laugh at.";
        builder.append(quote);
        auto msg = builder.to_message();
        CHECK_EQ(msg.types(), (make_type_id_list<std::string>()));
        CHECK_EQ(to_string(msg.types()), "[std::string]");
        using view_t = const_typed_message_view<std::string>;
        if (auto tup = view_t(msg); CHECK(tup)) {
          CHECK_EQ(get<0>(tup), quote);
        }
      }
    }
  }
}