aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/quickcontrols/snippets
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/quickcontrols/snippets')
-rw-r--r--tests/auto/quickcontrols/snippets/CMakeLists.txt70
-rw-r--r--tests/auto/quickcontrols/snippets/data/dependencies.qml7
-rw-r--r--tests/auto/quickcontrols/snippets/qtquickcontrols2.conf3
-rw-r--r--tests/auto/quickcontrols/snippets/tst_snippets.cpp136
4 files changed, 216 insertions, 0 deletions
diff --git a/tests/auto/quickcontrols/snippets/CMakeLists.txt b/tests/auto/quickcontrols/snippets/CMakeLists.txt
new file mode 100644
index 0000000000..adad1e69c5
--- /dev/null
+++ b/tests/auto/quickcontrols/snippets/CMakeLists.txt
@@ -0,0 +1,70 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+# Generated from snippets.pro.
+
+if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_snippets LANGUAGES C CXX ASM)
+ find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
+endif()
+
+#####################################################################
+## tst_snippets Test:
+#####################################################################
+
+# Collect test data
+file(GLOB_RECURSE test_data_glob
+ RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/data/*)
+list(APPEND test_data ${test_data_glob})
+
+set(SNIPPETS_PATH \\\"${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/quickcontrols/doc/snippets\\\")
+
+if(WEBOS)
+ # Collect snippets for webOS
+ file(GLOB_RECURSE test_snippets_glob
+ RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/quickcontrols/doc/snippets/*)
+ list(APPEND test_snippets ${test_snippets_glob})
+
+ # Copy snippets to a location which is included in the webOS emulator image
+ file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/data/snippets)
+ file(COPY ${test_snippets} DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/data/snippets)
+
+ set(SNIPPETS_PATH \\\"./data/snippets\\\")
+endif()
+
+qt_internal_add_test(tst_snippets
+ SOURCES
+ tst_snippets.cpp
+ DEFINES
+ QQC2_SNIPPETS_PATH=${SNIPPETS_PATH}
+ LIBRARIES
+ Qt::CorePrivate
+ Qt::Gui
+ Qt::Quick
+ Qt::QuickControls2
+ Qt::QuickControls2Private
+ TESTDATA ${test_data}
+)
+
+# Resources:
+set(qmake_immediate_resource_files
+ "qtquickcontrols2.conf"
+)
+
+qt_internal_add_resource(tst_snippets "qmake_immediate"
+ PREFIX
+ "/"
+ FILES
+ ${qmake_immediate_resource_files}
+)
+
+
+#### Keys ignored in scope 1:.:.:snippets.pro:<TRUE>:
+# OTHER_FILES = "$$PWD/data/*.qml"
+# TEMPLATE = "app"
+
+## Scopes:
+#####################################################################
diff --git a/tests/auto/quickcontrols/snippets/data/dependencies.qml b/tests/auto/quickcontrols/snippets/data/dependencies.qml
new file mode 100644
index 0000000000..8785d0b08e
--- /dev/null
+++ b/tests/auto/quickcontrols/snippets/data/dependencies.qml
@@ -0,0 +1,7 @@
+import QtQuick
+import QtQuick.Layouts
+import QtQuick.Controls
+import QtQuick.Controls.Material
+import QtQuick.Controls.Universal
+
+Control { }
diff --git a/tests/auto/quickcontrols/snippets/qtquickcontrols2.conf b/tests/auto/quickcontrols/snippets/qtquickcontrols2.conf
new file mode 100644
index 0000000000..bd15777684
--- /dev/null
+++ b/tests/auto/quickcontrols/snippets/qtquickcontrols2.conf
@@ -0,0 +1,3 @@
+# Specify the style here so that it can be overridden by e.g. command line arguments.
+[Controls]
+Style=Basic
diff --git a/tests/auto/quickcontrols/snippets/tst_snippets.cpp b/tests/auto/quickcontrols/snippets/tst_snippets.cpp
new file mode 100644
index 0000000000..b16066a693
--- /dev/null
+++ b/tests/auto/quickcontrols/snippets/tst_snippets.cpp
@@ -0,0 +1,136 @@
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
+
+#include <QtTest>
+#include <QtQuick>
+#include <QtQuickControls2/qquickstyle.h>
+#include <QtQuickControls2/private/qquickstyle_p.h>
+
+typedef QPair<QString, QString> QStringPair;
+
+class tst_Snippets : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void initTestCase();
+
+ void verify();
+ void verify_data();
+
+private:
+ void loadSnippet(const QString &source);
+
+ bool takeScreenshots;
+ QMap<QString, QStringPair> snippetPaths;
+};
+
+static QMap<QString, QStringPair> findSnippets(const QDir &inputDir, const QDir &outputDir = QDir())
+{
+ QMap<QString, QStringPair> snippetPaths;
+ QDirIterator it(inputDir.path(), QStringList() << "qtquick*.qml" << "qtlabs*.qml", QDir::Files | QDir::Readable);
+ while (it.hasNext()) {
+ QFileInfo fi(it.next());
+ const QString outDirPath = !outputDir.path().isEmpty() ? outputDir.filePath(fi.baseName() + ".png") : QString();
+ snippetPaths.insert(fi.baseName(), qMakePair(fi.filePath(), outDirPath));
+ }
+ return snippetPaths;
+}
+
+void tst_Snippets::initTestCase()
+{
+ qInfo() << "Snippets are taken from" << QQC2_SNIPPETS_PATH;
+
+ QDir snippetsDir(QQC2_SNIPPETS_PATH);
+ QVERIFY(!snippetsDir.path().isEmpty());
+
+ QDir screenshotsDir(QDir::current().filePath("screenshots"));
+
+ takeScreenshots = qEnvironmentVariableIntValue("SCREENSHOTS");
+ if (takeScreenshots)
+ QVERIFY(screenshotsDir.exists() || QDir::current().mkpath("screenshots"));
+
+ snippetPaths = findSnippets(snippetsDir, screenshotsDir);
+ QVERIFY(!snippetPaths.isEmpty());
+}
+
+Q_DECLARE_METATYPE(QList<QQmlError>)
+
+void tst_Snippets::verify()
+{
+ QFETCH(QString, input);
+ QFETCH(QString, output);
+
+ QQmlEngine engine;
+ QQmlComponent component(&engine);
+
+ qRegisterMetaType<QList<QQmlError> >();
+ QSignalSpy warnings(&engine, SIGNAL(warnings(QList<QQmlError>)));
+ QVERIFY(warnings.isValid());
+
+ QUrl url = QUrl::fromLocalFile(input);
+ component.loadUrl(url);
+
+ QScopedPointer<QObject> root(component.create());
+ QVERIFY2(!root.isNull(), qPrintable(component.errorString()));
+
+ QCOMPARE(component.status(), QQmlComponent::Ready);
+ QVERIFY(component.errors().isEmpty());
+
+ QVERIFY(warnings.isEmpty());
+
+ if (takeScreenshots) {
+ const QString currentDataTag = QLatin1String(QTest::currentDataTag());
+ static const QString applicationStyle = QQuickStyle::name().isEmpty() ? "Basic" : QQuickStyle::name();
+ static const QStringList builtInStyles = QQuickStylePrivate::builtInStyles();
+
+ bool isStyledSnippet = false;
+ const QString snippetStyle = currentDataTag.section("-", 1, 1);
+ for (const QString &style : builtInStyles) {
+ if (!snippetStyle.compare(style, Qt::CaseInsensitive)) {
+ if (applicationStyle != style)
+ QSKIP(qPrintable(QString("%1 style specific snippet. Running with the %2 style.").arg(style, applicationStyle)));
+ isStyledSnippet = true;
+ }
+ }
+
+ if (!isStyledSnippet && !applicationStyle.isEmpty()) {
+ int index = output.indexOf("-", output.lastIndexOf("/"));
+ if (index != -1)
+ output.insert(index, "-" + applicationStyle.toLower());
+ }
+
+ QQuickWindow *window = qobject_cast<QQuickWindow *>(root.data());
+ if (!window) {
+ QQuickView *view = new QQuickView;
+ view->setContent(url, &component, root.data());
+ window = view;
+ }
+
+ window->show();
+ window->requestActivate();
+ QVERIFY(QTest::qWaitForWindowActive(window));
+
+ QSharedPointer<QQuickItemGrabResult> result = window->contentItem()->grabToImage();
+ QSignalSpy spy(result.data(), SIGNAL(ready()));
+ QVERIFY(spy.isValid());
+ QVERIFY(spy.wait());
+ QVERIFY(result->saveToFile(output));
+
+ window->close();
+ }
+}
+
+void tst_Snippets::verify_data()
+{
+ QTest::addColumn<QString>("input");
+ QTest::addColumn<QString>("output");
+
+ QMap<QString, QStringPair>::const_iterator it;
+ for (it = snippetPaths.constBegin(); it != snippetPaths.constEnd(); ++it)
+ QTest::newRow(qPrintable(it.key())) << it.value().first << it.value().second;
+}
+
+QTEST_MAIN(tst_Snippets)
+
+#include "tst_snippets.moc"