1
0
Fork 0

Add tests for MP-runway start, and fix behaviour.

Fix a bug in how taxi-nodes were classified, which meant that MP start
on a runway was not applied correctly.
This commit is contained in:
James Turner 2021-03-07 15:12:58 +00:00
parent 84f95fe3c2
commit 81df48b858
8 changed files with 73 additions and 27 deletions

View file

@ -190,7 +190,7 @@ void FGGroundNetXMLLoader::startNode(const XMLAttributes &atts)
} }
SGGeod pos(SGGeod::fromDeg(processPosition(lon), processPosition(lat))); SGGeod pos(SGGeod::fromDeg(processPosition(lon), processPosition(lat)));
FGTaxiNodeRef node(new FGTaxiNode(index, pos, onRunway, holdPointType)); FGTaxiNodeRef node(new FGTaxiNode(FGPositioned::TAXI_NODE, index, pos, onRunway, holdPointType));
_indexMap[index] = node; _indexMap[index] = node;
_unreferencedNodes.insert(node); _unreferencedNodes.insert(node);
} }

View file

@ -14,10 +14,10 @@ using namespace flightgear;
* FGTaxiNode * FGTaxiNode
*************************************************************************/ *************************************************************************/
FGTaxiNode::FGTaxiNode(int index, const SGGeod& pos, FGTaxiNode::FGTaxiNode(FGPositioned::Type ty, int index, const SGGeod& pos,
bool aOnRunway, int aHoldType, bool aOnRunway, int aHoldType,
const std::string& ident) : const std::string& ident) :
FGPositioned(TRANSIENT_ID, FGPositioned::PARKING, ident, pos), FGPositioned(TRANSIENT_ID, ty, ident, pos),
m_index(index), m_index(index),
isOnRunway(aOnRunway), isOnRunway(aOnRunway),
holdType(aHoldType), holdType(aHoldType),
@ -26,10 +26,6 @@ FGTaxiNode::FGTaxiNode(int index, const SGGeod& pos,
} }
FGTaxiNode::~FGTaxiNode()
{
}
void FGTaxiNode::setElevation(double val) void FGTaxiNode::setElevation(double val)
{ {
// ignored for the moment // ignored for the moment

View file

@ -26,14 +26,14 @@ class FGTaxiNode : public FGPositioned
protected: protected:
const int m_index; const int m_index;
bool isOnRunway; const bool isOnRunway;
int holdType; const int holdType;
bool m_isPushback; bool m_isPushback;
public: public:
FGTaxiNode(int index, const SGGeod& pos, bool aOnRunway, int aHoldType, FGTaxiNode(FGPositioned::Type ty, int index, const SGGeod& pos, bool aOnRunway, int aHoldType,
const std::string& ident = {}); const std::string& ident = {});
virtual ~FGTaxiNode(); virtual ~FGTaxiNode() = default;
void setElevation(double val); void setElevation(double val);

View file

@ -20,9 +20,7 @@
// //
// $Id$ // $Id$
#ifdef HAVE_CONFIG_H #include <config.h>
# include <config.h>
#endif
#include "groundnetwork.hxx" #include "groundnetwork.hxx"

View file

@ -22,9 +22,7 @@
// //
// $Id$ // $Id$
#ifdef HAVE_CONFIG_H #include <config.h>
# include <config.h>
#endif
#include <simgear/compiler.h> #include <simgear/compiler.h>
@ -42,7 +40,7 @@ FGParking::FGParking(int index,
const std::string& name, const std::string& name,
const std::string& aType, const std::string& aType,
const std::string& codes) : const std::string& codes) :
FGTaxiNode(index, pos, false, 0, name), FGTaxiNode(FGPositioned::PARKING, index, pos, false, 0, name),
heading(aHeading), heading(aHeading),
radius(aRadius), radius(aRadius),
type(aType), type(aType),
@ -50,10 +48,6 @@ FGParking::FGParking(int index,
{ {
} }
FGParking::~FGParking()
{
}
void FGParking::setPushBackPoint(const FGTaxiNodeRef &node) void FGParking::setPushBackPoint(const FGTaxiNodeRef &node)
{ {
pushBackPoint = node; pushBackPoint = node;

View file

@ -25,10 +25,6 @@
#ifndef _PARKING_HXX_ #ifndef _PARKING_HXX_
#define _PARKING_HXX_ #define _PARKING_HXX_
#ifndef __cplusplus
# error This library requires C++
#endif
#include <simgear/compiler.h> #include <simgear/compiler.h>
#include <simgear/sg_inlines.h> #include <simgear/sg_inlines.h>
@ -56,7 +52,7 @@ public:
double heading, double radius, double heading, double radius,
const std::string& name, const std::string& type, const std::string& name, const std::string& type,
const std::string& codes); const std::string& codes);
virtual ~FGParking(); virtual ~FGParking() = default;
double getHeading () const { return heading; }; double getHeading () const { return heading; };
double getRadius () const { return radius; }; double getRadius () const { return radius; };

View file

@ -927,3 +927,58 @@ void PosInitTests::testRepositionAtInvalid()
auto runway = apt->getRunwayByIdent("36"); auto runway = apt->getRunwayByIdent("36");
checkPosition(runway->threshold()); checkPosition(runway->threshold());
} }
void PosInitTests::testMPRunwayStart()
{
{
Options* opts = Options::sharedInstance();
opts->setShouldLoadDefaultConfig(false);
// set dummy value to pretend MP is active
fgSetString("/sim/multiplay/txhost", "lalalal");
const char* args[] = {"dummypath", "--airport=EDDF", "--runway=07L"};
opts->init(3, (char**) args, SGPath());
opts->processOptions();
}
initPosition();
CPPUNIT_ASSERT(fgGetBool("/sim/presets/airport-requested"));
CPPUNIT_ASSERT(fgGetBool("/sim/presets/runway-requested"));
CPPUNIT_ASSERT(fgGetBool("/sim/presets/avoided-mp-runway"));
auto apt = FGAirport::getByIdent("EDDF");
FGGroundNetwork* groundNet = apt->groundNetwork();
auto rwy = apt->getRunwayByIdent("07L");
FGTaxiNodeRef taxiNode = groundNet->findNearestNodeOffRunway(rwy->threshold(), rwy, 50.0);
checkPosition(taxiNode->geod());
}
void PosInitTests::testMPRunwayStartNoGroundnet()
{
{
Options* opts = Options::sharedInstance();
opts->setShouldLoadDefaultConfig(false);
// set dummy value to pretend MP is active
fgSetString("/sim/multiplay/txhost", "lalalal");
const char* args[] = {"dummypath", "--airport=EDDS", "--runway=07"};
opts->init(3, (char**) args, SGPath());
opts->processOptions();
}
initPosition();
CPPUNIT_ASSERT(fgGetBool("/sim/presets/airport-requested"));
CPPUNIT_ASSERT(fgGetBool("/sim/presets/runway-requested"));
CPPUNIT_ASSERT(!fgGetBool("/sim/presets/avoided-mp-runway"));
auto apt = FGAirport::getByIdent("EDDS");
auto rwy = apt->getRunwayByIdent("07");
checkPosition(rwy->threshold());
}

View file

@ -72,6 +72,10 @@ class PosInitTests : public CppUnit::TestFixture
CPPUNIT_TEST(testRepositionAtOccupied); CPPUNIT_TEST(testRepositionAtOccupied);
CPPUNIT_TEST(testRepositionAtInvalid); CPPUNIT_TEST(testRepositionAtInvalid);
// MP tests
CPPUNIT_TEST(testMPRunwayStart);
CPPUNIT_TEST(testMPRunwayStartNoGroundnet);
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
void simulateStartReposition(); void simulateStartReposition();
@ -119,6 +123,9 @@ public:
void testRepositionAtInvalid(); void testRepositionAtInvalid();
void testAirportRunwayRepositionAirport(); void testAirportRunwayRepositionAirport();
// MP tests
void testMPRunwayStart();
void testMPRunwayStartNoGroundnet();
private: private:
// Helper functions for tests. Return void as they use CPPUNIT_ASSERT // Helper functions for tests. Return void as they use CPPUNIT_ASSERT
void checkAlt(float value); void checkAlt(float value);