14#include <QXmlStreamReader>
36 bool parse(QIODevice *device);
56 std::string
getName(
const QString& localName,
57 const QString& qName);
69 : m_reportByType(), m_processor(processor), m_hasFatalError(false)
90 return m_d->
parse(device);
116 LDEBUG <<
"TestCasesReaderPrivate::parse";
118 if (
m_reader.readNextStartElement()) {
119 if (
m_reader.name() == QLatin1String(
"testcases"))
125 m_reader.raiseError(QObject::tr(
"The file is not a LIMA test cases file."));
141 Q_ASSERT(
m_reader.isStartElement() &&
m_reader.name() == QLatin1String(
"testcases"));
143 while (
m_reader.readNextStartElement()) {
144 if (
m_reader.name() == QLatin1String(
"testcase"))
147 m_reader.raiseError(QObject::tr(
"Expected a code but got a %1.").arg(
m_reader.name()));
166 LTRACE <<
"TestCasesReaderPrivate::readTestcase" <<
m_reader.name();
167 Q_ASSERT(
m_reader.isStartElement() &&
m_reader.name() == QLatin1String(
"testcase"));
169 LDEBUG <<
"TestCasesReaderPrivate::readTestcase: new testcase ";
172 auto typech =
m_reader.attributes().value(
"type").toString().toStdString();
177 bool hasExpl =
false;
178 bool hasCallParameters =
false;
179 bool hasTest =
false;
180 while (
m_reader.readNextStartElement())
182 if (
m_reader.name() == QLatin1String(
"call-parameters"))
184 hasCallParameters =
true;
187 else if (
m_reader.name() == QLatin1String(
"expl"))
192 else if (
m_reader.name() == QLatin1String(
"test"))
198 m_reader.raiseError(QObject::tr(
"Expected a call-parameters, a expl or a test but got a %1.").arg(
m_reader.name()));
200 if (!hasCallParameters)
201 m_reader.raiseError(QObject::tr(
"Testcase is missing a call-parameters."));
203 m_reader.raiseError(QObject::tr(
"Testcase should have at least one test. None found."));
208 <<
"has no explanation. This is wrong.";
218 << std::endl << e.
what() << std::endl;
236 std::cerr <<
"runtime error: " << e.
what() << std::endl;
238 throw std::runtime_error(e.
what());
259 LTRACE <<
"TestCasesReaderPrivate::readCallParameters" <<
m_reader.name();
260 Q_ASSERT(
m_reader.isStartElement() &&
m_reader.name() == QLatin1String(
"call-parameters"));
262 while (
m_reader.readNextStartElement())
264 if (
m_reader.name() == QLatin1String(
"param"))
266 else if (
m_reader.name() == QLatin1String(
"list"))
268 else if (
m_reader.name() == QLatin1String(
"map"))
271 m_reader.raiseError(QObject::tr(
"Expected a param, a list or a map but got a %1.").arg(
m_reader.name()));
283 Q_ASSERT(
m_reader.isStartElement() &&
m_reader.name() == QLatin1String(
"param"));
285 std::string key =
m_reader.attributes().value(
"key").toString().toStdString();
287 if (
m_reader.attributes().hasAttribute(
"value"))
289 val =
m_reader.attributes().value(
"value").toString().toStdString();
294 val =
m_reader.readElementText().toStdString();
296 LTRACE <<
"TestCasesReaderPrivate::readParam key:" << key <<
"value:" << val;
310 Q_ASSERT(
m_reader.isStartElement() &&
m_reader.name() == QLatin1String(
"list"));
317 std::pair<std::string,std::list<std::string> > newElem(
m_listKey,std::list<std::string>() );
325 while (
m_reader.readNextStartElement())
327 if (
m_reader.name() == QLatin1String(
"item"))
330 m_reader.raiseError(QObject::tr(
"Expected an item but got a %1.").arg(
m_reader.name()));
345 Q_ASSERT(
m_reader.isStartElement() &&
m_reader.name() == QLatin1String(
"map"));
351 std::pair<std::string,std::map<std::string,std::string> > newElem(
m_mapKey,std::map<std::string,std::string>() );
359 while (
m_reader.readNextStartElement())
361 if (
m_reader.name() == QLatin1String(
"item"))
364 m_reader.raiseError(QObject::tr(
"Expected ??? but got a %1.").arg(
m_reader.name()));
376 Q_ASSERT(
m_reader.isStartElement() &&
m_reader.name() == QLatin1String(
"item"));
382 std::string val =
m_reader.attributes().value(
"value").toString().toStdString();
383 (*pos).second.push_back(val);
386 LERROR <<
"!! TestCasesReader::startElement: no list for param " <<
m_listKey;
393 std::string attr =
m_reader.attributes().value(
"key").toString().toStdString();
394 std::string val =
m_reader.attributes().value(
"value").toString().toStdString();
395 (*pos).second.insert(make_pair(attr,val));
398 LERROR <<
"!! TestCasesReader::startElement: no list for param " <<
m_listKey;
403 m_reader.raiseError(QObject::tr(
"Should be in a list or a map when reading an item.").arg(
m_reader.name()));
415 Q_ASSERT(
m_reader.isStartElement() &&
m_reader.name() == QLatin1String(
"expl"));
431 Q_ASSERT(
m_reader.isStartElement() &&
m_reader.name() == QLatin1String(
"test"));
436 tu.
id =
m_reader.attributes().value(
"id").toString().toStdString();
437 tu.
trace =
m_reader.attributes().value(
"trace").toString().toStdString();
438 tu.
comment =
m_reader.attributes().value(
"comment").toString().toStdString();
439 tu.
left =
m_reader.attributes().value(
"left").toString().toStdString();
440 tu.
op =
m_reader.attributes().value(
"operator").toString().toStdString();
441 tu.
right =
m_reader.attributes().value(
"right").toString().toStdString();
444 LDEBUG <<
"TestCasesReader::startElement: push testUnit"
446 <<
", trace =" << tu.
trace
448 <<
", left =" << tu.
left
450 <<
", right =" << tu.
right
458 std::string newTextVal(
m_reader.readElementText().toStdString());
468 std::string& textVal = (*pos).second;
469 textVal.append(newTextVal);
486 auto errorStr = QObject::tr(
"%1, Line %2, column %3")
const std::string & what() const
bool isConditional() const
virtual TestCaseError processTestCase(const TestCase &testCase)=0
void readCallParameters()
std::string getName(const QString &localName, const QString &qName)
~TestCasesReaderPrivate()=default
std::map< std::string, TestCasesReader::TestReport > m_reportByType
TestCasesReaderPrivate(TestCaseProcessor &processor)
bool parse(QIODevice *device)
TestCaseProcessor & m_processor
QXmlStreamReader m_reader
QString errorString() const
bool hasFatalError() const
TestCasesReader(TestCaseProcessor &processor)
bool parse(QIODevice *device)
const std::map< std::string, TestReport > & reportByType() const
int const EXIT_FATAL_ERROR
char const *const FATAL_ERROR_TYPE
int exitCode(TestCasesHandler const &tch)
MultiValCallParams multiValCallParams
SimpleValCallParams simpleValCallParams
MapValCallParams mapValCallParams
std::list< TestUnit > tests