Merge pull request #3387 from verveerpj/fix_keyword_validation

Small fix for the keyword validation
This commit is contained in:
Joakim Hove 2021-06-18 15:23:03 +02:00 committed by GitHub
commit 7d2984e3a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 75 additions and 15 deletions

View File

@ -129,14 +129,16 @@ namespace KeywordValidation
// Find the index number, which starts counting at one, so item_index + 1
const auto& item_properties = keyword_properties->second.find(item_index + 1);
if (item_properties != keyword_properties->second.end()) {
// Validate the item, if it is partially supported.
validateKeywordItem<T>(keyword,
item_properties->second,
keyword.size() > 1,
record_index,
item_index,
item.get<T>(0),
errors);
if (item.hasValue(0)) {
// Validate the item, if it is partially supported.
validateKeywordItem<T>(keyword,
item_properties->second,
keyword.size() > 1,
record_index,
item_index,
item.get<T>(0),
errors);
}
}
}
}

View File

@ -40,8 +40,15 @@ const PartiallySupportedKeywords<std::string> test_string_items = {
{
"PINCH",
{
{2, {false, allow_values<std::string>{"GAP", "BAR"}, std::nullopt}}, // GAP
{4, {true, allow_values<std::string>{"TOPBOT"}, "This is a critical error"}}, // PINCHOUT_OPTION
{2, {false, allow_values<std::string> {"GAP", "BAR"}, std::nullopt}}, // GAP
{4, {true, allow_values<std::string> {"TOPBOT"}, "This is a critical error"}}, // PINCHOUT_OPTION
},
},
{
"EQLOPTS",
{
{1, {false, allow_values<std::string> {}, std::nullopt}},
{3, {false, allow_values<std::string> {"THPRESS"}, std::nullopt}},
},
},
};
@ -51,15 +58,15 @@ const PartiallySupportedKeywords<int> test_int_items = {
{
"ENDSCALE",
{
{3, {false, allow_values<int>{1}, std::nullopt}}, // NTENDP
{4, {true, allow_values<int>{20, 30, 40}, std::nullopt}}, // NSENDP
{3, {false, allow_values<int> {1}, std::nullopt}}, // NTENDP
{4, {true, allow_values<int> {20, 30, 40}, std::nullopt}}, // NSENDP
},
},
{
"COMPDAT",
{
{2, {false, allow_values<int>{1}, std::nullopt}}, // I
{3, {false, allow_values<int>{1}, std::nullopt}}, // J
{2, {false, allow_values<int> {1}, std::nullopt}}, // I
{3, {false, allow_values<int> {1}, std::nullopt}}, // J
},
},
};
@ -70,12 +77,13 @@ const PartiallySupportedKeywords<double> test_double_items = {
"EHYSTR",
{
{1, {false, [](double x) { return x > 0; }, std::nullopt}},
{3, {false, allow_values<double>{1.0, 2.0}, std::nullopt}},
{3, {false, allow_values<double> {1.0, 2.0}, std::nullopt}},
},
},
};
BOOST_AUTO_TEST_CASE(non_critical_keyword)
{
const auto keywords_string = std::string {R"(
@ -513,3 +521,53 @@ ENDSCALE
" In file: <memory string>, line 4\n"
" This is a critical error");
}
BOOST_AUTO_TEST_CASE(keyword_without_default)
{
const auto keywords_string = std::string {R"(
EQLOPTS
1* /
)"};
const auto deck = Parser {}.parseString(keywords_string);
const auto& test_keyword = deck.getKeyword("EQLOPTS");
KeywordValidator validator(test_unsupported_keywords, test_string_items, test_int_items, test_double_items);
std::vector<ValidationError> errors;
validator.validateDeckKeyword(test_keyword, errors);
BOOST_CHECK(errors.size() == 0);
}
BOOST_AUTO_TEST_CASE(keyword_without_default_with_wrong_value)
{
const auto keywords_string = std::string {R"(
EQLOPTS
FOO /
)"};
const auto deck = Parser {}.parseString(keywords_string);
const auto& test_keyword = deck.getKeyword("EQLOPTS");
KeywordValidator validator(test_unsupported_keywords, test_string_items, test_int_items, test_double_items);
std::vector<ValidationError> errors;
validator.validateDeckKeyword(test_keyword, errors);
BOOST_CHECK(errors.size() == 1);
BOOST_CHECK(errors[0].item_number == 1);
BOOST_CHECK(errors[0].item_value == "FOO");
BOOST_CHECK(!errors[0].user_message);
}
BOOST_AUTO_TEST_CASE(keyword_without_default_with_correct_value)
{
const auto keywords_string = std::string {R"(
EQLOPTS
1* 1* THPRESS /
)"};
const auto deck = Parser {}.parseString(keywords_string);
const auto& test_keyword = deck.getKeyword("EQLOPTS");
KeywordValidator validator(test_unsupported_keywords, test_string_items, test_int_items, test_double_items);
std::vector<ValidationError> errors;
validator.validateDeckKeyword(test_keyword, errors);
BOOST_CHECK(errors.size() == 0);
}