1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2009 University of Washington
4  * Copyright (c) 2011 CTTC
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation;
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  *
19  * Author: Nicola Baldo <nbaldo@cttc.es>
20  * part of the code copied from test.h
21  */
22 
23 #include <ns3/test.h>
24 #include <ns3/spectrum-value.h>
25 
26 
27 /**
28  * \brief Test if two SpectrumModel instances are equal within a given tolerance.
29  *
30  * This test compares component-by-component the two SpectrumModel
31  * instances; if any pair of components differs by more than the given
32  * tolerance, the test fails.
33  *
34  * \param actual the actual value obtained by the simulator
35  * \param expected the expected value obtained by off-line calculations
36  * \param tol the tolerance
37  * \param msg the message to print if the test fails
38  *
39  */
40 #define NS_TEST_ASSERT_MSG_SPECTRUM_MODEL_EQ_TOL(actual, expected, tol, msg) \
41   NS_TEST_ASSERT_MSG_SPECTRUM_MODEL_EQ_TOL_INTERNAL (actual, expected, tol, msg, __FILE__, __LINE__)
42 
43 
44 #define NS_TEST_ASSERT_MSG_SPECTRUM_MODEL_EQ_TOL_INTERNAL(actual, expected, tol, msg, file, line) \
45   do                                                                           \
46     {                                                                          \
47       Bands::const_iterator i = (actual).Begin ();                      \
48       Bands::const_iterator j = (expected).Begin ();                    \
49       uint32_t k = 0;                                                          \
50       while (i != (actual).End () && j != (expected).End ())            \
51         {                                                                      \
52           if ((i->fl > j->fl + (tol)) || (i->fl < j->fl - (tol))        \
53               || (i->fc > j->fc + (tol)) || (i->fc < j->fc - (tol))        \
54               || (i->fh > j->fh + (tol)) || (i->fh < j->fh - (tol)))       \
55             {                                           \
56               ASSERT_ON_FAILURE;                        \
57               std::ostringstream indexStream;           \
58               indexStream << "[" << k << "]";           \
59               std::ostringstream msgStream;     \
60               msgStream << (msg);               \
61               std::ostringstream actualStream;  \
62               actualStream << i->fl << " <-- " << i->fc << " --> " << i->fh; \
63               std::ostringstream expectedStream;        \
64               expectedStream << j->fl << " <-- " << j->fc << " --> " << j->fh;          \
65               ReportTestFailure (std::string (# actual) + indexStream.str () + " == " + std::string (# expected) + indexStream.str (),    \
66                                  actualStream.str (), expectedStream.str (), msgStream.str (), (file), (line)); \
67               CONTINUE_ON_FAILURE;                                      \
68             }                   \
69           ++i;   \
70           ++j;   \
71           ++k;   \
72         }        \
73       if (i != (actual).End () || j != (expected).End ())       \
74         { \
75           std::ostringstream msgStream;     \
76           msgStream << (msg);               \
77           std::ostringstream actualStream;  \
78           actualStream << (i != (actual).End ());   \
79           std::ostringstream expectedStream;        \
80           expectedStream <<  (j != (expected).End ());              \
81           ReportTestFailure ("Bands::iterator == End ()",                                  \
82                              actualStream.str (), expectedStream.str (), msgStream.str (), (file), (line)); \
83         } \
84     }            \
85   while (false); \
86 
87 
88 /**
89  * \brief Test if two SpectrumValue instances are equal within a given tolerance.
90  *
91  * This test compares component-by-component the two SpectrumValue
92  * instances; if any pair of components differs by more than the given
93  * tolerance, the test fails.
94  *
95  * \param actual the actual value obtained by the simulator
96  * \param expected the expected value obtained by off-line calculations
97  * \param tol the tolerance
98  * \param msg the message to print if the test fails
99  *
100  */
101 #define NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL(actual, expected, tol, msg) \
102   NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL_INTERNAL (actual, expected, tol, msg, __FILE__, __LINE__)
103 
104 
105 #define NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL_INTERNAL(actual, expected, tol, msg, file, line) \
106   do                                                                           \
107     {                                                                          \
108       Values::const_iterator i = (actual).ConstValuesBegin ();          \
109       Values::const_iterator j = (expected).ConstValuesBegin ();        \
110       uint32_t k = 0;                                                          \
111       while (i != (actual).ConstValuesEnd () && j != (expected).ConstValuesEnd ()) \
112         {                                                                      \
113           if ((*i) > (*j) + (tol) || (*i) < (*j) - (tol))                      \
114             {                                           \
115               ASSERT_ON_FAILURE;                        \
116               std::ostringstream indexStream;           \
117               indexStream << "[" << k << "]";           \
118               std::ostringstream msgStream;     \
119               msgStream << msg;                 \
120               std::ostringstream actualStream;  \
121               actualStream << actual;           \
122               std::ostringstream expectedStream;        \
123               expectedStream << expected;               \
124               ReportTestFailure (std::string (# actual) + indexStream.str () + " == " + std::string (# expected) + indexStream.str (),    \
125                                  actualStream.str (), expectedStream.str (), msgStream.str (), file, line);     \
126               CONTINUE_ON_FAILURE;                                      \
127             }                   \
128           ++i;   \
129           ++j;   \
130           ++k;   \
131         }        \
132       if (i != (actual).ConstValuesEnd () || j != (expected).ConstValuesEnd ()) \
133         { \
134           std::ostringstream msgStream;     \
135           msgStream << (msg);               \
136           std::ostringstream actualStream;  \
137           actualStream << (i != (actual).ConstValuesEnd ());        \
138           std::ostringstream expectedStream;        \
139           expectedStream <<  (j != (expected).ConstValuesEnd ());   \
140           ReportTestFailure ("Values::const_iterator == ConstValuesEnd ()",                                        \
141                              actualStream.str (), expectedStream.str (), msgStream.str (), (file), (line)); \
142         } \
143     }            \
144   while (false); \
145 
146 
147 
148 
149