fix(input): validate inactive Part records
This commit is contained in:
Vendored
+5
@@ -68,3 +68,8 @@ hierarchical_part_target_invalid invalid invalid/hierarchical_part_set_target.in
|
||||
material_data_invalid invalid invalid/material_data.inp syntax abaqus.syntax.data_without_keyword 2 - - - - - - - - - - -
|
||||
node_coordinate_invalid invalid invalid/node_invalid_coordinate.inp semantic abaqus.semantic.invalid_number 2 - - - - - - - - - - -
|
||||
element_missing_node_invalid invalid invalid/element_missing_node.inp semantic abaqus.semantic.missing_node 4 - - - - - - - - - - -
|
||||
inactive_part_node_invalid invalid invalid/inactive_part_node_surplus.inp semantic abaqus.semantic.invalid_node_data 3 - - - - - - - - - - -
|
||||
inactive_part_element_invalid invalid invalid/inactive_part_element_type.inp semantic abaqus.semantic.unsupported_element 2 - - - - - - - - - - -
|
||||
inactive_part_section_invalid invalid invalid/inactive_part_section_data.inp semantic abaqus.semantic.invalid_section_data 3 - - - - - - - - - - -
|
||||
inactive_part_duplicate_node_invalid invalid invalid/inactive_part_duplicate_node.inp semantic abaqus.semantic.duplicate_node_label 4 - - - - - - - - - - -
|
||||
inactive_part_missing_node_invalid invalid invalid/inactive_part_missing_node.inp semantic abaqus.semantic.missing_node 5 - - - - - - - - - - -
|
||||
|
||||
|
@@ -0,0 +1,11 @@
|
||||
*PART, NAME=Unused
|
||||
*NODE
|
||||
1, 0.0, 0.0, 0.0
|
||||
1, 1.0, 0.0, 0.0
|
||||
*END PART
|
||||
*PART, NAME=Active
|
||||
*END PART
|
||||
*ASSEMBLY, NAME=RootAssembly
|
||||
*INSTANCE, NAME=Active-1, PART=Active
|
||||
*END INSTANCE
|
||||
*END ASSEMBLY
|
||||
@@ -0,0 +1,10 @@
|
||||
*PART, NAME=Unused
|
||||
*ELEMENT, TYPE=B32
|
||||
1, 1, 2
|
||||
*END PART
|
||||
*PART, NAME=Active
|
||||
*END PART
|
||||
*ASSEMBLY, NAME=RootAssembly
|
||||
*INSTANCE, NAME=Active-1, PART=Active
|
||||
*END INSTANCE
|
||||
*END ASSEMBLY
|
||||
@@ -0,0 +1,12 @@
|
||||
*PART, NAME=Unused
|
||||
*NODE
|
||||
1, 0.0, 0.0, 0.0
|
||||
*ELEMENT, TYPE=B31
|
||||
1, 1, 2
|
||||
*END PART
|
||||
*PART, NAME=Active
|
||||
*END PART
|
||||
*ASSEMBLY, NAME=RootAssembly
|
||||
*INSTANCE, NAME=Active-1, PART=Active
|
||||
*END INSTANCE
|
||||
*END ASSEMBLY
|
||||
@@ -0,0 +1,10 @@
|
||||
*PART, NAME=Unused
|
||||
*NODE
|
||||
1, 0.0, 0.0, 0.0, 9.0
|
||||
*END PART
|
||||
*PART, NAME=Active
|
||||
*END PART
|
||||
*ASSEMBLY, NAME=RootAssembly
|
||||
*INSTANCE, NAME=Active-1, PART=Active
|
||||
*END INSTANCE
|
||||
*END ASSEMBLY
|
||||
@@ -0,0 +1,11 @@
|
||||
*PART, NAME=Unused
|
||||
*BEAM GENERAL SECTION, SECTION=GENERAL, ELSET=Beam, MATERIAL=Steel
|
||||
0.0, 1.0, 0.0, 1.0, 1.0
|
||||
0.0, 1.0, 0.0
|
||||
*END PART
|
||||
*PART, NAME=Active
|
||||
*END PART
|
||||
*ASSEMBLY, NAME=RootAssembly
|
||||
*INSTANCE, NAME=Active-1, PART=Active
|
||||
*END INSTANCE
|
||||
*END ASSEMBLY
|
||||
@@ -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",
|
||||
|
||||
@@ -315,7 +315,7 @@ TEST(BeamSection, RejectsElementWithoutSectionAssignment) {
|
||||
|
||||
const auto result = parse_and_map(input);
|
||||
|
||||
expect_diagnostic(result, "abaqus.semantic.missing_section", 4U);
|
||||
expect_diagnostic(result, "abaqus.semantic.missing_section", 5U);
|
||||
}
|
||||
|
||||
TEST(BeamSection, RejectsDuplicateSectionAssignment) {
|
||||
|
||||
Reference in New Issue
Block a user