LCOV - code coverage report
Current view: top level - trgdataformats/unittest - TriggerDataStructures_test.cxx (source / functions) Coverage Total Hit
Test: code.result Lines: 100.0 % 93 93
Test Date: 2026-10-11 15:05:20 Functions: 100.0 % 14 14

            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()
        

Generated by: LCOV version 2.0-1