test: strengthen core harness guardrails

This commit is contained in:
NINI
2026-05-04 12:46:37 +09:00
parent 950ce29df1
commit 99445d43bb
5 changed files with 97 additions and 28 deletions
+34 -5
View File
@@ -3,10 +3,17 @@
#include <cmath>
#include <functional>
#include <iostream>
#include <type_traits>
#include <stdexcept>
#include <string>
#include <vector>
static_assert(std::is_same_v<fesa::Real, double>, "Real must remain double");
static_assert(std::is_same_v<fesa::GlobalId, std::int64_t>, "GlobalId must remain int64");
static_assert(std::is_same_v<fesa::LocalIndex, std::int64_t>, "LocalIndex must remain int64");
static_assert(std::is_same_v<fesa::EquationId, std::int64_t>, "EquationId must remain int64");
static_assert(std::is_same_v<fesa::SparseIndex, std::int64_t>, "SparseIndex must remain int64");
namespace {
using TestFn = std::function<void()>;
@@ -103,11 +110,24 @@ fesa::Domain parsedPhase1Domain() {
FESA_TEST(core_types_and_dof_mapping_are_stable) {
FESA_CHECK(sizeof(fesa::Real) == 8);
FESA_CHECK(sizeof(fesa::GlobalId) == 8);
FESA_CHECK(sizeof(fesa::LocalIndex) == 8);
FESA_CHECK(sizeof(fesa::EquationId) == 8);
FESA_CHECK(fesa::abaqusDofNumber(fesa::Dof::UX) == 1);
FESA_CHECK(fesa::abaqusDofNumber(fesa::Dof::RZ) == 6);
FESA_CHECK(fesa::dofFromAbaqus(3).value() == fesa::Dof::UZ);
FESA_CHECK(std::string(fesa::dofLabel(fesa::Dof::RY)) == "RY");
FESA_CHECK(sizeof(fesa::SparseIndex) == 8);
FESA_CHECK(std::numeric_limits<fesa::GlobalId>::is_signed);
FESA_CHECK(std::numeric_limits<fesa::LocalIndex>::is_signed);
FESA_CHECK(std::numeric_limits<fesa::EquationId>::is_signed);
FESA_CHECK(std::numeric_limits<fesa::SparseIndex>::is_signed);
const auto dofs = fesa::allDofs();
FESA_CHECK(dofs.size() == 6);
for (std::size_t i = 0; i < dofs.size(); ++i) {
const int abaqus_number = static_cast<int>(i + 1);
FESA_CHECK(fesa::abaqusDofNumber(dofs[i]) == abaqus_number);
FESA_CHECK(fesa::dofFromAbaqus(abaqus_number).value() == dofs[i]);
FESA_CHECK(std::string(fesa::dofLabel(dofs[i])) == fesa::displacementComponentLabels()[i]);
}
FESA_CHECK(!fesa::dofFromAbaqus(0).has_value());
FESA_CHECK(!fesa::dofFromAbaqus(7).has_value());
}
FESA_TEST(parser_accepts_phase1_subset) {
@@ -176,11 +196,20 @@ FESA_TEST(domain_validation_reports_missing_property_and_targets) {
domain.nodes[2] = {2, {1, 0, 0}};
domain.nodes[3] = {3, {1, 1, 0}};
domain.nodes[4] = {4, {0, 1, 0}};
domain.elements[1] = {1, fesa::ElementType::MITC4, {1, 2, 3, 4}, ""};
domain.elements[1] = {1, fesa::ElementType::MITC4, {1, 2, 3, 99}, ""};
domain.shell_sections.push_back({"MISSING_ELSET", "MISSING_MAT", 0.1});
domain.loads.push_back({"MISSING", 3, 1.0});
auto diagnostics = fesa::validateDomain(domain);
FESA_CHECK(fesa::containsDiagnostic(diagnostics, "FESA-VALIDATION-ELEMENT-MISSING-NODE"));
FESA_CHECK(fesa::containsDiagnostic(diagnostics, "FESA-VALIDATION-MISSING-PROPERTY"));
FESA_CHECK(fesa::containsDiagnostic(diagnostics, "FESA-VALIDATION-MISSING-ELSET"));
FESA_CHECK(fesa::containsDiagnostic(diagnostics, "FESA-VALIDATION-MISSING-MATERIAL"));
FESA_CHECK(fesa::containsDiagnostic(diagnostics, "FESA-VALIDATION-MISSING-NSET"));
for (const auto& diagnostic : diagnostics) {
FESA_CHECK(!diagnostic.code.empty());
FESA_CHECK(!diagnostic.message.empty());
FESA_CHECK(!diagnostic.source.keyword.empty());
}
}
FESA_TEST(dof_manager_owns_equation_numbering_and_reconstruction) {