#include #include #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; using SwappedFields = serif::utils::dependencies::KeyList; const serif::discretization::blocks::SystemLayout layout{.state_sizes = {8, 8, 1, 1, 25}, .residual_sizes = {8, 8, 1, 1, 25}}; const serif::discretization::blocks::SystemLayout 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); }