#3378 Fix boolean reading form command file.

This commit is contained in:
Gaute Lindkvist 2018-09-19 09:25:27 +02:00
parent cc2faae87d
commit 09d263cc39
3 changed files with 91 additions and 18 deletions

View File

@ -86,3 +86,47 @@ void RicfFieldWriter<QString>::writeFieldData(const QString& fieldValue, QTextSt
}
outputStream << "\"";
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicfFieldReader<bool>::readFieldData(bool& fieldValue, QTextStream& inputStream, RicfMessages* errorMessageContainer)
{
errorMessageContainer->skipWhiteSpaceWithLineNumberCount(inputStream);
QString accumulatedFieldValue;
QChar nextChar;
QChar currentChar;
while (!inputStream.atEnd())
{
nextChar = errorMessageContainer->peekNextChar(inputStream);
if (nextChar.isLetter())
{
currentChar = errorMessageContainer->readCharWithLineNumberCount(inputStream);
accumulatedFieldValue += currentChar;
}
else
{
break;
}
}
// Accept TRUE or False in any case combination.
bool evaluatesToTrue = QString::compare(accumulatedFieldValue, QString("true"), Qt::CaseInsensitive) == 0;
bool evaluatesToFalse = QString::compare(accumulatedFieldValue, QString("false"), Qt::CaseInsensitive) == 0;
if (evaluatesToTrue == evaluatesToFalse)
{
QString formatString("Boolean argument \"%1\" for the command \"%2\" does not evaluate to either true or false");
QString errorMessage = formatString.arg(errorMessageContainer->currentArgument).arg(errorMessageContainer->currentCommand);
errorMessageContainer->addError(errorMessage);
}
fieldValue = evaluatesToTrue;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicfFieldWriter<bool>::writeFieldData(const bool& fieldValue, QTextStream& outputStream)
{
// Lower-case true/false is used in the documentation.
outputStream << (fieldValue ? "true" : "false");
}

View File

@ -65,6 +65,19 @@ struct RicfFieldWriter<QString>
static void writeFieldData(const QString & fieldValue, QTextStream& outputStream);
};
template <>
struct RicfFieldReader<bool>
{
static void readFieldData(bool& fieldValue, QTextStream& inputStream, RicfMessages* errorMessageContainer);
};
template <>
struct RicfFieldWriter<bool>
{
static void writeFieldData(const bool& fieldValue, QTextStream& outputStream);
};
template <typename T>
struct RicfFieldReader< caf::AppEnum<T> >
{

View File

@ -16,15 +16,18 @@ public:
RICF_InitField(&m_textArgument, "TextArgument", QString(), "TextArgument", "", "", "");
RICF_InitField(&m_doubleArgument, "DoubleArgument", 0.0, "DoubleArgument", "", "", "");
RICF_InitField(&m_intArgument, "IntArgument", 0, "IntArgument", "", "", "");
RICF_InitField(&m_boolArgument, "BoolArgument", false, "BoolArgument", "", "", "");
}
virtual void execute() override { std::cout << "TestCommand1::execute(" << "\"" << m_textArgument().toStdString() << "\", "
<< m_doubleArgument() << ", "
<< m_intArgument << ");" << std::endl; }
<< m_intArgument << ", "
<< m_boolArgument << ");" << std::endl; }
caf::PdmField<QString> m_textArgument;
caf::PdmField<double> m_doubleArgument;
caf::PdmField<int> m_intArgument;
caf::PdmField<bool> m_boolArgument;
};
CAF_PDM_SOURCE_INIT(TestCommand1, "TestCommand1");
@ -39,15 +42,17 @@ public:
RICF_InitField(&m_textArgument, "ta", QString(), "TextArgument", "", "", "");
RICF_InitField(&m_doubleArgument, "da", 0.0, "DoubleArgument", "", "", "");
RICF_InitField(&m_intArgument, "ia", 0,"IntArgument", "", "", "");
RICF_InitField(&m_boolArgument, "ba", false,"BoolArgument", "", "", "");
}
virtual void execute() override { std::cout << "TC2::execute(" << "\"" << m_textArgument().toStdString() << "\", "
<< m_doubleArgument() << ", "
<< m_intArgument << ");" << std::endl; }
<< m_intArgument() << ", " << m_boolArgument() << ");" << std::endl; }
caf::PdmField<QString> m_textArgument;
caf::PdmField<double> m_doubleArgument;
caf::PdmField<int> m_intArgument;
caf::PdmField<bool> m_boolArgument;
};
CAF_PDM_SOURCE_INIT(TC2, "TC2");
@ -60,8 +65,9 @@ TEST(RicfCommands, Test1)
{
QString commandString("TestCommand1(IntArgument=3, TextArgument=\"Dette er en tekst, \\\"og\\\" jeg er: (happy)\", DoubleArgument=5.0e3) \n"
"TestCommand1 ( IntArgument = 4 , \n TextArgument = \"Dette er en tekst, \\\"og\\\" jeg er: (happy)\", \n DoubleArgument = 5.0e-3 ) \n"
" TestCommand1(TextArgument=\"Litt kortere tekst.\") \n"
"TC2 ( ta = \"Hepp\", ia = 3, da= 0.123)");
" TestCommand1(TextArgument=\"Litt kortere tekst.\", BoolArgument=true) \n"
"TC2( ia = -12, ba=True, ta = \"Floff\", da =-662.518)\n"
"TC2 ( ta = \"Hepp\", ia = 3, ba = false, da= 0.123)");
//std::cout << commandString.toStdString() << std::endl;
@ -69,24 +75,34 @@ TEST(RicfCommands, Test1)
RicfMessages errors;
auto objects = RicfCommandFileReader::readCommands(inputStream, caf::PdmDefaultObjectFactory::instance(), &errors);
EXPECT_EQ((size_t)4, objects.size());
EXPECT_EQ((size_t)5, objects.size());
auto tc2 = dynamic_cast<TestCommand1*>(objects[0]);
EXPECT_EQ(39, tc2->m_textArgument().size());
EXPECT_EQ(5.0e3, tc2->m_doubleArgument());
auto tc1 = dynamic_cast<TestCommand1*>(objects[0]);
EXPECT_EQ(39, tc1->m_textArgument().size());
EXPECT_EQ(5.0e3, tc1->m_doubleArgument());
EXPECT_EQ(false, tc1->m_boolArgument());
tc2 = dynamic_cast<TestCommand1*>(objects[1]);
EXPECT_EQ(39, tc2->m_textArgument().size());
EXPECT_EQ(5e-3, tc2->m_doubleArgument());
tc1 = dynamic_cast<TestCommand1*>(objects[1]);
EXPECT_EQ(39, tc1->m_textArgument().size());
EXPECT_EQ(5e-3, tc1->m_doubleArgument());
EXPECT_EQ(false, tc1->m_boolArgument());
tc2 = dynamic_cast<TestCommand1*>(objects[2]);
EXPECT_EQ(19, tc2->m_textArgument().size());
EXPECT_EQ(0.0, tc2->m_doubleArgument());
tc1 = dynamic_cast<TestCommand1*>(objects[2]);
EXPECT_EQ(19, tc1->m_textArgument().size());
EXPECT_EQ(0.0, tc1->m_doubleArgument());
EXPECT_EQ(true, tc1->m_boolArgument());
auto tc3 = dynamic_cast<TC2*>(objects[3]);
EXPECT_EQ(4, tc3->m_textArgument().size());
EXPECT_EQ(0.123, tc3->m_doubleArgument());
EXPECT_EQ(3, tc3->m_intArgument());
auto tc2 = dynamic_cast<TC2*>(objects[3]);
EXPECT_EQ(5, tc2->m_textArgument().size());
EXPECT_EQ(-662.518, tc2->m_doubleArgument());
EXPECT_EQ(-12, tc2->m_intArgument());
EXPECT_EQ(true, tc2->m_boolArgument());
tc2 = dynamic_cast<TC2*>(objects[4]);
EXPECT_EQ(4, tc2->m_textArgument().size());
EXPECT_EQ(0.123, tc2->m_doubleArgument());
EXPECT_EQ(3, tc2->m_intArgument());
EXPECT_EQ(false, tc2->m_boolArgument());
for (auto obj: objects)
{