UNPKG

aerofly-missions

Version:

The Aerofly Missionsgerät converts simulator flight plan files for Aerofly FS 4, Microsoft Flight Simulator, X-Plane, GeoFS, and Garmin / Infinite Flight flight plan files. It also imports SimBrief flight plans.

141 lines (127 loc) 5.79 kB
import { Test } from "../Cli/Test.js"; import { MsfsPlnExport, MsfsPln, Msfs2024Export } from "../Import/MsfsPln.js"; import * as fs from "node:fs"; import { Mission } from "../Aerofly/Mission.js"; import { MissionCheckpoint } from "../Aerofly/MissionCheckpoint.js"; import { Units } from "../World/Units.js"; export class MsfsPlnTest extends Test { constructor(protected process: NodeJS.Process, protected dieOnError = false) { super(process, dieOnError); this.testEGOV(); this.testLittleNavMap(); this.testGarminParse(); this.testRunway(); } testEGOV() { // Parse PLN const pln = new MsfsPln(fs.readFileSync("./src/Tests/fixtures/EGOV.pln", "utf8")); this.group(MsfsPln.name); { this.assertEquals(pln.waypoints.length, 16); this.assertEquals(pln.waypoints[0].identifier, "EGOV"); this.assertEquals(pln.waypoints[0].type, "AIRPORT"); this.assertEquals(pln.waypoints[1].type, "USER WAYPOINT"); this.assertEquals(pln.waypoints[1].lat, 52.717475); this.assertEquals(pln.waypoints[1].elevationMeter, 2500 / Units.feetPerMeter); this.assertEqualsRounded(pln.waypoints[1].lon, -4.05834167, 8); this.assertEquals(pln.cruisingAltFt, 2500); this.assertEquals(pln.departureRunway, undefined); this.assertEquals(pln.destinationRunway, undefined); } // Convert PLN to Mission const mission = new Mission("", "").fromGarminFpl(pln); this.group(MsfsPln.name + ": Mission conversion"); { this.assertEquals(mission.checkpoints.length, 16); this.assertEquals(mission.flight_setting, Mission.FLIGHT_SETTING_TAXI); this.assertEqualsRounded(mission.origin_dir, 151.3, 1); } // Export Mission to XML const exportPln = new MsfsPlnExport(mission); this.group(MsfsPlnExport.name + ": Mission conversion"); { this.assert(exportPln.toString() !== "", "Not empty flight plan"); } const exportPln2 = new Msfs2024Export(mission); this.group(Msfs2024Export.name + ": Mission conversion"); { this.assert(exportPln2.toString() !== "", "Not empty flight plan"); } // Reimport XML to PLN const secondPln = new MsfsPln(exportPln.toString()); this.group(MsfsPln.name); { this.assertEquals(secondPln.waypoints.length, pln.waypoints.length); secondPln.waypoints.forEach((wp, index) => { this.assertEquals(wp.identifier, pln.waypoints[index].identifier); this.assertEquals(wp.type, pln.waypoints[index].type); this.assertEquals(wp.lat, pln.waypoints[index].lat); this.assertEquals(wp.lon, pln.waypoints[index].lon); }); this.assertEquals(secondPln.cruisingAltFt, pln.cruisingAltFt); } } testLittleNavMap() { this.group(MsfsPln.name + ": Little Nav Map"); { const pln = new MsfsPln(fs.readFileSync("./src/Tests/fixtures/egov-lnavmap.pln", "utf8")); this.assertEquals(pln.waypoints.length, 16); this.assertEquals(pln.waypoints[0].identifier, "EGOV"); this.assertEquals(pln.waypoints[0].type, "AIRPORT"); this.assertEquals(pln.waypoints[1].type, "USER WAYPOINT"); this.assertEqualsRounded(pln.waypoints[1].elevationMeter ?? 0, 762, 0); this.assertEqualsRounded(pln.waypoints[2].elevationMeter ?? 0, 762, 0); this.assertEquals(pln.cruisingAltFt, 2500); } } testGarminParse() { const pln = new MsfsPln(fs.readFileSync("./src/Tests/fixtures/EFMA-lnavmap.pln", "utf8")); this.group(MsfsPln.name + ": Little Nav Map to Mission"); { this.assertEquals(pln.waypoints.length, 11); this.assertEquals(pln.waypoints[0].identifier, "EFMA"); this.assertEquals(pln.waypoints[0].type, "AIRPORT"); this.assertEquals(pln.waypoints[1].type, "USER WAYPOINT"); this.assertEquals(pln.waypoints[3].identifier, "RATSO"); this.assertEquals(pln.waypoints[3].countryCode, "EF"); this.assertEquals(pln.waypoints[4].type, "VOR"); this.assertEquals(pln.waypoints[5].type, "NDB"); this.assertEqualsRounded(pln.waypoints[1].elevationMeter ?? 0, 68.22, 2); this.assertEquals(pln.cruisingAltFt, 2500); } // Convert FMS to Mission const mission = new Mission("", "").fromGarminFpl(pln); this.group(MsfsPln.name + ": Mission conversion"); { this.assertEquals(mission.checkpoints.length, 11); this.assertEquals(mission.flight_setting, Mission.FLIGHT_SETTING_TAXI); this.assertEquals(mission.checkpoints[0].type, MissionCheckpoint.TYPE_ORIGIN); this.assertEquals(mission.checkpoints[0].icao_region, "EF"); this.assertEquals(mission.checkpoints[1].type, MissionCheckpoint.TYPE_DEPARTURE_RUNWAY); this.assertEquals(mission.checkpoints[9].type, MissionCheckpoint.TYPE_DESTINATION_RUNWAY); this.assertEquals(mission.checkpoints[10].type, MissionCheckpoint.TYPE_DESTINATION); this.assertEquals(mission.checkpoints[10].icao_region, "EF"); } // Export Mission to XML const exportPln = new MsfsPlnExport(mission); this.group(MsfsPlnExport.name + ": Mission conversion"); { this.assert(exportPln.toString() !== "", "Not empty flight plan"); } const exportPln2 = new Msfs2024Export(mission); this.group(Msfs2024Export.name + ": Mission conversion"); { this.assert(exportPln2.toString() !== "", "Not empty flight plan"); } } testRunway() { const pln = new MsfsPln(fs.readFileSync("./src/Tests/fixtures/ENHD_local_flight.pln", "utf8")); this.group(MsfsPln.name + ": Runway check"); { this.assertEquals(pln.departureRunway, "13"); this.assertEquals(pln.destinationRunway, "31"); const mission = new Mission("", "").fromGarminFpl(pln); this.assertEquals(mission.checkpoints.length, 9); } } }