The test suite is extensive. Note that LLMs were used to aid in the development of the test suite. All LLM generated code was manually reviewed.
39 lines
2.6 KiB
C++
39 lines
2.6 KiB
C++
#include <sstream>
|
|
#include <catch2/catch_test_macros.hpp>
|
|
#include "serif/tests/solver/archive.hpp"
|
|
|
|
TEST_CASE("Validation rechecks reject missing mismatched and repeated coordinate identities", "[unit][solver][validation_archive]") {
|
|
namespace archive = serif::tests::solver::archive;
|
|
const std::string identity = "coordinates=density_primal_v1;density=0:8;potential=8:8";
|
|
std::istringstream valid("stage=seed\n" + identity + "\nstage=complete_converged\n");
|
|
CHECK_NOTHROW(archive::require_preparation_identity(valid, identity));
|
|
for (const std::string& text : {
|
|
std::string{"stage=complete_converged\n"},
|
|
std::string{"coordinates=mixed_gravity_v1;density=0:8;potential=8:8\n"},
|
|
std::string{"coordinates=density_primal_v1;density=8:8;potential=0:8\n"},
|
|
identity + '\n' + identity + '\n'}) {
|
|
std::istringstream invalid(text);
|
|
CHECK_THROWS(archive::require_preparation_identity(invalid, identity));
|
|
}
|
|
const std::string mapping = "mapping=kelvin_mesh_radii_v1,r_star_ref=1,r_inf_ref=5";
|
|
std::istringstream correct_map(mapping + '\n');
|
|
CHECK_NOTHROW(archive::require_preparation_identity(correct_map, mapping));
|
|
std::istringstream wrong_map("mapping=kelvin_mesh_radii_v1,r_star_ref=1,r_inf_ref=2\n");
|
|
CHECK_THROWS(archive::require_preparation_identity(wrong_map, mapping));
|
|
std::istringstream missing_map(identity + '\n');
|
|
CHECK_THROWS(archive::require_preparation_identity(missing_map, mapping));
|
|
}
|
|
|
|
TEST_CASE("Validation coordinate identities distinguish equal-length layouts and meshes", "[unit][solver][validation_archive]") {
|
|
namespace fixture = serif::tests::solver;
|
|
namespace archive = fixture::archive;
|
|
using Fields = serif::utils::dependencies::KeyList<fixture::Density, fixture::Potential, fixture::Constant, fixture::Omega, fixture::Shape>;
|
|
using SwappedFields = serif::utils::dependencies::KeyList<fixture::Potential, fixture::Density, fixture::Constant, fixture::Omega, fixture::Shape>;
|
|
const serif::discretization::blocks::SystemLayout<Fields, Fields> layout{.state_sizes = {8, 8, 1, 1, 25}, .residual_sizes = {8, 8, 1, 1, 25}};
|
|
const serif::discretization::blocks::SystemLayout<SwappedFields, SwappedFields> swapped{.state_sizes = layout.state_sizes, .residual_sizes = layout.residual_sizes};
|
|
const std::string identity = archive::coordinate_identity(layout, "mesh-a");
|
|
CHECK(identity != archive::coordinate_identity(swapped, "mesh-a"));
|
|
CHECK(identity != archive::coordinate_identity(layout, "mesh-b"));
|
|
CHECK(identity.find("density=0:8;potential=8:8;surface_level=16:1;angular_velocity=17:1;shape=18:25") != std::string::npos);
|
|
}
|