feat(cpp-object-oriented-modular-refactoring): step 9 - result-io-vector3

This commit is contained in:
KOKO\Mimi
2026-08-16 07:40:16 +09:00
parent 1cb1f26cdc
commit 0be8d1bd89
6 changed files with 140 additions and 148 deletions
@@ -24,6 +24,7 @@
#include "fesa/analysis/analysis_state.h"
#include "fesa/build_info.h"
#include "fesa/fem/dof_manager.h"
#include "fesa/math/vector3.h"
#include "fesa/model/domain.h"
namespace {
@@ -1114,7 +1115,7 @@ TEST(Hdf5ResultsWriter, SuccessfullyReplacesExistingFinal) {
EXPECT_EQ(ReadUint64Attribute(metadata.Get(), "schema_version"), 0U);
}
// MITC4-H5-001
// MITC4-H5-001, C-DUP-002
TEST(Hdf5ResultsWriter, WritesExactShellMetadataAndModelIdentity) {
TempDirectory directory{"shell-model"};
const auto source = directory.Path() / "shell.inp";
@@ -1150,9 +1151,15 @@ TEST(Hdf5ResultsWriter, WritesExactShellMetadataAndModelIdentity) {
EXPECT_EQ(DatasetDimensions(file.Get(), "/model/shell/nodal_director"),
std::vector<hsize_t>({4U, 3U}));
constexpr fesa::Vector3 director{0.0, 0.0, 1.0};
std::vector<double> expected_directors;
for (std::size_t node = 0U; node < 4U; ++node) {
expected_directors.insert(expected_directors.end(),
director.Components().begin(),
director.Components().end());
}
EXPECT_EQ(ReadDoubleDataset(file.Get(), "/model/shell/nodal_director"),
std::vector<double>(
{0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0}));
expected_directors);
EXPECT_EQ(DatasetDimensions(file.Get(), "/model/shell/nodal_frame"),
std::vector<hsize_t>({4U, 3U, 3U}));
ExpectCompoundMemberNames(file.Get(), "/model/shell/materials",
@@ -1305,3 +1312,31 @@ TEST(Hdf5ResultsWriter, InvalidShellInventoryPreservesExistingFinal) {
EXPECT_EQ(ReadBytes(final), sentinel);
EXPECT_EQ(EntryCount(directory.Path()), 1U);
}
// C-DUP-002
TEST(Hdf5ResultsWriter,
Vector3ShellSerializationRejectsNonfiniteWithoutReplacingFinal) {
TempDirectory directory{"shell-vector3-atomic"};
auto fixture = MakeShellFixture(directory.Path() / "shell.inp");
const auto final = directory.Path() / "results.h5";
fesa::Hdf5ResultsWriter writer;
ASSERT_TRUE(writer.Write(final, *fixture.domain, *fixture.state, {}).IsOk());
const std::vector<char> valid_bytes = ReadBytes(final);
const auto file = OpenFile(final);
const auto directors =
ReadDoubleDataset(file.Get(), "/model/shell/nodal_director");
ASSERT_EQ(directors.size(), 12U);
for (std::size_t offset = 0U; offset < directors.size(); offset += 3U) {
const fesa::Vector3 director{directors[offset], directors[offset + 1U],
directors[offset + 2U]};
EXPECT_TRUE(director.IsFinite());
EXPECT_EQ(director, (fesa::Vector3{0.0, 0.0, 1.0}));
}
fixture.state->Displacement()[0U] = std::numeric_limits<double>::quiet_NaN();
ExpectOutputFailure(writer.Write(final, *fixture.domain, *fixture.state, {}),
"invalid-result-state");
EXPECT_EQ(ReadBytes(final), valid_bytes);
EXPECT_EQ(EntryCount(directory.Path()), 1U);
}