Line data Source code
1 : /**
2 : * @file DAPHNEFrame_test.cxx - Comprehensive unit tests for DAPHNEFrame
3 : *
4 : * This is part of the DUNE DAQ Application Framework, copyright 2022.
5 : * Licensing/copyright details are in the COPYING file that you should have
6 : * received with this code.
7 : *
8 : */
9 :
10 : #include "fddetdataformats/DAPHNEFrame.hpp"
11 :
12 : #define BOOST_TEST_MODULE DAPHNEFrame_test // NOLINT
13 :
14 : #include "boost/test/unit_test.hpp"
15 :
16 : #include <algorithm>
17 : #include <random>
18 : #include <vector>
19 :
20 : // NOLINTBEGIN(build/unsigned)
21 :
22 : BOOST_AUTO_TEST_SUITE(DAPHNEFrame_test)
23 :
24 2 : BOOST_AUTO_TEST_CASE(DAPHNEFrame_AllFieldsTest)
25 : {
26 1 : constexpr int n_adcs = 320;
27 1 : constexpr int n_peaks = 5;
28 :
29 1 : std::random_device rd;
30 1 : std::mt19937 gen(rd());
31 1 : std::uniform_int_distribution<uint16_t> adc_dist(1, (1 << 14) - 1);
32 1 : std::uniform_int_distribution<uint16_t> u10bit(0, 0x3FF);
33 1 : std::uniform_int_distribution<uint16_t> u9bit(0, 0x1FF);
34 1 : std::uniform_int_distribution<uint16_t> u4bit(0, 0xF);
35 1 : std::uniform_int_distribution<uint32_t> u23bit(0, 0x7FFFFF);
36 1 : std::uniform_int_distribution<uint16_t> u14bit(0, 0x3FFF);
37 1 : std::uniform_int_distribution<uint8_t> u1bit(0, 1);
38 :
39 1 : dunedaq::fddetdataformats::DAPHNEFrame frame{};
40 :
41 : // ─── Test ADC Values ──────────────────────────────────────────────
42 1 : std::vector<uint16_t> adcs(n_adcs);
43 321 : std::generate(adcs.begin(), adcs.end(), [&]() { return adc_dist(gen); });
44 :
45 321 : for (int i = 0; i < n_adcs; ++i)
46 320 : frame.set_adc(i, adcs[i]);
47 :
48 1 : frame.set_adc(0, adcs[0]);
49 :
50 321 : for (int i = 0; i < n_adcs; ++i)
51 320 : BOOST_CHECK_EQUAL(frame.get_adc(i), adcs[i]);
52 :
53 : // ─── Test Header ──────────────────────────────────────────────────
54 1 : frame.set_channel(17);
55 1 : frame.header.algorithm_id = 9;
56 1 : frame.header.trigger_sample_value = 0xFACE;
57 1 : frame.header.threshold = 0xBEEF;
58 1 : frame.header.baseline = 0xABCD;
59 :
60 1 : BOOST_CHECK_EQUAL(frame.get_channel(), 17);
61 1 : BOOST_CHECK_EQUAL(frame.header.algorithm_id, 9);
62 1 : BOOST_CHECK_EQUAL(frame.header.trigger_sample_value, 0xFACE);
63 1 : BOOST_CHECK_EQUAL(frame.header.threshold, 0xBEEF);
64 1 : BOOST_CHECK_EQUAL(frame.header.get_baseline(), 0xABCD);
65 :
66 : // ─── Test Trailer ─────────────────────────────────────────────────
67 6 : for (int peak = 0; peak < n_peaks; ++peak) {
68 5 : uint8_t num_subpeaks = u4bit(gen);
69 5 : uint8_t found = u1bit(gen);
70 5 : uint32_t adc_integral = u23bit(gen);
71 5 : uint16_t adc_max = u14bit(gen);
72 5 : uint16_t sample_peak = u9bit(gen);
73 5 : uint16_t tob = u9bit(gen);
74 5 : uint16_t sob = u10bit(gen);
75 :
76 5 : frame.peaks_data.set_num_subpeaks(num_subpeaks, peak);
77 5 : frame.peaks_data.set_found(found, peak);
78 5 : frame.peaks_data.set_adc_integral(adc_integral, peak);
79 5 : frame.peaks_data.set_adc_max(adc_max, peak);
80 5 : frame.peaks_data.set_sample_max(sample_peak, peak);
81 5 : frame.peaks_data.set_samples_over_baseline(tob, peak);
82 5 : frame.peaks_data.set_sample_start(sob, peak);
83 :
84 5 : BOOST_CHECK_EQUAL(frame.peaks_data.get_num_subpeaks(peak), num_subpeaks);
85 5 : BOOST_CHECK_EQUAL(frame.peaks_data.is_found(peak), found);
86 5 : BOOST_CHECK_EQUAL(frame.peaks_data.get_adc_integral(peak), adc_integral);
87 5 : BOOST_CHECK_EQUAL(frame.peaks_data.get_adc_max(peak), adc_max);
88 5 : BOOST_CHECK_EQUAL(frame.peaks_data.get_sample_max(peak), sample_peak);
89 5 : BOOST_CHECK_EQUAL(frame.peaks_data.get_samples_over_baseline(peak), tob);
90 5 : BOOST_CHECK_EQUAL(frame.peaks_data.get_sample_start(peak), sob);
91 : }
92 1 : }
93 :
94 : BOOST_AUTO_TEST_SUITE_END()
95 :
96 : // NOLINTEND(build/unsigned)
|