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,6 +129,7 @@ namespace KeywordValidation
// Find the index number, which starts counting at one, so item_index + 1 // Find the index number, which starts counting at one, so item_index + 1
const auto& item_properties = keyword_properties->second.find(item_index + 1); const auto& item_properties = keyword_properties->second.find(item_index + 1);
if (item_properties != keyword_properties->second.end()) { if (item_properties != keyword_properties->second.end()) {
if (item.hasValue(0)) {
// Validate the item, if it is partially supported. // Validate the item, if it is partially supported.
validateKeywordItem<T>(keyword, validateKeywordItem<T>(keyword,
item_properties->second, item_properties->second,
@ -142,6 +143,7 @@ namespace KeywordValidation
} }
} }
} }
}
template <typename T> template <typename T>

View File

@ -40,8 +40,15 @@ const PartiallySupportedKeywords<std::string> test_string_items = {
{ {
"PINCH", "PINCH",
{ {
{2, {false, allow_values<std::string>{"GAP", "BAR"}, std::nullopt}}, // GAP {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 {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", "ENDSCALE",
{ {
{3, {false, allow_values<int>{1}, std::nullopt}}, // NTENDP {3, {false, allow_values<int> {1}, std::nullopt}}, // NTENDP
{4, {true, allow_values<int>{20, 30, 40}, std::nullopt}}, // NSENDP {4, {true, allow_values<int> {20, 30, 40}, std::nullopt}}, // NSENDP
}, },
}, },
{ {
"COMPDAT", "COMPDAT",
{ {
{2, {false, allow_values<int>{1}, std::nullopt}}, // I {2, {false, allow_values<int> {1}, std::nullopt}}, // I
{3, {false, allow_values<int>{1}, std::nullopt}}, // J {3, {false, allow_values<int> {1}, std::nullopt}}, // J
}, },
}, },
}; };
@ -70,12 +77,13 @@ const PartiallySupportedKeywords<double> test_double_items = {
"EHYSTR", "EHYSTR",
{ {
{1, {false, [](double x) { return x > 0; }, std::nullopt}}, {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) BOOST_AUTO_TEST_CASE(non_critical_keyword)
{ {
const auto keywords_string = std::string {R"( const auto keywords_string = std::string {R"(
@ -513,3 +521,53 @@ ENDSCALE
" In file: <memory string>, line 4\n" " In file: <memory string>, line 4\n"
" This is a critical error"); " 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);
}