summaryrefslogtreecommitdiffstats
path: root/tests/auto/xmlpatternsxqts/lib/XSDTSTestCase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/xmlpatternsxqts/lib/XSDTSTestCase.cpp')
-rw-r--r--tests/auto/xmlpatternsxqts/lib/XSDTSTestCase.cpp346
1 files changed, 346 insertions, 0 deletions
diff --git a/tests/auto/xmlpatternsxqts/lib/XSDTSTestCase.cpp b/tests/auto/xmlpatternsxqts/lib/XSDTSTestCase.cpp
new file mode 100644
index 0000000..b19eb91
--- /dev/null
+++ b/tests/auto/xmlpatternsxqts/lib/XSDTSTestCase.cpp
@@ -0,0 +1,346 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the Patternist project on Trolltech Labs.
+**
+** $TROLLTECH_GPL_LICENSE$
+**
+***************************************************************************
+*/
+
+#include <QColor>
+#include <QFile>
+#include <QFileInfo>
+#include <QVariant>
+#include <QtDebug>
+
+#include "XSDTSTestCase.h"
+
+#include "qxmlschema.h"
+#include "qxmlschemavalidator.h"
+
+using namespace QPatternistSDK;
+using namespace QPatternist;
+
+XSDTSTestCase::XSDTSTestCase(const Scenario scen, TreeItem *p, TestType testType)
+ : m_scenario(scen)
+ , m_parent(p)
+ , m_testType(testType)
+{
+}
+
+XSDTSTestCase::~XSDTSTestCase()
+{
+ qDeleteAll(m_baseLines);
+}
+
+TestResult::List XSDTSTestCase::execute(const ExecutionStage, TestSuite*)
+{
+ ErrorHandler errHandler;
+ ErrorHandler::installQtMessageHandler(&errHandler);
+
+ TestResult::List retval;
+ TestResult::Status resultStatus = TestResult::Unknown;
+ QString serialized;
+
+ if (m_testType == SchemaTest) {
+ executeSchemaTest(resultStatus, serialized, &errHandler);
+ } else {
+ executeInstanceTest(resultStatus, serialized, &errHandler);
+ }
+
+ resultStatus = TestBaseLine::scan(serialized, baseLines());
+ Q_ASSERT(resultStatus != TestResult::Unknown);
+
+ m_result = new TestResult(name(), resultStatus, 0, errHandler.messages(),
+ QPatternist::Item::List(), serialized);
+ retval.append(m_result);
+ ErrorHandler::installQtMessageHandler(0);
+ changed(this);
+ return retval;
+}
+
+void XSDTSTestCase::executeSchemaTest(TestResult::Status &resultStatus, QString &serialized, QAbstractMessageHandler *handler)
+{
+ QFile file(m_schemaUri.path());
+ if (!file.open(QIODevice::ReadOnly)) {
+ resultStatus = TestResult::Fail;
+ serialized = QString();
+ return;
+ }
+
+ QXmlSchema schema;
+ schema.setMessageHandler(handler);
+ schema.load(&file, m_schemaUri);
+
+ if (schema.isValid()) {
+ resultStatus = TestResult::Pass;
+ serialized = QString::fromLatin1("true");
+ } else {
+ resultStatus = TestResult::Pass;
+ serialized = QString::fromLatin1("false");
+ }
+}
+
+void XSDTSTestCase::executeInstanceTest(TestResult::Status &resultStatus, QString &serialized, QAbstractMessageHandler *handler)
+{
+ QFile instanceFile(m_instanceUri.path());
+ if (!instanceFile.open(QIODevice::ReadOnly)) {
+ resultStatus = TestResult::Fail;
+ serialized = QString();
+ return;
+ }
+
+ QXmlSchema schema;
+ if (m_schemaUri.isValid()) {
+ QFile file(m_schemaUri.path());
+ if (!file.open(QIODevice::ReadOnly)) {
+ resultStatus = TestResult::Fail;
+ serialized = QString();
+ return;
+ }
+
+ schema.setMessageHandler(handler);
+ schema.load(&file, m_schemaUri);
+
+ if (!schema.isValid()) {
+ resultStatus = TestResult::Pass;
+ serialized = QString::fromLatin1("false");
+ return;
+ }
+ }
+
+ QXmlSchemaValidator validator(schema);
+ validator.setMessageHandler(handler);
+
+ qDebug("check %s", qPrintable(m_instanceUri.path()));
+ if (validator.validate(&instanceFile, m_instanceUri)) {
+ resultStatus = TestResult::Pass;
+ serialized = QString::fromLatin1("true");
+ } else {
+ resultStatus = TestResult::Pass;
+ serialized = QString::fromLatin1("false");
+ }
+}
+
+QVariant XSDTSTestCase::data(const Qt::ItemDataRole role, int column) const
+{
+ if(role == Qt::DisplayRole)
+ {
+ if(column == 0)
+ return title();
+
+ const TestResult *const tr = testResult();
+ if(!tr)
+ {
+ if(column == 1)
+ return TestResult::displayName(TestResult::NotTested);
+ else
+ return QString();
+ }
+ const TestResult::Status status = tr->status();
+
+ switch(column)
+ {
+ case 1:
+ return status == TestResult::Pass ? QString(QChar::fromLatin1('1'))
+ : QString(QChar::fromLatin1('0'));
+ case 2:
+ return status == TestResult::Fail ? QString(QChar::fromLatin1('1'))
+ : QString(QChar::fromLatin1('0'));
+ default:
+ return QString();
+ }
+ }
+
+ if(role != Qt::BackgroundRole)
+ return QVariant();
+
+ const TestResult *const tr = testResult();
+
+ if(!tr)
+ {
+ if(column == 0)
+ return Qt::yellow;
+ else
+ return QVariant();
+ }
+
+ const TestResult::Status status = tr->status();
+
+ if(status == TestResult::NotTested || status == TestResult::Unknown)
+ return Qt::yellow;
+
+ switch(column)
+ {
+ case 1:
+ return status == TestResult::Pass ? Qt::green : QVariant();
+ case 2:
+ return status == TestResult::Fail ? Qt::red : QVariant();
+ default:
+ return QVariant();
+ }
+}
+
+QString XSDTSTestCase::sourceCode(bool &ok) const
+{
+ QFile file((m_testType == SchemaTest ? m_schemaUri : m_instanceUri).toLocalFile());
+
+ QString err;
+
+ if(!file.exists())
+ err = QString::fromLatin1("Error: %1 does not exist.").arg(file.fileName());
+ else if(!QFileInfo(file.fileName()).isFile())
+ err = QString::fromLatin1("Error: %1 is not a file, cannot display it.").arg(file.fileName());
+ else if(!file.open(QIODevice::ReadOnly))
+ err = QString::fromLatin1("Error: Could not open %1. Likely a permission error.")
+ .arg(file.fileName());
+
+ if(err.isNull()) /* No errors. */
+ {
+ ok = true;
+ /* Scary, we assume the query is stored in UTF-8. */
+ return QString::fromUtf8(file.readAll());
+ }
+ else
+ {
+ ok = false;
+ return err;
+ }
+}
+
+int XSDTSTestCase::columnCount() const
+{
+ return 2;
+}
+
+void XSDTSTestCase::addBaseLine(TestBaseLine *line)
+{
+ m_baseLines.append(line);
+}
+
+QString XSDTSTestCase::name() const
+{
+ return m_name;
+}
+
+QString XSDTSTestCase::creator() const
+{
+ return m_creator;
+}
+
+QString XSDTSTestCase::description() const
+{
+ return m_description;
+}
+
+QDate XSDTSTestCase::lastModified() const
+{
+ return m_lastModified;
+}
+
+bool XSDTSTestCase::isXPath() const
+{
+ return false;
+}
+
+TestCase::Scenario XSDTSTestCase::scenario() const
+{
+ return m_scenario;
+}
+
+void XSDTSTestCase::setName(const QString &n)
+{
+ m_name = n;
+}
+
+void XSDTSTestCase::setCreator(const QString &ctor)
+{
+ m_creator = ctor;
+}
+
+void XSDTSTestCase::setDescription(const QString &descriptionP)
+{
+ m_description = descriptionP;
+}
+
+void XSDTSTestCase::setLastModified(const QDate &date)
+{
+ m_lastModified = date;
+}
+
+void XSDTSTestCase::setSchemaUri(const QUrl &uri)
+{
+ m_schemaUri = uri;
+}
+
+void XSDTSTestCase::setInstanceUri(const QUrl &uri)
+{
+ m_instanceUri = uri;
+}
+
+TreeItem *XSDTSTestCase::parent() const
+{
+ return m_parent;
+}
+
+QString XSDTSTestCase::title() const
+{
+ return m_name;
+}
+
+TestBaseLine::List XSDTSTestCase::baseLines() const
+{
+ Q_ASSERT_X(!m_baseLines.isEmpty(), Q_FUNC_INFO,
+ qPrintable(QString::fromLatin1("The test %1 has no base lines, it should have at least one.").arg(name())));
+ return m_baseLines;
+}
+
+QUrl XSDTSTestCase::schemaUri() const
+{
+ return m_schemaUri;
+}
+
+QUrl XSDTSTestCase::instanceUri() const
+{
+ return m_instanceUri;
+}
+
+void XSDTSTestCase::setContextItemSource(const QUrl &uri)
+{
+ m_contextItemSource = uri;
+}
+
+QUrl XSDTSTestCase::contextItemSource() const
+{
+ return m_contextItemSource;
+}
+
+void XSDTSTestCase::setParent(TreeItem *const p)
+{
+ m_parent = p;
+}
+
+QPatternist::ExternalVariableLoader::Ptr XSDTSTestCase::externalVariableLoader() const
+{
+ return QPatternist::ExternalVariableLoader::Ptr();
+}
+
+TestResult *XSDTSTestCase::testResult() const
+{
+ return m_result;
+}
+
+TestItem::ResultSummary XSDTSTestCase::resultSummary() const
+{
+ if(m_result)
+ return ResultSummary(m_result->status() == TestResult::Pass ? 1 : 0,
+ 1);
+
+ return ResultSummary(0, 1);
+}
+
+// vim: et:ts=4:sw=4:sts=4
+