SRS-control 0.1.4
Loading...
Searching...
No Matches
UnitTestStruct.cpp
Go to the documentation of this file.
4#include <array>
5#include <chrono>
6#include <cstddef>
7#include <cstdint>
8#include <gtest/gtest.h>
9#include <random>
10#include <ranges>
11
12using srs::StructData;
13
14namespace process = srs::process;
15
16namespace
17{
18
19 auto generate_random_struct_data() -> StructData
20 {
21 static constexpr auto MAX_NUM_SIZE = 100;
22 auto struct_data = StructData{};
23
24 auto random_device = std::random_device{};
25 auto random_gen = std::mt19937_64{ random_device() };
26
27 auto data_size_gen = std::uniform_int_distribution<uint32_t>{ 1, MAX_NUM_SIZE };
28
29 const auto marker_size = data_size_gen(random_gen);
30 const auto hit_size = data_size_gen(random_gen);
31
32 struct_data.header.frame_counter = 1;
33 struct_data.header.vmm_tag = std::array<char, 3>{ 'V', 'M', '3' };
34 struct_data.header.udp_timestamp = std::chrono::system_clock::now().time_since_epoch().count();
35
36 // NOLINTBEGIN (cppcoreguidelines-avoid-magic-numbers)
37 auto vmm_id_gen = std::uniform_int_distribution<uint8_t>{ 0, (1U << 5U) - 1 };
38 auto srs_timestamp_gen = std::uniform_int_distribution<uint64_t>{ 0, (uint64_t{ 1 } << 42U) - 1 };
39
40 struct_data.marker_data.reserve(marker_size);
41 for (auto idx : std::views::iota(uint32_t{ 0 }, marker_size))
42 {
43 auto& marker = struct_data.marker_data.emplace_back();
44 marker.vmm_id = vmm_id_gen(random_gen);
45 marker.srs_timestamp = srs_timestamp_gen(random_gen);
46 }
47
48 auto channel_num_gen = std::uniform_int_distribution<uint8_t>{ 0, (1U << 6U) - 1 };
49 auto tdc_gen = std::uniform_int_distribution<uint8_t>{ 0, (1U << 8U) - 1 };
50 auto offset_gen = std::uniform_int_distribution<uint8_t>{ 0, (1U << 5U) - 1 };
51 auto adc_gen = std::uniform_int_distribution<uint16_t>{ 0, (1U << 10U) - 1 };
52 auto bc_id_gen = std::uniform_int_distribution<uint16_t>{ 0, (1U << 12U) - 1 };
53 // NOLINTEND (cppcoreguidelines-avoid-magic-numbers)
54
55 struct_data.hit_data.reserve(hit_size);
56 for ([[maybe_unused]] auto idx : std::views::iota(uint32_t{ 0 }, hit_size))
57 {
58 auto& hit = struct_data.hit_data.emplace_back();
59 hit.channel_num = channel_num_gen(random_gen);
60 hit.channel_num = channel_num_gen(random_gen);
61 hit.tdc = tdc_gen(random_gen);
62 hit.offset = offset_gen(random_gen);
63 hit.adc = adc_gen(random_gen);
64 hit.bc_id = bc_id_gen(random_gen);
65 }
66
67 return struct_data;
68 }
69
70} // namespace
71
72TEST(data_structure, check_de_serialization)
73{
74 auto random_data = generate_random_struct_data();
75
76 auto serializer_converter = process::StructSerializer();
77 auto deserializer_converter = process::StructDeserializer();
78
79 auto initial_converter = [&random_data](std::size_t /*line_number*/ = 0) -> const StructData*
80 { return &random_data; };
81
82 auto res = serializer_converter.run(initial_converter);
83
84 EXPECT_FALSE(res.has_value());
85 auto struct_data = deserializer_converter.run(serializer_converter);
86 EXPECT_FALSE(struct_data.has_value());
87}
TEST(data_structure, check_de_serialization)