File indexing completed on 2024-05-05 16:07:08

0001 /*
0002     This file is part of the test suite of the Qt Toolkit.
0003     SPDX-FileCopyrightText: 2014 Digia Plc and/or its subsidiary(-ies) <http://www.qt-project.org/legal>
0004 
0005     SPDX-License-Identifier: LGPL-2.1-only WITH Qt-LGPL-exception-1.1 OR LGPL-3.0-only WITH Qt-LGPL-exception-1.1 OR LicenseRef-Qt-Commercial
0006 */
0007 
0008 #include "util.h"
0009 
0010 #include <QMutexLocker>
0011 #include <QQmlComponent>
0012 #include <QQmlContext>
0013 #include <QQmlEngine>
0014 #include <QQmlError>
0015 #include <QTest>
0016 #include <QTextStream>
0017 
0018 QQmlDataTest *QQmlDataTest::m_instance = nullptr;
0019 
0020 QQmlDataTest::QQmlDataTest()
0021     : m_dataDirectory(QFINDTESTDATA("input"))
0022     , m_dataDirectoryUrl(QUrl::fromLocalFile(m_dataDirectory + QLatin1Char('/')))
0023 {
0024     m_instance = this;
0025 }
0026 
0027 QQmlDataTest::~QQmlDataTest()
0028 {
0029     m_instance = nullptr;
0030 }
0031 
0032 void QQmlDataTest::initTestCase()
0033 {
0034     QVERIFY2(!m_dataDirectory.isEmpty(), "'input' directory not found");
0035     m_directory = QFileInfo(m_dataDirectory).absolutePath();
0036     QVERIFY2(QDir::setCurrent(m_directory), qPrintable(QLatin1String("Could not chdir to ") + m_directory));
0037 }
0038 
0039 QString QQmlDataTest::testFile(const QString &fileName) const
0040 {
0041     if (m_directory.isEmpty()) {
0042         qFatal("QQmlDataTest::initTestCase() not called.");
0043     }
0044     QString result = m_dataDirectory;
0045     result += QLatin1Char('/');
0046     result += fileName;
0047     return result;
0048 }
0049 
0050 QByteArray QQmlDataTest::msgComponentError(const QQmlComponent &c, const QQmlEngine *engine /* = 0 */)
0051 {
0052     QString result;
0053     const QList<QQmlError> errors = c.errors();
0054     QTextStream str(&result);
0055     str << "Component '" << c.url().toString() << "' has " << errors.size() << " errors: '";
0056     for (int i = 0; i < errors.size(); ++i) {
0057         if (i) {
0058             str << ", '";
0059         }
0060         str << errors.at(i).toString() << '\'';
0061     }
0062     if (!engine) {
0063         if (QQmlContext *context = c.creationContext()) {
0064             engine = context->engine();
0065         }
0066     }
0067     if (engine) {
0068         str << " Import paths: (" << engine->importPathList().join(QLatin1String(", ")) << ") Plugin paths: ("
0069             << engine->pluginPathList().join(QLatin1String(", ")) << ')';
0070     }
0071     return result.toLocal8Bit();
0072 }
0073 
0074 Q_GLOBAL_STATIC(QMutex, qQmlTestMessageHandlerMutex)
0075 
0076 QQmlTestMessageHandler *QQmlTestMessageHandler::m_instance = nullptr;
0077 
0078 void QQmlTestMessageHandler::messageHandler(QtMsgType, const QMessageLogContext &, const QString &message)
0079 {
0080     QMutexLocker locker(qQmlTestMessageHandlerMutex());
0081     if (QQmlTestMessageHandler::m_instance) {
0082         QQmlTestMessageHandler::m_instance->m_messages.push_back(message);
0083     }
0084 }
0085 
0086 QQmlTestMessageHandler::QQmlTestMessageHandler()
0087 {
0088     QMutexLocker locker(qQmlTestMessageHandlerMutex());
0089     Q_ASSERT(!QQmlTestMessageHandler::m_instance);
0090     QQmlTestMessageHandler::m_instance = this;
0091     m_oldHandler = qInstallMessageHandler(messageHandler);
0092 }
0093 
0094 QQmlTestMessageHandler::~QQmlTestMessageHandler()
0095 {
0096     QMutexLocker locker(qQmlTestMessageHandlerMutex());
0097     Q_ASSERT(QQmlTestMessageHandler::m_instance);
0098     qInstallMessageHandler(m_oldHandler);
0099     QQmlTestMessageHandler::m_instance = nullptr;
0100 }
0101 
0102 #include "moc_util.cpp"