mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2025-12-31 00:10:44 -06:00
* Remove old non-submodule version of nlohmann in favor of submodule * Update nlohmann from 3.9.1 to 3.12.0 - Already disable implicit conversions in preparation for next major version
869 lines
29 KiB
C++
869 lines
29 KiB
C++
/*****************************************************************************************
|
|
* *
|
|
* OpenSpace *
|
|
* *
|
|
* Copyright (c) 2014-2025 *
|
|
* *
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of this *
|
|
* software and associated documentation files (the "Software"), to deal in the Software *
|
|
* without restriction, including without limitation the rights to use, copy, modify, *
|
|
* merge, publish, distribute, sublicense, and/or sell copies of the Software, and to *
|
|
* permit persons to whom the Software is furnished to do so, subject to the following *
|
|
* conditions: *
|
|
* *
|
|
* The above copyright notice and this permission notice shall be included in all copies *
|
|
* or substantial portions of the Software. *
|
|
* *
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, *
|
|
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A *
|
|
* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT *
|
|
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF *
|
|
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE *
|
|
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
|
|
****************************************************************************************/
|
|
|
|
#include <catch2/catch_approx.hpp>
|
|
#include <catch2/catch_test_macros.hpp>
|
|
|
|
#include <openspace/json.h>
|
|
#include <openspace/util/spicemanager.h>
|
|
#include <ghoul/filesystem/filesystem.h>
|
|
#include <ghoul/logging/logmanager.h>
|
|
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
#include <modules/space/horizonsfile.h>
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
|
|
using namespace openspace;
|
|
using json = nlohmann::json;
|
|
|
|
namespace {
|
|
|
|
// Struct to hold the data for some of the tests
|
|
struct HorizonsTestData {
|
|
std::string observer;
|
|
std::string target;
|
|
std::string start;
|
|
std::string stop;
|
|
std::string step;
|
|
std::string unit;
|
|
};
|
|
|
|
// Avoid repetitive code by using these functions
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
void testHorizonsAnswer(const HorizonsTestData& data, HorizonsType type,
|
|
const std::filesystem::path& filePath,
|
|
HorizonsResultCode expectedAnswerCode)
|
|
{
|
|
const std::string url = constructHorizonsUrl(
|
|
type,
|
|
data.target,
|
|
data.observer,
|
|
data.start,
|
|
data.stop,
|
|
data.step,
|
|
data.unit
|
|
);
|
|
const json answer = sendHorizonsRequest(url, filePath);
|
|
HorizonsResultCode code = isValidHorizonsAnswer(answer);
|
|
CHECK(code == expectedAnswerCode);
|
|
|
|
CHECK(std::filesystem::is_regular_file(filePath));
|
|
std::filesystem::remove(filePath);
|
|
CHECK(!std::filesystem::is_regular_file(filePath));
|
|
}
|
|
|
|
void testHorizonsAnswerAndResult(const HorizonsTestData& data, HorizonsType type,
|
|
const std::filesystem::path& filePath,
|
|
HorizonsResultCode expectedAnswerCode,
|
|
HorizonsResultCode expectedResultCode,
|
|
bool shouldDeleteFile = true)
|
|
{
|
|
const std::string url = constructHorizonsUrl(
|
|
type,
|
|
data.target,
|
|
data.observer,
|
|
data.start,
|
|
data.stop,
|
|
data.step,
|
|
data.unit
|
|
);
|
|
json answer = sendHorizonsRequest(url, filePath);
|
|
HorizonsResultCode answerCode = isValidHorizonsAnswer(answer);
|
|
CHECK(answerCode == expectedAnswerCode);
|
|
|
|
// Extract the result from the json object and test it
|
|
auto result = answer.find("result");
|
|
CHECK(result != answer.end());
|
|
|
|
const HorizonsFile horizonsFile(filePath, result->get<std::string>());
|
|
HorizonsResultCode resultCode = isValidHorizonsFile(horizonsFile.file());
|
|
CHECK(resultCode == expectedResultCode);
|
|
|
|
CHECK(std::filesystem::is_regular_file(filePath));
|
|
if (shouldDeleteFile) {
|
|
std::filesystem::remove(filePath);
|
|
CHECK(!std::filesystem::is_regular_file(filePath));
|
|
}
|
|
}
|
|
|
|
void testReadingHorizons(HorizonsType type, const std::filesystem::path& filePath,
|
|
double t0, double x0, double y0, double z0, double t1,
|
|
double x1, double y1, double z1, double t2, double x2,
|
|
double y2, double z2)
|
|
{
|
|
// Get files and make sure they exist
|
|
const std::filesystem::path kernel =
|
|
absPath("${TESTDIR}/horizonsTest/naif0012.tls");
|
|
CHECK(std::filesystem::is_regular_file(kernel));
|
|
CHECK(std::filesystem::is_regular_file(filePath));
|
|
|
|
// Initialize SpiceManager and load leap second kernel
|
|
SpiceManager::initialize();
|
|
openspace::SpiceManager::ref().loadKernel(kernel);
|
|
|
|
// Read the file
|
|
HorizonsResult result = readHorizonsFile(filePath);
|
|
|
|
// Check the result
|
|
CHECK(result.type == type);
|
|
CHECK(result.errorCode == HorizonsResultCode::Valid);
|
|
|
|
std::vector<HorizonsKeyframe> data = result.data;
|
|
REQUIRE(data.size() == 3);
|
|
|
|
CHECK(data[0].time == Catch::Approx(t0));
|
|
CHECK(data[0].position.x == Catch::Approx(x0));
|
|
CHECK(data[0].position.y == Catch::Approx(y0));
|
|
CHECK(data[0].position.z == Catch::Approx(z0));
|
|
|
|
|
|
CHECK(data[1].time == Catch::Approx(t1));
|
|
CHECK(data[1].position.x == Catch::Approx(x1));
|
|
CHECK(data[1].position.y == Catch::Approx(y1));
|
|
CHECK(data[1].position.z == Catch::Approx(z1));
|
|
|
|
|
|
CHECK(data[2].time == Catch::Approx(t2));
|
|
CHECK(data[2].position.x == Catch::Approx(x2));
|
|
CHECK(data[2].position.y == Catch::Approx(y2));
|
|
CHECK(data[2].position.z == Catch::Approx(z2));
|
|
|
|
// Clean up
|
|
openspace::SpiceManager::ref().unloadKernel(kernel);
|
|
openspace::SpiceManager::deinitialize();
|
|
}
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
}
|
|
|
|
// Test if the space module is enable or not
|
|
TEST_CASE("HorizonsFile: Space module", "[horizonsfile]") {
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
CHECK(true);
|
|
LINFOC("test_horizons", "Downloading Horizons test data ...");
|
|
#else
|
|
LERRORC("test_horizons", "These tests requires the Space module to be enabled");
|
|
CHECK(false);
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
}
|
|
|
|
// Test Horizons requests and error handling
|
|
// Test the errors that are captured by the error field in the json result
|
|
TEST_CASE("HorizonsFile: File size too large", "[horizonsfile]") {
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
HorizonsTestData data;
|
|
data.observer = "@ssb";
|
|
data.target = "-74"; // MRO
|
|
data.start = "2005-08-13 00:00:00";
|
|
data.stop = "2022-07-01 00:00:00";
|
|
data.step = "1";
|
|
data.unit = "m";
|
|
const std::filesystem::path filePath = absPath(
|
|
"${TESTDIR}/horizonsTest/horizonstest_1.hrz"
|
|
);
|
|
const HorizonsResultCode expectedAnswerCode = HorizonsResultCode::ErrorSize;
|
|
|
|
// Test Vector format
|
|
HorizonsType type = HorizonsType::Vector;
|
|
testHorizonsAnswer(data, type, filePath, expectedAnswerCode);
|
|
|
|
// Test Observer format
|
|
type = HorizonsType::Observer;
|
|
testHorizonsAnswer(data, type, filePath, expectedAnswerCode);
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
}
|
|
|
|
TEST_CASE("HorizonsFile: Time steps too large", "[horizonsfile]") {
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
HorizonsTestData data;
|
|
data.observer = "@ssb";
|
|
data.target = "-74"; // MRO
|
|
data.start = "2005-08-13 00:00:00";
|
|
data.stop = "2022-07-01 00:00:00";
|
|
data.step = "1111111111";
|
|
data.unit = "d";
|
|
const std::filesystem::path filePath = absPath(
|
|
"${TESTDIR}/horizonsTest/horizonstest_2.hrz"
|
|
);
|
|
const HorizonsResultCode expectedAnswerCode = HorizonsResultCode::ErrorSpan;
|
|
|
|
// Test Vector format
|
|
HorizonsType type = HorizonsType::Vector;
|
|
testHorizonsAnswer(data, type, filePath, expectedAnswerCode);
|
|
|
|
// Test Observer format
|
|
type = HorizonsType::Observer;
|
|
testHorizonsAnswer(data,type, filePath, expectedAnswerCode);
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
}
|
|
|
|
TEST_CASE("HorizonsFile: Outside available time range", "[horizonsfile]") {
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
HorizonsTestData data;
|
|
data.observer = "@ssb";
|
|
data.target = "Tesla";
|
|
data.start = "1950-05-19 00:00:00";
|
|
data.stop = "2000-05-19 00:00:00";
|
|
data.step = "1";
|
|
data.unit = "d";
|
|
const std::filesystem::path filePath = absPath(
|
|
"${TESTDIR}/horizonsTest/horizonstest_3.hrz"
|
|
);
|
|
const HorizonsResultCode expectedAnswerCode = HorizonsResultCode::ErrorTimeRange;
|
|
|
|
// Test Vector format
|
|
HorizonsType type = HorizonsType::Vector;
|
|
testHorizonsAnswer(data, type, filePath, expectedAnswerCode);
|
|
|
|
// Test Observer format
|
|
type = HorizonsType::Observer;
|
|
testHorizonsAnswer(data, type, filePath, expectedAnswerCode);
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
}
|
|
|
|
TEST_CASE("HorizonsFile: No observer", "[horizonsfile]") {
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
HorizonsTestData data;
|
|
data.observer = "abcdefghijkl";
|
|
data.target = "Tesla";
|
|
data.start = "2021-05-19 00:00:00";
|
|
data.stop = "2022-05-19 00:00:00";
|
|
data.step = "1";
|
|
data.unit = "d";
|
|
const std::filesystem::path filePath = absPath(
|
|
"${TESTDIR}/horizonsTest/horizonstest_4.hrz"
|
|
);
|
|
const HorizonsResultCode answer = HorizonsResultCode::ErrorNoObserver;
|
|
|
|
// Test Vector format
|
|
HorizonsType type = HorizonsType::Vector;
|
|
testHorizonsAnswer(data, type, filePath, answer);
|
|
|
|
// Test Observer format
|
|
type = HorizonsType::Observer;
|
|
testHorizonsAnswer(data, type, filePath, answer);
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
}
|
|
|
|
TEST_CASE("HorizonsFile: Observer and target same", "[horizonsfile]") {
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
HorizonsTestData data;
|
|
data.observer = "500@4"; // Mars barycenter
|
|
data.target = "4"; // Mars barycenter
|
|
data.start = "2021-05-19 00:00:00";
|
|
data.stop = "2022-05-19 00:00:00";
|
|
data.step = "1";
|
|
data.unit = "d";
|
|
const std::filesystem::path filePath = absPath(
|
|
"${TESTDIR}/horizonsTest/horizonstest_5.hrz"
|
|
);
|
|
const HorizonsResultCode answer = HorizonsResultCode::ErrorObserverTargetSame;
|
|
|
|
// This test is only for Observer type format
|
|
const HorizonsType type = HorizonsType::Observer;
|
|
testHorizonsAnswer(data, type, filePath, answer);
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
}
|
|
|
|
TEST_CASE("HorizonsFile: Multiple observer stations", "[horizonsfile]") {
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
HorizonsTestData data;
|
|
data.observer = "l2";
|
|
data.target = "Tesla";
|
|
data.start = "2021-05-19 00:00:00";
|
|
data.stop = "2022-05-19 00:00:00";
|
|
data.step = "1";
|
|
data.unit = "d";
|
|
const std::filesystem::path filePath = absPath(
|
|
"${TESTDIR}/horizonsTest/horizonstest_6.hrz"
|
|
);
|
|
const HorizonsResultCode answer = HorizonsResultCode::MultipleObserverStations;
|
|
|
|
// Test Vector format
|
|
HorizonsType type = HorizonsType::Vector;
|
|
testHorizonsAnswer(data, type, filePath, answer);
|
|
|
|
// Test Observer format
|
|
type = HorizonsType::Observer;
|
|
testHorizonsAnswer(data, type, filePath, answer);
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
}
|
|
|
|
|
|
// Test errors that are nat captured by the error field in the json result
|
|
TEST_CASE("HorizonsFile: Multiple observers", "[horizonsfile]") {
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
HorizonsTestData data;
|
|
data.observer = "@mars";
|
|
data.target = "Tesla";
|
|
data.start = "2021-05-19 00:00:00";
|
|
data.stop = "2022-05-19 00:00:00";
|
|
data.step = "1";
|
|
data.unit = "d";
|
|
const std::filesystem::path filePath = absPath(
|
|
"${TESTDIR}/horizonsTest/horizonstest_7.hrz"
|
|
);
|
|
const HorizonsResultCode expectedAnswerCode = HorizonsResultCode::Valid;
|
|
const HorizonsResultCode expectedResultCode = HorizonsResultCode::MultipleObserver;
|
|
|
|
// Test Vector format
|
|
HorizonsType type = HorizonsType::Vector;
|
|
testHorizonsAnswerAndResult(
|
|
data,
|
|
type,
|
|
filePath,
|
|
expectedAnswerCode,
|
|
expectedResultCode
|
|
);
|
|
|
|
// Test Observer format
|
|
type = HorizonsType::Observer;
|
|
testHorizonsAnswerAndResult(
|
|
data,
|
|
type,
|
|
filePath,
|
|
expectedAnswerCode,
|
|
expectedResultCode
|
|
);
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
}
|
|
|
|
TEST_CASE("HorizonsFile: No target", "[horizonsfile]") {
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
HorizonsTestData data;
|
|
data.observer = "@ssb";
|
|
data.target = "abcdefghijkl";
|
|
data.start = "2021-05-20 00:00:00";
|
|
data.stop = "2022-05-20 00:00:00";
|
|
data.step = "1";
|
|
data.unit = "d";
|
|
const std::filesystem::path filePath = absPath(
|
|
"${TESTDIR}/horizonsTest/horizonstest_8.hrz"
|
|
);
|
|
const HorizonsResultCode expectedAnswerCode = HorizonsResultCode::Valid;
|
|
const HorizonsResultCode expectedResultCode = HorizonsResultCode::ErrorNoTarget;
|
|
|
|
// Test Vector format
|
|
HorizonsType type = HorizonsType::Vector;
|
|
testHorizonsAnswerAndResult(
|
|
data,
|
|
type,
|
|
filePath,
|
|
expectedAnswerCode,
|
|
expectedResultCode
|
|
);
|
|
|
|
// Test Observer format
|
|
type = HorizonsType::Observer;
|
|
testHorizonsAnswerAndResult(
|
|
data,
|
|
type,
|
|
filePath,
|
|
expectedAnswerCode,
|
|
expectedResultCode
|
|
);
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
}
|
|
|
|
TEST_CASE("HorizonsFile: Multiple targets (major bodies)", "[horizonsfile]") {
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
HorizonsTestData data;
|
|
data.observer = "@ssb";
|
|
data.target = "mars";
|
|
data.start = "2021-05-20 00:00:00";
|
|
data.stop = "2022-05-20 00:00:00";
|
|
data.step = "1";
|
|
data.unit = "d";
|
|
const std::filesystem::path filePath = absPath(
|
|
"${TESTDIR}/horizonsTest/horizonstest_9.hrz"
|
|
);
|
|
const HorizonsResultCode expectedAnswerCode = HorizonsResultCode::Valid;
|
|
const HorizonsResultCode expectedResultCode = HorizonsResultCode::MultipleTarget;
|
|
|
|
// Test Vector format
|
|
HorizonsType type = HorizonsType::Vector;
|
|
testHorizonsAnswerAndResult(
|
|
data,
|
|
type,
|
|
filePath,
|
|
expectedAnswerCode,
|
|
expectedResultCode
|
|
);
|
|
|
|
// Test Observer format
|
|
type = HorizonsType::Observer;
|
|
testHorizonsAnswerAndResult(
|
|
data,
|
|
type,
|
|
filePath,
|
|
expectedAnswerCode,
|
|
expectedResultCode
|
|
);
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
}
|
|
|
|
TEST_CASE("HorizonsFile: Multiple targets (minor bodies case 1)", "[horizonsfile]") {
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
HorizonsTestData data;
|
|
data.observer = "@ssb";
|
|
data.target = "DES = 141P;";
|
|
data.start = "2021-05-20 00:00:00";
|
|
data.stop = "2022-05-20 00:00:00";
|
|
data.step = "1";
|
|
data.unit = "d";
|
|
const std::filesystem::path filePath = absPath(
|
|
"${TESTDIR}/horizonsTest/horizonstest_10.hrz"
|
|
);
|
|
const HorizonsResultCode expectedAnswerCode = HorizonsResultCode::Valid;
|
|
const HorizonsResultCode expectedResultCode = HorizonsResultCode::MultipleTarget;
|
|
|
|
// Test Vector format
|
|
HorizonsType type = HorizonsType::Vector;
|
|
testHorizonsAnswerAndResult(
|
|
data,
|
|
type,
|
|
filePath,
|
|
expectedAnswerCode,
|
|
expectedResultCode
|
|
);
|
|
|
|
// Test Observer format
|
|
type = HorizonsType::Observer;
|
|
testHorizonsAnswerAndResult(
|
|
data,
|
|
type,
|
|
filePath,
|
|
expectedAnswerCode,
|
|
expectedResultCode
|
|
);
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
}
|
|
|
|
TEST_CASE("HorizonsFile: Multiple targets (minor bodies case 2)", "[horizonsfile]") {
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
HorizonsTestData data;
|
|
data.observer = "@ssb";
|
|
data.target = "borisov";
|
|
data.start = "2021-05-20 00:00:00";
|
|
data.stop = "2022-05-20 00:00:00";
|
|
data.step = "1";
|
|
data.unit = "d";
|
|
const std::filesystem::path filePath = absPath(
|
|
"${TESTDIR}/horizonsTest/horizonstest_11.hrz"
|
|
);
|
|
const HorizonsResultCode expectedAnswerCode = HorizonsResultCode::Valid;
|
|
const HorizonsResultCode expectedResultCode = HorizonsResultCode::MultipleTarget;
|
|
|
|
// Test Vector format
|
|
HorizonsType type = HorizonsType::Vector;
|
|
testHorizonsAnswerAndResult(
|
|
data,
|
|
type,
|
|
filePath,
|
|
expectedAnswerCode,
|
|
expectedResultCode
|
|
);
|
|
|
|
// Test Observer format
|
|
type = HorizonsType::Observer;
|
|
testHorizonsAnswerAndResult(
|
|
data,
|
|
type,
|
|
filePath,
|
|
expectedAnswerCode,
|
|
expectedResultCode
|
|
);
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
}
|
|
|
|
TEST_CASE("HorizonsFile: Detect multiple observers or targets", "[horizonsfile]") {
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
HorizonsTestData data;
|
|
data.observer = "@l2";
|
|
data.target = "90001048"; // 141P Machholz 2 epoch 2019
|
|
data.start = "2021-05-23 00:00:00";
|
|
data.stop = "2022-05-23 00:00:00";
|
|
data.step = "1";
|
|
data.unit = "d";
|
|
const std::filesystem::path filePath = absPath(
|
|
"${TESTDIR}/horizonsTest/horizonstest_12.hrz"
|
|
);
|
|
const HorizonsResultCode expectedAnswerCode = HorizonsResultCode::Valid;
|
|
const HorizonsResultCode expectedResultCode = HorizonsResultCode::MultipleObserver;
|
|
|
|
// Test Vector format
|
|
HorizonsType type = HorizonsType::Vector;
|
|
testHorizonsAnswerAndResult(
|
|
data,
|
|
type,
|
|
filePath,
|
|
expectedAnswerCode,
|
|
expectedResultCode
|
|
);
|
|
|
|
// Test Observer format
|
|
type = HorizonsType::Observer;
|
|
testHorizonsAnswerAndResult(
|
|
data,
|
|
type,
|
|
filePath,
|
|
expectedAnswerCode,
|
|
expectedResultCode
|
|
);
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
}
|
|
|
|
TEST_CASE("HorizonsFile: Valid request and response", "[horizonsfile]") {
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
HorizonsTestData data;
|
|
data.observer = "@ssb";
|
|
data.target = "Tesla";
|
|
data.start = "2022-05-22 00:00:00";
|
|
data.stop = "2022-05-23 00:00:00";
|
|
data.step = "12";
|
|
data.unit = "h";
|
|
const std::filesystem::path filePathVector = absPath(
|
|
"${TESTDIR}/horizonsTest/validVectorFile.hrz"
|
|
);
|
|
const std::filesystem::path filePathObserver = absPath(
|
|
"${TESTDIR}/horizonsTest/validObserverFile.hrz"
|
|
);
|
|
const HorizonsResultCode expectedAnswerCode = HorizonsResultCode::Valid;
|
|
const HorizonsResultCode expectedResultCode = HorizonsResultCode::Valid;
|
|
|
|
// Test Vector format
|
|
HorizonsType type = HorizonsType::Vector;
|
|
testHorizonsAnswerAndResult(
|
|
data,
|
|
type,
|
|
filePathVector,
|
|
expectedAnswerCode,
|
|
expectedResultCode,
|
|
false
|
|
);
|
|
|
|
// Test Observer format
|
|
type = HorizonsType::Observer;
|
|
testHorizonsAnswerAndResult(
|
|
data,
|
|
type,
|
|
filePathObserver,
|
|
expectedAnswerCode,
|
|
expectedResultCode,
|
|
false
|
|
);
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
}
|
|
|
|
|
|
// Test parsing of timeranges
|
|
// Since data can get updated this is tested towards stored files
|
|
TEST_CASE("HorizonsFile: Parsing time range with time", "[horizonsfile]") {
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
const std::filesystem::path filePath =
|
|
absPath("${TESTDIR}/horizonsTest/timerange_time.hrz");
|
|
const HorizonsFile horizonsFile(filePath);
|
|
|
|
// Parse time range
|
|
const std::pair<std::string, std::string> timeRange = horizonsFile.parseValidTimeRange(
|
|
"Trajectory files",
|
|
"************",
|
|
"Trajectory name"
|
|
);
|
|
|
|
CHECK(timeRange.first == "2005-Aug-12 T 12:42");
|
|
CHECK(timeRange.second == "2022-Sep-02 T 02:55");
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
}
|
|
|
|
TEST_CASE("HorizonsFile: Parsing time range without time", "[horizonsfile]") {
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
const std::filesystem::path filePath =
|
|
absPath("${TESTDIR}/horizonsTest/timerange_no_time.hrz");
|
|
const HorizonsFile horizonsFile(filePath);
|
|
|
|
// Parse time range
|
|
const std::pair<std::string, std::string> timeRange = horizonsFile.parseValidTimeRange(
|
|
"Trajectory files",
|
|
"************",
|
|
"Trajectory name",
|
|
false
|
|
);
|
|
|
|
CHECK(timeRange.first == "2013-Dec-19");
|
|
CHECK(timeRange.second == "2026-Sep-14");
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
}
|
|
|
|
|
|
// Test parsing of matches
|
|
// Since data can get updated this is tested towards stored files
|
|
TEST_CASE("HorizonsFile: Parsing multiple matching observers", "[horizonsfile]") {
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
const std::filesystem::path filePath =
|
|
absPath("${TESTDIR}/horizonsTest/parse_multiple_observers.hrz");
|
|
const HorizonsFile horizonsFile(filePath);
|
|
|
|
// Parse matches
|
|
const std::vector<std::string> matches =
|
|
horizonsFile.parseMatches("Name", "matches", ">MATCH NAME<");
|
|
|
|
REQUIRE(matches.size() == 3);
|
|
CHECK(matches[0] ==
|
|
" ID# Name Designation IAU/aliases/other "
|
|
);
|
|
CHECK(matches[1] ==
|
|
" 3 Earth-Moon Barycenter EMB "
|
|
);
|
|
CHECK(matches[2] ==
|
|
" 399 Earth Geocenter "
|
|
);
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
}
|
|
|
|
TEST_CASE("HorizonsFile: Parsing multiple matching targets", "[horizonsfile]") {
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
const std::filesystem::path filePath =
|
|
absPath("${TESTDIR}/horizonsTest/parse_multiple_targets.hrz");
|
|
const HorizonsFile horizonsFile(filePath);
|
|
|
|
// Parse matches
|
|
const std::vector<std::string> matches =
|
|
horizonsFile.parseMatches("Name", "matches", ">MATCH NAME<");
|
|
|
|
REQUIRE(matches.size() == 11);
|
|
CHECK(matches[0] ==
|
|
" ID# Name Designation IAU/aliases/other "
|
|
);
|
|
CHECK(matches[1] ==
|
|
" 4 Mars Barycenter "
|
|
);
|
|
CHECK(matches[2] ==
|
|
" 499 Mars "
|
|
);
|
|
CHECK(matches[3] ==
|
|
" -3 Mars Orbiter Mission (MOM) (spacec Mangalyaan "
|
|
);
|
|
CHECK(matches[4] ==
|
|
" -41 Mars Express (spacecraft) MEX "
|
|
);
|
|
CHECK(matches[5] ==
|
|
" -53 Mars Odyssey (spacecraft) "
|
|
);
|
|
CHECK(matches[6] ==
|
|
" -530 Mars Pathfinder (spacecraft) MPF "
|
|
);
|
|
CHECK(matches[7] ==
|
|
" -74 Mars Reconnaissance Orbiter (space MRO "
|
|
);
|
|
CHECK(matches[8] ==
|
|
" -76 Mars Science Laboratory (spacecraf Curiosity MSL "
|
|
);
|
|
CHECK(matches[9] ==
|
|
" -143 ExoMars16 TGO (spacecraft) "
|
|
);
|
|
CHECK(matches[10] ==
|
|
" -168 Mars2020 (spacecraft) Perserverance Ingenu "
|
|
);
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
}
|
|
|
|
TEST_CASE("HorizonsFile: Parsing multiple matching stations", "[horizonsfile]") {
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
const std::filesystem::path filePath =
|
|
absPath("${TESTDIR}/horizonsTest/parse_multiple_stations.hrz");
|
|
CHECK(std::filesystem::is_regular_file(filePath));
|
|
const HorizonsFile horizonsFile(filePath);
|
|
|
|
// Parse matches
|
|
const std::vector<std::string> matches =
|
|
horizonsFile.parseMatches("Observatory Name", "Multiple matching stations found");
|
|
|
|
REQUIRE(matches.size() == 11);
|
|
CHECK(matches[0] ==
|
|
" # E. Lon DXY DZ Observatory Name"
|
|
);
|
|
CHECK(matches[1] ==
|
|
" L20 18.3207 +308014 +293859 AG_Sarajevo Observatory, Sarajevo"
|
|
);
|
|
CHECK(matches[2] ==
|
|
" L21 27.4213 +307050 +294814 Ostrov Observatory, Constanta"
|
|
);
|
|
CHECK(matches[3] ==
|
|
" L22 27.6695 +295446 +306365 Barlad Observatory"
|
|
);
|
|
CHECK(matches[4] ==
|
|
" L23 27.8319 +299346 +302574 Schela"
|
|
);
|
|
CHECK(matches[5] ==
|
|
" L24 27.9289 +383214 -186499 Gauteng"
|
|
);
|
|
CHECK(matches[6] ==
|
|
" L25 14.4374 +255033 +340528 Smolecin"
|
|
);
|
|
CHECK(matches[7] ==
|
|
" L26 11.8102 +316937 +284229 Sanderphil Urban Obs., Civitavecchia"
|
|
);
|
|
CHECK(matches[8] ==
|
|
" L27 5.6470 +307222 +294693 29PREMOTE Obs., Dauban {Soulier]"
|
|
);
|
|
CHECK(matches[9] ==
|
|
" L28 15.4634 +323190 +277274 ISON-Castelgrande Observatory"
|
|
);
|
|
CHECK(matches[10] ==
|
|
" L29 18.0169 +391400 -168725 Drebach-South Observatory, Windhoek"
|
|
);
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
}
|
|
|
|
|
|
// Test reading of data and compare a recent request with a stored file
|
|
TEST_CASE("HorizonsFile: Reading Vector data from request", "[horizonsfile]") {
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
const HorizonsType type = HorizonsType::Vector;
|
|
const std::filesystem::path filePathVector =
|
|
absPath("${TESTDIR}/horizonsTest/validVectorFile.hrz");
|
|
|
|
const double t0 = 706449669.18513119;
|
|
const double x0 = -126367222949.377166748;
|
|
const double y0 = 63060654906.4096450806;
|
|
const double z0 = -126727123841.2694549561;
|
|
|
|
const double t1 = 706492869.18512082;
|
|
const double x1 = -127007207301.5597076416;
|
|
const double y1 = 62521315275.043838501;
|
|
const double z1 = -125920644491.178314209;
|
|
|
|
const double t2 = 706536069.18511045;
|
|
const double x2 = -127642636109.8239135742;
|
|
const double y2 = 61979705046.1750488281;
|
|
const double z2 = -125109598352.4534301758;
|
|
|
|
testReadingHorizons(
|
|
type, filePathVector,
|
|
t0, x0, y0, z0,
|
|
t1, x1, y1, z1,
|
|
t2, x2, y2, z2
|
|
);
|
|
|
|
// Clean up
|
|
std::filesystem::remove(filePathVector);
|
|
CHECK(!std::filesystem::is_regular_file(filePathVector));
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
}
|
|
|
|
TEST_CASE("HorizonsFile: Reading Observer data from request", "[horizonsfile]") {
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
const HorizonsType type = HorizonsType::Observer;
|
|
const std::filesystem::path filePathObserver =
|
|
absPath("${TESTDIR}/horizonsTest/validObserverFile.hrz");
|
|
|
|
const double t0 = 706449669.18513119;
|
|
const double x0 = -126358694845.7201385498;
|
|
const double y0 = 63067750258.2510452271;
|
|
const double z0 = -126737728343.3621063232;
|
|
|
|
const double t1 = 706492869.18512082;
|
|
const double x1 = -126998752832.9455413818;
|
|
const double y1 = 62528427647.3945465088;
|
|
const double z1 = -125931292434.5601806641;
|
|
|
|
const double t2 = 706536069.18511045;
|
|
const double x2 = -127634254978.5487976074;
|
|
const double y2 = 61986837622.6675033569;
|
|
const double z2 = -125120288440.1994018555;
|
|
|
|
testReadingHorizons(
|
|
type, filePathObserver,
|
|
t0, x0, y0, z0,
|
|
t1, x1, y1, z1,
|
|
t2, x2, y2, z2
|
|
);
|
|
|
|
// Clean up
|
|
std::filesystem::remove(filePathObserver);
|
|
CHECK(!std::filesystem::is_regular_file(filePathObserver));
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
}
|
|
|
|
|
|
TEST_CASE("HorizonsFile: Reading Vector data from file", "[horizonsfile]") {
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
const HorizonsType type = HorizonsType::Vector;
|
|
const std::filesystem::path filePathVector =
|
|
absPath("${TESTDIR}/horizonsTest/vectorFileTest.hrz");
|
|
|
|
const double t0 = 706449669.18513119;
|
|
const double x0 = -126379670172.70331;
|
|
const double y0 = 63049830070.652786;
|
|
const double z0 = -126710964556.55870;
|
|
|
|
const double t1 = 706492869.18512082;
|
|
const double x1 = -127019567853.94952;
|
|
const double y1 = 62510445746.414017;
|
|
const double z1 = -125904395646.64995;
|
|
|
|
const double t2 = 706536069.18511045;
|
|
const double x2 = -127654909093.56494;
|
|
const double y2 = 61968790989.645737;
|
|
const double z2 = -125093260079.10854;
|
|
|
|
testReadingHorizons(
|
|
type, filePathVector,
|
|
t0, x0, y0, z0,
|
|
t1, x1, y1, z1,
|
|
t2, x2, y2, z2
|
|
);
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
}
|
|
|
|
TEST_CASE("HorizonsFile: Reading Observer data from file", "[horizonsfile]") {
|
|
#ifdef OPENSPACE_MODULE_SPACE_ENABLED
|
|
const HorizonsType type = HorizonsType::Observer;
|
|
const std::filesystem::path filePathObserver =
|
|
absPath("${TESTDIR}/horizonsTest/observerFileTest.hrz");
|
|
|
|
const double t0 = 706449669.18513119;
|
|
const double x0 = -126371142157.29857;
|
|
const double y0 = 63056923889.044579;
|
|
const double z0 = -126721572150.18513;
|
|
|
|
const double t1 = 706492869.18512082;
|
|
const double x1 = -127011112787.76295;
|
|
const double y1 = 62517559574.749786;
|
|
const double z1 = -125915045896.36182;
|
|
|
|
const double t2 = 706536069.18511045;
|
|
const double x2 = -127646529740.40393;
|
|
const double y2 = 61975921972.090714;
|
|
const double z2 = -125103951590.60988;
|
|
|
|
testReadingHorizons(
|
|
type, filePathObserver,
|
|
t0, x0, y0, z0,
|
|
t1, x1, y1, z1,
|
|
t2, x2, y2, z2
|
|
);
|
|
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
|
}
|