1#ifndef ARCHIVIATORE_TEST_UTILS_CLASS_H
2#define ARCHIVIATORE_TEST_UTILS_CLASS_H
4#include <radarelab/utils/tests.h>
19 bool all_missing =
true;
23 unsigned count_missing = 0;
24 unsigned count_values = 0;
28 double avg()
const {
return count_values ? sum / count_values : min; }
30 void count_sample(
const T& sample)
45 sum += (double)sample;
49 void count_sample(
const T& missing,
const T& sample)
51 if (sample == missing)
58 void fill(
const T* arr,
unsigned size)
60 for (
unsigned i = 0; i < size; ++i)
61 this->count_sample(arr[i]);
64 void fill(
const radarelab::Matrix2D<T>& arr)
66 this->fill(arr.data(), arr.size());
69 void fill(
const radarelab::Volume<T>& vol)
71 for (
unsigned i = 0; i < vol.size(); ++i)
72 this->fill(vol.
scan(i));
76 void fill(
const T& missing,
const T* arr,
unsigned size)
78 for (
unsigned i = 0; i < size; ++i)
79 this->count_sample(missing, arr[i]);
82 void fill(
const T& missing,
const radarelab::Matrix2D<T>& arr)
84 this->fill(missing, arr.data(), arr.size());
87 void fill(
const T& missing,
const radarelab::Volume<T>& vol)
89 for (
unsigned i = 0; i < vol.size(); ++i)
90 this->fill(missing, vol.
scan(i));
99 fprintf(stderr,
"min %f max %f \n",(
double)this->min, (
double)this->max);
103template<
typename T>
inline T to_num(
const T& val) {
return val; }
104inline std::string to_num(
const double& val)
107 snprintf(buf, 30,
"%.2f", val);
110inline float to_num(
const float& val) {
return round(val * 100.0) / 100.0; }
111inline unsigned to_num(
const unsigned char& val) {
return val; }
112inline int to_num(
const char& val) {
return val; }
114template<
typename T>
inline bool approx_equals(
const T& v1,
const T& v2) {
return v1 == v2; }
115inline bool approx_equals(
const double& v1,
const double& v2) {
return round(v1 * 100) == round(v2 * 100); }
116inline bool approx_equals(
const float& v1,
const float& v2) {
return roundf(v1 * 100) == roundf(v2 * 100); }
118template<
typename DATA>
121 typedef typename DATA::Scalar Scalar;
123 bool has_missing =
false;
125 unsigned count_missing = 0;
130 TestStatsEqual(
const DATA& actual, Scalar min,
double avg, Scalar max)
131 : matrix(actual), min(min), avg(avg), max(max)
135 TestStatsEqual(
const DATA& actual, Scalar missing,
unsigned count_missing, Scalar min,
double avg, Scalar max)
136 : matrix(actual), has_missing(true), missing(missing), count_missing(count_missing), min(min), avg(avg), max(max)
142 using namespace radarelab::utils::tests;
144 ArrayStats<Scalar> stats;
148 stats.fill(missing, matrix);
149 if (stats.count_missing != count_missing)
153 if (!approx_equals(stats.min, min)) failed =
true;
154 if (!approx_equals(stats.max, max)) failed =
true;
155 if (!approx_equals(stats.avg(), avg)) failed =
true;
159 std::stringstream ss;
162 ss <<
"missing: " << stats.count_missing <<
" ";
163 ss <<
"min: " << to_num(stats.min)
164 <<
" avg: " << to_num(stats.avg())
165 <<
" max: " << to_num(stats.max)
166 <<
") differ from expected (";
168 ss <<
"missing: " << count_missing <<
" ";
169 ss <<
"min: " << to_num(min)
170 <<
" avg: " << to_num(avg)
171 <<
" max: " << to_num(max)
173 throw TestFailed(ss.str());
179struct ActualMatrix2D :
public radarelab::utils::tests::Actual<const radarelab::Matrix2D<T>&>
181 using radarelab::utils::tests::Actual<
const radarelab::Matrix2D<T>&>::Actual;
183 template<
typename... args>
184 TestStatsEqual<radarelab::Matrix2D<T>> statsEqual(args&&... params)
const
186 return TestStatsEqual<radarelab::Matrix2D<T>>(this->_actual, params...);
191struct ActualVolume :
public radarelab::utils::tests::Actual<const radarelab::Volume<T>&>
193 using radarelab::utils::tests::Actual<
const radarelab::Volume<T>&>::Actual;
195 template<
typename... args>
196 TestStatsEqual<radarelab::Volume<T>> statsEqual(args&&... params)
const
198 return TestStatsEqual<radarelab::Volume<T>>(this->_actual, params...);
203inline ActualMatrix2D<T> actual(
const radarelab::Matrix2D<T>& actual) {
return ActualMatrix2D<T>(actual); }
206inline ActualMatrix2D<T> actual(
const radarelab::PolarScan<T>& actual) {
return ActualMatrix2D<T>(actual); }
209inline ActualMatrix2D<T> actual(
const radarelab::Image<T>& actual) {
return ActualMatrix2D<T>(actual); }
212inline ActualVolume<T> actual(
const radarelab::Volume<T>& actual) {
return ActualVolume<T>(actual); }
214template<
typename DATA>
215void print_stats(
const std::string& name,
const DATA& data,
const typename DATA::Scalar& missing, std::ostream& out)
218 ArrayStats<typename DATA::Scalar> stats;
219 stats.fill(missing, data);
220 out <<
"wassert(actual(" << name <<
").statsEqual"
221 <<
"(" << to_num(missing)
222 <<
", " << stats.count_missing
223 <<
", " << to_num(stats.min)
224 <<
", " << to_num(stats.avg())
225 <<
", " << to_num(stats.max)
229template<
typename DATA>
230void print_stats(
const std::string& name,
const DATA& data, std::ostream& out)
233 ArrayStats<typename DATA::Scalar> stats;
235 out <<
"wassert(actual(" << name <<
").statsEqual"
236 <<
"(" << to_num(stats.min)
237 <<
", " << to_num(stats.avg())
238 <<
", " << to_num(stats.max)
242void print_stats(
const std::string& name,
const elaboradar::CUM_BAC& cb, std::ostream& out);
244void print_stats(
const std::string& name,
const elaboradar::Cart& cart, std::ostream& out);
245void print_stats(
const std::string& name,
const elaboradar::CartLowris& cart, std::ostream& out);
246void print_stats(
const std::string& name,
const elaboradar::CartProducts& cart, std::ostream& out);
Classe principale del programma.
PolarScan< T > & scan(unsigned idx)
Access a polar scan.
name space generale del programma
Definisce le principali strutture che contengono i dati.