Line data Source code
1 : /**
2 : * @file DAPHNEEthFrame_test.cxx DAPHNEEthFrame class Unit Tests
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 : #include "fddetdataformats/DAPHNEEthFrame.hpp"
10 :
11 : #define BOOST_TEST_MODULE DAPHNEEthFrame_test // NOLINT
12 :
13 : #include "boost/test/unit_test.hpp"
14 :
15 : #include <random>
16 : #include <vector>
17 :
18 : // NOLINTBEGIN(build/unsigned)
19 :
20 : BOOST_AUTO_TEST_SUITE(DAPHNEEthFrame_test)
21 :
22 2 : BOOST_AUTO_TEST_CASE(DAPHNEEthFrame_ADCDataMutators)
23 : {
24 1 : using dunedaq::fddetdataformats::DAPHNEEthFrame;
25 :
26 1 : std::random_device dev;
27 1 : std::mt19937 rng(dev());
28 1 : std::uniform_int_distribution<uint16_t> dist(0, (1 << DAPHNEEthFrame::s_bits_per_adc) - 1);
29 :
30 1 : std::vector<uint16_t> adcs(DAPHNEEthFrame::s_num_adcs);
31 1025 : for (auto& adc : adcs) {
32 1024 : adc = dist(rng);
33 : }
34 :
35 1 : DAPHNEEthFrame frame{};
36 :
37 1025 : for (int i = 0; i < DAPHNEEthFrame::s_num_adcs; ++i) {
38 1024 : frame.set_adc(i, adcs[i]);
39 : }
40 :
41 1025 : for (int i = 0; i < DAPHNEEthFrame::s_num_adcs; ++i) {
42 1024 : BOOST_REQUIRE_EQUAL(frame.get_adc(i), adcs[i]);
43 : }
44 :
45 1 : frame.set_adc(0, adcs[0]);
46 :
47 1025 : for (int i = 0; i < DAPHNEEthFrame::s_num_adcs; ++i) {
48 1024 : BOOST_REQUIRE_EQUAL(frame.get_adc(i), adcs[i]);
49 : }
50 1 : }
51 :
52 2 : BOOST_AUTO_TEST_CASE(DAPHNEEthFrame_IndexAndValueBounds)
53 : {
54 1 : using dunedaq::fddetdataformats::DAPHNEEthFrame;
55 :
56 1 : DAPHNEEthFrame frame{};
57 :
58 1 : BOOST_CHECK_THROW(frame.get_adc(-1), std::out_of_range);
59 1 : BOOST_CHECK_THROW(frame.get_adc(DAPHNEEthFrame::s_num_adcs), std::out_of_range);
60 :
61 1 : BOOST_CHECK_THROW(frame.set_adc(-1, 123), std::out_of_range);
62 1 : BOOST_CHECK_THROW(frame.set_adc(DAPHNEEthFrame::s_num_adcs, 123), std::out_of_range);
63 1 : BOOST_CHECK_THROW(frame.set_adc(0, static_cast<uint16_t>(1 << DAPHNEEthFrame::s_bits_per_adc)), std::out_of_range);
64 :
65 1 : BOOST_CHECK_NO_THROW(frame.set_adc(0, static_cast<uint16_t>((1 << DAPHNEEthFrame::s_bits_per_adc) - 1)));
66 1 : BOOST_CHECK_EQUAL(frame.get_adc(0), static_cast<uint16_t>((1 << DAPHNEEthFrame::s_bits_per_adc) - 1));
67 1 : }
68 :
69 2 : BOOST_AUTO_TEST_CASE(DAPHNEEthFrame_BitPackingBoundaryIsolation)
70 : {
71 1 : using dunedaq::fddetdataformats::DAPHNEEthFrame;
72 :
73 1 : DAPHNEEthFrame frame{};
74 1 : constexpr auto max_adc = static_cast<uint16_t>((1u << DAPHNEEthFrame::s_bits_per_adc) - 1u);
75 :
76 1 : constexpr int boundary_adc = 4;
77 1 : frame.set_adc(boundary_adc - 1, 0x0000u);
78 1 : frame.set_adc(boundary_adc, 0x0000u);
79 1 : frame.set_adc(boundary_adc + 1, 0x0000u);
80 :
81 1 : frame.set_adc(boundary_adc, 0x2AAAu);
82 1 : BOOST_CHECK_EQUAL(frame.get_adc(boundary_adc - 1), 0x0000u);
83 1 : BOOST_CHECK_EQUAL(frame.get_adc(boundary_adc), 0x2AAAu);
84 1 : BOOST_CHECK_EQUAL(frame.get_adc(boundary_adc + 1), 0x0000u);
85 :
86 1 : frame.set_adc(boundary_adc - 1, max_adc);
87 1 : BOOST_CHECK_EQUAL(frame.get_adc(boundary_adc - 1), max_adc);
88 1 : BOOST_CHECK_EQUAL(frame.get_adc(boundary_adc), 0x2AAAu);
89 1 : BOOST_CHECK_EQUAL(frame.get_adc(boundary_adc + 1), 0x0000u);
90 :
91 1 : frame.set_adc(boundary_adc + 1, 0x1555u);
92 1 : BOOST_CHECK_EQUAL(frame.get_adc(boundary_adc - 1), max_adc);
93 1 : BOOST_CHECK_EQUAL(frame.get_adc(boundary_adc), 0x2AAAu);
94 1 : BOOST_CHECK_EQUAL(frame.get_adc(boundary_adc + 1), 0x1555u);
95 1 : }
96 :
97 2 : BOOST_AUTO_TEST_CASE(DAPHNEEthFrame_MetadataMutators)
98 : {
99 1 : using dunedaq::fddetdataformats::DAPHNEEthFrame;
100 :
101 1 : DAPHNEEthFrame frame{};
102 :
103 1 : frame.set_timestamp(0x0123456789ABCDEFuLL);
104 1 : BOOST_CHECK_EQUAL(frame.get_timestamp(), 0x0123456789ABCDEFuLL);
105 :
106 1 : frame.set_channel(0);
107 1 : BOOST_CHECK_EQUAL(frame.get_channel(), 0);
108 :
109 1 : frame.set_channel(255);
110 1 : BOOST_CHECK_EQUAL(frame.get_channel(), 255);
111 1 : }
112 :
113 : BOOST_AUTO_TEST_SUITE_END()
114 :
115 : // NOLINTEND(build/unsigned)
|