31 #include <Waveform.hpp>
32 #include <gtest/gtest.h>
34 #include <boost/archive/text_iarchive.hpp>
36 #include <boost/serialization/vector.hpp>
37 #include <boost/serialization/complex.hpp>
42 #define EXPECT_ITERABLE_BASE( PREDICATE, REFTYPE, TARTYPE, ref, target) \
44 const REFTYPE& ref_(ref); \
45 const TARTYPE& target_(target); \
46 REFTYPE::const_iterator refIter = ref_.begin(); \
47 TARTYPE::const_iterator tarIter = target_.begin(); \
49 while(refIter != ref_.end()) { \
50 if ( tarIter == target_.end() ) { \
51 ADD_FAILURE() << #target " has a smaller length than " #ref ; \
54 PREDICATE(* refIter, * tarIter) \
55 << "Containers " #ref " (refIter) and " #target " (tarIter)" \
56 " differ at index " << i; \
57 ++refIter; ++tarIter; ++i; \
59 EXPECT_TRUE( tarIter == target_.end() ) \
60 << #ref " has a smaller length than " #target ; \
64 #define EXPECT_ITERABLE_EQ( TYPE, ref, target) \
65 EXPECT_ITERABLE_BASE( EXPECT_EQ, TYPE, TYPE, ref, target )
68 #define EXPECT_ITERABLE_EQ2( REFTYPE, TARTYPE, ref, target) \
69 EXPECT_ITERABLE_BASE( EXPECT_EQ, REFTYPE, TARTYPE, ref, target )
72 #define EXPECT_ITERABLE_DOUBLE_EQ( TYPE, ref, target) \
73 EXPECT_ITERABLE_BASE( EXPECT_DOUBLE_EQ, TYPE, TYPE, ref, target )
77 #define EXPECT_ITERABLE_BASE_NOTYPE( PREDICATE, ref, target) \
79 typedef decltype(ref) REFTYPE; \
80 typedef decltype(target) TARTYPE; \
81 const REFTYPE& ref_(ref); \
82 const TARTYPE& target_(target); \
83 auto refIter = ref_.begin(); \
84 auto tarIter = target_.begin(); \
86 while(refIter != ref_.end()) { \
87 if ( tarIter == target_.end() ) { \
88 ADD_FAILURE() << #target " has a smaller length than " #ref ; \
91 PREDICATE(* refIter, * tarIter) \
92 << "Containers " #ref " (refIter) and " #target " (tarIter)" \
93 " differ at index " << i; \
94 ++refIter; ++tarIter; ++i; \
96 EXPECT_TRUE( tarIter == target_.end() ) \
97 << #ref " has a smaller length than " #target ; \
112 #define EXPECT_ITERABLE_EQ_NOTYPE( ref, target) \
113 EXPECT_ITERABLE_BASE_NOTYPE(EXPECT_EQ, ref, target )
115 #define EXPECT_ITERABLE_FLOAT_EQ_NOTYPE( ref, target) \
116 EXPECT_ITERABLE_BASE_NOTYPE(EXPECT_FLOAT_EQ, ref, target )
117 #define EXPECT_ITERABLE_DOUBLE_EQ_NOTYPE( ref, target) \
118 EXPECT_ITERABLE_BASE_NOTYPE(EXPECT_DOUBLE_EQ, ref, target )
128 typedef std::vector<double> RealType;
129 typedef std::vector< std::complex<double> > ComplexType;
133 template <
typename T>
135 parse_dat_file (std::string fileName)
137 std::ifstream ifs(fileName.c_str());
141 std::vector<T> result { std::istream_iterator<T>(ifs)
142 , std::istream_iterator<T>() };
148 class WaveformTest :
public ::testing::Test {
176 std::ifstream ifs_tDomain(
"test_data/bs_WaveformTest_tDomain_.txt");
177 boost::archive::text_iarchive ia_tDomain(ifs_tDomain);
178 ia_tDomain >> tDomainExampleData_;
180 std::ifstream ifs_fDomain(
"test_data/bs_WaveformTest_fDomain_.txt");
181 boost::archive::text_iarchive ia_fDomain(ifs_fDomain);
182 ia_fDomain >> fDomainExampleData_;
185 stepFn1024_real = parse_dat_file<double>(
"test_data/stepFn1024_real.dat");
186 stepFn1024_complex = parse_dat_file<std::complex<double> >(
"test_data/stepFn1024_complex.dat");
188 diracFn1024_real = parse_dat_file<double>(
"test_data/diracFn1024_real.dat");
189 diracFn1024_complex = parse_dat_file<std::complex<double> >(
"test_data/diracFn1024_complex.dat");
191 triangleFn1024_real = parse_dat_file<double>(
"test_data/triangleFn1024_real.dat");
192 triangleFn1024_complex = parse_dat_file<std::complex<double> >(
"test_data/triangleFn1024_complex.dat");
194 squareFn1024_real = parse_dat_file<double>(
"test_data/squareFn1024_real.dat");
195 squareFn1024_complex = parse_dat_file<std::complex<double> >(
"test_data/squareFn1024_complex.dat");
198 testArrays_real.push_back(stepFn1024_real);
199 testArrays_real.push_back(diracFn1024_real);
200 testArrays_real.push_back(triangleFn1024_real);
201 testArrays_real.push_back(squareFn1024_real);
203 testArrays_complex.push_back(stepFn1024_complex);
204 testArrays_complex.push_back(diracFn1024_complex);
205 testArrays_complex.push_back(triangleFn1024_complex);
206 testArrays_complex.push_back(squareFn1024_complex);
219 RealType tDomainExampleData_;
221 ComplexType fDomainExampleData_;
225 std::vector<double> stepFn1024_real;
226 std::vector< std::complex<double> > stepFn1024_complex;
228 std::vector<double> diracFn1024_real;
229 std::vector< std::complex<double> > diracFn1024_complex;
231 std::vector<double> triangleFn1024_real;
232 std::vector< std::complex<double> > triangleFn1024_complex;
234 std::vector<double> squareFn1024_real;
235 std::vector< std::complex<double> > squareFn1024_complex;
237 std::vector< std::vector<double> > testArrays_real;
238 std::vector< std::vector<std::complex<double> > > testArrays_complex;
247 TEST_F(WaveformTest,FillConstructor)
249 WaveformType filltest (512);
251 EXPECT_EQ(512, filltest.size());
256 TEST_F(WaveformTest,CopyConstructor)
258 WaveformType originalWfm (tDomainExampleData_);
261 WaveformType copiedWfm (originalWfm);
264 EXPECT_ITERABLE_DOUBLE_EQ_NOTYPE(originalWfm.GetConstTimeSeries(), copiedWfm.GetConstTimeSeries());
266 EXPECT_ITERABLE_EQ_NOTYPE(originalWfm.GetConstFreqSpectrum(), copiedWfm.GetConstFreqSpectrum());
284 TEST_F(WaveformTest,TimeDomainRangeConstructor)
286 WaveformType timedomaintest (tDomainExampleData_);
288 EXPECT_ITERABLE_DOUBLE_EQ_NOTYPE(tDomainExampleData_, timedomaintest.GetConstTimeSeries());
291 TEST_F(WaveformTest,FreqDomainRangeConstructor)
293 WaveformType freqdomaintest (fDomainExampleData_);
299 EXPECT_EQ(fDomainExampleData_.size(), freqdomaintest.size()/2 + 1);
301 for (
unsigned i = 0; i < fDomainExampleData_.size(); ++i) {
302 EXPECT_EQ(fDomainExampleData_[i] , freqdomaintest.GetConstFreqSpectrum().at(i));
310 EXPECT_EQ(fDomainExampleData_, freqdomaintest.GetConstFreqSpectrum());
317 EXPECT_TRUE(fDomainExampleData_ == freqdomaintest.GetConstFreqSpectrum());
324 EXPECT_ITERABLE_EQ(decltype(fDomainExampleData_), fDomainExampleData_, freqdomaintest.GetConstFreqSpectrum());
331 EXPECT_ITERABLE_EQ_NOTYPE(fDomainExampleData_, freqdomaintest.GetConstFreqSpectrum());
335 TEST_F(WaveformTest,CopyAssignOperator)
338 ADD_FAILURE() <<
"Not Yet Implemented!";
344 main (
int argc,
char** argv)
346 ::testing::InitGoogleTest(&argc, argv);
347 return RUN_ALL_TESTS();