Line data Source code
1 : /**
2 : * @file TriggerDataStructures_test.cxx
3 : *
4 : * This is part of the DUNE DAQ Application Framework, copyright 2020.
5 : * Licensing/copyright details are in the COPYING file that you should have
6 : * received with this code.
7 : */
8 :
9 : #include "trgdataformats/TriggerActivityData.hpp"
10 : #include "trgdataformats/TriggerCandidateData.hpp"
11 : #include "trgdataformats/TriggerObjectOverlay.hpp"
12 : #include "trgdataformats/TriggerPrimitive.hpp"
13 : #include "trgdataformats/Types.hpp"
14 :
15 : #define BOOST_TEST_MODULE TriggerDataStructures_test // NOLINT
16 :
17 : #include "boost/test/unit_test.hpp"
18 :
19 : #include <algorithm>
20 : #include <cstddef>
21 : #include <cstdint>
22 : #include <limits>
23 : #include <new>
24 : #include <set>
25 : #include <string>
26 : #include <type_traits>
27 : #include <vector>
28 :
29 : using namespace dunedaq::trgdataformats;
30 :
31 : BOOST_AUTO_TEST_SUITE(TriggerDataStructures_test)
32 :
33 2 : BOOST_AUTO_TEST_CASE(TriggerPrimitive_DefaultValues_And_Timestamp)
34 : {
35 1 : TriggerPrimitive tp;
36 :
37 1 : BOOST_REQUIRE_EQUAL(tp.version, TriggerPrimitive::s_trigger_primitive_version);
38 1 : BOOST_REQUIRE_EQUAL(tp.flag, 0);
39 1 : BOOST_REQUIRE_EQUAL(tp.detid, TypeDefaults::s_invalid_detid);
40 1 : BOOST_REQUIRE_EQUAL(tp.channel, TriggerPrimitive::s_invalid_tp_channel);
41 1 : BOOST_REQUIRE_EQUAL(tp.samples_over_threshold, TriggerPrimitive::s_invalid_samples_over_threshold);
42 1 : BOOST_REQUIRE_EQUAL(tp.time_start, TypeDefaults::s_invalid_timestamp);
43 1 : BOOST_REQUIRE_EQUAL(tp.samples_to_peak, TriggerPrimitive::s_invalid_samples_to_peak);
44 1 : BOOST_REQUIRE_EQUAL(tp.adc_integral, 0);
45 1 : BOOST_REQUIRE_EQUAL(tp.adc_peak, 0);
46 :
47 1 : constexpr timestamp_t test_ts = 0x12345678ULL;
48 1 : tp.set_timestamp(test_ts);
49 1 : BOOST_REQUIRE_EQUAL(tp.get_timestamp(), test_ts);
50 1 : BOOST_REQUIRE_EQUAL(tp.time_start, test_ts);
51 1 : }
52 :
53 2 : BOOST_AUTO_TEST_CASE(TriggerPrimitive_Ordering)
54 : {
55 1 : TriggerPrimitive a;
56 1 : TriggerPrimitive b;
57 1 : TriggerPrimitive c;
58 :
59 1 : a.time_start = 100;
60 1 : a.channel = 10;
61 :
62 1 : b.time_start = 100;
63 1 : b.channel = 8;
64 :
65 1 : c.time_start = 99;
66 1 : c.channel = 20;
67 :
68 1 : std::vector<TriggerPrimitive> tps{ a, b, c };
69 1 : std::sort(tps.begin(), tps.end());
70 :
71 1 : BOOST_REQUIRE_EQUAL(tps[0].time_start, 99);
72 1 : BOOST_REQUIRE_EQUAL(tps[0].channel, 20);
73 :
74 1 : BOOST_REQUIRE_EQUAL(tps[1].time_start, 100);
75 1 : BOOST_REQUIRE_EQUAL(tps[1].channel, 8);
76 :
77 1 : BOOST_REQUIRE_EQUAL(tps[2].time_start, 100);
78 1 : BOOST_REQUIRE_EQUAL(tps[2].channel, 10);
79 1 : }
80 :
81 2 : BOOST_AUTO_TEST_CASE(TriggerActivityData_DefaultValues)
82 : {
83 1 : TriggerActivityData ta;
84 :
85 1 : BOOST_REQUIRE_EQUAL(ta.version, TriggerActivityData::s_trigger_activity_version);
86 1 : BOOST_REQUIRE_EQUAL(ta.time_start, TypeDefaults::s_invalid_timestamp);
87 1 : BOOST_REQUIRE_EQUAL(ta.time_end, TypeDefaults::s_invalid_timestamp);
88 1 : BOOST_REQUIRE_EQUAL(ta.time_peak, TypeDefaults::s_invalid_timestamp);
89 1 : BOOST_REQUIRE_EQUAL(ta.time_activity, TypeDefaults::s_invalid_timestamp);
90 1 : BOOST_REQUIRE_EQUAL(ta.channel_start, TriggerActivityData::s_invalid_channel);
91 1 : BOOST_REQUIRE_EQUAL(ta.channel_end, TriggerActivityData::s_invalid_channel);
92 1 : BOOST_REQUIRE_EQUAL(ta.channel_peak, TriggerActivityData::s_invalid_channel);
93 1 : BOOST_REQUIRE_EQUAL(ta.adc_integral, 0);
94 1 : BOOST_REQUIRE_EQUAL(ta.adc_peak, 0);
95 1 : BOOST_REQUIRE_EQUAL(ta.detid, TypeDefaults::s_invalid_detid);
96 1 : BOOST_REQUIRE_EQUAL(static_cast<int>(ta.type), static_cast<int>(TriggerActivityData::Type::kUnknown));
97 1 : BOOST_REQUIRE_EQUAL(static_cast<int>(ta.algorithm), static_cast<int>(TriggerActivityData::Algorithm::kUnknown));
98 1 : }
99 :
100 2 : BOOST_AUTO_TEST_CASE(TriggerCandidateData_DefaultValues)
101 : {
102 1 : TriggerCandidateData tc{};
103 :
104 1 : BOOST_REQUIRE_EQUAL(tc.version, TriggerCandidateData::s_trigger_candidate_version);
105 1 : BOOST_REQUIRE_EQUAL(tc.time_start, TypeDefaults::s_invalid_timestamp);
106 1 : BOOST_REQUIRE_EQUAL(tc.time_end, TypeDefaults::s_invalid_timestamp);
107 1 : BOOST_REQUIRE_EQUAL(tc.time_candidate, TypeDefaults::s_invalid_timestamp);
108 1 : BOOST_REQUIRE_EQUAL(static_cast<int>(tc.type), static_cast<int>(TriggerCandidateData::Type::kUnknown));
109 1 : BOOST_REQUIRE_EQUAL(static_cast<int>(tc.algorithm), static_cast<int>(TriggerCandidateData::Algorithm::kUnknown));
110 :
111 1 : BOOST_REQUIRE_EQUAL(tc.detid, TypeDefaults::s_invalid_detid);
112 1 : }
113 :
114 2 : BOOST_AUTO_TEST_CASE(Types_DefaultConstants)
115 : {
116 1 : BOOST_REQUIRE_EQUAL(TypeDefaults::s_invalid_timestamp, std::numeric_limits<timestamp_t>::max());
117 1 : BOOST_REQUIRE_EQUAL(TypeDefaults::s_invalid_detid, std::numeric_limits<detid_t>::max());
118 1 : BOOST_REQUIRE_EQUAL(TypeDefaults::s_invalid_trigger_number, std::numeric_limits<trigger_number_t>::max());
119 1 : BOOST_REQUIRE(g_whole_detector != TypeDefaults::s_invalid_detid);
120 1 : BOOST_REQUIRE_EQUAL(g_whole_detector,
121 : static_cast<detid_t>(std::numeric_limits<detid_t>::max() - static_cast<detid_t>(1)));
122 1 : }
123 :
124 2 : BOOST_AUTO_TEST_CASE(TriggerObjectOverlay_AliasesAndLayout)
125 : {
126 1 : BOOST_REQUIRE((std::is_same_v<TriggerActivity::data_t, TriggerActivityData>));
127 1 : BOOST_REQUIRE((std::is_same_v<TriggerActivity::input_t, TriggerPrimitive>));
128 1 : BOOST_REQUIRE((std::is_same_v<TriggerCandidate::data_t, TriggerCandidateData>));
129 1 : BOOST_REQUIRE((std::is_same_v<TriggerCandidate::input_t, TriggerActivityData>));
130 :
131 1 : BOOST_REQUIRE_EQUAL(offsetof(TriggerActivity, n_inputs), sizeof(TriggerActivityData));
132 1 : BOOST_REQUIRE_EQUAL(offsetof(TriggerCandidate, n_inputs), sizeof(TriggerCandidateData));
133 1 : }
134 :
135 2 : BOOST_AUTO_TEST_CASE(TriggerObjectOverlay_SetInputs)
136 : {
137 1 : std::vector<TriggerPrimitive> tps(3);
138 1 : tps[0].time_start = 100;
139 1 : tps[0].channel = 10;
140 1 : tps[1].time_start = 101;
141 1 : tps[1].channel = 11;
142 1 : tps[2].time_start = 102;
143 1 : tps[2].channel = 12;
144 :
145 : // Recall that the "inputs" in the struct are a flexible array member which needs space allocated for it
146 1 : const std::size_t nbytes = sizeof(TriggerActivity) + tps.size() * sizeof(TriggerPrimitive);
147 1 : void* storage_for_ta_overlay = ::operator new(nbytes);
148 1 : auto* ta = new (storage_for_ta_overlay) TriggerActivity{};
149 :
150 1 : ta->set_inputs(tps);
151 1 : BOOST_REQUIRE_EQUAL(ta->n_inputs, tps.size());
152 :
153 4 : for (size_t i = 0; i < tps.size(); ++i) {
154 3 : BOOST_REQUIRE_EQUAL(tps[i].time_start, ta->inputs[i].time_start);
155 3 : BOOST_REQUIRE_EQUAL(tps[i].channel, ta->inputs[i].channel);
156 : }
157 1 : }
158 :
159 : BOOST_AUTO_TEST_SUITE_END()
|