#5434 Ensemble Parameters : Improve robustness

Avoid throwing when errors are detected
This commit is contained in:
Magne Sjaastad 2020-01-30 13:27:49 +01:00
parent 96fd4a1c9f
commit 7de8b6bb08
4 changed files with 51 additions and 75 deletions

View File

@ -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.
//

View File

@ -28,12 +28,6 @@
#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;
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 );
}

View File

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

View File

@ -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 );
}
}