A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
test-cosine-antenna.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2011 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/log.h>
22 #include <ns3/test.h>
23 #include <ns3/double.h>
24 #include <ns3/cosine-antenna-model.h>
25 #include <ns3/simulator.h>
26 #include <cmath>
27 #include <string>
28 #include <iostream>
29 #include <sstream>
30 
31 
32 NS_LOG_COMPONENT_DEFINE ("TestCosineAntennaModel");
33 
34 namespace ns3 {
35 
37  EQUAL = 0,
39 };
40 
42 {
43 public:
44  static std::string BuildNameString (Angles a, double b, double o, double g);
45  CosineAntennaModelTestCase (Angles a, double b, double o, double g, double expectedGainDb, CosineAntennaModelGainTestCondition cond);
46 
47 
48 private:
49  virtual void DoRun (void);
50 
52  double m_b;
53  double m_o;
54  double m_g;
57 };
58 
59 std::string CosineAntennaModelTestCase::BuildNameString (Angles a, double b, double o, double g)
60 {
61  std::ostringstream oss;
62  oss << "theta=" << a.theta << " , phi=" << a.phi
63  << ", beamdwidth=" << b << "deg"
64  << ", orientation=" << o
65  << ", maxGain=" << g << " dB";
66  return oss.str ();
67 }
68 
69 
70 CosineAntennaModelTestCase::CosineAntennaModelTestCase (Angles a, double b, double o, double g, double expectedGainDb, CosineAntennaModelGainTestCondition cond)
71  : TestCase (BuildNameString (a, b, o, g)),
72  m_a (a),
73  m_b (b),
74  m_o (o),
75  m_g (g),
76  m_expectedGain (expectedGainDb),
77  m_cond (cond)
78 {
79 }
80 
81 void
83 {
85 
86  Ptr<CosineAntennaModel> a = CreateObject<CosineAntennaModel> ();
87  a->SetAttribute ("Beamwidth", DoubleValue (m_b));
88  a->SetAttribute ("Orientation", DoubleValue (m_o));
89  a->SetAttribute ("MaxGain", DoubleValue (m_g));
90  double actualGain = a->GetGainDb (m_a);
91  switch (m_cond)
92  {
93  case EQUAL:
94  NS_TEST_EXPECT_MSG_EQ_TOL (actualGain, m_expectedGain, 0.001, "wrong value of the radiation pattern");
95  break;
96  case LESSTHAN:
97  NS_TEST_EXPECT_MSG_LT (actualGain, m_expectedGain, "gain higher than expected");
98  break;
99  default:
100  break;
101  }
102 }
103 
104 
105 
106 
108 {
109 public:
111 };
112 
114  : TestSuite ("cosine-antenna-model", UNIT)
115 {
116  // to calculate the azimut angle offset for a given gain in db:
117  // phideg = (2*acos(10^(targetgaindb/(20*n))))*180/pi
118  // e.g., with a 60 deg beamwidth, gain is -20dB at +- 74.945 degrees from boresight
119 
120  // phi, theta, beamwidth, orientation, maxGain, expectedGain, condition
132 
133  // test positive orientation
145 
146  // test negative orientation and different beamwidths
147  // with a 100 deg beamwidth, gain is -20dB at +- 117.47 degrees from boresight
149  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-100), 0), 100, -150, 0, -3, EQUAL), TestCase::QUICK);
150  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-200), 0), 100, -150, 0, -3, EQUAL), TestCase::QUICK);
151  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-32.531), 0), 100, -150, 0, -20, EQUAL), TestCase::QUICK);
152  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (92.531), 0), 100, -150, 0, -20, EQUAL), TestCase::QUICK);
158  // with a 150 deg beamwidth, gain is -10dB at +- 124.93 degrees from boresight, and -20dB at +- 155.32 degrees from boresight
162  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (85.070), 0), 150, -150, 0, -10, EQUAL), TestCase::QUICK);
163  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-25.070), 0), 150, -150, 0, -10, EQUAL), TestCase::QUICK);
164  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (5.3230), 0), 150, -150, 0, -20, EQUAL), TestCase::QUICK);
165  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (54.677), 0), 150, -150, 0, -20, EQUAL), TestCase::QUICK);
168 
169  // test maxGain
178  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-200), 0), 100, -150, -1, -4, EQUAL), TestCase::QUICK);
179 
180 
181  // test elevation angle
191  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-150), -3), 100, -150, 0, 0, EQUAL), TestCase::QUICK);
192  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-100), -3), 100, -150, 0, -3, EQUAL), TestCase::QUICK);
193  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-200), -3), 100, -150, 0, -3, EQUAL), TestCase::QUICK);
200  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-150), 9.5), 100, -150, 2, 2, EQUAL), TestCase::QUICK);
201  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-100), 9.5), 100, -150, 4, 1, EQUAL), TestCase::QUICK);
202  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-200), 9.5), 100, -150, -1, -4, EQUAL), TestCase::QUICK);
203 
204 };
205 
206 static CosineAntennaModelTestSuite staticCosineAntennaModelTestSuiteInstance;
207 
208 
209 
210 
211 } // namespace ns3
smart pointer class similar to boost::intrusive_ptr
Definition: ptr.h:59
#define NS_LOG_FUNCTION(parameters)
Definition: log.h:345
A suite of tests to run.
Definition: test.h:1025
double DegreesToRadians(double degrees)
converts degrees to radians
Definition: angles.cc:32
double theta
the inclination angle in radians
Definition: angles.h:117
encapsulates test code
Definition: test.h:849
CosineAntennaModelGainTestCondition m_cond
#define NS_TEST_EXPECT_MSG_EQ_TOL(actual, limit, tol, msg)
Test that actual and expected (limit) values are equal to plus or minus some tolerance and report if ...
Definition: test.h:485
NS_LOG_COMPONENT_DEFINE("TestCosineAntennaModel")
static CosineAntennaModelTestSuite staticCosineAntennaModelTestSuiteInstance
CosineAntennaModelGainTestCondition
CosineAntennaModelTestCase(Angles a, double b, double o, double g, double expectedGainDb, CosineAntennaModelGainTestCondition cond)
void AddTestCase(TestCase *testCase) NS_DEPRECATED
Add an individual child TestCase case to this TestCase.
Definition: test.cc:173
static std::string BuildNameString(Angles a, double b, double o, double g)
Fast test.
Definition: test.h:857
double phi
the azimuth angle in radians
Definition: angles.h:111
virtual void DoRun(void)
Implementation to actually run this TestCase.
#define NS_TEST_EXPECT_MSG_LT(actual, limit, msg)
Test that an actual value is less than a limit and report if not.
Definition: test.h:729
struct holding the azimuth and inclination angles of spherical coordinates.
Definition: angles.h:71
Hold a floating point type.
Definition: double.h:41