#pragma once #include "fesa/core/status.h" #include #include #include #include #include namespace fesa::test { struct Mitc4ReferenceCase { std::string caseId; std::string expectedSourceElementType; std::filesystem::path inputPath; std::filesystem::path displacementCsvPath; std::filesystem::path resultsHdf5Path; }; struct Mitc4RowDecision { std::string caseId; std::string instanceName; std::int64_t sourceNodeLabel; std::string component; double fesaValue; double referenceValue; double absoluteError; double tolerance; double normalizedError; bool blocking; bool withinTolerance; }; struct Mitc4ComponentMetrics { std::string component; double referenceScale; double tolerance; double maximumAbsoluteError; double maximumNormalizedError; double rmsError; double vectorNormError; std::size_t worstRow; }; struct Mitc4VectorMetrics { std::string instanceName; std::int64_t sourceNodeLabel; double displacementNormError; double rotationNormError; }; struct Mitc4Warning { std::string code; std::size_t row; std::string message; }; struct Mitc4ComparisonReport { std::string caseId; std::string sourceElementType; std::string internalFormulation; std::string integrationRule; std::vector rows; std::vector metrics; std::vector vectorMetrics; std::vector warnings; std::size_t worstRow; bool passed; }; class Mitc4ReferenceComparison { public: static Result compare( const Mitc4ReferenceCase& referenceCase); static Status writeDeterministicJson( const Mitc4ComparisonReport& report, const std::filesystem::path& outputJson); }; } // namespace fesa::test