IRSOL
C++ code implementing socket server for interacting with Baumer camera.
test_variants.cpp
Go to the documentation of this file.
8
9#include <catch2/catch_all.hpp>
10#include <memory>
11#include <string>
12#include <string_view>
13#include <utility>
14
15constexpr bool
16strings_equal(char const* a, char const* b)
17{
18 return std::string_view(a) == b;
19}
20
21TEST_CASE("InMessageKindToString()", "[Protocol][Protocol::Message]")
22{
23 {
24 auto [messageKind, expected] = GENERATE(
25 std::make_pair(irsol::protocol::InMessageKind::ASSIGNMENT, "ASSIGNMENT"),
26 std::make_pair(irsol::protocol::InMessageKind::INQUIRY, "INQUIRY"),
27 std::make_pair(irsol::protocol::InMessageKind::COMMAND, "COMMAND"));
29 }
30 {
31 {
32 constexpr auto messageKind = irsol::protocol::InMessageKind::COMMAND;
34 }
35 {
36 constexpr auto messageKind = irsol::protocol::InMessageKind::INQUIRY;
38 }
39 {
40 constexpr auto messageKind = irsol::protocol::InMessageKind::ASSIGNMENT;
42 strings_equal(irsol::protocol::InMessageKindToString(messageKind), "ASSIGNMENT"));
43 }
44 }
45}
46
47TEST_CASE("OutMessageKindToString()", "[Protocol][Protocol::Message]")
48{
49 {
50 auto [messageKind, expected] = GENERATE(
51 std::make_pair(irsol::protocol::OutMessageKind::SUCCESS, "SUCCESS"),
52 std::make_pair(irsol::protocol::OutMessageKind::BINARY_BUFFER, "BINARY_BUFFER"),
53 std::make_pair(irsol::protocol::OutMessageKind::BW_IMAGE, "BW_IMAGE"),
54 std::make_pair(irsol::protocol::OutMessageKind::COLOR_IMAGE, "COLOR_IMAGE"),
55 std::make_pair(irsol::protocol::OutMessageKind::ERROR, "ERROR"));
57 }
58 {
59 {
60 constexpr auto messageKind = irsol::protocol::OutMessageKind::SUCCESS;
62 }
63 {
64 constexpr auto messageKind = irsol::protocol::OutMessageKind::BINARY_BUFFER;
66 strings_equal(irsol::protocol::OutMessageKindToString(messageKind), "BINARY_BUFFER"));
67 }
68 {
69 constexpr auto messageKind = irsol::protocol::OutMessageKind::BW_IMAGE;
71 }
72 {
73 constexpr auto messageKind = irsol::protocol::OutMessageKind::COLOR_IMAGE;
75 strings_equal(irsol::protocol::OutMessageKindToString(messageKind), "COLOR_IMAGE"));
76 }
77 {
78 constexpr auto messageKind = irsol::protocol::OutMessageKind::ERROR;
80 }
81 }
82}
83
84TEST_CASE("getInMessageKind<direct>()", "[Protocol][Protocol::Message]")
85{
86 {
87 auto m = irsol::protocol::Assignment{"x", 42};
90 }
91 {
92 auto m = irsol::protocol::Inquiry{"x"};
94 }
95 {
96 auto m = irsol::protocol::Command{"x"};
98 }
99}
100
101TEST_CASE("getInMessageKind<variant>()", "[Protocol][Protocol::Message]")
102{
103 {
106 }
107 {
110 }
111 {
114 }
115}
116
117TEST_CASE("isAssignment<direct>()", "[Protocol][Protocol::Message]")
118{
119 {
120 auto m = irsol::protocol::Assignment{"x", 42};
122 }
123 {
124 auto m = irsol::protocol::Inquiry{"x"};
125 STATIC_CHECK_FALSE(irsol::protocol::isAssignment(m));
126 }
127 {
128 auto m = irsol::protocol::Command{"x"};
129 STATIC_CHECK_FALSE(irsol::protocol::isAssignment(m));
130 }
131}
132
133TEST_CASE("isAssignment<variant>()", "[Protocol][Protocol::Message]")
134{
135 {
138 }
139 {
142 }
143 {
146 }
147}
148
149TEST_CASE("isInquiry<direct>()", "[Protocol][Protocol::Message]")
150{
151 {
152 auto m = irsol::protocol::Inquiry{"x"};
154 }
155 {
156 auto m = irsol::protocol::Assignment{"x", 42};
157 STATIC_CHECK_FALSE(irsol::protocol::isInquiry(m));
158 }
159 {
160 auto m = irsol::protocol::Command{"x"};
161 STATIC_CHECK_FALSE(irsol::protocol::isInquiry(m));
162 }
163}
164
165TEST_CASE("isInquiry<variant>()", "[Protocol][Protocol::Message]")
166{
167 {
170 }
171 {
174 }
175 {
178 }
179}
180
181TEST_CASE("isCommand<direct>()", "[Protocol][Protocol::Message]")
182{
183 {
184 auto m = irsol::protocol::Command{"x"};
186 }
187 {
188 auto m = irsol::protocol::Inquiry{"x"};
189 STATIC_CHECK_FALSE(irsol::protocol::isCommand(m));
190 }
191 {
192 auto m = irsol::protocol::Assignment{"x", 42};
193 STATIC_CHECK_FALSE(irsol::protocol::isCommand(m));
194 }
195}
196
197TEST_CASE("isCommand<variant>()", "[Protocol][Protocol::Message]")
198{
199 {
202 }
203 {
206 }
207 {
210 }
211}
212TEST_CASE("getOutMessageKind<direct>()", "[Protocol][Protocol::Message]")
213{
214 {
217 }
218 {
219 std::vector<irsol::types::byte_t> data(
221 auto m = irsol::protocol::BinaryDataBuffer{std::move(data), {10}};
224 }
225 {
226 std::vector<irsol::types::byte_t> data(
228 auto m = irsol::protocol::ImageBinaryData{std::move(data), {10, 16}};
231 }
232 {
233 std::vector<irsol::types::byte_t> data(
235 auto m = irsol::protocol::ColorImageBinaryData{std::move(data), {10, 16, 3}};
238 }
239 {
240 auto m = irsol::protocol::Error::from(irsol::protocol::Command{"x"}, "error message");
242 }
243}
244TEST_CASE("getOutMessageKind<variant>()", "[Protocol][Protocol::Message]")
245{
246 {
248 auto mVariant = irsol::protocol::OutMessage(std::move(m));
250 }
251 {
252 std::vector<irsol::types::byte_t> data(
254 auto m = irsol::protocol::BinaryDataBuffer{std::move(data), {10}};
255 auto mVariant = irsol::protocol::OutMessage{std::move(m)};
256 CHECK(
259 }
260 {
261 std::vector<irsol::types::byte_t> data(
263 auto m = irsol::protocol::ImageBinaryData{std::move(data), {10, 16}};
264 auto mVariant = irsol::protocol::OutMessage{std::move(m)};
265 CHECK(
267 }
268 {
269 std::vector<irsol::types::byte_t> data(
271 auto m = irsol::protocol::ColorImageBinaryData{std::move(data), {10, 16, 3}};
272 auto mVariant = irsol::protocol::OutMessage{std::move(m)};
273 CHECK(
275 }
276 {
277 auto m = irsol::protocol::Error::from(irsol::protocol::Command{"x"}, "error message");
278 auto mVariant = irsol::protocol::OutMessage(std::move(m));
280 }
281}
282
283TEST_CASE("isSuccess<direct>()", "[Protocol][Protocol::Message]")
284{
285 {
288 }
289 {
291 STATIC_CHECK_FALSE(irsol::protocol::isSuccess(m));
292 }
293 {
294 auto m = irsol::protocol::ImageBinaryData{{}, {}};
295 STATIC_CHECK_FALSE(irsol::protocol::isSuccess(m));
296 }
297 {
299 STATIC_CHECK_FALSE(irsol::protocol::isSuccess(m));
300 }
301 {
302 auto m = irsol::protocol::Error::from(irsol::protocol::Command{"x"}, "error message");
303 STATIC_CHECK_FALSE(irsol::protocol::isSuccess(m));
304 }
305}
306TEST_CASE("isSuccess<variant>()", "[Protocol][Protocol::Message]")
307{
308 {
309 auto m =
312 }
313 {
316 }
317 {
320 }
321 {
324 }
325 {
329 }
330}
331
332TEST_CASE("isBinaryDataBuffer<direct>()", "[Protocol][Protocol::Message]")
333{
334 {
337 }
338 {
340 STATIC_CHECK_FALSE(irsol::protocol::isBinaryDataBuffer(m));
341 }
342 {
343 auto m = irsol::protocol::ImageBinaryData{{}, {}};
344 STATIC_CHECK_FALSE(irsol::protocol::isBinaryDataBuffer(m));
345 }
346 {
348 STATIC_CHECK_FALSE(irsol::protocol::isBinaryDataBuffer(m));
349 }
350 {
351 auto m = irsol::protocol::Error::from(irsol::protocol::Command{"x"}, "error message");
352 STATIC_CHECK_FALSE(irsol::protocol::isBinaryDataBuffer(m));
353 }
354}
355
356TEST_CASE("isBinaryDataBuffer<variant>()", "[Protocol][Protocol::Message]")
357{
358 {
361 }
362 {
363 auto m =
366 }
367 {
370 }
371 {
374 }
375 {
379 }
380}
381
382TEST_CASE("isImageBinaryData<direct>()", "[Protocol][Protocol::Message]")
383{
384 {
385 auto m = irsol::protocol::ImageBinaryData{{}, {}};
387 }
388 {
390 STATIC_CHECK_FALSE(irsol::protocol::isImageBinaryData(m));
391 }
392 {
394 STATIC_CHECK_FALSE(irsol::protocol::isImageBinaryData(m));
395 }
396 {
398 STATIC_CHECK_FALSE(irsol::protocol::isImageBinaryData(m));
399 }
400 {
401 auto m = irsol::protocol::Error::from(irsol::protocol::Command{"x"}, "error message");
402 STATIC_CHECK_FALSE(irsol::protocol::isImageBinaryData(m));
403 }
404}
405
406TEST_CASE("isImageBinaryData<variant>()", "[Protocol][Protocol::Message]")
407{
408 {
411 }
412 {
413 auto m =
416 }
417 {
420 }
421 {
424 }
425 {
429 }
430}
431
432TEST_CASE("isColorImageBinaryData<direct>()", "[Protocol][Protocol::Message]")
433{
434 {
437 }
438 {
440 STATIC_CHECK_FALSE(irsol::protocol::isColorImageBinaryData(m));
441 }
442 {
444 STATIC_CHECK_FALSE(irsol::protocol::isColorImageBinaryData(m));
445 }
446 {
447 auto m = irsol::protocol::ImageBinaryData{{}, {}};
448 STATIC_CHECK_FALSE(irsol::protocol::isColorImageBinaryData(m));
449 }
450 {
451 auto m = irsol::protocol::Error::from(irsol::protocol::Command{"x"}, "error message");
452 STATIC_CHECK_FALSE(irsol::protocol::isColorImageBinaryData(m));
453 }
454}
455
456TEST_CASE("isColorImageBinaryData<variant>()", "[Protocol][Protocol::Message]")
457{
458 {
461 }
462 {
463 auto m =
466 }
467 {
470 }
471 {
474 }
475 {
479 }
480}
481
482TEST_CASE("isError<direct>()", "[Protocol][Protocol::Message]")
483{
484 {
485 auto m = irsol::protocol::Error::from(irsol::protocol::Command{"x"}, "error message");
487 }
488 {
490 STATIC_CHECK_FALSE(irsol::protocol::isError(m));
491 }
492 {
494 STATIC_CHECK_FALSE(irsol::protocol::isError(m));
495 }
496 {
497 auto m = irsol::protocol::ImageBinaryData{{}, {}};
498 STATIC_CHECK_FALSE(irsol::protocol::isError(m));
499 }
500 {
502 STATIC_CHECK_FALSE(irsol::protocol::isError(m));
503 }
504}
505
506TEST_CASE("isError<variant>()", "[Protocol][Protocol::Message]")
507{
508 {
512 }
513 {
514 auto m =
517 }
518 {
521 }
522 {
525 }
526 {
529 }
530}
Protocol assignment operation representation.
Protocol binary data types and attributes definitions.
Protocol command representation.
Protocol error message representation.
constexpr bool isError(IRSOL_MAYBE_UNUSED T &msg)
Checks if a given outgoing message type is Error.
Definition variants.hpp:347
std::variant< Assignment, Inquiry, Command > InMessage
Variant type representing any incoming message.
Definition variants.hpp:86
constexpr OutMessageKind getOutMessageKind(IRSOL_MAYBE_UNUSED const T &msg)
Returns the OutMessageKind enum value corresponding to a given outgoing message type.
Definition variants.hpp:254
constexpr bool isCommand(IRSOL_MAYBE_UNUSED T &msg)
Checks if a given incoming message type is a Command.
Definition variants.hpp:237
constexpr const char * OutMessageKindToString(OutMessageKind kind)
Converts an OutMessageKind enum to a human-readable string.
Definition variants.hpp:116
constexpr bool isSuccess(IRSOL_MAYBE_UNUSED T &msg)
Checks if a given outgoing message type is Success.
Definition variants.hpp:287
constexpr bool isColorImageBinaryData(IRSOL_MAYBE_UNUSED T &msg)
Checks if a given outgoing message type is ColorImageBinaryData.
Definition variants.hpp:332
constexpr bool isInquiry(IRSOL_MAYBE_UNUSED T &msg)
Checks if a given incoming message type is an Inquiry.
Definition variants.hpp:222
constexpr bool isBinaryDataBuffer(IRSOL_MAYBE_UNUSED T &msg)
Checks if a given outgoing message type is BinaryDataBuffer.
Definition variants.hpp:302
constexpr bool isAssignment(IRSOL_MAYBE_UNUSED T &msg)
Checks if a given incoming message type is an Assignment.
Definition variants.hpp:207
constexpr bool isImageBinaryData(IRSOL_MAYBE_UNUSED T &msg)
Checks if a given outgoing message type is ImageBinaryData (black & white).
Definition variants.hpp:317
constexpr const char * InMessageKindToString(InMessageKind kind)
Converts an InMessageKind enum to a human-readable string.
Definition variants.hpp:59
std::variant< Success, BinaryDataBuffer, ImageBinaryData, ColorImageBinaryData, Error > OutMessage
Variant type representing any outgoing message.
Definition variants.hpp:149
constexpr InMessageKind getInMessageKind(IRSOL_MAYBE_UNUSED const T &msg)
Returns the InMessageKind enum value corresponding to a given incoming message type.
Definition variants.hpp:178
Protocol inquiry representation.
Represents an assignment operation in the protocol.
Represents a command invocation in the protocol.
Definition command.hpp:33
static Error from(const T &msg, const std::string &description)
Creates an error from a specific incoming message type.
Definition error.hpp:63
Represents a value inquiry in the protocol.
Definition inquiry.hpp:32
static Success from(const Assignment &msg, std::optional< irsol::types::protocol_value_t > overrideValue=std::nullopt)
Creates a success message from an Assignment.
Definition success.hpp:75
Represents a binary data object within the protocol.
Definition binary.hpp:107
static constexpr uint8_t BYTES_PER_ELEMENT
Number of bytes per element.
Definition binary.hpp:112
Protocol success message representation.
CHECK(m.identifier==identifier)
CHECK_FALSE(m.hasDouble())
irsol::protocol::Assignment m(identifier, value)
STATIC_CHECK(m.DIM==1)
TEST_CASE("Pixel<T>::max())", "[PixelFormat]")
std::vector< std::string > expected
constexpr bool strings_equal(char const *a, char const *b)
Definitions and utilities for incoming and outgoing protocol messages.