Replace RifRoffReader code to utilize roffcpp::reader (#10098)

- Replace current content if RifRoffReader to utilize roffcpp
- Remove unit tests not applicable for function (some previous tests now belongs to roffcpp)
This commit is contained in:
Jørgen Herje 2023-04-17 09:45:14 +02:00 committed by GitHub
parent 6f6dc80bc6
commit c7b915c141
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 31 additions and 126 deletions

View File

@ -48,7 +48,8 @@ void RicFaciesPropertiesImportTools::importFaciesPropertiesFromFile( const QStri
std::map<int, QString> codeNames;
try
{
RifRoffReader::readCodeNames( filePath, codeNames );
const QString parameterTagName = "composite";
RifRoffReader::readCodeNames( filePath, parameterTagName, codeNames );
}
catch ( RifRoffReaderException& ex )
{

View File

@ -21,121 +21,48 @@
#include <QFile>
#include <QTextStream>
const QString codeValuesString = QString( "array int codeValues" );
const QString codeNamesString = QString( "array char codeNames" );
const QString headerString = QString( "roff-asc" );
#include "roffcpp/src/Reader.hpp"
bool RifRoffReader::isCodeValuesDefinition( const QString& line )
#include <fstream>
void RifRoffReader::readCodeNames( const QString& filename, const QString& parameterTagName, std::map<int, QString>& codeNames )
{
return line.startsWith( codeValuesString );
}
codeNames.clear();
bool RifRoffReader::isCodeNamesDefinition( const QString& line )
{
return line.startsWith( codeNamesString );
}
bool RifRoffReader::isCorrectHeader( const QString& line )
{
return line.startsWith( headerString );
}
int RifRoffReader::extractNumberAfterString( const QString& line, const QString& prefix )
{
QString copiedLine( line );
bool ok;
int num = copiedLine.remove( prefix ).toInt( &ok );
if ( !ok )
{
throw RifRoffReaderException( "Unexpected value: not an integer." );
}
return num;
}
int RifRoffReader::extractCodeValuesCount( const QString& line )
{
return extractNumberAfterString( line, codeValuesString );
}
int RifRoffReader::extractCodeNamesCount( const QString& line )
{
return extractNumberAfterString( line, codeNamesString );
}
void RifRoffReader::readCodeNames( const QString& filename, std::map<int, QString>& codeNames )
{
QFile file( filename );
if ( !file.open( QIODevice::ReadOnly | QIODevice::Text ) )
std::ifstream stream( filename.toStdString(), std::ios::binary );
if ( !stream.good() )
{
throw RifRoffReaderException( "Unable to open roff file." );
}
bool isFirstLine = true;
int numCodeValues = -1;
int numCodeNames = -1;
roff::Reader reader( stream );
reader.parse();
std::vector<int> readCodeValues;
std::vector<QString> readCodeNames;
std::vector<std::pair<std::string, roff::Token::Kind>> arrayTypes = reader.getNamedArrayTypes();
QTextStream in( &file );
while ( !in.atEnd() )
{
QString line = in.readLine();
// Find array types by keywords
const std::string codeNamesKeyword = parameterTagName.toStdString() + ".codeNames";
const std::string codeValuesKeyword = parameterTagName.toStdString() + ".codeValues";
auto codeNamesItr = std::find_if( arrayTypes.begin(),
arrayTypes.end(),
[&codeNamesKeyword]( const auto& arrayType ) { return arrayType.first == codeNamesKeyword; } );
auto codeValuesItr = std::find_if( arrayTypes.begin(),
arrayTypes.end(),
[&codeValuesKeyword]( const auto& arrayType ) { return arrayType.first == codeValuesKeyword; } );
// Check that the first line has the roff-asc header
if ( isFirstLine )
{
if ( !isCorrectHeader( line ) )
{
throw RifRoffReaderException( "Unexpected file type: roff-asc header missing." );
}
isFirstLine = false;
}
else if ( isCodeValuesDefinition( line ) )
{
// Expected line:
// array int codeValues 99
numCodeValues = extractCodeValuesCount( line );
for ( int i = 0; i < numCodeValues; i++ )
{
// The code values comes next, can be multiple per line.
int codeValue;
in >> codeValue;
readCodeValues.push_back( codeValue );
}
}
else if ( isCodeNamesDefinition( line ) )
{
// Expected line:
// array char codeNames 99
numCodeNames = extractCodeNamesCount( line );
for ( int i = 0; i < numCodeNames; i++ )
{
// Read code names. Assumes one name per line.
QString codeName = in.readLine();
readCodeNames.push_back( codeName.trimmed().remove( "\"" ) );
}
}
}
if ( codeNamesItr == arrayTypes.end() ) throw RifRoffReaderException( "Code names not found." );
if ( codeValuesItr == arrayTypes.end() ) throw RifRoffReaderException( "Code values not found." );
if ( numCodeValues == -1 )
{
throw RifRoffReaderException( "Code values not found." );
}
const auto readCodeNames = reader.getStringArray( codeNamesKeyword );
const auto readCodeValues = reader.getIntArray( codeValuesKeyword );
if ( numCodeNames == -1 )
{
throw RifRoffReaderException( "Code names not found." );
}
if ( numCodeNames != numCodeValues )
if ( readCodeNames.size() != readCodeValues.size() )
{
throw RifRoffReaderException( "Inconsistent code names and values: must be equal length." );
}
for ( int i = 0; i < numCodeNames; i++ )
for ( size_t i = 0; i < readCodeNames.size(); ++i )
{
codeNames[readCodeValues[i]] = readCodeNames[i];
codeNames[readCodeValues[i]] = QString::fromStdString( readCodeNames[i] );
}
}

View File

@ -45,14 +45,5 @@ class RifRoffReader
{
public:
// Throws RifRoffReaderException on error
static void readCodeNames( const QString& filename, std::map<int, QString>& codeNames );
private:
static bool isCorrectHeader( const QString& line );
static bool isCodeNamesDefinition( const QString& line );
static bool isCodeValuesDefinition( const QString& line );
static int extractNumberAfterString( const QString& line, const QString& prefix );
static int extractCodeNamesCount( const QString& line );
static int extractCodeValuesCount( const QString& line );
static void readCodeNames( const QString& filename, const QString& parameterTagName, std::map<int, QString>& codeNames );
};

View File

@ -16,7 +16,7 @@ TEST( RifRoffReader, ReadValidFile )
EXPECT_TRUE( QFile::exists( filePath ) );
std::map<int, QString> codeNames;
RifRoffReader::readCodeNames( filePath, codeNames );
RifRoffReader::readCodeNames( filePath, "composite", codeNames );
ASSERT_EQ( 6u, codeNames.size() );
for ( int i = 0; i < 6; i++ )
@ -35,7 +35,7 @@ std::string readIncorrectFile( const QString filename )
std::map<int, QString> codeNames;
try
{
RifRoffReader::readCodeNames( filePath, codeNames );
RifRoffReader::readCodeNames( filePath, "composite", codeNames );
return "";
}
catch ( RifRoffReaderException& ex )
@ -44,13 +44,6 @@ std::string readIncorrectFile( const QString filename )
}
}
TEST( RifRoffReader, ReadWrongFileType )
{
// Read a surface file: no expected to work
QString filename( "RifSurfaceImporter/test.ptl" );
ASSERT_EQ( readIncorrectFile( filename ), std::string( "Unexpected file type: roff-asc header missing." ) );
}
TEST( RifRoffReader, ReadNonExistingFileType )
{
// Read a non-existing file
@ -58,13 +51,6 @@ TEST( RifRoffReader, ReadNonExistingFileType )
ASSERT_EQ( readIncorrectFile( filename ), std::string( "Unable to open roff file." ) );
}
TEST( RifRoffReader, ReadFileWithIncorrectInteger )
{
// Read a file with incorrect integer for code values
QString filename( "RifRoffReader/code_values_integer_wrong.roff" );
ASSERT_EQ( readIncorrectFile( filename ), std::string( "Unexpected value: not an integer." ) );
}
TEST( RifRoffReader, ReadFileCodeNamesMissing )
{
// Read a file without code names