diff --git a/opm/parser/eclipse/IntegrationTests/ParseACTION.cpp b/opm/parser/eclipse/IntegrationTests/ParseACTION.cpp index 5da5d4de0..4574147bd 100644 --- a/opm/parser/eclipse/IntegrationTests/ParseACTION.cpp +++ b/opm/parser/eclipse/IntegrationTests/ParseACTION.cpp @@ -38,14 +38,21 @@ using namespace Opm; BOOST_AUTO_TEST_CASE( parse_ACTION_OK ) { ParserPtr parser(new Parser( false )); boost::filesystem::path actionFile("testdata/integration_tests/ACTION/ACTION.txt"); + boost::filesystem::path actionFile2("testdata/integration_tests/ACTION/ACTION_EXCEPTION.txt"); ParserKeywordConstPtr DIMENS( new ParserKeyword("DIMENS" , (size_t) 1 , IGNORE_WARNING )); + ParserKeywordConstPtr THROW( new ParserKeyword("THROW" , THROW_EXCEPTION )); BOOST_REQUIRE( parser->loadKeywordFromFile( boost::filesystem::path( std::string(KEYWORD_DIRECTORY) + std::string("/W/WCONHIST") )) ); parser->addKeyword( DIMENS ); - + parser->addKeyword( THROW ); + BOOST_REQUIRE( parser->hasKeyword( "DIMENS" )); BOOST_REQUIRE( parser->hasKeyword( "WCONHIST" )); - + BOOST_REQUIRE( parser->hasKeyword( "THROW" )); + + BOOST_REQUIRE_THROW( parser->parse( actionFile2.string() , false) , std::invalid_argument ); + + DeckPtr deck = parser->parse(actionFile.string() , false); DeckKeywordConstPtr kw1 = deck->getKeyword("WCONHIST" , 0); BOOST_CHECK_EQUAL( 3U , kw1->size() ); @@ -83,5 +90,4 @@ BOOST_AUTO_TEST_CASE( parse_ACTION_OK ) { BOOST_CHECK_EQUAL( 6U , location.second); } - } diff --git a/opm/parser/eclipse/Parser/Parser.cpp b/opm/parser/eclipse/Parser/Parser.cpp index 5df30dce9..62369ada3 100644 --- a/opm/parser/eclipse/Parser/Parser.cpp +++ b/opm/parser/eclipse/Parser/Parser.cpp @@ -90,7 +90,7 @@ namespace Opm { if (inputstream) { RawKeywordPtr rawKeyword; - + while (tryParseKeyword(deck, file.string() , lineNR , inputstream, rawKeyword, parseStrict)) { if (rawKeyword->getKeywordName() == Opm::RawConsts::include) { RawRecordConstPtr firstRecord = rawKeyword->getRecord(0); @@ -146,6 +146,11 @@ namespace Opm { RawKeywordPtr Parser::createRawKeyword(const DeckConstPtr deck, const std::string& filename , size_t lineNR , const std::string& keywordString, bool strictParsing) const { if (hasKeyword(keywordString)) { ParserKeywordConstPtr parserKeyword = m_parserKeywords.find(keywordString)->second; + ParserKeywordActionEnum action = parserKeyword->getAction(); + + if (action == THROW_EXCEPTION) + throw std::invalid_argument("Parsing terminated by fatal keyword: " + keywordString); + if (parserKeyword->getSizeType() == SLASH_TERMINATED) return RawKeywordPtr(new RawKeyword(keywordString , filename , lineNR)); else { @@ -174,13 +179,14 @@ namespace Opm { } } + bool Parser::tryParseKeyword(const DeckConstPtr deck, const std::string& filename , size_t& lineNR , std::ifstream& inputstream, RawKeywordPtr& rawKeyword, bool strictParsing) const { std::string line; while (std::getline(inputstream, line)) { std::string keywordString; lineNR++; - + if (rawKeyword == NULL) { if (RawKeyword::tryParseKeyword(line, keywordString)) { rawKeyword = createRawKeyword(deck, filename , lineNR , keywordString, strictParsing); diff --git a/opm/parser/eclipse/Parser/ParserEnums.cpp b/opm/parser/eclipse/Parser/ParserEnums.cpp index 644b1631e..7f1027668 100644 --- a/opm/parser/eclipse/Parser/ParserEnums.cpp +++ b/opm/parser/eclipse/Parser/ParserEnums.cpp @@ -114,6 +114,9 @@ namespace Opm { case IGNORE: return "IGNORE"; break; + case THROW_EXCEPTION: + return "THROW_EXCEPTION"; + break; case IGNORE_WARNING: return "IGNORE_WARNING"; break; @@ -127,6 +130,8 @@ namespace Opm { return INTERNALIZE; else if (stringValue == "IGNORE") return IGNORE; + else if (stringValue == "THROW_EXCEPTION") + return THROW_EXCEPTION; else if (stringValue == "IGNORE_WARNING") return IGNORE_WARNING; else diff --git a/opm/parser/eclipse/Parser/ParserEnums.hpp b/opm/parser/eclipse/Parser/ParserEnums.hpp index e25a9ab49..409cabab7 100644 --- a/opm/parser/eclipse/Parser/ParserEnums.hpp +++ b/opm/parser/eclipse/Parser/ParserEnums.hpp @@ -50,7 +50,8 @@ namespace Opm { enum ParserKeywordActionEnum { INTERNALIZE = 0, IGNORE = 1, - IGNORE_WARNING = 2 + IGNORE_WARNING = 2, + THROW_EXCEPTION = 3 }; const std::string ParserKeywordActionEnum2String(ParserKeywordActionEnum enumValue); diff --git a/opm/parser/eclipse/Parser/tests/ParserEnumTests.cpp b/opm/parser/eclipse/Parser/tests/ParserEnumTests.cpp index e91ff1c5b..488cfddde 100644 --- a/opm/parser/eclipse/Parser/tests/ParserEnumTests.cpp +++ b/opm/parser/eclipse/Parser/tests/ParserEnumTests.cpp @@ -105,9 +105,10 @@ BOOST_AUTO_TEST_CASE(TestValueTypeEnumLoop) { /*****************************************************************/ BOOST_AUTO_TEST_CASE(TestKeywordActionEnum2String) { - BOOST_CHECK_EQUAL( "INTERNALIZE" , ParserKeywordActionEnum2String(INTERNALIZE)); - BOOST_CHECK_EQUAL( "IGNORE" , ParserKeywordActionEnum2String(IGNORE)); - BOOST_CHECK_EQUAL( "IGNORE_WARNING" , ParserKeywordActionEnum2String(IGNORE_WARNING)); + BOOST_CHECK_EQUAL( "INTERNALIZE" , ParserKeywordActionEnum2String(INTERNALIZE)); + BOOST_CHECK_EQUAL( "IGNORE" , ParserKeywordActionEnum2String(IGNORE)); + BOOST_CHECK_EQUAL( "IGNORE_WARNING" , ParserKeywordActionEnum2String(IGNORE_WARNING)); + BOOST_CHECK_EQUAL( "THROW_EXCEPTION" , ParserKeywordActionEnum2String(THROW_EXCEPTION)); } @@ -116,6 +117,7 @@ BOOST_AUTO_TEST_CASE(TestKeywordActionEnumFromString) { BOOST_CHECK_EQUAL( INTERNALIZE , ParserKeywordActionEnumFromString("INTERNALIZE")); BOOST_CHECK_EQUAL( IGNORE_WARNING , ParserKeywordActionEnumFromString("IGNORE_WARNING")); BOOST_CHECK_EQUAL( IGNORE , ParserKeywordActionEnumFromString("IGNORE")); + BOOST_CHECK_EQUAL( THROW_EXCEPTION , ParserKeywordActionEnumFromString("THROW_EXCEPTION")); } @@ -124,10 +126,12 @@ BOOST_AUTO_TEST_CASE(TestKeywordActionEnumLoop) { BOOST_CHECK_EQUAL( INTERNALIZE , ParserKeywordActionEnumFromString( ParserKeywordActionEnum2String( INTERNALIZE ) )); BOOST_CHECK_EQUAL( IGNORE , ParserKeywordActionEnumFromString( ParserKeywordActionEnum2String( IGNORE ) )); BOOST_CHECK_EQUAL( IGNORE_WARNING , ParserKeywordActionEnumFromString( ParserKeywordActionEnum2String( IGNORE_WARNING ) )); + BOOST_CHECK_EQUAL( THROW_EXCEPTION , ParserKeywordActionEnumFromString( ParserKeywordActionEnum2String( THROW_EXCEPTION ) )); BOOST_CHECK_EQUAL( "INTERNALIZE" , ParserKeywordActionEnum2String(ParserKeywordActionEnumFromString( "INTERNALIZE" ) )); BOOST_CHECK_EQUAL( "IGNORE" , ParserKeywordActionEnum2String(ParserKeywordActionEnumFromString( "IGNORE" ) )); BOOST_CHECK_EQUAL( "IGNORE_WARNING" , ParserKeywordActionEnum2String(ParserKeywordActionEnumFromString( "IGNORE_WARNING" ) )); + BOOST_CHECK_EQUAL( "THROW_EXCEPTION" , ParserKeywordActionEnum2String(ParserKeywordActionEnumFromString( "THROW_EXCEPTION" ) )); } diff --git a/testdata/integration_tests/ACTION/ACTION_EXCEPTION.txt b/testdata/integration_tests/ACTION/ACTION_EXCEPTION.txt new file mode 100644 index 000000000..cb22b6c18 --- /dev/null +++ b/testdata/integration_tests/ACTION/ACTION_EXCEPTION.txt @@ -0,0 +1,8 @@ +THROW + -- This keyword should raise an exception in the parser + Some data / +/ + + + +