diff --git a/opm/parser/eclipse/Parser/ParserRecord.cpp b/opm/parser/eclipse/Parser/ParserRecord.cpp index 53702718e..76dc4b260 100644 --- a/opm/parser/eclipse/Parser/ParserRecord.cpp +++ b/opm/parser/eclipse/Parser/ParserRecord.cpp @@ -54,12 +54,18 @@ namespace Opm { } DeckRecordConstPtr ParserRecord::parse(RawRecordPtr rawRecord) const { + std::string recordBeforeParsing = rawRecord->getRecordString(); DeckRecordPtr deckRecord(new DeckRecord()); for (size_t i = 0; i < size(); i++) { ParserItemConstPtr parserItem = get(i); DeckItemConstPtr deckItem = parserItem->scan(rawRecord); deckRecord->addItem(deckItem); } + const size_t recordSize = rawRecord->size(); + if (recordSize > 0) + throw std::invalid_argument("The RawRecord for keyword \"" + rawRecord->getKeywordName() + "\" in file\"" + rawRecord->getFileName() + "\" contained " + + boost::lexical_cast(recordSize) + + " too many items according to the spec. RawRecord was: " + recordBeforeParsing); return deckRecord; } diff --git a/opm/parser/eclipse/Parser/tests/ParserRecordTests.cpp b/opm/parser/eclipse/Parser/tests/ParserRecordTests.cpp index 329adff90..28bd519a5 100644 --- a/opm/parser/eclipse/Parser/tests/ParserRecordTests.cpp +++ b/opm/parser/eclipse/Parser/tests/ParserRecordTests.cpp @@ -21,6 +21,7 @@ #define BOOST_TEST_MODULE ParserTests #include +#include #include #include #include @@ -29,6 +30,9 @@ #include #include +#include "opm/parser/eclipse/RawDeck/RawKeyword.hpp" +#include "opm/parser/eclipse/Parser/ParserKeyword.hpp" + using namespace Opm; BOOST_AUTO_TEST_CASE(DefaultConstructor_NoParams_NoThrow) { @@ -115,13 +119,10 @@ ParserRecordPtr createSimpleParserRecord() { record->addItem(itemInt1); record->addItem(itemInt2); - + return record; } - - - BOOST_AUTO_TEST_CASE(parse_validRecord_noThrow) { ParserRecordPtr record = createSimpleParserRecord(); RawRecordPtr rawRecord(new RawRecord("100 443 /")); @@ -138,6 +139,7 @@ BOOST_AUTO_TEST_CASE(parse_validRecord_deckRecordCreated) { // INT INT DOUBLE DOUBLE INT DOUBLE + ParserRecordPtr createMixedParserRecord() { ParserItemSizeEnum sizeType = SINGLE; @@ -160,67 +162,62 @@ ParserRecordPtr createMixedParserRecord() { return record; } - - BOOST_AUTO_TEST_CASE(parse_validMixedRecord_noThrow) { ParserRecordPtr record = createMixedParserRecord(); RawRecordPtr rawRecord(new RawRecord("1 2 10.0 20.0 4 90.0 /")); BOOST_CHECK_NO_THROW(record->parse(rawRecord)); } - BOOST_AUTO_TEST_CASE(Equal_Equal_ReturnsTrue) { ParserRecordPtr record1 = createMixedParserRecord(); ParserRecordPtr record2 = createMixedParserRecord(); - BOOST_CHECK( record1->equal( *record1 )); - BOOST_CHECK( record1->equal( *record2 )); + BOOST_CHECK(record1->equal(*record1)); + BOOST_CHECK(record1->equal(*record2)); } - BOOST_AUTO_TEST_CASE(Equal_Different_ReturnsFalse) { ParserItemSizeEnum sizeType = SINGLE; - ParserIntItemPtr itemInt(new ParserIntItem("INTITEM1", sizeType , 0)); - ParserDoubleItemPtr itemDouble(new ParserDoubleItem("DOUBLEITEM1", sizeType , 0)); + ParserIntItemPtr itemInt(new ParserIntItem("INTITEM1", sizeType, 0)); + ParserDoubleItemPtr itemDouble(new ParserDoubleItem("DOUBLEITEM1", sizeType, 0)); ParserStringItemPtr itemString(new ParserStringItem("STRINGITEM1", sizeType)); ParserRecordPtr record1(new ParserRecord()); ParserRecordPtr record2(new ParserRecord()); ParserRecordPtr record3(new ParserRecord()); - record1->addItem( itemInt ); - record1->addItem( itemDouble ); + record1->addItem(itemInt); + record1->addItem(itemDouble); - record2->addItem( itemInt ); - record2->addItem( itemDouble ); - record2->addItem( itemString ); + record2->addItem(itemInt); + record2->addItem(itemDouble); + record2->addItem(itemString); - record3->addItem( itemDouble ); - record3->addItem( itemInt ); - BOOST_CHECK( !record1->equal( *record2 )); - BOOST_CHECK( !record1->equal( *record3 )); + record3->addItem(itemDouble); + record3->addItem(itemInt); + BOOST_CHECK(!record1->equal(*record2)); + BOOST_CHECK(!record1->equal(*record3)); } - BOOST_AUTO_TEST_CASE(ParseWithDefault_defaultAppliedCorrectInDeck) { ParserRecord parserRecord; - ParserIntItemConstPtr itemInt( new ParserIntItem("ITEM1", SINGLE)); - ParserStringItemConstPtr itemString( new ParserStringItem( "ITEM2", SINGLE)); - ParserDoubleItemConstPtr itemDouble( new ParserDoubleItem( "ITEM3", SINGLE)); + ParserIntItemConstPtr itemInt(new ParserIntItem("ITEM1", SINGLE)); + ParserStringItemConstPtr itemString(new ParserStringItem("ITEM2", SINGLE)); + ParserDoubleItemConstPtr itemDouble(new ParserDoubleItem("ITEM3", SINGLE)); + + parserRecord.addItem(itemInt); + parserRecord.addItem(itemString); + parserRecord.addItem(itemDouble); - parserRecord.addItem( itemInt ); - parserRecord.addItem( itemString ); - parserRecord.addItem( itemDouble ); - { RawRecordPtr rawRecord(new RawRecord("* /")); DeckItemConstPtr deckStringItem = itemString->scan(rawRecord); DeckItemConstPtr deckIntItem = itemInt->scan(rawRecord); DeckItemConstPtr deckDoubleItem = itemDouble->scan(rawRecord); - - BOOST_CHECK( deckStringItem->defaultApplied() ); - BOOST_CHECK( deckIntItem->defaultApplied() ); - BOOST_CHECK( deckDoubleItem->defaultApplied() ); + + BOOST_CHECK(deckStringItem->defaultApplied()); + BOOST_CHECK(deckIntItem->defaultApplied()); + BOOST_CHECK(deckDoubleItem->defaultApplied()); } @@ -229,22 +226,22 @@ BOOST_AUTO_TEST_CASE(ParseWithDefault_defaultAppliedCorrectInDeck) { DeckItemConstPtr deckStringItem = itemString->scan(rawRecord); DeckItemConstPtr deckIntItem = itemInt->scan(rawRecord); DeckItemConstPtr deckDoubleItem = itemDouble->scan(rawRecord); - - BOOST_CHECK( deckStringItem->defaultApplied() ); - BOOST_CHECK( deckIntItem->defaultApplied() ); - BOOST_CHECK( deckDoubleItem->defaultApplied() ); + + BOOST_CHECK(deckStringItem->defaultApplied()); + BOOST_CHECK(deckIntItem->defaultApplied()); + BOOST_CHECK(deckDoubleItem->defaultApplied()); } - + { RawRecordPtr rawRecord(new RawRecord("TRYGVE 10 2.9 /")); DeckItemConstPtr deckStringItem = itemString->scan(rawRecord); DeckItemConstPtr deckIntItem = itemInt->scan(rawRecord); DeckItemConstPtr deckDoubleItem = itemDouble->scan(rawRecord); - - BOOST_CHECK_EQUAL( false , deckStringItem->defaultApplied() ); - BOOST_CHECK_EQUAL( false , deckIntItem->defaultApplied() ); - BOOST_CHECK_EQUAL( false , deckDoubleItem->defaultApplied() ); + + BOOST_CHECK_EQUAL(false, deckStringItem->defaultApplied()); + BOOST_CHECK_EQUAL(false, deckIntItem->defaultApplied()); + BOOST_CHECK_EQUAL(false, deckDoubleItem->defaultApplied()); } @@ -253,10 +250,10 @@ BOOST_AUTO_TEST_CASE(ParseWithDefault_defaultAppliedCorrectInDeck) { DeckItemConstPtr deckStringItem = itemString->scan(rawRecord); DeckItemConstPtr deckIntItem = itemInt->scan(rawRecord); DeckItemConstPtr deckDoubleItem = itemDouble->scan(rawRecord); - - BOOST_CHECK_EQUAL( true , deckStringItem->defaultApplied() ); - BOOST_CHECK_EQUAL( true , deckIntItem->defaultApplied() ); - BOOST_CHECK_EQUAL( true , deckDoubleItem->defaultApplied() ); + + BOOST_CHECK_EQUAL(true, deckStringItem->defaultApplied()); + BOOST_CHECK_EQUAL(true, deckIntItem->defaultApplied()); + BOOST_CHECK_EQUAL(true, deckDoubleItem->defaultApplied()); } { @@ -264,12 +261,46 @@ BOOST_AUTO_TEST_CASE(ParseWithDefault_defaultAppliedCorrectInDeck) { DeckItemConstPtr deckStringItem = itemString->scan(rawRecord); DeckItemConstPtr deckIntItem = itemInt->scan(rawRecord); DeckItemConstPtr deckDoubleItem = itemDouble->scan(rawRecord); - - BOOST_CHECK_EQUAL( true , deckStringItem->defaultApplied() ); - BOOST_CHECK_EQUAL( true , deckIntItem->defaultApplied() ); - BOOST_CHECK_EQUAL( true , deckDoubleItem->defaultApplied() ); + + BOOST_CHECK_EQUAL(true, deckStringItem->defaultApplied()); + BOOST_CHECK_EQUAL(true, deckIntItem->defaultApplied()); + BOOST_CHECK_EQUAL(true, deckDoubleItem->defaultApplied()); } } +BOOST_AUTO_TEST_CASE(Parse_RawRecordTooManyItems_Throws) { + ParserRecordPtr parserRecord(new ParserRecord()); + ParserIntItemConstPtr itemI(new ParserIntItem("I", SINGLE)); + ParserIntItemConstPtr itemJ(new ParserIntItem("J", SINGLE)); + ParserIntItemConstPtr itemK(new ParserIntItem("K", SINGLE)); + + parserRecord->addItem(itemI); + parserRecord->addItem(itemJ); + parserRecord->addItem(itemK); + + + RawRecordPtr rawRecord(new RawRecord("3 3 3 /")); + BOOST_CHECK_NO_THROW(parserRecord->parse(rawRecord)); + + RawRecordPtr rawRecordOneExtra(new RawRecord("3 3 3 4 /")); + BOOST_CHECK_THROW(parserRecord->parse(rawRecordOneExtra), std::invalid_argument); + + RawRecordPtr rawRecordForgotRecordTerminator(new RawRecord("3 3 3 \n 4 4 4 /")); + BOOST_CHECK_THROW(parserRecord->parse(rawRecordForgotRecordTerminator), std::invalid_argument); + +} +BOOST_AUTO_TEST_CASE(Parse_RawRecordTooFewItems_ThrowsNot) { + ParserRecordPtr parserRecord(new ParserRecord()); + ParserIntItemConstPtr itemI(new ParserIntItem("I", SINGLE)); + ParserIntItemConstPtr itemJ(new ParserIntItem("J", SINGLE)); + ParserIntItemConstPtr itemK(new ParserIntItem("K", SINGLE)); + + parserRecord->addItem(itemI); + parserRecord->addItem(itemJ); + parserRecord->addItem(itemK); + + RawRecordPtr rawRecord(new RawRecord("3 3 /")); + BOOST_CHECK_NO_THROW(parserRecord->parse(rawRecord)); +} \ No newline at end of file diff --git a/opm/parser/eclipse/RawDeck/RawKeyword.cpp b/opm/parser/eclipse/RawDeck/RawKeyword.cpp index 23ab74af0..7834737eb 100644 --- a/opm/parser/eclipse/RawDeck/RawKeyword.cpp +++ b/opm/parser/eclipse/RawDeck/RawKeyword.cpp @@ -90,7 +90,7 @@ namespace Opm { if (!m_isFinished) { if (RawRecord::isTerminatedRecordString(partialRecordString)) { - RawRecordPtr record(new RawRecord(m_partialRecordString)); + RawRecordPtr record(new RawRecord(m_partialRecordString, m_filename, m_name)); m_records.push_back(record); m_partialRecordString.clear(); diff --git a/opm/parser/eclipse/RawDeck/RawRecord.cpp b/opm/parser/eclipse/RawDeck/RawRecord.cpp index 67087b94b..a370f1748 100644 --- a/opm/parser/eclipse/RawDeck/RawRecord.cpp +++ b/opm/parser/eclipse/RawDeck/RawRecord.cpp @@ -28,7 +28,7 @@ using namespace std; namespace Opm { - RawRecord::RawRecord() { + RawRecord::RawRecord() : m_fileName(""), m_keywordName("") { } /* @@ -40,7 +40,7 @@ namespace Opm { * exception is thrown. * */ - RawRecord::RawRecord(const std::string& singleRecordString) { + RawRecord::RawRecord(const std::string& singleRecordString, const std::string& fileName, const std::string& keywordName) : m_fileName(fileName), m_keywordName(keywordName){ if (isTerminatedRecordString(singleRecordString)) { setRecordString(singleRecordString); splitSingleRecordString(); @@ -49,6 +49,15 @@ namespace Opm { " offending string: " + singleRecordString); } } + + const std::string& RawRecord::getFileName() const { + return m_fileName; + } + + const std::string& RawRecord::getKeywordName() const { + return m_keywordName; + } + std::string RawRecord::pop_front() { std::string front = m_recordItems.front(); diff --git a/opm/parser/eclipse/RawDeck/RawRecord.hpp b/opm/parser/eclipse/RawDeck/RawRecord.hpp index b059f087f..5440cba73 100644 --- a/opm/parser/eclipse/RawDeck/RawRecord.hpp +++ b/opm/parser/eclipse/RawDeck/RawRecord.hpp @@ -33,7 +33,7 @@ namespace Opm { class RawRecord { public: RawRecord(); - RawRecord(const std::string& singleRecordString); + RawRecord(const std::string& singleRecordString, const std::string& fileName = "", const std::string& keywordName = ""); std::string pop_front(); void push_front(std::string token); @@ -41,6 +41,8 @@ namespace Opm { const std::string& getRecordString() const; const std::string& getItem(size_t index) const; + const std::string& getFileName() const; + const std::string& getKeywordName() const; static bool isTerminatedRecordString(const std::string& candidateRecordString); virtual ~RawRecord(); @@ -49,7 +51,9 @@ namespace Opm { private: std::string m_sanitizedRecordString; std::deque m_recordItems; - + const std::string& m_fileName; + const std::string& m_keywordName; + void setRecordString(const std::string& singleRecordString); void splitSingleRecordString(); void processSeparatorCharacter(std::string& currentToken, const char& currentChar, char& tokenStarter); diff --git a/opm/parser/eclipse/RawDeck/tests/RawRecordTests.cpp b/opm/parser/eclipse/RawDeck/tests/RawRecordTests.cpp index 5e5c6f347..b6b75d2f8 100644 --- a/opm/parser/eclipse/RawDeck/tests/RawRecordTests.cpp +++ b/opm/parser/eclipse/RawDeck/tests/RawRecordTests.cpp @@ -51,57 +51,63 @@ BOOST_AUTO_TEST_CASE(RawRecordIsCompleteRecordInCompleteRecordReturnsFalse) { BOOST_CHECK_EQUAL(false, isComplete); } - BOOST_AUTO_TEST_CASE(Rawrecord_OperatorThis_OK) { - Opm::RawRecord record(" 'NODIR ' 'REVERS' 1 20 /"); - Opm::RawRecordPtr recordPtr(new Opm::RawRecord(" 'NODIR ' 'REVERS' 1 20 /")); + Opm::RawRecord record(" 'NODIR ' 'REVERS' 1 20 /"); + Opm::RawRecordPtr recordPtr(new Opm::RawRecord(" 'NODIR ' 'REVERS' 1 20 /")); - BOOST_CHECK_EQUAL( "NODIR " , record.getItem(0)); - BOOST_CHECK_EQUAL( "REVERS" , record.getItem(1)); - BOOST_CHECK_EQUAL( "1" , record.getItem(2)); - BOOST_CHECK_EQUAL( "20" , record.getItem(3)); + BOOST_CHECK_EQUAL("NODIR ", record.getItem(0)); + BOOST_CHECK_EQUAL("REVERS", record.getItem(1)); + BOOST_CHECK_EQUAL("1", record.getItem(2)); + BOOST_CHECK_EQUAL("20", record.getItem(3)); - BOOST_CHECK_EQUAL( "20" , recordPtr->getItem(3)); + BOOST_CHECK_EQUAL("20", recordPtr->getItem(3)); - BOOST_CHECK_THROW( record.getItem(4) , std::out_of_range); + BOOST_CHECK_THROW(record.getItem(4), std::out_of_range); } - BOOST_AUTO_TEST_CASE(Rawrecord_PushFront_OK) { - Opm::RawRecordPtr record(new Opm::RawRecord(" 'NODIR ' 'REVERS' 1 20 /")); - record->push_front( "String2" ); - record->push_front( "String1" ); - - - BOOST_CHECK_EQUAL( "String1" , record->getItem(0)); - BOOST_CHECK_EQUAL( "String2" , record->getItem(1)); -} + Opm::RawRecordPtr record(new Opm::RawRecord(" 'NODIR ' 'REVERS' 1 20 /")); + record->push_front("String2"); + record->push_front("String1"); + BOOST_CHECK_EQUAL("String1", record->getItem(0)); + BOOST_CHECK_EQUAL("String2", record->getItem(1)); +} + BOOST_AUTO_TEST_CASE(Rawrecord_size_OK) { - Opm::RawRecordPtr record(new Opm::RawRecord(" 'NODIR ' 'REVERS' 1 20 /")); + Opm::RawRecordPtr record(new Opm::RawRecord(" 'NODIR ' 'REVERS' 1 20 /")); - BOOST_CHECK_EQUAL( 4U , record->size()); - record->push_front( "String2" ); - record->push_front( "String1" ); - BOOST_CHECK_EQUAL( 6U , record->size()); + BOOST_CHECK_EQUAL(4U, record->size()); + record->push_front("String2"); + record->push_front("String1"); + BOOST_CHECK_EQUAL(6U, record->size()); } - BOOST_AUTO_TEST_CASE(Rawrecord_sizeEmpty_OK) { - Opm::RawRecordPtr record(new Opm::RawRecord("/")); - - BOOST_CHECK_EQUAL( 0U , record->size()); + Opm::RawRecordPtr record(new Opm::RawRecord("/")); + BOOST_CHECK_EQUAL(0U, record->size()); } - BOOST_AUTO_TEST_CASE(Rawrecord_spaceOnlyEmpty_OK) { - Opm::RawRecordPtr record(new Opm::RawRecord(" /")); - BOOST_CHECK_EQUAL( "" , record->getRecordString()); - BOOST_CHECK_EQUAL( 0U , record->size()); + Opm::RawRecordPtr record(new Opm::RawRecord(" /")); + BOOST_CHECK_EQUAL("", record->getRecordString()); + BOOST_CHECK_EQUAL(0U, record->size()); +} + +BOOST_AUTO_TEST_CASE(Rawrecord_noFileAndKeywordGiven_EmptyStringUsed) { + Opm::RawRecordPtr record(new Opm::RawRecord("32 33 /")); + BOOST_CHECK_EQUAL("", record->getKeywordName()); + BOOST_CHECK_EQUAL("", record->getFileName()); +} + +BOOST_AUTO_TEST_CASE(Rawrecord_FileAndKeywordGiven_CorrectStringsReturned) { + const std::string fileName = "/this/is/it"; + const std::string keywordName = "KEYWD"; + Opm::RawRecordPtr record(new Opm::RawRecord("32 33 /", fileName, keywordName)); + BOOST_CHECK_EQUAL(keywordName, record->getKeywordName()); + BOOST_CHECK_EQUAL(fileName, record->getFileName()); } - - diff --git a/opm/parser/share/keywords/G/GCONINJE b/opm/parser/share/keywords/G/GCONINJE index ddf5f6e09..d531bc57b 100644 --- a/opm/parser/share/keywords/G/GCONINJE +++ b/opm/parser/share/keywords/G/GCONINJE @@ -10,5 +10,6 @@ {"name" : "GUIDE_FRACTION" , "value_type" : "FLOAT" , "default" : 0}, {"name" : "GUIDE_DEF" , "value_type" : "STRING"}, {"name" : "REINJECT_GROUP" , "value_type" : "STRING"}, - {"name" : "VOIDAGE_GROUP" , "value_type" : "STRING"} + {"name" : "VOIDAGE_GROUP" , "value_type" : "STRING"}, + {"name" : "WETGAS_TARGET", "value_type" : "FLOAT"} ]} \ No newline at end of file