1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2009 CTTC
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  *
18  * Author: Nicola Baldo <nbaldo@cttc.es>
19  */
20 
21 #include <ns3/object.h>
22 #include <ns3/spectrum-value.h>
23 #include <ns3/spectrum-converter.h>
24 #include <ns3/log.h>
25 #include <ns3/test.h>
26 #include <iostream>
27 #include <cmath>
28 
29 #include "spectrum-test.h"
30 
31 using namespace ns3;
32 
33 // NS_LOG_COMPONENT_DEFINE ("SpectrumValueTest");
34 
35 #define TOLERANCE 1e-6
36 
37 class SpectrumValueTestCase : public TestCase
38 {
39 public:
40   SpectrumValueTestCase (SpectrumValue a, SpectrumValue b, std::string name);
41   virtual ~SpectrumValueTestCase ();
42   virtual void DoRun (void);
43 
44 private:
45   bool MoreOrLessEqual (SpectrumValue x, SpectrumValue y);
46   SpectrumValue m_a;
47   SpectrumValue m_b;
48 };
49 
50 
51 
SpectrumValueTestCase(SpectrumValue a,SpectrumValue b,std::string name)52 SpectrumValueTestCase::SpectrumValueTestCase (SpectrumValue a, SpectrumValue b, std::string name)
53   : TestCase (name),
54     m_a (a),
55     m_b (b)
56 {
57 }
58 
~SpectrumValueTestCase()59 SpectrumValueTestCase::~SpectrumValueTestCase ()
60 {
61 }
62 
63 
64 bool
MoreOrLessEqual(SpectrumValue x,SpectrumValue y)65 SpectrumValueTestCase::MoreOrLessEqual (SpectrumValue x, SpectrumValue y)
66 {
67   SpectrumValue z = x - y;
68   return (Norm (z) < TOLERANCE);
69 }
70 
71 void
DoRun(void)72 SpectrumValueTestCase::DoRun (void)
73 {
74   NS_TEST_ASSERT_MSG_SPECTRUM_MODEL_EQ_TOL (*m_a.GetSpectrumModel (), *m_b.GetSpectrumModel (), TOLERANCE, "");
75   NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL (m_a, m_b, TOLERANCE, "");
76 }
77 
78 
79 
80 
81 
82 
83 
84 
85 class SpectrumValueTestSuite : public TestSuite
86 {
87 public:
88   SpectrumValueTestSuite ();
89 };
90 
SpectrumValueTestSuite()91 SpectrumValueTestSuite::SpectrumValueTestSuite ()
92   : TestSuite ("spectrum-value", UNIT)
93 {
94 
95   // NS_LOG_INFO("creating SpectrumValueTestSuite");
96 
97 
98   std::vector<double> freqs;
99 
100   for (int i = 1; i <= 5; i++)
101     {
102       freqs.push_back (i);
103     }
104 
105   Ptr<SpectrumModel> f = Create<SpectrumModel> (freqs);
106 
107   SpectrumValue v1 (f), v2 (f), v3 (f), v4 (f), v5 (f), v6 (f), v7 (f), v8 (f), v9 (f), v10 (f);
108 
109   double doubleValue;
110 
111 
112   doubleValue =  1.12345600000000;
113 
114   v1[0] =  0.700539792840;
115   v1[1] = -0.554277600423;
116   v1[2] =  0.750309319469;
117   v1[3] = -0.892299213192;
118   v1[4] =  0.987045234885;
119 
120   v2[0] =  0.870441628737;
121   v2[1] =  0.271419263880;
122   v2[2] =  0.451557288312;
123   v2[3] =  0.968992859395;
124   v2[4] = -0.929186654705;
125 
126   v3[0] =  1.570981421577;
127   v3[1] = -0.282858336543;
128   v3[2] =  1.201866607781;
129   v3[3] =  0.076693646203;
130   v3[4] =  0.057858580180;
131 
132   v4[0] = -0.169901835897;
133   v4[1] = -0.825696864302;
134   v4[2] =  0.298752031158;
135   v4[3] = -1.861292072588;
136   v4[4] =  1.916231889590;
137 
138   v5[0] =  0.609778998275;
139   v5[1] = -0.150441618292;
140   v5[2] =  0.338807641695;
141   v5[3] = -0.864631566028;
142   v5[4] = -0.917149259846;
143 
144   v6[0] =  0.804809615846;
145   v6[1] = -2.042145397125;
146   v6[2] =  1.661603829438;
147   v6[3] = -0.920852207053;
148   v6[4] = -1.062267984465;
149 
150   v7[0] =  1.823995792840;
151   v7[1] =  0.569178399577;
152   v7[2] =  1.873765319469;
153   v7[3] =  0.231156786808;
154   v7[4] =  2.110501234885;
155 
156   v8[0] = -0.422916207160;
157   v8[1] = -1.677733600423;
158   v8[2] = -0.373146680531;
159   v8[3] = -2.015755213192;
160   v8[4] = -0.136410765115;
161 
162   v9[0] =  0.787025633505;
163   v9[1] = -0.622706495860;
164   v9[2] =  0.842939506814;
165   v9[3] = -1.002458904856;
166   v9[4] =  1.108901891403;
167 
168   v10[0] =  0.623557836569;
169   v10[1] = -0.493368320987;
170   v10[2] =  0.667858215604;
171   v10[3] = -0.794244913190;
172   v10[4] =  0.878579343459;
173 
174   SpectrumValue tv3 (f), tv4 (f), tv5 (f), tv6 (f);
175 
176   tv3 = v1 + v2;
177   tv4 = v1 - v2;
178   tv5 = v1 * v2;
179   tv6 = v1 / v2;
180 
181 
182   AddTestCase (new SpectrumValueTestCase (tv3, v3, "tv3 = v1 + v2"), TestCase::QUICK);
183   AddTestCase (new SpectrumValueTestCase (tv4, v4, "tv4 = v1 - v2"), TestCase::QUICK);
184   AddTestCase (new SpectrumValueTestCase (tv5, v5, "tv5 = v1 * v2"), TestCase::QUICK);
185   AddTestCase (new SpectrumValueTestCase (tv6, v6, "tv6 = v1 div v2"), TestCase::QUICK);
186 
187   // std::cerr << v6 << std::endl;
188   // std::cerr << tv6 << std::endl;
189 
190 
191   tv3 = v1;
192   tv4 = v1;
193   tv5 = v1;
194   tv6 = v1;
195 
196   tv3 += v2;
197   tv4 -= v2;
198   tv5 *= v2;
199   tv6 /= v2;
200 
201   AddTestCase (new SpectrumValueTestCase (tv3, v3, "tv3 += v2"), TestCase::QUICK);
202   AddTestCase (new SpectrumValueTestCase (tv4, v4, "tv4 -= v2"), TestCase::QUICK);
203   AddTestCase (new SpectrumValueTestCase (tv5, v5, "tv5 *= v2"), TestCase::QUICK);
204   AddTestCase (new SpectrumValueTestCase (tv6, v6, "tv6 div= v2"), TestCase::QUICK);
205 
206   SpectrumValue tv7a (f), tv8a (f), tv9a (f), tv10a (f);
207   tv7a = v1 + doubleValue;
208   tv8a = v1 - doubleValue;
209   tv9a = v1 * doubleValue;
210   tv10a = v1 / doubleValue;
211   AddTestCase (new SpectrumValueTestCase (tv7a, v7, "tv7a = v1 + doubleValue"), TestCase::QUICK);
212   AddTestCase (new SpectrumValueTestCase (tv8a, v8, "tv8a = v1 - doubleValue"), TestCase::QUICK);
213   AddTestCase (new SpectrumValueTestCase (tv9a, v9, "tv9a = v1 * doubleValue"), TestCase::QUICK);
214   AddTestCase (new SpectrumValueTestCase (tv10a, v10, "tv10a = v1 div doubleValue"), TestCase::QUICK);
215 
216   SpectrumValue tv7b (f), tv8b (f), tv9b (f), tv10b (f);
217   tv7b =  doubleValue + v1;
218   tv8b =  doubleValue - v1;
219   tv9b =  doubleValue * v1;
220   tv10b = doubleValue / v1;
221   AddTestCase (new SpectrumValueTestCase (tv7b, v7, "tv7b =  doubleValue + v1"), TestCase::QUICK);
222   AddTestCase (new SpectrumValueTestCase (tv8b, v8, "tv8b =  doubleValue - v1"), TestCase::QUICK);
223   AddTestCase (new SpectrumValueTestCase (tv9b, v9, "tv9b =  doubleValue * v1"), TestCase::QUICK);
224   AddTestCase (new SpectrumValueTestCase (tv10b, v10, "tv10b = doubleValue div v1"), TestCase::QUICK);
225 
226 
227 
228 
229 
230   SpectrumValue v1ls3 (f), v1rs3 (f);
231   SpectrumValue tv1ls3 (f), tv1rs3 (f);
232 
233   v1ls3[0] = v1[3];
234   v1ls3[1] = v1[4];
235   tv1ls3 = v1 << 3;
236   AddTestCase (new SpectrumValueTestCase (tv1ls3, v1ls3, "tv1ls3 = v1 << 3"), TestCase::QUICK);
237 
238 
239   v1rs3[3] = v1[0];
240   v1rs3[4] = v1[1];
241   tv1rs3 = v1 >> 3;
242   AddTestCase (new SpectrumValueTestCase (tv1rs3, v1rs3, "tv1rs3 = v1 >> 3"), TestCase::QUICK);
243 
244 
245 }
246 
247 
248 
249 
250 
251 
252 
253 class SpectrumConverterTestSuite : public TestSuite
254 {
255 public:
256   SpectrumConverterTestSuite ();
257 };
258 
SpectrumConverterTestSuite()259 SpectrumConverterTestSuite::SpectrumConverterTestSuite ()
260   : TestSuite ("spectrum-converter", UNIT)
261 {
262   double f;
263 
264 
265   std::vector<double> f1;
266   for (f = 3; f <= 7; f += 2)
267     {
268       f1.push_back (f);
269     }
270   Ptr<SpectrumModel> sof1 = Create<SpectrumModel> (f1);
271 
272 
273 
274   std::vector<double> f2;
275   for (f = 2; f <= 8; f += 1)
276     {
277       f2.push_back (f);
278     }
279   Ptr<SpectrumModel> sof2 = Create<SpectrumModel> (f2);
280 
281 
282 
283   Ptr<SpectrumValue> res;
284 
285 
286   Ptr<SpectrumValue> v1 = Create<SpectrumValue> (sof1);
287   *v1 = 4;
288   SpectrumConverter c12 (sof1, sof2);
289   res = c12.Convert (v1);
290   SpectrumValue t12 (sof2);
291   t12 = 4;
292   t12[0] = 2;
293   t12[6] = 2;
294 //   NS_LOG_LOGIC(*v1);
295 //   NS_LOG_LOGIC(t12);
296 //   NS_LOG_LOGIC(*res);
297 
298   AddTestCase (new SpectrumValueTestCase (t12, *res, ""), TestCase::QUICK);
299   // TEST_ASSERT(MoreOrLessEqual(t12, *res));
300 
301   Ptr<SpectrumValue> v2a = Create<SpectrumValue> (sof2);
302   *v2a = -2;
303   SpectrumConverter c21 (sof2, sof1);
304   res = c21.Convert (v2a);
305   SpectrumValue t21a (sof1);
306   t21a = -2;
307 //   NS_LOG_LOGIC(*v2a);
308 //   NS_LOG_LOGIC(t21a);
309 //   NS_LOG_LOGIC(*res);
310   AddTestCase (new SpectrumValueTestCase (t21a, *res, ""), TestCase::QUICK);
311   // TEST_ASSERT(MoreOrLessEqual(t21a, *res));
312 
313   Ptr<SpectrumValue> v2b = Create<SpectrumValue> (sof2);
314   (*v2b)[0] = 3;
315   (*v2b)[1] = 5;
316   (*v2b)[2] = 1;
317   (*v2b)[3] = 2;
318   (*v2b)[4] = 4;
319   (*v2b)[5] = 6;
320   (*v2b)[6] = 3;
321   res = c21.Convert (v2b);
322   SpectrumValue t21b (sof1);
323   t21b[0] = 3 * 0.25 + 5 * 0.5 + 1 * 0.25;
324   t21b[1] = 1 * 0.25 + 2 * 0.5 + 4 * 0.25;
325   t21b[2] = 4 * 0.25 + 6 * 0.5 + 3 * 0.25;
326 //   NS_LOG_LOGIC(*v2b);
327 //   NS_LOG_LOGIC(t21b);
328 //   NS_LOG_LOGIC(*res);
329   AddTestCase (new SpectrumValueTestCase (t21b, *res, ""), TestCase::QUICK);
330 
331 
332 }
333 
334 
335 
336 
337 
338 
339 // static instance of test suites
340 static SpectrumValueTestSuite g_SpectrumValueTestSuite;
341 static SpectrumConverterTestSuite g_SpectrumConverterTestSuite;
342