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 ([[maybe_unused]] 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.tdc = tdc_gen(random_gen);
61 hit.offset = offset_gen(random_gen);
62 hit.adc = adc_gen(random_gen);
63 hit.bc_id = bc_id_gen(random_gen);
64 }
65
66 return struct_data;
67 }
68
69} // namespace
70
71TEST(data_structure, check_de_serialization)
72{
73 const auto random_data = generate_random_struct_data();
74
75 auto serializer_converter = process::StructSerializer();
76 auto deserializer_converter = process::StructDeserializer();
77
78 auto initial_converter = [&random_data](std::size_t /*line_number*/ = 0) -> const StructData*
79 { return &random_data; };
80
81 auto res = serializer_converter.run(initial_converter);
82
83 EXPECT_TRUE(res.has_value());
84 auto struct_data = deserializer_converter.run(serializer_converter);
85 const auto& output_struct = *struct_data.value();
86 EXPECT_TRUE(random_data.header == output_struct.header);
87 EXPECT_TRUE(struct_data.has_value());
88 EXPECT_TRUE(random_data == *struct_data.value());
89}
TEST(data_structure, check_de_serialization)