fix(input): validate inactive Part records

This commit is contained in:
KOKO\Mimi
2026-08-01 04:07:18 +09:00
parent af886f3f90
commit cbb621bb28
10 changed files with 383 additions and 151 deletions
@@ -333,6 +333,92 @@ TEST(ActiveInstance, ExcludesPartsNotReferencedByTheInstance) {
EXPECT_EQ(result.domain->nodes()[1].origin.part_name, "BeamPart");
}
TEST(ActiveInstance, RejectsInvalidRecordsInUnreferencedParts) {
struct Case final {
std::string_view name;
std::string_view unused_records;
std::string_view code;
std::size_t line;
};
const Case cases[]{
{
"node-surplus",
"*NODE\n1, 0.0, 0.0, 0.0, 9.0\n",
"abaqus.semantic.invalid_node_data",
3U,
},
{
"element-type",
"*ELEMENT, TYPE=B32\n1, 1, 2\n",
"abaqus.semantic.unsupported_element",
2U,
},
{
"duplicate-node",
"*NODE\n1, 0.0, 0.0, 0.0\n1, 1.0, 0.0, 0.0\n",
"abaqus.semantic.duplicate_node_label",
4U,
},
{
"missing-node",
"*NODE\n1, 0.0, 0.0, 0.0\n"
"*ELEMENT, TYPE=B31\n1, 1, 2\n",
"abaqus.semantic.missing_node",
5U,
},
{
"section-data",
"*BEAM GENERAL SECTION, SECTION=GENERAL, ELSET=Beam, "
"MATERIAL=Steel\n"
"0.0, 1.0, 0.0, 1.0, 1.0\n"
"0.0, 1.0, 0.0\n",
"abaqus.semantic.invalid_section_data",
3U,
},
};
const std::string active_model{
"*PART, NAME=BeamPart\n"
"*NODE\n"
"1, 0.0, 0.0, 0.0\n"
"2, 1.0, 0.0, 0.0\n"
"*ELEMENT, TYPE=B31, ELSET=Beam\n"
"1, 1, 2\n"
"*ELSET, ELSET=Beam\n"
"1\n"
"*BEAM GENERAL SECTION, SECTION=GENERAL, ELSET=Beam, MATERIAL=Steel\n"
"1.0, 1.0, 0.0, 1.0, 1.0\n"
"0.0, 1.0, 0.0\n"
"*END PART\n"
"*ASSEMBLY, NAME=RootAssembly\n"
"*INSTANCE, NAME=Beam-1, PART=BeamPart\n"
"*END INSTANCE\n"
"*END ASSEMBLY\n"
"*MATERIAL, NAME=Steel\n"
"*ELASTIC\n"
"210000.0, 0.3\n"
"*STEP\n"
"*STATIC\n"
"*END STEP\n"};
for (const auto& test_case : cases) {
const TemporaryDeck input{
"fesa-inactive-part-" + std::string{test_case.name} + ".inp",
"*PART, NAME=Unused\n" + std::string{test_case.unused_records} +
"*END PART\n" + active_model,
};
const auto result = parse_and_map(input.path());
SCOPED_TRACE(test_case.name);
EXPECT_FALSE(result.domain.has_value());
const fesa::Diagnostic* diagnostic =
find_diagnostic(result, test_case.code);
ASSERT_NE(diagnostic, nullptr);
ASSERT_TRUE(diagnostic->source.has_value());
EXPECT_EQ(diagnostic->source->line, test_case.line);
}
}
TEST(ActiveInstance, RejectsInstanceTransformWithSourceDiagnostic) {
const TemporaryDeck input{
"fesa-instance-transform.inp",