Splitting records with string_view; test updates

The splitting of RawRecords into individual symbols uses string_view.
Also updates tests since RawRecord now assumes that the record string it
receives is complete and does *not* contain the terminating slash.
This commit is contained in:
Jørgen Kvalsvik
2016-04-13 10:24:21 +02:00
parent a105f3a193
commit 8a4eb5279c
5 changed files with 36 additions and 39 deletions

View File

@@ -100,7 +100,7 @@ BOOST_AUTO_TEST_CASE(get_byNameNonExisting_throws) {
BOOST_AUTO_TEST_CASE(StringsWithSpaceOK) { BOOST_AUTO_TEST_CASE(StringsWithSpaceOK) {
ParserStringItemPtr itemString(new ParserStringItem(std::string("STRINGITEM1"))); ParserStringItemPtr itemString(new ParserStringItem(std::string("STRINGITEM1")));
ParserRecordPtr record1(new ParserRecord()); ParserRecordPtr record1(new ParserRecord());
RawRecord rawRecord( " ' VALUE ' /" ); RawRecord rawRecord( " ' VALUE ' " );
ParseContext parseContext; ParseContext parseContext;
record1->addItem( itemString ); record1->addItem( itemString );

View File

@@ -93,7 +93,7 @@ BOOST_AUTO_TEST_CASE(Initialize_Default_String) {
BOOST_AUTO_TEST_CASE(scan_PreMatureTerminator_defaultUsed) { BOOST_AUTO_TEST_CASE(scan_PreMatureTerminator_defaultUsed) {
ParserIntItem itemInt(std::string("ITEM2"), 123); ParserIntItem itemInt(std::string("ITEM2"), 123);
RawRecord rawRecord1( "/" ); RawRecord rawRecord1( "" );
const auto defaulted = itemInt.scan(rawRecord1); const auto defaulted = itemInt.scan(rawRecord1);
BOOST_CHECK(defaulted.defaultApplied(0)); BOOST_CHECK(defaulted.defaultApplied(0));
@@ -315,7 +315,7 @@ BOOST_AUTO_TEST_CASE(Scan_All_CorrectIntSetInDeckItem) {
ParserItemSizeEnum sizeType = ALL; ParserItemSizeEnum sizeType = ALL;
ParserIntItem itemInt("ITEM", sizeType); ParserIntItem itemInt("ITEM", sizeType);
RawRecord rawRecord( "100 443 10*77 10*1 25/" ); RawRecord rawRecord( "100 443 10*77 10*1 25" );
const auto deckIntItem = itemInt.scan(rawRecord); const auto deckIntItem = itemInt.scan(rawRecord);
BOOST_CHECK_EQUAL(23U, deckIntItem.size()); BOOST_CHECK_EQUAL(23U, deckIntItem.size());
BOOST_CHECK_EQUAL(77, deckIntItem.get< int >(3)); BOOST_CHECK_EQUAL(77, deckIntItem.get< int >(3));
@@ -327,7 +327,7 @@ BOOST_AUTO_TEST_CASE(Scan_All_WithDefaults) {
ParserItemSizeEnum sizeType = ALL; ParserItemSizeEnum sizeType = ALL;
ParserIntItem itemInt("ITEM", sizeType); ParserIntItem itemInt("ITEM", sizeType);
RawRecord rawRecord( "100 10* 10*1 25/" ); RawRecord rawRecord( "100 10* 10*1 25" );
const auto deckIntItem = itemInt.scan(rawRecord); const auto deckIntItem = itemInt.scan(rawRecord);
BOOST_CHECK_EQUAL(22U, deckIntItem.size()); BOOST_CHECK_EQUAL(22U, deckIntItem.size());
BOOST_CHECK(!deckIntItem.defaultApplied(0)); BOOST_CHECK(!deckIntItem.defaultApplied(0));
@@ -341,7 +341,7 @@ BOOST_AUTO_TEST_CASE(Scan_All_WithDefaults) {
BOOST_AUTO_TEST_CASE(Scan_SINGLE_CorrectIntSetInDeckItem) { BOOST_AUTO_TEST_CASE(Scan_SINGLE_CorrectIntSetInDeckItem) {
ParserIntItem itemInt(std::string("ITEM2")); ParserIntItem itemInt(std::string("ITEM2"));
RawRecord rawRecord("100 44.3 'Heisann' /" ); RawRecord rawRecord("100 44.3 'Heisann'" );
const auto deckIntItem = itemInt.scan(rawRecord); const auto deckIntItem = itemInt.scan(rawRecord);
BOOST_CHECK_EQUAL(100, deckIntItem.get< int >(0)); BOOST_CHECK_EQUAL(100, deckIntItem.get< int >(0));
} }
@@ -351,7 +351,7 @@ BOOST_AUTO_TEST_CASE(Scan_SeveralInts_CorrectIntsSetInDeckItem) {
ParserIntItem itemInt2(std::string("ITEM2")); ParserIntItem itemInt2(std::string("ITEM2"));
ParserIntItem itemInt3(std::string("ITEM3")); ParserIntItem itemInt3(std::string("ITEM3"));
RawRecord rawRecord( "100 443 338932 222.33 'Heisann' /" ); RawRecord rawRecord( "100 443 338932 222.33 'Heisann' " );
const auto deckIntItem1 = itemInt1.scan(rawRecord); const auto deckIntItem1 = itemInt1.scan(rawRecord);
BOOST_CHECK_EQUAL(100, deckIntItem1.get< int >(0)); BOOST_CHECK_EQUAL(100, deckIntItem1.get< int >(0));
@@ -370,7 +370,7 @@ BOOST_AUTO_TEST_CASE(Scan_Multiplier_CorrectIntsSetInDeckItem) {
ParserItemSizeEnum sizeType = ALL; ParserItemSizeEnum sizeType = ALL;
ParserIntItem itemInt("ITEM2", sizeType); ParserIntItem itemInt("ITEM2", sizeType);
RawRecord rawRecord( "3*4 /" ); RawRecord rawRecord( "3*4 " );
const auto deckIntItem = itemInt.scan(rawRecord); const auto deckIntItem = itemInt.scan(rawRecord);
BOOST_CHECK_EQUAL(4, deckIntItem.get< int >(0)); BOOST_CHECK_EQUAL(4, deckIntItem.get< int >(0));
BOOST_CHECK_EQUAL(4, deckIntItem.get< int >(1)); BOOST_CHECK_EQUAL(4, deckIntItem.get< int >(1));
@@ -381,7 +381,7 @@ BOOST_AUTO_TEST_CASE(Scan_StarNoMultiplier_ExceptionThrown) {
ParserItemSizeEnum sizeType = SINGLE; ParserItemSizeEnum sizeType = SINGLE;
ParserIntItem itemInt("ITEM2", sizeType , 100); ParserIntItem itemInt("ITEM2", sizeType , 100);
RawRecord rawRecord( "*45 /" ); RawRecord rawRecord( "*45 " );
BOOST_CHECK_THROW(itemInt.scan(rawRecord), std::invalid_argument); BOOST_CHECK_THROW(itemInt.scan(rawRecord), std::invalid_argument);
} }
@@ -389,7 +389,7 @@ BOOST_AUTO_TEST_CASE(Scan_MultipleItems_CorrectIntsSetInDeckItem) {
ParserIntItem itemInt1(std::string("ITEM1")); ParserIntItem itemInt1(std::string("ITEM1"));
ParserIntItem itemInt2(std::string("ITEM2")); ParserIntItem itemInt2(std::string("ITEM2"));
RawRecord rawRecord( "10 20 /" ); RawRecord rawRecord( "10 20" );
const auto deckIntItem1 = itemInt1.scan(rawRecord); const auto deckIntItem1 = itemInt1.scan(rawRecord);
const auto deckIntItem2 = itemInt2.scan(rawRecord); const auto deckIntItem2 = itemInt2.scan(rawRecord);
@@ -401,7 +401,7 @@ BOOST_AUTO_TEST_CASE(Scan_MultipleDefault_CorrectIntsSetInDeckItem) {
ParserIntItem itemInt1("ITEM1", 10); ParserIntItem itemInt1("ITEM1", 10);
ParserIntItem itemInt2("ITEM2", 20); ParserIntItem itemInt2("ITEM2", 20);
RawRecord rawRecord( "* * /" ); RawRecord rawRecord( "* * " );
const auto deckIntItem1 = itemInt1.scan(rawRecord); const auto deckIntItem1 = itemInt1.scan(rawRecord);
const auto deckIntItem2 = itemInt2.scan(rawRecord); const auto deckIntItem2 = itemInt2.scan(rawRecord);
@@ -413,7 +413,7 @@ BOOST_AUTO_TEST_CASE(Scan_MultipleWithMultiplier_CorrectIntsSetInDeckItem) {
ParserIntItem itemInt1("ITEM1", 10); ParserIntItem itemInt1("ITEM1", 10);
ParserIntItem itemInt2("ITEM2", 20); ParserIntItem itemInt2("ITEM2", 20);
RawRecord rawRecord( "2*30/" ); RawRecord rawRecord( "2*30" );
const auto deckIntItem1 = itemInt1.scan(rawRecord); const auto deckIntItem1 = itemInt1.scan(rawRecord);
const auto deckIntItem2 = itemInt2.scan(rawRecord); const auto deckIntItem2 = itemInt2.scan(rawRecord);
@@ -424,14 +424,14 @@ BOOST_AUTO_TEST_CASE(Scan_MultipleWithMultiplier_CorrectIntsSetInDeckItem) {
BOOST_AUTO_TEST_CASE(Scan_MalformedMultiplier_Throw) { BOOST_AUTO_TEST_CASE(Scan_MalformedMultiplier_Throw) {
ParserIntItem itemInt1("ITEM1" , 10); ParserIntItem itemInt1("ITEM1" , 10);
RawRecord rawRecord( "2.10*30/" ); RawRecord rawRecord( "2.10*30" );
BOOST_CHECK_THROW(itemInt1.scan(rawRecord), std::invalid_argument); BOOST_CHECK_THROW(itemInt1.scan(rawRecord), std::invalid_argument);
} }
BOOST_AUTO_TEST_CASE(Scan_MalformedMultiplierChar_Throw) { BOOST_AUTO_TEST_CASE(Scan_MalformedMultiplierChar_Throw) {
ParserIntItem itemInt1("ITEM1", 10); ParserIntItem itemInt1("ITEM1", 10);
RawRecord rawRecord( "210X30/" ); RawRecord rawRecord( "210X30" );
BOOST_CHECK_THROW(itemInt1.scan(rawRecord), std::invalid_argument); BOOST_CHECK_THROW(itemInt1.scan(rawRecord), std::invalid_argument);
} }
@@ -439,7 +439,7 @@ BOOST_AUTO_TEST_CASE(Scan_MultipleWithMultiplierDefault_CorrectIntsSetInDeckItem
ParserIntItem itemInt1("ITEM1", 10); ParserIntItem itemInt1("ITEM1", 10);
ParserIntItem itemInt2("ITEM2", 20); ParserIntItem itemInt2("ITEM2", 20);
RawRecord rawRecord( "2*/" ); RawRecord rawRecord( "2*" );
const auto deckIntItem1 = itemInt1.scan(rawRecord); const auto deckIntItem1 = itemInt1.scan(rawRecord);
const auto deckIntItem2 = itemInt2.scan(rawRecord); const auto deckIntItem2 = itemInt2.scan(rawRecord);
@@ -501,24 +501,24 @@ BOOST_AUTO_TEST_CASE(InitializeStringItem_FromJsonObject_withDefaultInvalid_thro
BOOST_AUTO_TEST_CASE(init_defaultvalue_defaultset) { BOOST_AUTO_TEST_CASE(init_defaultvalue_defaultset) {
ParserStringItem itemString(std::string("ITEM1") , "DEFAULT"); ParserStringItem itemString(std::string("ITEM1") , "DEFAULT");
RawRecord rawRecord( "'1*'/" ); RawRecord rawRecord( "'1*'" );
BOOST_CHECK_EQUAL("1*", itemString.scan( rawRecord ).get< std::string >(0) ); BOOST_CHECK_EQUAL("1*", itemString.scan( rawRecord ).get< std::string >(0) );
RawRecord rawRecord1( "13*/" ); RawRecord rawRecord1( "13*" );
BOOST_CHECK_EQUAL("DEFAULT" , itemString.scan( rawRecord1 ).get< std::string >(0) ); BOOST_CHECK_EQUAL("DEFAULT" , itemString.scan( rawRecord1 ).get< std::string >(0) );
RawRecord rawRecord2( "*/" ); RawRecord rawRecord2( "*" );
BOOST_CHECK_EQUAL("DEFAULT", itemString.scan( rawRecord2 ).get< std::string >(0) ); BOOST_CHECK_EQUAL("DEFAULT", itemString.scan( rawRecord2 ).get< std::string >(0) );
ParserStringItem itemStringDefaultChanged("ITEM2", "SPECIAL"); ParserStringItem itemStringDefaultChanged("ITEM2", "SPECIAL");
RawRecord rawRecord3( "*/" ); RawRecord rawRecord3( "*" );
BOOST_CHECK_EQUAL("SPECIAL", itemStringDefaultChanged.scan( rawRecord3 ).get< std::string >(0) ); BOOST_CHECK_EQUAL("SPECIAL", itemStringDefaultChanged.scan( rawRecord3 ).get< std::string >(0) );
} }
BOOST_AUTO_TEST_CASE(scan_all_valuesCorrect) { BOOST_AUTO_TEST_CASE(scan_all_valuesCorrect) {
ParserItemSizeEnum sizeType = ALL; ParserItemSizeEnum sizeType = ALL;
ParserStringItem itemString("ITEMWITHMANY", sizeType); ParserStringItem itemString("ITEMWITHMANY", sizeType);
RawRecord rawRecord( "'WELL1' FISK BANAN 3*X OPPLEGG_FOR_DATAANALYSE 'Foo$*!% BAR' /" ); RawRecord rawRecord( "'WELL1' FISK BANAN 3*X OPPLEGG_FOR_DATAANALYSE 'Foo$*!% BAR' " );
const auto deckItem = itemString.scan(rawRecord); const auto deckItem = itemString.scan(rawRecord);
BOOST_CHECK_EQUAL(8U, deckItem.size()); BOOST_CHECK_EQUAL(8U, deckItem.size());
@@ -535,7 +535,7 @@ BOOST_AUTO_TEST_CASE(scan_all_valuesCorrect) {
BOOST_AUTO_TEST_CASE(scan_all_withdefaults) { BOOST_AUTO_TEST_CASE(scan_all_withdefaults) {
ParserItemSizeEnum sizeType = ALL; ParserItemSizeEnum sizeType = ALL;
ParserIntItem itemString("ITEMWITHMANY", sizeType); ParserIntItem itemString("ITEMWITHMANY", sizeType);
RawRecord rawRecord( "10*1 10* 10*2 /" ); RawRecord rawRecord( "10*1 10* 10*2 " );
const auto deckItem = itemString.scan(rawRecord); const auto deckItem = itemString.scan(rawRecord);
BOOST_CHECK_EQUAL(30U, deckItem.size()); BOOST_CHECK_EQUAL(30U, deckItem.size());
@@ -558,7 +558,7 @@ BOOST_AUTO_TEST_CASE(scan_all_withdefaults) {
BOOST_AUTO_TEST_CASE(scan_single_dataCorrect) { BOOST_AUTO_TEST_CASE(scan_single_dataCorrect) {
ParserStringItem itemString(std::string("ITEM1")); ParserStringItem itemString(std::string("ITEM1"));
RawRecord rawRecord( "'WELL1' 'WELL2' /" ); RawRecord rawRecord( "'WELL1' 'WELL2'" );
const auto deckItem = itemString.scan(rawRecord); const auto deckItem = itemString.scan(rawRecord);
BOOST_CHECK_EQUAL(1U, deckItem.size()); BOOST_CHECK_EQUAL(1U, deckItem.size());
BOOST_CHECK_EQUAL("WELL1", deckItem.get< std::string >(0)); BOOST_CHECK_EQUAL("WELL1", deckItem.get< std::string >(0));
@@ -576,7 +576,7 @@ BOOST_AUTO_TEST_CASE(scan_singleWithMixedRecord_dataCorrect) {
/******************String and int**********************/ /******************String and int**********************/
BOOST_AUTO_TEST_CASE(scan_intsAndStrings_dataCorrect) { BOOST_AUTO_TEST_CASE(scan_intsAndStrings_dataCorrect) {
RawRecord rawRecord( "'WELL1' 2 2 2*3 /" ); RawRecord rawRecord( "'WELL1' 2 2 2*3" );
ParserItemSizeEnum sizeTypeItemBoxed = ALL; ParserItemSizeEnum sizeTypeItemBoxed = ALL;

View File

@@ -331,7 +331,7 @@ BOOST_AUTO_TEST_CASE(Parse_RawRecordTooFewItems) {
parserRecord->addItem(itemK); parserRecord->addItem(itemK);
ParseContext parseContext; ParseContext parseContext;
RawRecord rawRecord( "3 3 /" ); RawRecord rawRecord( "3 3 " );
// no default specified for the third item, record can be parsed just fine but trying // no default specified for the third item, record can be parsed just fine but trying
// to access the data will raise an exception... // to access the data will raise an exception...
BOOST_CHECK_NO_THROW(parserRecord->parse(parseContext , rawRecord)); BOOST_CHECK_NO_THROW(parserRecord->parse(parseContext , rawRecord));

View File

@@ -33,16 +33,15 @@ using namespace std;
namespace Opm { namespace Opm {
static inline std::string::const_iterator first_nonspace ( template< typename Itr >
std::string::const_iterator begin, static inline Itr first_nonspace( Itr begin, Itr end ) {
std::string::const_iterator end ) {
return std::find_if_not( begin, end, RawConsts::is_separator ); return std::find_if_not( begin, end, RawConsts::is_separator );
} }
static std::deque< string_view > splitSingleRecordString( const string_view& record ) { static std::deque< string_view > splitSingleRecordString( const string_view& line ) {
std::deque< string_view > dst; std::deque< string_view > dst;
string_view record( rec ); string_view record( line );
for( auto current = first_nonspace( record.begin(), record.end() ); for( auto current = first_nonspace( record.begin(), record.end() );
current != record.end(); current != record.end();

View File

@@ -24,7 +24,7 @@
BOOST_AUTO_TEST_CASE(RawRecordGetRecordsCorrectElementsReturned) { BOOST_AUTO_TEST_CASE(RawRecordGetRecordsCorrectElementsReturned) {
Opm::RawRecordPtr record(new Opm::RawRecord(" 'NODIR ' 'REVERS' 1 20 /")); Opm::RawRecordPtr record(new Opm::RawRecord(" 'NODIR ' 'REVERS' 1 20 "));
BOOST_CHECK_EQUAL((unsigned) 4, record->size()); BOOST_CHECK_EQUAL((unsigned) 4, record->size());
@@ -42,13 +42,11 @@ BOOST_AUTO_TEST_CASE(RawRecordIsCompleteRecordCompleteRecordReturnsTrue) {
BOOST_AUTO_TEST_CASE(RawRecordIsCompleteRecordInCompleteRecordReturnsFalse) { BOOST_AUTO_TEST_CASE(RawRecordIsCompleteRecordInCompleteRecordReturnsFalse) {
bool isComplete = Opm::RawRecord::isTerminatedRecordString("'NODIR ' 'REVERS' 1 20 "); bool isComplete = Opm::RawRecord::isTerminatedRecordString("'NODIR ' 'REVERS' 1 20 ");
BOOST_CHECK_EQUAL(false, isComplete); BOOST_CHECK_EQUAL(false, isComplete);
isComplete = Opm::RawRecord::isTerminatedRecordString("'NODIR ' 'REVERS 1 20 /");
BOOST_CHECK_EQUAL(false, isComplete);
} }
BOOST_AUTO_TEST_CASE(Rawrecord_OperatorThis_OK) { BOOST_AUTO_TEST_CASE(Rawrecord_OperatorThis_OK) {
Opm::RawRecord record(" 'NODIR ' 'REVERS' 1 20 /"); Opm::RawRecord record(" 'NODIR ' 'REVERS' 1 20 ");
Opm::RawRecordPtr recordPtr(new Opm::RawRecord(" 'NODIR ' 'REVERS' 1 20 /")); Opm::RawRecordPtr recordPtr(new Opm::RawRecord(" 'NODIR ' 'REVERS' 1 20 "));
BOOST_CHECK_EQUAL("'NODIR '", record.getItem(0)); BOOST_CHECK_EQUAL("'NODIR '", record.getItem(0));
BOOST_CHECK_EQUAL("'REVERS'", record.getItem(1)); BOOST_CHECK_EQUAL("'REVERS'", record.getItem(1));
@@ -61,7 +59,7 @@ BOOST_AUTO_TEST_CASE(Rawrecord_OperatorThis_OK) {
} }
BOOST_AUTO_TEST_CASE(Rawrecord_PushFront_OK) { BOOST_AUTO_TEST_CASE(Rawrecord_PushFront_OK) {
Opm::RawRecordPtr record(new Opm::RawRecord(" 'NODIR ' 'REVERS' 1 20 /")); Opm::RawRecordPtr record(new Opm::RawRecord(" 'NODIR ' 'REVERS' 1 20 "));
record->push_front("String2"); record->push_front("String2");
record->push_front("String1"); record->push_front("String1");
@@ -71,7 +69,7 @@ BOOST_AUTO_TEST_CASE(Rawrecord_PushFront_OK) {
} }
BOOST_AUTO_TEST_CASE(Rawrecord_size_OK) { 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()); BOOST_CHECK_EQUAL(4U, record->size());
record->push_front("String2"); record->push_front("String2");
@@ -80,17 +78,17 @@ BOOST_AUTO_TEST_CASE(Rawrecord_size_OK) {
} }
BOOST_AUTO_TEST_CASE(Rawrecord_sizeEmpty_OK) { BOOST_AUTO_TEST_CASE(Rawrecord_sizeEmpty_OK) {
Opm::RawRecordPtr record(new Opm::RawRecord("/")); Opm::RawRecordPtr record(new Opm::RawRecord(""));
BOOST_CHECK_EQUAL(0U, record->size()); BOOST_CHECK_EQUAL(0U, record->size());
} }
BOOST_AUTO_TEST_CASE(Rawrecord_spaceOnlyEmpty_OK) { BOOST_AUTO_TEST_CASE(Rawrecord_spaceOnlyEmpty_OK) {
Opm::RawRecordPtr record(new Opm::RawRecord(" /")); Opm::RawRecordPtr record(new Opm::RawRecord(" "));
BOOST_CHECK_EQUAL(0U, record->size()); BOOST_CHECK_EQUAL(0U, record->size());
} }
BOOST_AUTO_TEST_CASE(Rawrecord_noFileAndKeywordGiven_EmptyStringUsed) { BOOST_AUTO_TEST_CASE(Rawrecord_noFileAndKeywordGiven_EmptyStringUsed) {
Opm::RawRecordPtr record(new Opm::RawRecord("32 33 /")); Opm::RawRecordPtr record(new Opm::RawRecord("32 33 "));
BOOST_CHECK_EQUAL("", record->getKeywordName()); BOOST_CHECK_EQUAL("", record->getKeywordName());
BOOST_CHECK_EQUAL("", record->getFileName()); BOOST_CHECK_EQUAL("", record->getFileName());
} }
@@ -98,7 +96,7 @@ BOOST_AUTO_TEST_CASE(Rawrecord_noFileAndKeywordGiven_EmptyStringUsed) {
BOOST_AUTO_TEST_CASE(Rawrecord_FileAndKeywordGiven_CorrectStringsReturned) { BOOST_AUTO_TEST_CASE(Rawrecord_FileAndKeywordGiven_CorrectStringsReturned) {
const std::string fileName = "/this/is/it"; const std::string fileName = "/this/is/it";
const std::string keywordName = "KEYWD"; const std::string keywordName = "KEYWD";
Opm::RawRecordPtr record(new Opm::RawRecord("32 33 /", fileName, keywordName)); Opm::RawRecordPtr record(new Opm::RawRecord("32 33 ", fileName, keywordName));
BOOST_CHECK_EQUAL(keywordName, record->getKeywordName()); BOOST_CHECK_EQUAL(keywordName, record->getKeywordName());
BOOST_CHECK_EQUAL(fileName, record->getFileName()); BOOST_CHECK_EQUAL(fileName, record->getFileName());
} }