A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
building-position-allocator-test.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2011, 2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation;
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 *
17 * Author: Nicola Baldo <nbaldo@cttc.es>
18 */
19
20#include "ns3/log.h"
21#include "ns3/test.h"
22#include <ns3/building-position-allocator.h>
23#include <ns3/building.h>
24#include <ns3/buildings-helper.h>
25#include <ns3/constant-position-mobility-model.h>
26#include <ns3/mobility-building-info.h>
27#include <ns3/mobility-helper.h>
28#include <ns3/mobility-model.h>
29#include <ns3/simulator.h>
30
31#include <map>
32
33using namespace ns3;
34
35NS_LOG_COMPONENT_DEFINE("BuildingPositionAllocatorTest");
36
48struct Room
49{
56 Room(uint32_t xx, uint32_t yy, uint32_t zz);
60};
61
63 : x(xx),
64 y(yy),
65 z(zz)
66{
67}
68
69bool
70operator<(const Room& a, const Room& b)
71{
72 return ((a.x < b.x) || ((a.x == b.x) && (a.y < b.y)) ||
73 ((a.x == b.x) && (a.y == b.y) && (a.z < b.z)));
74}
75
83{
84 public:
86
87 private:
88 void DoRun() override;
89};
90
92 : TestCase("RandomRoom, 12 rooms, 24 nodes")
93{
94}
95
96void
98{
99 NS_LOG_FUNCTION(this);
100
101 NS_LOG_LOGIC("create building");
102 Ptr<Building> b = CreateObject<Building>();
103 b->SetBoundaries(Box(1, 3, 1, 4, 1, 3));
104 b->SetNFloors(2);
105 b->SetNRoomsX(2);
106 b->SetNRoomsY(3);
107
109 nodes.Create(24);
110
111 MobilityHelper mobility;
112 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
113 Ptr<PositionAllocator> positionAlloc = CreateObject<RandomRoomPositionAllocator>();
114 mobility.SetPositionAllocator(positionAlloc);
115 mobility.Install(nodes);
117
118 std::map<Room, uint32_t> roomCounter;
119
120 for (NodeContainer::Iterator it = nodes.Begin(); it != nodes.End(); ++it)
121 {
122 Ptr<MobilityModel> mm = (*it)->GetObject<MobilityModel>();
123 NS_ASSERT_MSG(mm, "no mobility model aggregated to this node");
124 Ptr<MobilityBuildingInfo> bmm = mm->GetObject<MobilityBuildingInfo>();
125 NS_ASSERT_MSG(bmm,
126 "MobilityBuildingInfo has not been aggregated to this node mobility model");
127
128 NS_TEST_ASSERT_MSG_EQ(bmm->IsIndoor(), true, "node should be indoor");
129 Room r(bmm->GetRoomNumberX(), bmm->GetRoomNumberY(), bmm->GetFloorNumber());
130 ++(roomCounter[r]);
131
132 Vector p = mm->GetPosition();
133 NS_TEST_ASSERT_MSG_GT(p.x, bmm->GetRoomNumberX(), "wrong x value");
134 NS_TEST_ASSERT_MSG_LT(p.x, bmm->GetRoomNumberX() + 1, "wrong x value");
135 NS_TEST_ASSERT_MSG_GT(p.y, bmm->GetRoomNumberY(), "wrong y value");
136 NS_TEST_ASSERT_MSG_LT(p.y, bmm->GetRoomNumberY() + 1, "wrong y value");
137 NS_TEST_ASSERT_MSG_GT(p.z, bmm->GetFloorNumber(), "wrong z value");
138 NS_TEST_ASSERT_MSG_LT(p.z, bmm->GetFloorNumber() + 1, "wrong z value");
139 }
140
141 for (std::map<Room, uint32_t>::iterator it = roomCounter.begin(); it != roomCounter.end(); ++it)
142 {
143 // random selection is done without replacement until the set of
144 // eligible room is empty, at which point the set is filled
145 // again. Hence with 24 nodes and 12 rooms we expect 2 nodes per room
146 NS_TEST_ASSERT_MSG_EQ(it->second, 2, "expected 2 nodes per room");
147 }
148
149 NS_TEST_ASSERT_MSG_EQ(roomCounter.size(), 12, "expected 12 rooms allocated");
150
152}
153
161{
162 public:
164
165 private:
166 void DoRun() override;
167};
168
170 : TestCase("SameRoom 48 nodes")
171{
172}
173
174void
176{
177 NS_LOG_FUNCTION(this);
178
179 NS_LOG_LOGIC("create building");
180 Ptr<Building> b = CreateObject<Building>();
181 b->SetBoundaries(Box(-10, -6, 20, 26, -1, 5));
182 b->SetNFloors(2);
183 b->SetNRoomsX(2);
184 b->SetNRoomsY(3);
185
187 nodes.Create(24);
188
189 MobilityHelper mobility;
190 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
191 Ptr<PositionAllocator> positionAlloc = CreateObject<RandomRoomPositionAllocator>();
192 mobility.SetPositionAllocator(positionAlloc);
193 mobility.Install(nodes);
195
196 NodeContainer copyNodes;
197 copyNodes.Create(48);
198 positionAlloc = CreateObject<SameRoomPositionAllocator>(nodes);
199 mobility.SetPositionAllocator(positionAlloc);
200 mobility.Install(copyNodes);
201 BuildingsHelper::Install(copyNodes);
202
203 std::map<Room, uint32_t> roomCounter;
204
205 for (NodeContainer::Iterator it = copyNodes.Begin(); it != copyNodes.End(); ++it)
206 {
207 Ptr<MobilityModel> mm = (*it)->GetObject<MobilityModel>();
208 NS_ASSERT_MSG(mm, "no mobility model aggregated to this node");
209 Ptr<MobilityBuildingInfo> bmm = mm->GetObject<MobilityBuildingInfo>();
210 NS_ASSERT_MSG(bmm,
211 "MobilityBuildingInfo has not been aggregated to this node mobility model");
212
213 NS_TEST_ASSERT_MSG_EQ(bmm->IsIndoor(), true, "node should be indoor");
214 Room r(bmm->GetRoomNumberX(), bmm->GetRoomNumberY(), bmm->GetFloorNumber());
215 ++(roomCounter[r]);
216 }
217
218 for (std::map<Room, uint32_t>::iterator it = roomCounter.begin(); it != roomCounter.end(); ++it)
219 {
220 NS_TEST_ASSERT_MSG_EQ(it->second, 4, "expected 4 nodes per room");
221 }
222
223 NS_TEST_ASSERT_MSG_EQ(roomCounter.size(), 12, "expected 12 rooms allocated");
224
226}
227
235{
236 public:
238};
239
241 : TestSuite("building-position-allocator", UNIT)
242{
243 NS_LOG_FUNCTION(this);
244
247}
248
bool operator<(const Room &a, const Room &b)
static BuildingPositionAllocatorTestSuite buildingsPositionAllocatorTestSuiteInstance
Static variable for test initialization.
RandomRoomPositionAllocator TestSuite.
void DoRun() override
Implementation to actually run this TestCase.
void DoRun() override
Implementation to actually run this TestCase.
a 3d box
Definition: box.h:35
static void Install(Ptr< Node > node)
Install the MobilityBuildingInfo to a node.
mobility buildings information (to be used by mobility models)
Helper class used to assign positions and mobility models to nodes.
Keep track of the current position and velocity of an object.
keep track of a set of node pointers.
std::vector< Ptr< Node > >::const_iterator Iterator
Node container iterator.
Iterator End() const
Get an iterator which indicates past-the-last Node in the container.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Iterator Begin() const
Get an iterator which refers to the first Node in the container.
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:78
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:140
encapsulates test code
Definition: test.h:1060
@ QUICK
Fast test.
Definition: test.h:1065
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:301
A suite of tests to run.
Definition: test.h:1256
#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:86
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:282
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#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:709
#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:144
#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:874
NodeContainer nodes
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Room coordinates.
uint32_t x
X coord.
uint32_t y
Y coord.
uint32_t z
Z coord (floor)
Room(uint32_t xx, uint32_t yy, uint32_t zz)
Constructor.