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.
This commit is contained in:
2026-11-09 13:53:17 -05:00
parent 74e55a6859
commit cb20faeb3d
202 changed files with 35505 additions and 953 deletions

38
tests/solver/archive.cpp Normal file
View File

@@ -0,0 +1,38 @@
#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);
}