/* * Copyright (C) 2020 James Turner * * This file is part of the program FlightGear. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * 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, see . */ #include "test_AIManager.hxx" #include #include #include "test_suite/FGTestApi/NavDataCache.hxx" #include "test_suite/FGTestApi/TestDataLogger.hxx" #include "test_suite/FGTestApi/TestPilot.hxx" #include "test_suite/FGTestApi/testGlobals.hxx" #include #include #include #include #include
#include
///////////////////////////////////////////////////////////////////////////// // Set up function for each test. void AIManagerTests::setUp() { FGTestApi::setUp::initTestGlobals("AI"); FGTestApi::setUp::initNavDataCache(); globals->add_new_subsystem(); auto props = globals->get_props(); props->setBoolValue("sim/ai/enabled", true); globals->get_subsystem_mgr()->bind(); globals->get_subsystem_mgr()->init(); globals->get_subsystem_mgr()->postinit(); } // Clean up after each test. void AIManagerTests::tearDown() { FGTestApi::tearDown::shutdownTestGlobals(); } void AIManagerTests::testBasic() { auto aim = globals->get_subsystem(); auto bikf = FGAirport::findByIdent("BIKF"); auto pilot = SGSharedPtr(new FGTestApi::TestPilot); FGTestApi::setPosition(bikf->geod()); pilot->resetAtPosition(bikf->geod()); pilot->setSpeedKts(220); pilot->setCourseTrue(0.0); pilot->setTargetAltitudeFtMSL(10000); FGTestApi::runForTime(10.0); auto aiUserAircraft = aim->getUserAircraft(); CPPUNIT_ASSERT(aiUserAircraft->isValid()); CPPUNIT_ASSERT(!aiUserAircraft->getDie()); const SGGeod g = globals->get_aircraft_position(); CPPUNIT_ASSERT_DOUBLES_EQUAL(g.getLongitudeDeg(), aiUserAircraft->getGeodPos().getLongitudeDeg(), 0.01); CPPUNIT_ASSERT_DOUBLES_EQUAL(g.getLatitudeDeg(), aiUserAircraft->getGeodPos().getLatitudeDeg(), 0.01); // disable, the AI user aircraft doesn't track altitude?! // CPPUNIT_ASSERT_DOUBLES_EQUAL(g.getElevationFt(), aiUserAircraft->getGeodPos().getElevationFt(), 1); CPPUNIT_ASSERT_DOUBLES_EQUAL(fgGetDouble("orientation/heading-deg"), aiUserAircraft->getTrueHeadingDeg(), 1); CPPUNIT_ASSERT_DOUBLES_EQUAL(fgGetDouble("velocities/groundspeed-kt"), aiUserAircraft->getSpeed(), 1); } void AIManagerTests::testAIFlightPlan() { std::unique_ptr aiFP(new FGAIFlightPlan); aiFP->setName("Bob"); aiFP->setRunway("24"); CPPUNIT_ASSERT_EQUAL(string{"Bob"}, aiFP->getName()); CPPUNIT_ASSERT_EQUAL(string{"24"}, aiFP->getRunway()); CPPUNIT_ASSERT_EQUAL(0, aiFP->getNrOfWayPoints()); CPPUNIT_ASSERT_EQUAL(static_cast(nullptr), aiFP->getPreviousWaypoint()); CPPUNIT_ASSERT_EQUAL(static_cast(nullptr), aiFP->getCurrentWaypoint()); CPPUNIT_ASSERT_EQUAL(static_cast(nullptr), aiFP->getNextWaypoint()); CPPUNIT_ASSERT_EQUAL(0, aiFP->getLeg()); auto wp1 = new FGAIWaypoint; wp1->setName("testWp_0"); wp1->setOn_ground(true); wp1->setGear_down(true); wp1->setSpeed(100); auto wp2 = new FGAIWaypoint; wp2->setName("upImTheAir"); wp2->setOn_ground(false); wp2->setGear_down(true); wp2->setSpeed(150); aiFP->addWaypoint(wp1); aiFP->addWaypoint(wp2); CPPUNIT_ASSERT_EQUAL(2, aiFP->getNrOfWayPoints()); CPPUNIT_ASSERT_EQUAL(wp1, aiFP->getCurrentWaypoint()); CPPUNIT_ASSERT_EQUAL(wp2, aiFP->getNextWaypoint()); CPPUNIT_ASSERT_EQUAL(0, aiFP->getLeg()); time_t startTime = 1498; aiFP->setTime(startTime); CPPUNIT_ASSERT(!aiFP->isActive(1400)); CPPUNIT_ASSERT(aiFP->isActive(1500)); } void AIManagerTests::testAircraftWaypoints() { auto aim = globals->get_subsystem(); SGPropertyNode_ptr aircraftDefinition(new SGPropertyNode); aircraftDefinition->setStringValue("type", "aircraft"); aircraftDefinition->setStringValue("callsign", "G-ARTA"); // set class for performance data auto eggd = FGAirport::findByIdent("EGGD"); aircraftDefinition->setDoubleValue("heading", 90.0); aircraftDefinition->setDoubleValue("latitude", eggd->geod().getLatitudeDeg()); aircraftDefinition->setDoubleValue("longitude", eggd->geod().getLongitudeDeg()); aircraftDefinition->setDoubleValue("altitude", 6000.0); aircraftDefinition->setDoubleValue("speed", 250.0); // IAS or TAS? auto ai = aim->addObject(aircraftDefinition); CPPUNIT_ASSERT(ai); CPPUNIT_ASSERT_EQUAL(FGAIBase::otAircraft, ai->getType()); CPPUNIT_ASSERT_EQUAL(std::string{"aircraft"}, std::string{ai->getTypeString()}); auto aiAircraft = static_cast(ai.get()); const auto aiPos = aiAircraft->getGeodPos(); CPPUNIT_ASSERT_DOUBLES_EQUAL(eggd->geod().getLatitudeDeg(), aiPos.getLatitudeDeg(), 0.01); CPPUNIT_ASSERT_DOUBLES_EQUAL(eggd->geod().getLongitudeDeg(), aiPos.getLongitudeDeg(), 0.01); CPPUNIT_ASSERT_DOUBLES_EQUAL(90.0, aiAircraft->getTrueHeadingDeg(), 1); CPPUNIT_ASSERT_DOUBLES_EQUAL(250.0, aiAircraft->getSpeed(), 1); std::unique_ptr aiFP(new FGAIFlightPlan); ai->setFlightPlan(std::move(aiFP)); }