A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
building-position-allocator-test.cc
Go to the documentation of this file.
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2011, 2012 Centre Tecnologic de Telecomunicacions de Catalunya (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 
22 
23 #include "ns3/log.h"
24 #include "ns3/test.h"
25 #include <ns3/building-position-allocator.h>
26 #include <ns3/mobility-building-info.h>
27 #include <ns3/constant-position-mobility-model.h>
28 #include <ns3/mobility-model.h>
29 #include <ns3/building.h>
30 #include <ns3/buildings-helper.h>
31 #include <ns3/mobility-helper.h>
32 #include <ns3/simulator.h>
33 #include <map>
34 
35 NS_LOG_COMPONENT_DEFINE ("BuildingPositionAllocatorTest");
36 
37 using namespace ns3;
38 
39 
40 struct Room
41 {
42  Room (uint32_t xx, uint32_t yy, uint32_t zz);
43  uint32_t x;
44  uint32_t y;
45  uint32_t z;
46 };
47 
48 Room::Room (uint32_t xx, uint32_t yy, uint32_t zz)
49  : x (xx),
50  y (yy),
51  z (zz)
52 {
53 }
54 
55 bool
56 operator < (const Room& a, const Room& b)
57 {
58  return ( (a.x < b.x)
59  || ( (a.x == b.x) && (a.y < b.y) )
60  || ( (a.x == b.x) && (a.y == b.y) && (a.z < b.z) ));
61 }
62 
63 
64 
66 {
67 public:
69 
70 private:
71  virtual void DoRun (void);
72 
73 };
74 
75 
77  : TestCase ("RandomRoom, 12 rooms, 24 nodes")
78 {
79 }
80 
81 void
83 {
84  NS_LOG_FUNCTION (this);
85 
86 
87 
88  NS_LOG_LOGIC ("create building");
89  Ptr<Building> b = CreateObject<Building> ();
90  b->SetBoundaries (Box (1, 3, 1, 4, 1, 3));
91  b->SetNFloors (2);
92  b->SetNRoomsX (2);
93  b->SetNRoomsY (3);
94 
96  nodes.Create (24);
97 
98  MobilityHelper mobility;
99  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
100  Ptr<PositionAllocator> positionAlloc = CreateObject<RandomRoomPositionAllocator> ();
101  mobility.SetPositionAllocator (positionAlloc);
102  mobility.Install (nodes);
103  BuildingsHelper::Install (nodes);
104 
105  BuildingsHelper::MakeMobilityModelConsistent ();
106 
107  std::map<Room, uint32_t> roomCounter;
108 
109  for (NodeContainer::Iterator it = nodes.Begin (); it != nodes.End (); ++it)
110  {
112  NS_ASSERT_MSG (mm, "no mobility model aggregated to this node");
114  NS_ASSERT_MSG (bmm, "MobilityBuildingInfo has not been aggregated to this node mobility model");
115 
116  NS_TEST_ASSERT_MSG_EQ (bmm->IsIndoor (), true, "node should be indoor");
117  Room r (bmm->GetRoomNumberX (), bmm->GetRoomNumberY (), bmm->GetFloorNumber ());
118  ++(roomCounter[r]);
119 
120  Vector p = mm->GetPosition ();
121  NS_TEST_ASSERT_MSG_GT (p.x, bmm->GetRoomNumberX (), "wrong x value");
122  NS_TEST_ASSERT_MSG_LT (p.x, bmm->GetRoomNumberX () + 1, "wrong x value");
123  NS_TEST_ASSERT_MSG_GT (p.y, bmm->GetRoomNumberY (), "wrong y value");
124  NS_TEST_ASSERT_MSG_LT (p.y, bmm->GetRoomNumberY () + 1, "wrong y value");
125  NS_TEST_ASSERT_MSG_GT (p.z, bmm->GetFloorNumber (), "wrong z value");
126  NS_TEST_ASSERT_MSG_LT (p.z, bmm->GetFloorNumber () + 1, "wrong z value");
127 
128  }
129 
130  for (std::map<Room, uint32_t>::iterator it = roomCounter.begin (); it != roomCounter.end (); ++it)
131  {
132  // random selection is done without replacement until the set of
133  // eligible room is empty, at which point the set is filled
134  // again. Hence with 24 nodes and 12 rooms we expect 2 nodes per room
135  NS_TEST_ASSERT_MSG_EQ (it->second, 2, "expected 2 nodes per room");
136  }
137 
138  NS_TEST_ASSERT_MSG_EQ (roomCounter.size (), 12, "expected 12 rooms allocated");
139 
140  Simulator::Destroy ();
141 }
142 
143 
144 
145 
146 
148 {
149 public:
151 
152 private:
153  virtual void DoRun (void);
154 
155 };
156 
157 
159  : TestCase ("SameRoom 48 nodes")
160 {
161 }
162 
163 void
165 {
166  NS_LOG_FUNCTION (this);
167 
168 
169 
170  NS_LOG_LOGIC ("create building");
171  Ptr<Building> b = CreateObject<Building> ();
172  b->SetBoundaries (Box (-10, -6, 20, 26, -1, 5));
173  b->SetNFloors (2);
174  b->SetNRoomsX (2);
175  b->SetNRoomsY (3);
176 
178  nodes.Create (24);
179 
180  MobilityHelper mobility;
181  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
182  Ptr<PositionAllocator> positionAlloc = CreateObject<RandomRoomPositionAllocator> ();
183  mobility.SetPositionAllocator (positionAlloc);
184  mobility.Install (nodes);
185  BuildingsHelper::Install (nodes);
186 
187  NodeContainer copyNodes;
188  copyNodes.Create (48);
189  positionAlloc = CreateObject<SameRoomPositionAllocator> (nodes);
190  mobility.SetPositionAllocator (positionAlloc);
191  mobility.Install (copyNodes);
192  BuildingsHelper::Install (copyNodes);
193 
194  BuildingsHelper::MakeMobilityModelConsistent ();
195 
196  std::map<Room, uint32_t> roomCounter;
197 
198  for (NodeContainer::Iterator it = copyNodes.Begin (); it != copyNodes.End (); ++it)
199  {
201  NS_ASSERT_MSG (mm, "no mobility model aggregated to this node");
203  NS_ASSERT_MSG (bmm, "MobilityBuildingInfo has not been aggregated to this node mobility model");
204 
205  NS_TEST_ASSERT_MSG_EQ (bmm->IsIndoor (), true, "node should be indoor");
206  Room r (bmm->GetRoomNumberX (), bmm->GetRoomNumberY (), bmm->GetFloorNumber ());
207  ++(roomCounter[r]);
208  }
209 
210  for (std::map<Room, uint32_t>::iterator it = roomCounter.begin (); it != roomCounter.end (); ++it)
211  {
212 
213  NS_TEST_ASSERT_MSG_EQ (it->second, 4, "expected 4 nodes per room");
214  }
215 
216  NS_TEST_ASSERT_MSG_EQ (roomCounter.size (), 12, "expected 12 rooms allocated");
217 
218  Simulator::Destroy ();
219 }
220 
221 
222 
223 
224 
225 
227 {
228 public:
230 };
231 
232 
234  : TestSuite ("building-position-allocator", UNIT)
235 {
236  NS_LOG_FUNCTION (this);
237 
238  AddTestCase (new RandomRoomPositionAllocatorTestCase, TestCase::QUICK);
239  AddTestCase (new SameRoomPositionAllocatorTestCase, TestCase::QUICK);
240 
241 }
242 
smart pointer class similar to boost::intrusive_ptr
Definition: ptr.h:60
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
void SetNRoomsY(uint16_t nroomy)
Definition: building.cc:174
std::vector< Ptr< Node > >::const_iterator Iterator
Node container iterator.
A suite of tests to run.
Definition: test.h:1105
virtual void DoRun(void)
Implementation to actually run this TestCase.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:170
Vector GetPosition(void) const
Iterator End(void) const
Get an iterator which indicates past-the-last Node in the container.
encapsulates test code
Definition: test.h:929
a 3d vector
Definition: vector.h:31
a 3d box
Definition: box.h:33
tuple nodes
Definition: first.py:25
Keep track of the current position and velocity of an object.
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
bool operator<(const Room &a, const Room &b)
void SetNFloors(uint16_t nfloors)
Definition: building.cc:160
#define NS_TEST_ASSERT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report and abort if not.
Definition: test.h:148
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:233
keep track of a set of node pointers.
Iterator Begin(void) const
Get an iterator which refers to the first Node in the container.
void SetMobilityModel(std::string type, std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue(), std::string n8="", const AttributeValue &v8=EmptyAttributeValue(), std::string n9="", const AttributeValue &v9=EmptyAttributeValue())
void AddTestCase(TestCase *testCase) NS_DEPRECATED
Add an individual child TestCase case to this TestCase.
Definition: test.cc:184
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition: assert.h:84
Helper class used to assign positions and mobility models to nodes.
mobility buildings information (to be used by mobility models)
void SetNRoomsX(uint16_t nroomx)
Definition: building.cc:167
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
static BuildingPositionAllocatorTestSuite buildingsPositionAllocatorTestSuiteInstance
void SetPositionAllocator(Ptr< PositionAllocator > allocator)
Set the position allocator which will be used to allocate the initial position of every node initiali...
#define NS_TEST_ASSERT_MSG_GT(actual, limit, msg)
Test that an actual value is greater than a limit and report and abort if not.
Definition: test.h:847
Ptr< T > GetObject(void) const
Definition: object.h:362
Room(uint32_t xx, uint32_t yy, uint32_t zz)
void SetBoundaries(Box box)
Set the boundaries of the building.
Definition: building.cc:139
#define NS_TEST_ASSERT_MSG_LT(actual, limit, msg)
Test that an actual value is less than a limit and report and abort if not.
Definition: test.h:753
virtual void DoRun(void)
Implementation to actually run this TestCase.