Files
MeanField_SERiF/tests/solver/archive.cpp
Emily Boudreaux cb20faeb3d test(tests): added test suite
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.
2026-11-09 13:53:17 -05:00

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);
}