Fix invalid parsing of line with keyword end tag and comment

* Add error text when size differs
* #9845: Remove invalid parsing of data in comment line
The line '/ -- 123 123' was parsed incorrectly, and values 123 123 was added to the list of valid values for the keyword.
This commit is contained in:
Magne Sjaastad 2023-02-16 13:04:16 +01:00 committed by GitHub
parent 20439e1da9
commit edbeb4dfb1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 46 additions and 12 deletions

View File

@ -193,8 +193,12 @@ bool RifEclipseInputFileTools::openGridFile( const QString& fileName,
ecl_grid_free( inputGrid );
QString errorMessages;
// Import additional keywords as input properties
RifEclipseInputPropertyLoader::createInputPropertiesFromKeywords( eclipseCase, objects );
RifEclipseInputPropertyLoader::createInputPropertiesFromKeywords( eclipseCase, objects, &errorMessages );
if ( !errorMessages.isEmpty() ) RiaLogging::error( errorMessages );
return true;
}

View File

@ -40,7 +40,7 @@ QString RifEclipseInputPropertyLoader::evaluateAndCreateInputPropertyResult( Rig
QString* errorMessage )
{
auto eclipseKeyword = keywordContent.keyword;
if ( isInputPropertyCandidate( eclipseCase, eclipseKeyword, keywordContent.values.size() ) )
if ( isInputPropertyCandidate( eclipseCase, eclipseKeyword, keywordContent.values.size(), errorMessage ) )
{
QString newResultName = eclipseCase->results( RiaDefines::PorosityModelType::MATRIX_MODEL )
->makeResultNameUnique( QString::fromStdString( eclipseKeyword ) );
@ -58,11 +58,12 @@ QString RifEclipseInputPropertyLoader::evaluateAndCreateInputPropertyResult( Rig
///
//--------------------------------------------------------------------------------------------------
void RifEclipseInputPropertyLoader::createInputPropertiesFromKeywords( RigEclipseCaseData* eclipseCase,
const std::vector<RifEclipseKeywordContent>& keywordContent )
const std::vector<RifEclipseKeywordContent>& keywordContent,
QString* errorText )
{
for ( const auto& keywordAndValues : keywordContent )
{
RifEclipseInputPropertyLoader::evaluateAndCreateInputPropertyResult( eclipseCase, keywordAndValues, nullptr );
RifEclipseInputPropertyLoader::evaluateAndCreateInputPropertyResult( eclipseCase, keywordAndValues, errorText );
}
}
@ -71,13 +72,27 @@ void RifEclipseInputPropertyLoader::createInputPropertiesFromKeywords( RigEclips
//--------------------------------------------------------------------------------------------------
bool RifEclipseInputPropertyLoader::isInputPropertyCandidate( const RigEclipseCaseData* caseData,
const std::string& eclipseKeyword,
size_t numberOfValues )
size_t numberOfValues,
QString* errorText )
{
CVF_ASSERT( caseData );
if ( !isValidDataKeyword( QString::fromStdString( eclipseKeyword ) ) ) return false;
return ( numberOfValues == caseData->mainGrid()->cellCount() );
if ( numberOfValues != caseData->mainGrid()->cellCount() )
{
if ( errorText )
{
*errorText += QString( "Keyword %1 has %2 values, but the grid has %3 cells" )
.arg( QString::fromStdString( eclipseKeyword ) )
.arg( numberOfValues )
.arg( caseData->mainGrid()->cellCount() );
}
return false;
}
return true;
}
//--------------------------------------------------------------------------------------------------

View File

@ -42,7 +42,8 @@ class RifEclipseInputPropertyLoader
{
public:
static void createInputPropertiesFromKeywords( RigEclipseCaseData* eclipseCase,
const std::vector<RifEclipseKeywordContent>& keywordContent );
const std::vector<RifEclipseKeywordContent>& keywordContent,
QString* errorText );
// Returns map of assigned resultName and Eclipse Keyword.
static std::map<QString, QString> readProperties( const QString& fileName, RigEclipseCaseData* eclipseCase );
@ -56,7 +57,8 @@ private:
static bool isInputPropertyCandidate( const RigEclipseCaseData* caseData,
const std::string& eclipseKeyword,
size_t numberOfValues );
size_t numberOfValues,
QString* errorText );
static bool appendNewInputPropertyResult( RigEclipseCaseData* caseData,
const QString& resultName,

View File

@ -147,6 +147,13 @@ std::pair<std::string, std::vector<float>>
continue;
}
// End of keyword is defined by '/', parse values of line until '/' is found
auto positionOfEndToken = line.find_first_of( '/' );
if ( positionOfEndToken != std::string::npos )
{
line = line.substr( 0, positionOfEndToken );
}
if ( !isEndTokenKeywordRead )
{
size_t start = 0;
@ -186,8 +193,7 @@ std::pair<std::string, std::vector<float>>
}
}
// End of keyword is defined by '/'
if ( line.find_first_of( '/' ) != std::string::npos )
if ( positionOfEndToken != std::string::npos )
{
isEndTokenKeywordRead = true;
continue;

View File

@ -216,11 +216,14 @@ TEST( RifEclipseTextFileReader, KeywordsWithoutValue )
"/\n"
"SOIL\n"
"6.0 7.0 8.0 9.0\n"
"/\n";
"/\n"
"G4\n"
"1.0 2.0 3.0\n"
"0.123/ -- 1213 values in comment 123.123 \n";
auto keywordDataItems = RifEclipseTextFileReader::parseStringData( fileContent );
EXPECT_EQ( 3u, keywordDataItems.size() );
EXPECT_EQ( 4u, keywordDataItems.size() );
auto noEchoKeyword = keywordDataItems[0];
EXPECT_EQ( 0u, noEchoKeyword.values.size() );
@ -233,4 +236,8 @@ TEST( RifEclipseTextFileReader, KeywordsWithoutValue )
EXPECT_FLOAT_EQ( 1.0f, swatKeyword.values[0] );
EXPECT_FLOAT_EQ( 6.0f, soilKeyword.values[0] );
auto g4Keyword = keywordDataItems[3];
EXPECT_EQ( 4u, g4Keyword.values.size() );
EXPECT_FLOAT_EQ( 0.123f, g4Keyword.values[3] );
}