10 #include <gtest/gtest.h>
12 #include <tracking/spacePointCreation/MapHelperFunctions.h>
13 #include <framework/logging/Logger.h>
15 #include <unordered_map>
29 typedef std::unordered_map<int, double>
i2dMap;
36 template<
typename Functor>
40 for (
int i = 0; i < nEntries; ++i) {
41 map.insert(std::make_pair((i % 6), funct.operator()(i)));
51 template<
typename Functor>
55 for (
int i = 0; i < nEntries; ++i) {
56 map.insert(std::make_pair(i, funct.operator()(i)));
66 double operator()(
int i)
68 return std::tan(i) / std::sin(i);
74 double operator()(
int i)
76 return std::sin(i * .5);
105 unsigned int N = _nEntries;
106 EXPECT_EQ(N, _nanMultiMap.size());
107 EXPECT_EQ(N, _nanMap.size());
108 EXPECT_EQ(N, _multimap.size());
109 EXPECT_EQ(N, _map.size());
111 ASSERT_TRUE(std::isnan(
secans.operator()(0))) <<
"For the following tests to work properly this is expected to return a NaN (-nan)";
119 std::vector<int> possibleKeys = { 0, 1, 2, 3, 4, 5 };
120 for (
int key : possibleKeys) {
121 std::vector<double> nanPossibleValues, possibleValues;
122 for (
int arg = key; arg < _nEntries; arg += 6) {
123 nanPossibleValues.push_back(
secans.operator()(arg));
124 possibleValues.push_back(
sinHalf.operator()(arg));
127 auto keyRange = _nanMultiMap.equal_range(key);
129 EXPECT_EQ(nanPossibleValues.size(), std::distance(keyRange.first, keyRange.second));
130 i2dMultiMap::iterator multiMapIt = keyRange.first;
131 for (
int i = 0; i < std::distance(keyRange.first, keyRange.second); ++i) {
132 if (!std::isnan(multiMapIt->second)) {
133 auto findIt = std::find(nanPossibleValues.begin(), nanPossibleValues.end(), multiMapIt->second);
134 EXPECT_FALSE(findIt == nanPossibleValues.end());
136 EXPECT_TRUE(std::count_if(nanPossibleValues.begin(), nanPossibleValues.end(),
137 [](
const double & val) { return std::isnan(val); }) > 0);
141 keyRange = _multimap.equal_range(key);
142 EXPECT_EQ(possibleValues.size(), std::distance(keyRange.first, keyRange.second));
143 multiMapIt = keyRange.first;
144 for (
int i = 0; i < std::distance(keyRange.first, keyRange.second); ++i) {
145 auto findIt = std::find(possibleValues.begin(), possibleValues.end(), multiMapIt->second);
146 EXPECT_FALSE(findIt == possibleValues.end());
151 for (
unsigned int i = 0; i < N; ++i) {
152 auto range = _nanMap.equal_range(i);
153 i2dMap::iterator mapIt = range.first;
154 for (
int j = 0; j < std::distance(range.first, range.second); ++j) {
155 if (std::isnan(mapIt->second)) {
156 B2INFO(
"Not Comparing value to key " << i <<
" because value is NaN, checking if the functor returns NaN for this key");
157 EXPECT_TRUE(std::isnan(
secans.operator()(i)));
160 EXPECT_DOUBLE_EQ(mapIt->second,
secans.operator()(i));
164 range = _map.equal_range(i);
166 for (
int j = 0; j < std::distance(range.first, range.second); ++j) {
167 EXPECT_DOUBLE_EQ(mapIt->second,
sinHalf.operator()(i));
177 EXPECT_EQ(uniqueKeys.size(), _map.size());
178 for (
size_t i = 0; i < uniqueKeys.size(); ++i) {
180 auto findIt = std::find(uniqueKeys.begin(), uniqueKeys.end(), i);
181 EXPECT_FALSE(findIt == uniqueKeys.end());
186 unsigned int expectedSize = _multimap.size() > 6 ? 6 : _multimap.size();
187 EXPECT_EQ(expectedSize, uniqueMultiKeys.size());
188 for (
size_t i = 0; i < uniqueMultiKeys.size(); ++i) {
190 auto findIt = std::find(uniqueMultiKeys.begin(), uniqueMultiKeys.end(), i);
191 EXPECT_FALSE(findIt == uniqueMultiKeys.end());
199 std::vector<int> possibleKeys = { 0, 1, 2, 3, 4, 5 };
200 for (
int key : possibleKeys) {
201 std::vector<double> expectedValues;
202 for (
int arg = key; arg < _nEntries; arg += 6) { expectedValues.push_back(
sinHalf.operator()(arg)); }
203 std::vector<double> actualValues =
getValuesToKey(_multimap, key);
204 EXPECT_EQ(expectedValues.size(), actualValues.size());
207 for (
const double& d : actualValues) {
208 EXPECT_FALSE(std::find(expectedValues.begin(), expectedValues.end(), d) == expectedValues.end());
210 expectedValues.clear();
211 for (
int arg = key; arg < _nEntries; arg += 6) {
212 expectedValues.push_back(
secans.operator()(arg));
215 EXPECT_EQ(expectedValues.size(), actualValues.size());
218 for (
const double& d : actualValues) {
220 B2INFO(
"Not comparing NaN value!");
223 EXPECT_FALSE(std::find(expectedValues.begin(), expectedValues.end(), d) == expectedValues.end());
228 for (
int i = 0; i < _nEntries; ++i) {
230 EXPECT_EQ(values.size(), 1);
231 EXPECT_DOUBLE_EQ(values[0],
sinHalf.operator()(i));
234 EXPECT_EQ(values.size(), 1);
235 if (!std::isnan(values[0])) {
236 EXPECT_DOUBLE_EQ(values[0],
secans.operator()(i));
244 std::vector<std::pair<int, unsigned int> > mapKeys =
getNValuesPerKey(_map);
245 unsigned int oneKey2Value = std::count_if(mapKeys.begin(), mapKeys.end(),
246 [](
const std::pair<int, unsigned int>& pair) { return pair.second == 1; });
247 EXPECT_EQ(_map.size(), oneKey2Value);
250 oneKey2Value = std::count_if(mapKeys.begin(), mapKeys.end(),
251 [](
const std::pair<int, unsigned int>& pair) { return pair.second == 1; });
252 EXPECT_EQ(_nanMap.size(), oneKey2Value);
256 EXPECT_EQ(mapKeys.size(), 6);
257 for (
const auto& key : mapKeys) {
258 EXPECT_EQ(key.second, key.first < 2 ? 4 : 3);
262 EXPECT_EQ(mapKeys.size(), 6);
263 for (
const auto& key : mapKeys) {
264 EXPECT_EQ(key.second, key.first < 2 ? 4 : 3);
272 std::vector<int> possibleKeys = { 0, 1, 2, 3, 4, 5 };
273 std::vector<double> summedValues;
274 std::vector<double> summedNanValues;
275 for (
int key : possibleKeys) {
276 std::vector<double> possibleValues;
277 std::vector<double> possibleNanValues;
278 for (
int arg = key; arg < _nEntries; arg += 6) {
279 possibleValues.push_back(
sinHalf.operator()(arg));
280 possibleNanValues.push_back(
secans.operator()(arg));
282 summedNanValues.push_back(std::accumulate(possibleNanValues.begin(), possibleNanValues.end(), 0.0));
283 summedValues.push_back(std::accumulate(possibleValues.begin(), possibleValues.end(), 0.0));
288 EXPECT_EQ(keyValPairs.size(), 6);
290 EXPECT_EQ(get<0>(keyValPairs[0]), 0);
291 EXPECT_TRUE(std::isnan(get<1>(keyValPairs[0])));
292 EXPECT_EQ(get<2>(keyValPairs[0]), 4);
296 EXPECT_EQ(keyValPairs.size(), 6);
298 EXPECT_EQ(get<0>(keyValPairs[0]), 0);
299 EXPECT_DOUBLE_EQ(get<1>(keyValPairs[0]), summedValues[0]);
300 EXPECT_EQ(get<2>(keyValPairs[0]), 4);
302 EXPECT_EQ(get<0>(keyValPairs[2]), 3);
303 EXPECT_DOUBLE_EQ(get<1>(keyValPairs[2]), summedValues[3]);
304 EXPECT_EQ(get<2>(keyValPairs[2]), 3);
307 EXPECT_EQ(get<0>(keyValPairs[0]), 3);
308 EXPECT_DOUBLE_EQ(get<1>(keyValPairs[0]),
sinHalf.operator()(3));
310 EXPECT_EQ(get<0>(keyValPairs[19]), 9);
311 EXPECT_DOUBLE_EQ(get<1>(keyValPairs[19]),
sinHalf.operator()(9));
318 std::vector<double> possibleValues, nanPossibleValues;
319 for (
int i = 0; i < _nEntries; ++i) {
320 possibleValues.push_back(
sinHalf.operator()(i));
321 nanPossibleValues.push_back(
secans.operator()(i));
324 std::sort(possibleValues.begin(), possibleValues.end());
325 std::sort(nanPossibleValues.begin(), nanPossibleValues.end());
329 EXPECT_EQ(allValues.size(), _nEntries);
330 std::sort(allValues.begin(), allValues.end());
331 for (
int i = 0; i < _nEntries; ++i) {
332 EXPECT_DOUBLE_EQ(allValues[i], possibleValues[i]);
337 EXPECT_EQ(allValues.size(), _nEntries);
338 std::sort(allValues.begin(), allValues.end());
339 for (
int i = 0; i < _nEntries; ++i) {
340 EXPECT_DOUBLE_EQ(allValues[i], possibleValues[i]);
class for testing the helper functions from MapHelperFunctions.h
int _nEntries
the number of pairs that will be put into the maps for the tests
i2dMultiMap _multimap
multimap filled with values obtained by sinHalf functor
virtual void SetUp()
set up the maps for the tests
i2dMultiMap _nanMultiMap
multimap filled with values obtained by secans functor -> contains a NaN!
i2dMap _nanMap
map filled with values obtained by secans functor -> contains a NaN!
i2dMap _map
map filled with values obtained by sinHalf functor
i2dMultiMap createMultiMap(int nEntries, Functor funct)
create a multimap with
struct Belle2::@299 sinHalf
function object that implements sin(i/2).
std::unordered_map< int, double > i2dMap
typedef for less writing effort
std::vector< std::tuple< typename MapType::key_type, typename MapType::mapped_type, unsigned int > > getSortedKeyValueTuples(const MapType &aMap)
get the (key, value, number of values) tuples stored in the map, sorted after the following scheme (d...
TEST_F(MapHelperFunctionsTest, testGetAllValues)
test the getAllValues() function actually returns all values that are stored in the map
std::unordered_multimap< int, double > i2dMultiMap
typedef for less writing effort
std::vector< std::pair< typename MapType::key_type, unsigned int > > getNValuesPerKey(const MapType &aMap)
get the unique keys of a map together with the number of values associated to each key.
std::vector< typename MapType::key_type > getUniqueKeys(const MapType &aMap)
get the unique keys of a map (i.e.
i2dMap createMap(int nEntries, Functor funct)
create a multimap with
struct Belle2::@298 secans
function object that implements cosecans(x) == 1/cos(x) by tan(x) / sin(x).
std::vector< typename MapType::mapped_type > getValuesToKey(const MapType &aMap, typename MapType::key_type aKey)
get all values stored in the map for a given key
std::vector< typename MapType::mapped_type > getAllValues(const MapType &aMap)
get all values in the map (i.e.
Abstract base class for different kinds of events.