From 8d56587848b59408d78ead6fb2c5bb37bc2cee57 Mon Sep 17 00:00:00 2001 From: Nicola Baldo Date: Mon, 16 Jan 2012 13:14:02 +0100 Subject: [PATCH] added missing file --- src/buildings/test/buildings-helper-test.cc | 324 ++++++++++++++++++++ 1 file changed, 324 insertions(+) create mode 100644 src/buildings/test/buildings-helper-test.cc diff --git a/src/buildings/test/buildings-helper-test.cc b/src/buildings/test/buildings-helper-test.cc new file mode 100644 index 000000000..cebd393a4 --- /dev/null +++ b/src/buildings/test/buildings-helper-test.cc @@ -0,0 +1,324 @@ +/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2011, 2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Nicola Baldo + */ + + + +#include "ns3/log.h" +#include "ns3/test.h" +#include +#include +#include +#include +#include + +NS_LOG_COMPONENT_DEFINE ("BuildingsHelperTest"); + +using namespace ns3; + + +struct PositionInBuilding +{ + PositionInBuilding (); + Vector pos; // coordinates of the mobility model instance + bool indoor; // true if indoor, false otherwise + uint32_t bid; // building id + uint16_t rx; // room x + uint16_t ry; // room y + uint16_t fn; // floor number +}; + +PositionInBuilding::PositionInBuilding () + : pos (0,0,0), + indoor (false), + bid (0xffffffff), + rx (0), + ry (0), + fn (0) +{ +} + +/** + * data to construct a Building object. We don't want to pass Building + * objects to the TestCase constructor because otherwise BuildingList + * would contain all of them (even if only one is meant to be in the + * test case). + * + */ +struct BuildingData +{ + BuildingData (); + double xmin; + double xmax; + double ymin; + double ymax; + double zmin; + double zmax; + uint16_t nrx; + uint16_t nry; + uint16_t nf; +}; + +BuildingData::BuildingData () + : xmin (0), + xmax (0), + ymin (0), + ymax (0), + zmin (0), + zmax (0), + nrx (0), + nry (0), + nf (0) +{ +} + +class BuildingsHelperOneTestCase : public TestCase +{ +public: + static std::string BuildNameString (PositionInBuilding pib, BuildingData bd); + BuildingsHelperOneTestCase (PositionInBuilding pib, BuildingData bd); + +private: + virtual void DoRun (void); + + PositionInBuilding m_pib; + BuildingData m_bd; + +}; + +std::string BuildingsHelperOneTestCase::BuildNameString (PositionInBuilding pib, BuildingData bd) +{ + std::ostringstream oss; + oss << "pos=" << pib.pos; + if (pib.indoor) + { + oss << ", bid=" << pib.bid + << ", rx=" << pib.rx + << ", ry=" << pib.ry + << ", fn=" << pib.fn; + } + else + { + oss << ", outdoor"; + } + return oss.str (); +} + + +BuildingsHelperOneTestCase::BuildingsHelperOneTestCase (PositionInBuilding pib, BuildingData bd) + : TestCase (BuildNameString (pib, bd)), + m_pib (pib), + m_bd (bd) +{ +} + +void +BuildingsHelperOneTestCase::DoRun () +{ + NS_LOG_FUNCTION (this << BuildNameString (m_pib, m_bd)); + MobilityHelper mobility; + mobility.SetMobilityModel ("ns3::BuildingsMobilityModel"); + + NodeContainer nodes; + nodes.Create (1); + mobility.Install (nodes); + + Ptr bmm = nodes.Get (0)->GetObject (); + bmm->SetPosition (m_pib.pos); + + NS_LOG_LOGIC ("create building"); + Ptr b = CreateObject (m_bd.xmin, m_bd.xmax, m_bd.ymin, m_bd.ymax, m_bd.zmin, m_bd.zmax); + b->SetNFloors (m_bd.nf); + b->SetNRoomsX (m_bd.nrx); + b->SetNRoomsY (m_bd.nry); + + BuildingsHelper::MakeAllInstancesConsistent (); + + + NS_TEST_ASSERT_MSG_EQ (bmm->IsIndoor (), m_pib.indoor, "indoor/outdoor mismatch"); + if (m_pib.indoor) + { + NS_LOG_LOGIC (" got bid=" << bmm->GetBuilding ()->GetId () << ", f=" << (uint32_t) bmm->GetFloorNumber () << ", rx=" << (uint32_t) bmm->GetRoomNumberX () << ", roomY=" << (uint32_t) bmm->GetRoomNumberY ()); + // only one building in this test, so Id will be 0 + NS_TEST_ASSERT_MSG_EQ (bmm->GetBuilding ()->GetId (), 0, "Building ID mismatch"); + NS_TEST_ASSERT_MSG_EQ ((uint32_t) bmm->GetFloorNumber (), m_pib.fn, "floor number mismatch"); + NS_TEST_ASSERT_MSG_EQ ((uint32_t) bmm->GetRoomNumberX (), m_pib.rx, "x room number mismatch"); + NS_TEST_ASSERT_MSG_EQ ((uint32_t) bmm->GetRoomNumberY (), m_pib.ry, "y room number mismatch"); + } + + Simulator::Destroy (); +} + + + + + + + +class BuildingsHelperTestSuite : public TestSuite +{ +public: + BuildingsHelperTestSuite (); +}; + + +BuildingsHelperTestSuite::BuildingsHelperTestSuite () + : TestSuite ("buildings-helper", UNIT) +{ + NS_LOG_FUNCTION (this); + + BuildingData b1; + b1.xmin = 1; + b1.xmax = 3; + b1.ymin = 1; + b1.ymax = 2; + b1.zmin = 0; + b1.zmax = 4; + b1.nrx = 1; + b1.nry = 1; + b1.nf = 1; + + Vector vp1 (1.5, 1.5, 0.5); + PositionInBuilding p1; + p1.pos = vp1; + p1.indoor = true; + p1.bid = 0; + p1.rx = 1; + p1.ry = 1; + p1.fn = 1; + AddTestCase (new BuildingsHelperOneTestCase (p1, b1)); + + Vector vp2 (1.5, 0.5, 0.5); + PositionInBuilding p2; + p2.pos = vp2; + p2.indoor = false; + AddTestCase (new BuildingsHelperOneTestCase (p2, b1)); + + Vector vp3 (1.5, 2.5, 0.5); + PositionInBuilding p3; + p3.pos = vp3; + p3.indoor = false; + AddTestCase (new BuildingsHelperOneTestCase (p3, b1)); + + Vector vp4 (1.5, 1.5, 5); + PositionInBuilding p4; + p4.pos = vp4; + p4.indoor = false; + AddTestCase (new BuildingsHelperOneTestCase (p4, b1)); + + Vector vp5 (2.5, 1.6, 3.5); + PositionInBuilding p5; + p5.pos = vp5; + p5.indoor = true; + p5.bid = 0; + p5.rx = 1; + p5.ry = 1; + p5.fn = 1; + AddTestCase (new BuildingsHelperOneTestCase (p5, b1)); + + Vector vp6 (0.9999, 1.5, 1.5); + PositionInBuilding p6; + p6.pos = vp6; + p6.indoor = false; + AddTestCase (new BuildingsHelperOneTestCase (p6, b1)); + + Vector vp7 (3.0001, 1.5, 2.5); + PositionInBuilding p7; + p7.pos = vp7; + p7.indoor = false; + AddTestCase (new BuildingsHelperOneTestCase (p7, b1)); + + Vector vp8 (1.001, 1.001, -0.01); + PositionInBuilding p8; + p8.pos = vp8; + p8.indoor = false; + AddTestCase (new BuildingsHelperOneTestCase (p8, b1)); + + Vector vp9 (1.5, 1.5, 4.001); + PositionInBuilding p9; + p9.pos = vp9; + p9.indoor = false; + AddTestCase (new BuildingsHelperOneTestCase (p9, b1)); + + + + + BuildingData b2; + b2.xmin = -1; + b2.xmax = 0.5; + b2.ymin = -2; + b2.ymax = 0.5; + b2.zmin = 0; + b2.zmax = 2; + b2.nrx = 3; + b2.nry = 5; + b2.nf = 4; + + Vector vq1 (-0.7, -1.1, 1.2); + PositionInBuilding q1; + q1.pos = vq1; + q1.indoor = true; + q1.bid = 1; + q1.rx = 1; + q1.ry = 2; + q1.fn = 3; + AddTestCase (new BuildingsHelperOneTestCase (q1, b2)); + + Vector vq2 (0.2, 0.3, 0.2); + PositionInBuilding q2; + q2.pos = vq2; + q2.indoor = true; + q2.bid = 1; + q2.rx = 3; + q2.ry = 5; + q2.fn = 1; + AddTestCase (new BuildingsHelperOneTestCase (q2, b2)); + + Vector vq3 (0.6, -1.75, 1.5); + PositionInBuilding q3; + q3.pos = vq3; + q3.indoor = false; + AddTestCase (new BuildingsHelperOneTestCase (q3, b2)); + + Vector vq4 (-1.01, 0.3, 1.99); + PositionInBuilding q4; + q4.pos = vq4; + q4.indoor = false; + AddTestCase (new BuildingsHelperOneTestCase (q4, b2)); + + Vector vq5 (-0.8, 0.7, 0.01); + PositionInBuilding q5; + q5.pos = vq5; + q5.indoor = false; + AddTestCase (new BuildingsHelperOneTestCase (q5, b2)); + + Vector vq6 (0.2, 0.3, -0.2); + PositionInBuilding q6; + q6.pos = vq6; + q6.indoor = false; + AddTestCase (new BuildingsHelperOneTestCase (q6, b2)); + + Vector vq7 (0.2, 0.3, 2.001); + PositionInBuilding q7; + q7.pos = vq7; + q7.indoor = false; + AddTestCase (new BuildingsHelperOneTestCase (q7, b2)); +} + +static BuildingsHelperTestSuite buildingsHelperAntennaTestSuiteInstance;