From 7de8b6bb08c2334fa92b0ed2dedb2e87036b69a3 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Thu, 30 Jan 2020 13:27:49 +0100 Subject: [PATCH 1/2] #5434 Ensemble Parameters : Improve robustness Avoid throwing when errors are detected --- .../Application/RiaApplication.cpp | 6 ++ .../RifCaseRealizationParametersReader.cpp | 71 +++++++++++-------- .../RifCaseRealizationParametersReader.h | 3 + ...ifCaseRealizationParametersReader-Test.cpp | 46 ------------ 4 files changed, 51 insertions(+), 75 deletions(-) diff --git a/ApplicationCode/Application/RiaApplication.cpp b/ApplicationCode/Application/RiaApplication.cpp index c7137ef178..3583f4138a 100644 --- a/ApplicationCode/Application/RiaApplication.cpp +++ b/ApplicationCode/Application/RiaApplication.cpp @@ -1359,6 +1359,12 @@ int RiaApplication::launchUnitTests() testing::InitGoogleTest( &argc, argv ); + // + // Use the gtest filter to execute a subset of tests + //::testing::GTEST_FLAG( filter ) = "*RifCaseRealizationParametersReaderTest*"; + // + // + // Use this macro in main() to run all tests. It returns 0 if all // tests are successful, or 1 otherwise. // diff --git a/ApplicationCode/FileInterface/RifCaseRealizationParametersReader.cpp b/ApplicationCode/FileInterface/RifCaseRealizationParametersReader.cpp index 53387de8a3..ec7c829f1b 100644 --- a/ApplicationCode/FileInterface/RifCaseRealizationParametersReader.cpp +++ b/ApplicationCode/FileInterface/RifCaseRealizationParametersReader.cpp @@ -28,12 +28,6 @@ #include -//-------------------------------------------------------------------------------------------------- -/// Constants -//-------------------------------------------------------------------------------------------------- -#define PARAMETERS_FILE_NAME "parameters.txt" -#define RUNSPEC_FILE_NAME "runspecification.xml" - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -67,11 +61,11 @@ std::shared_ptr RifCaseRealizationReader::createReader { std::shared_ptr reader; - if ( fileName.endsWith( PARAMETERS_FILE_NAME ) ) + if ( fileName.endsWith( parametersFileName() ) ) { reader.reset( new RifCaseRealizationParametersReader( fileName ) ); } - else if ( fileName.endsWith( RUNSPEC_FILE_NAME ) ) + else if ( fileName.endsWith( runSpecificationFileName() ) ) { reader.reset( new RifCaseRealizationRunspecificationReader( fileName ) ); } @@ -108,6 +102,22 @@ void RifCaseRealizationReader::closeFile() } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RifCaseRealizationReader::parametersFileName() +{ + return "parameters.txt"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RifCaseRealizationReader::runSpecificationFileName() +{ + return "runspecification.xml"; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -136,6 +146,8 @@ void RifCaseRealizationParametersReader::parse() int lineNo = 0; QTextStream* dataStream = openDataStream(); + QStringList errors; + try { while ( !dataStream->atEnd() ) @@ -147,34 +159,30 @@ void RifCaseRealizationParametersReader::parse() if ( cols.size() != 2 ) { - throw FileParseException( - QString( "RifEnsembleParametersReader: Invalid file format in line %1" ).arg( lineNo ) ); + errors << QString( "RifEnsembleParametersReader: Invalid file format in line %1" ).arg( lineNo ); + + continue; } QString& name = cols[0]; QString& strValue = cols[1]; - if ( RiaStdStringTools::startsWithAlphabetic( strValue.toStdString() ) ) + if ( RiaStdStringTools::isNumber( strValue.toStdString(), QLocale::c().decimalPoint().toLatin1() ) ) { - m_parameters->addParameter( name, strValue ); + bool parseOk = true; + double value = QLocale::c().toDouble( strValue, &parseOk ); + if ( parseOk ) + { + m_parameters->addParameter( name, value ); + } + else + { + errors << QString( "RifEnsembleParametersReader: Invalid number format in line %1" ).arg( lineNo ); + } } else { - if ( !RiaStdStringTools::isNumber( strValue.toStdString(), QLocale::c().decimalPoint().toLatin1() ) ) - { - throw FileParseException( - QString( "RifEnsembleParametersReader: Invalid number format in line %1" ).arg( lineNo ) ); - } - - bool parseOk = true; - double value = QLocale::c().toDouble( strValue, &parseOk ); - if ( !parseOk ) - { - throw FileParseException( - QString( "RifEnsembleParametersReader: Invalid number format in line %1" ).arg( lineNo ) ); - } - - m_parameters->addParameter( name, value ); + m_parameters->addParameter( name, strValue ); } } @@ -185,6 +193,11 @@ void RifCaseRealizationParametersReader::parse() closeDataStream(); throw; } + + for ( const auto& s : errors ) + { + RiaLogging::warning( s ); + } } //-------------------------------------------------------------------------------------------------- @@ -316,8 +329,8 @@ QString RifCaseRealizationParametersFileLocator::locate( const QString& modelPat QStringList files = qdir.entryList( QDir::Files | QDir::NoDotAndDotDot ); for ( const QString& file : files ) { - if ( QString::compare( file, PARAMETERS_FILE_NAME, Qt::CaseInsensitive ) == 0 || - QString::compare( file, RUNSPEC_FILE_NAME, Qt::CaseInsensitive ) == 0 ) + if ( QString::compare( file, RifCaseRealizationReader::parametersFileName(), Qt::CaseInsensitive ) == 0 || + QString::compare( file, RifCaseRealizationReader::runSpecificationFileName(), Qt::CaseInsensitive ) == 0 ) { return qdir.absoluteFilePath( file ); } diff --git a/ApplicationCode/FileInterface/RifCaseRealizationParametersReader.h b/ApplicationCode/FileInterface/RifCaseRealizationParametersReader.h index 933055e3fa..c40158dc73 100644 --- a/ApplicationCode/FileInterface/RifCaseRealizationParametersReader.h +++ b/ApplicationCode/FileInterface/RifCaseRealizationParametersReader.h @@ -52,6 +52,9 @@ public: static std::shared_ptr createReaderFromFileName( const QString& fileName ); + static QString parametersFileName(); + static QString runSpecificationFileName(); + protected: QFile* openFile(); void closeFile(); diff --git a/ApplicationCode/UnitTests/RifCaseRealizationParametersReader-Test.cpp b/ApplicationCode/UnitTests/RifCaseRealizationParametersReader-Test.cpp index ea13a9f3fd..78c6539e91 100644 --- a/ApplicationCode/UnitTests/RifCaseRealizationParametersReader-Test.cpp +++ b/ApplicationCode/UnitTests/RifCaseRealizationParametersReader-Test.cpp @@ -61,49 +61,3 @@ TEST( RifCaseRealizationParametersReaderTest, SuccessfulParsing ) EXPECT_TRUE( false ); } } - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -TEST( RifCaseRealizationParametersReaderTest, ParseFailed_InvalidFormat ) -{ - RifCaseRealizationParametersReader reader( CASE_REAL_TEST_DATA_DIRECTORY + "parameters_invalid_format.txt" ); - - try - { - reader.parse(); - - EXPECT_TRUE( false ); - } - catch ( FileParseException e ) - { - EXPECT_TRUE( e.message.contains( "Invalid file format in line 10" ) ); - } - catch ( ... ) - { - EXPECT_TRUE( false ); - } -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -TEST( RifCaseRealizationParametersReaderTest, ParseFailed_InvalidNumberFormat ) -{ - RifCaseRealizationParametersReader reader( CASE_REAL_TEST_DATA_DIRECTORY + "parameters_invalid_number_format.txt" ); - - try - { - reader.parse(); - - EXPECT_TRUE( false ); - } - catch ( FileParseException e ) - { - EXPECT_TRUE( e.message.contains( "Invalid number format in line 10" ) ); - } - catch ( ... ) - { - EXPECT_TRUE( false ); - } -} From 9b433359145269bb5202993e3f7873521710a82b Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Thu, 30 Jan 2020 13:37:59 +0100 Subject: [PATCH 2/2] #5434 Ensemble Parameters : Improve robustness Runspec reader --- .../RifCaseRealizationParametersReader.cpp | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/ApplicationCode/FileInterface/RifCaseRealizationParametersReader.cpp b/ApplicationCode/FileInterface/RifCaseRealizationParametersReader.cpp index ec7c829f1b..84d88bd3bf 100644 --- a/ApplicationCode/FileInterface/RifCaseRealizationParametersReader.cpp +++ b/ApplicationCode/FileInterface/RifCaseRealizationParametersReader.cpp @@ -245,6 +245,8 @@ void RifCaseRealizationRunspecificationReader::parse() auto file = openFile(); QXmlStreamReader xml( file ); + QStringList errors; + QString paramName; while ( !xml.atEnd() ) @@ -269,30 +271,24 @@ void RifCaseRealizationRunspecificationReader::parse() if ( paramName.isEmpty() ) continue; - if ( RiaStdStringTools::startsWithAlphabetic( paramStrValue.toStdString() ) ) + if ( RiaStdStringTools::isNumber( paramStrValue.toStdString(), QLocale::c().decimalPoint().toLatin1() ) ) { - m_parameters->addParameter( paramName, paramStrValue ); + bool parseOk = true; + double value = QLocale::c().toDouble( paramStrValue, &parseOk ); + if ( parseOk ) + { + m_parameters->addParameter( paramName, value ); + } + else + { + errors << QString( + "RifCaseRealizationRunspecificationReader: Invalid number format in line %1" ) + .arg( xml.lineNumber() ); + } } else { - if ( !RiaStdStringTools::isNumber( paramStrValue.toStdString(), - QLocale::c().decimalPoint().toLatin1() ) ) - { - throw FileParseException( - QString( "RifEnsembleParametersReader: Invalid number format in line %1" ) - .arg( xml.lineNumber() ) ); - } - - bool parseOk = true; - double value = QLocale::c().toDouble( paramStrValue, &parseOk ); - if ( !parseOk ) - { - throw FileParseException( - QString( "RifEnsembleParametersReader: Invalid number format in line %1" ) - .arg( xml.lineNumber() ) ); - } - - m_parameters->addParameter( paramName, value ); + m_parameters->addParameter( paramName, paramStrValue ); } } } @@ -306,6 +302,11 @@ void RifCaseRealizationRunspecificationReader::parse() } closeFile(); + + for ( const auto& s : errors ) + { + RiaLogging::warning( s ); + } } //--------------------------------------------------------------------------------------------------