ATLAS Offline Software
ExpectationCompare.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 
8 //
9 // includes
10 //
11 
13 
14 #include <boost/core/demangle.hpp>
15 #include <gtest/gtest.h>
16 
17 #include <iomanip>
18 #include <span>
19 #include <string>
20 
21 //
22 // method implementations
23 //
24 
25 namespace columnar
26 {
27  namespace TestUtils
28  {
29  namespace
30  {
31  template<typename T> void checkExpectationTyped (const std::string& columnName, std::span<const T> output, std::span<const T> expectation)
32  {
33  SCOPED_TRACE (columnName);
34  EXPECT_EQ (output.size(), expectation.size());
35  for (std::size_t index = 0; index != std::min (output.size(), expectation.size()); ++ index)
36  {
37  SCOPED_TRACE (index);
38  if constexpr (std::is_floating_point_v<T>)
39  EXPECT_NEAR (output[index], expectation[index], 1e-6);
40  else
41  EXPECT_EQ (output[index], expectation[index]);
42  }
43  }
44  }
45 
46  void checkExpectation (const std::string& columnName, const std::type_info& outputType, std::size_t outputSize, const void *outputData, const std::type_info& expectationType, std::size_t expectationSize, const void *expectationData)
47  {
48  SCOPED_TRACE (columnName);
49  ASSERT_EQ (outputType, expectationType);
50  if (outputType == typeid(float))
51  checkExpectationTyped (columnName, std::span<const float> (static_cast<const float*> (outputData), outputSize), std::span<const float> (static_cast<const float*> (expectationData), expectationSize));
52  else if (outputType == typeid(char))
53  checkExpectationTyped (columnName, std::span<const char> (static_cast<const char*> (outputData), outputSize), std::span<const char> (static_cast<const char*> (expectationData), expectationSize));
54  else if (outputType == typeid(int))
55  checkExpectationTyped (columnName, std::span<const int> (static_cast<const int*> (outputData), outputSize), std::span<const int> (static_cast<const int*> (expectationData), expectationSize));
56  else if (outputType == typeid(std::uint8_t))
57  checkExpectationTyped (columnName, std::span<const std::uint8_t> (static_cast<const std::uint8_t*> (outputData), outputSize), std::span<const std::uint8_t> (static_cast<const std::uint8_t*> (expectationData), expectationSize));
58  else if (outputType == typeid(std::uint16_t))
59  checkExpectationTyped (columnName, std::span<const std::uint16_t> (static_cast<const std::uint16_t*> (outputData), outputSize), std::span<const std::uint16_t> (static_cast<const std::uint16_t*> (expectationData), expectationSize));
60  else if (outputType == typeid(std::uint32_t))
61  checkExpectationTyped (columnName, std::span<const std::uint32_t> (static_cast<const std::uint32_t*> (outputData), outputSize), std::span<const std::uint32_t> (static_cast<const std::uint32_t*> (expectationData), expectationSize));
62  else if (outputType == typeid(std::uint64_t))
63  checkExpectationTyped (columnName, std::span<const std::uint64_t> (static_cast<const std::uint64_t*> (outputData), outputSize), std::span<const std::uint64_t> (static_cast<const std::uint64_t*> (expectationData), expectationSize));
64  else if (outputType == typeid(std::size_t))
65  checkExpectationTyped (columnName, std::span<const std::size_t> (static_cast<const std::size_t*> (outputData), outputSize), std::span<const std::size_t> (static_cast<const std::size_t*> (expectationData), expectationSize));
66  else
67  throw std::logic_error ("received unsupported type " + boost::core::demangle(outputType.name()) + " for column compare, cast value or extend test handler to support it");
68  }
69 
70  namespace
71  {
72  template<typename T> void printExpectedOutputTyped (const std::string& columnName, const std::span<const T>& output)
73  {
74  std::cout << " columnMap.setExpectation (\"" << columnName << "\", {";
75  for (std::size_t index = 0; index != output.size(); ++ index)
76  {
77  if (index != 0)
78  std::cout << ", ";
79  if constexpr (std::is_floating_point_v<T>){
80  auto ss = std::cout.precision();
81  std::cout << std::setprecision (8) << output[index];
82  std::cout.precision(ss); //restore ostream state
83  } else if constexpr (std::is_same_v<T,char>){
84  std::cout << int (output[index]);
85  } else {
86  std::cout << output[index];
87  }
88  }
89  std::cout << "});" << std::endl;
90  }
91  }
92 
93  void printExpectedOutput (const std::string& columnName, const std::type_info& outputType, std::size_t outputSize, const void *outputData)
94  {
95  if (outputType == typeid(float))
96  printExpectedOutputTyped (columnName, std::span<const float> (static_cast<const float*> (outputData), outputSize));
97  else if (outputType == typeid(char))
98  printExpectedOutputTyped (columnName, std::span<const char> (static_cast<const char*> (outputData), outputSize));
99  else if (outputType == typeid(int))
100  printExpectedOutputTyped (columnName, std::span<const int> (static_cast<const int*> (outputData), outputSize));
101  else if (outputType == typeid(std::uint8_t))
102  printExpectedOutputTyped (columnName, std::span<const std::uint8_t> (static_cast<const std::uint8_t*> (outputData), outputSize));
103  else if (outputType == typeid(std::uint16_t))
104  printExpectedOutputTyped (columnName, std::span<const std::uint16_t> (static_cast<const std::uint16_t*> (outputData), outputSize));
105  else if (outputType == typeid(std::uint32_t))
106  printExpectedOutputTyped (columnName, std::span<const std::uint32_t> (static_cast<const std::uint32_t*> (outputData), outputSize));
107  else if (outputType == typeid(std::uint64_t))
108  printExpectedOutputTyped (columnName, std::span<const std::uint64_t> (static_cast<const std::uint64_t*> (outputData), outputSize));
109  else if (outputType == typeid(std::size_t))
110  printExpectedOutputTyped (columnName, std::span<const std::size_t> (static_cast<const std::size_t*> (outputData), outputSize));
111  else
112  throw std::logic_error ("received unsupported type " + boost::core::demangle(outputType.name()) + " for column printout, cast value or extend test handler to support it");
113  }
114  }
115 }
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
PowhegControl_ttHplus_NLO.ss
ss
Definition: PowhegControl_ttHplus_NLO.py:83
xAOD::uint8_t
uint8_t
Definition: Muon_v1.cxx:558
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
index
Definition: index.py:1
TestUtils
Definition: TestUtils.py:1
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
TCS::outputType
outputTopoType_t outputType(const std::string &output)
Definition: Types.cxx:146
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:93
xAOD::uint64_t
uint64_t
Definition: EventInfo_v1.cxx:123
columnar::TestUtils::checkExpectation
void checkExpectation(const std::string &columnName, const std::type_info &outputType, std::size_t outputSize, const void *outputData, const std::type_info &expectationType, std::size_t expectationSize, const void *expectationData)
Definition: ExpectationCompare.cxx:46
merge.output
output
Definition: merge.py:16
ExpectationCompare.h
DeMoScan.index
string index
Definition: DeMoScan.py:362
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
columnar
Definition: ClusterDef.h:16
columnar::TestUtils::printExpectedOutput
void printExpectedOutput(const std::string &columnName, const std::type_info &outputType, std::size_t outputSize, const void *outputData)
Definition: ExpectationCompare.cxx:93