Merge pull request #5440 from OPM/improve-robustness-parser

Improve robustness parser
This commit is contained in:
Magne Sjaastad 2020-01-30 15:01:52 +01:00 committed by GitHub
commit 7aea799a70
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 72 additions and 95 deletions

View File

@ -1359,6 +1359,12 @@ int RiaApplication::launchUnitTests()
testing::InitGoogleTest( &argc, argv ); 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 // Use this macro in main() to run all tests. It returns 0 if all
// tests are successful, or 1 otherwise. // tests are successful, or 1 otherwise.
// //

View File

@ -28,12 +28,6 @@
#include <functional> #include <functional>
//--------------------------------------------------------------------------------------------------
/// Constants
//--------------------------------------------------------------------------------------------------
#define PARAMETERS_FILE_NAME "parameters.txt"
#define RUNSPEC_FILE_NAME "runspecification.xml"
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -67,11 +61,11 @@ std::shared_ptr<RifCaseRealizationReader> RifCaseRealizationReader::createReader
{ {
std::shared_ptr<RifCaseRealizationReader> reader; std::shared_ptr<RifCaseRealizationReader> reader;
if ( fileName.endsWith( PARAMETERS_FILE_NAME ) ) if ( fileName.endsWith( parametersFileName() ) )
{ {
reader.reset( new RifCaseRealizationParametersReader( fileName ) ); reader.reset( new RifCaseRealizationParametersReader( fileName ) );
} }
else if ( fileName.endsWith( RUNSPEC_FILE_NAME ) ) else if ( fileName.endsWith( runSpecificationFileName() ) )
{ {
reader.reset( new RifCaseRealizationRunspecificationReader( fileName ) ); 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; int lineNo = 0;
QTextStream* dataStream = openDataStream(); QTextStream* dataStream = openDataStream();
QStringList errors;
try try
{ {
while ( !dataStream->atEnd() ) while ( !dataStream->atEnd() )
@ -147,34 +159,30 @@ void RifCaseRealizationParametersReader::parse()
if ( cols.size() != 2 ) if ( cols.size() != 2 )
{ {
throw FileParseException( errors << QString( "RifEnsembleParametersReader: Invalid file format in line %1" ).arg( lineNo );
QString( "RifEnsembleParametersReader: Invalid file format in line %1" ).arg( lineNo ) );
continue;
} }
QString& name = cols[0]; QString& name = cols[0];
QString& strValue = cols[1]; 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 else
{ {
if ( !RiaStdStringTools::isNumber( strValue.toStdString(), QLocale::c().decimalPoint().toLatin1() ) ) errors << QString( "RifEnsembleParametersReader: Invalid number format in line %1" ).arg( lineNo );
{
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 ) );
} }
else
m_parameters->addParameter( name, value ); {
m_parameters->addParameter( name, strValue );
} }
} }
@ -185,6 +193,11 @@ void RifCaseRealizationParametersReader::parse()
closeDataStream(); closeDataStream();
throw; throw;
} }
for ( const auto& s : errors )
{
RiaLogging::warning( s );
}
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -232,6 +245,8 @@ void RifCaseRealizationRunspecificationReader::parse()
auto file = openFile(); auto file = openFile();
QXmlStreamReader xml( file ); QXmlStreamReader xml( file );
QStringList errors;
QString paramName; QString paramName;
while ( !xml.atEnd() ) while ( !xml.atEnd() )
@ -256,30 +271,24 @@ void RifCaseRealizationRunspecificationReader::parse()
if ( paramName.isEmpty() ) continue; 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 else
{ {
if ( !RiaStdStringTools::isNumber( paramStrValue.toStdString(), errors << QString(
QLocale::c().decimalPoint().toLatin1() ) ) "RifCaseRealizationRunspecificationReader: Invalid number format in line %1" )
{ .arg( xml.lineNumber() );
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() ) );
} }
else
m_parameters->addParameter( paramName, value ); {
m_parameters->addParameter( paramName, paramStrValue );
} }
} }
} }
@ -293,6 +302,11 @@ void RifCaseRealizationRunspecificationReader::parse()
} }
closeFile(); closeFile();
for ( const auto& s : errors )
{
RiaLogging::warning( s );
}
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -316,8 +330,8 @@ QString RifCaseRealizationParametersFileLocator::locate( const QString& modelPat
QStringList files = qdir.entryList( QDir::Files | QDir::NoDotAndDotDot ); QStringList files = qdir.entryList( QDir::Files | QDir::NoDotAndDotDot );
for ( const QString& file : files ) for ( const QString& file : files )
{ {
if ( QString::compare( file, PARAMETERS_FILE_NAME, Qt::CaseInsensitive ) == 0 || if ( QString::compare( file, RifCaseRealizationReader::parametersFileName(), Qt::CaseInsensitive ) == 0 ||
QString::compare( file, RUNSPEC_FILE_NAME, Qt::CaseInsensitive ) == 0 ) QString::compare( file, RifCaseRealizationReader::runSpecificationFileName(), Qt::CaseInsensitive ) == 0 )
{ {
return qdir.absoluteFilePath( file ); return qdir.absoluteFilePath( file );
} }

View File

@ -52,6 +52,9 @@ public:
static std::shared_ptr<RifCaseRealizationReader> createReaderFromFileName( const QString& fileName ); static std::shared_ptr<RifCaseRealizationReader> createReaderFromFileName( const QString& fileName );
static QString parametersFileName();
static QString runSpecificationFileName();
protected: protected:
QFile* openFile(); QFile* openFile();
void closeFile(); void closeFile();

View File

@ -61,49 +61,3 @@ TEST( RifCaseRealizationParametersReaderTest, SuccessfulParsing )
EXPECT_TRUE( false ); 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 );
}
}