Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 27 additions & 29 deletions Fwk/AppFwk/cafPdmScripting/cafPdmFieldScriptingCapability.h
Original file line number Diff line number Diff line change
Expand Up @@ -209,12 +209,24 @@ struct PdmFieldScriptingCapabilityIOHandler
bool stringsAreQuoted = true )
{
inputStream >> fieldValue;
if ( inputStream.status() == QTextStream::ReadCorruptData )
if ( inputStream.status() != QTextStream::Ok )
{
errorMessageContainer->addError( "Argument value is unreadable in the argument: \"" +
errorMessageContainer->currentArgument + "\" in the command: \"" +
errorMessageContainer->currentCommand + "\"" );
QString errorMessage;
if ( inputStream.status() == QTextStream::ReadPastEnd )
{
errorMessage = "Read past end of argument";
}
else if ( inputStream.status() == QTextStream::ReadCorruptData )
{
errorMessage = "Argument value is unreadable";
}
else
{
errorMessage = "Unknown read error";
}

errorMessageContainer->addError( errorMessage + ": \"" + errorMessageContainer->currentArgument +
"\" in the command: \"" + errorMessageContainer->currentCommand + "\"" );
inputStream.setStatus( QTextStream::Ok );
}
}
Expand Down Expand Up @@ -325,23 +337,17 @@ struct PdmFieldScriptingCapabilityIOHandler<std::optional<T>>
PdmScriptIOMessages* errorMessageContainer,
bool stringsAreQuoted = true )
{
QString textValue;
T realValue;

PdmFieldScriptingCapabilityIOHandler<QString>::writeToField( textValue,
inputStream,
errorMessageContainer,
stringsAreQuoted );
textValue.remove( '"' );
if ( !textValue.isEmpty() )
// Use error count to detect if error messages were added during the read operation
// If so, we do not set the field value
auto incomingErrorCount = errorMessageContainer->m_messages.size();

PdmFieldScriptingCapabilityIOHandler<T>::writeToField( realValue, inputStream, errorMessageContainer, stringsAreQuoted );

if ( errorMessageContainer->m_messages.size() == incomingErrorCount )
{
QTextStream singleValueStream( &textValue );
T singleValue;
bool noStringQuotes = false;
PdmFieldScriptingCapabilityIOHandler<T>::writeToField( singleValue,
singleValueStream,
errorMessageContainer,
noStringQuotes );
fieldValue = singleValue;
fieldValue = realValue;
}
else
{
Expand All @@ -354,19 +360,11 @@ struct PdmFieldScriptingCapabilityIOHandler<std::optional<T>>
bool quoteStrings = true,
bool quoteNonBuiltins = false )
{
QString textValue;

if ( fieldValue.has_value() )
{
QTextStream singleValueStream( &textValue );
singleValueStream << fieldValue.value();
auto realValue = fieldValue.value();
PdmFieldScriptingCapabilityIOHandler<T>::readFromField( realValue, outputStream, quoteStrings, quoteNonBuiltins );
}
else
{
textValue = "";
}

PdmFieldScriptingCapabilityIOHandler<QString>::readFromField( textValue, outputStream, quoteStrings, quoteNonBuiltins );
}
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,9 @@ TEST( PdmFieldSerialization, ValueList )
//--------------------------------------------------------------------------------------------------
TEST( PdmFieldSerialization, OptionalValues )
{
// See currently supported types in PdmPythonGenerator::dataTypeString

// Optional string
{
std::optional<QString> optionalString = std::nullopt;
QString text;
Expand All @@ -144,7 +147,7 @@ TEST( PdmFieldSerialization, OptionalValues )
&messages,
stringsAreQuoted );

const QString expected = "\"\"";
const QString expected = "";
EXPECT_STREQ( expected.toStdString().c_str(), text.toStdString().c_str() );

std::optional<QString> result;
Expand Down Expand Up @@ -182,4 +185,100 @@ TEST( PdmFieldSerialization, OptionalValues )

EXPECT_STREQ( sourceText.toStdString().c_str(), result.value().toStdString().c_str() );
}

// Optional float
{
float sourceValue = 23.45;
std::optional<float> optionalString = sourceValue;

QString text;
QTextStream stream( &text );

caf::PdmScriptIOMessages messages;

caf::PdmFieldScriptingCapabilityIOHandler<std::optional<float>>::readFromField( optionalString, stream, &messages );

const QString expected = "23.45";
EXPECT_STREQ( expected.toStdString().c_str(), text.toStdString().c_str() );

std::optional<float> result;
caf::PdmFieldScriptingCapabilityIOHandler<std::optional<float>>::writeToField( result, stream, &messages );

EXPECT_TRUE( result.has_value() );
EXPECT_DOUBLE_EQ( sourceValue, result.value() );
}

// Optional double
{
double sourceValue = 23.45;
std::optional<double> optionalString = sourceValue;

QString text;
QTextStream stream( &text );

caf::PdmScriptIOMessages messages;

caf::PdmFieldScriptingCapabilityIOHandler<std::optional<double>>::readFromField( optionalString, stream, &messages );

const QString expected = "2.345000000000000e+01";
EXPECT_STREQ( expected.toStdString().c_str(), text.toStdString().c_str() );

std::optional<double> result;
caf::PdmFieldScriptingCapabilityIOHandler<std::optional<double>>::writeToField( result, stream, &messages );

EXPECT_TRUE( result.has_value() );
EXPECT_DOUBLE_EQ( sourceValue, result.value() );
}

// Optional bool
{
bool sourceValue = true;
std::optional<bool> optionalString = sourceValue;
QString text;
QTextStream stream( &text );
caf::PdmScriptIOMessages messages;
caf::PdmFieldScriptingCapabilityIOHandler<std::optional<bool>>::readFromField( optionalString, stream, &messages );

const QString expected = "true";
EXPECT_STREQ( expected.toStdString().c_str(), text.toStdString().c_str() );

std::optional<bool> result;
caf::PdmFieldScriptingCapabilityIOHandler<std::optional<bool>>::writeToField( result, stream, &messages );
EXPECT_TRUE( result.has_value() );
EXPECT_EQ( sourceValue, result.value() );
}

// Optional int
{
int sourceValue = 2345;
std::optional<int> optionalString = sourceValue;
QString text;
QTextStream stream( &text );
caf::PdmScriptIOMessages messages;
caf::PdmFieldScriptingCapabilityIOHandler<std::optional<int>>::readFromField( optionalString, stream, &messages );

const QString expected = "2345";
EXPECT_STREQ( expected.toStdString().c_str(), text.toStdString().c_str() );

std::optional<int> result;
caf::PdmFieldScriptingCapabilityIOHandler<std::optional<int>>::writeToField( result, stream, &messages );
EXPECT_TRUE( result.has_value() );
EXPECT_EQ( sourceValue, result.value() );
}

// Optional int with no value
{
std::optional<int> optionalInt;
QString text;
QTextStream stream( &text );
caf::PdmScriptIOMessages messages;
caf::PdmFieldScriptingCapabilityIOHandler<std::optional<int>>::readFromField( optionalInt, stream, &messages );

const QString expected = "";
EXPECT_STREQ( expected.toStdString().c_str(), text.toStdString().c_str() );

std::optional<int> result;
caf::PdmFieldScriptingCapabilityIOHandler<std::optional<int>>::writeToField( result, stream, &messages );
EXPECT_FALSE( result.has_value() );
}
}