From f865f4b76d9385077c9ba4ca91a91246554dd36e Mon Sep 17 00:00:00 2001 From: Mitch Curtis Date: Tue, 20 Jul 2021 13:30:11 +0200 Subject: Restructure tests in preparation for merging into qtdeclarative Task-number: QTBUG-95173 Change-Id: I541dc26cf2cdd6f2640824f693f7d059445367d9 Reviewed-by: Qt CI Bot Reviewed-by: Volker Hilsheimer --- .../quickcontrols2/qquickiconimage/CMakeLists.txt | 85 +++ .../qquickiconimage/data/alignment.qml | 16 + .../quickcontrols2/qquickiconimage/data/color.qml | 18 + .../qquickiconimage/data/fileSelectors.qml | 16 + .../qquickiconimage/data/imageProvider.qml | 9 + .../qquickiconimage/data/nameBindingNoSizes.qml | 7 + .../qquickiconimage/data/nameBindingSourceSize.qml | 16 + .../data/nameBindingSourceSizeWidthHeight.qml | 10 + .../quickcontrols2/qquickiconimage/data/root.qml | 6 + .../qquickiconimage/data/sourceBindingNoSizes.qml | 15 + .../data/sourceBindingSourceSize.qml | 16 + .../data/sourceBindingSourceSizeWidthHeight.qml | 10 + .../data/sourceBindingSourceTooLarge.qml | 8 + .../qquickiconimage/data/svgNoSizes.qml | 15 + .../data/svgSourceBindingSourceSize.qml | 17 + .../qquickiconimage/data/translucentColors.qml | 67 +++ .../testtheme/16x16/actions/appointment-new.png | Bin 0 -> 839 bytes .../actions/+testselector/appointment-new.png | Bin 0 -> 1040 bytes .../actions/+testselector/appointment-new@2x.png | Bin 0 -> 107 bytes .../testtheme/22x22/actions/appointment-new.png | Bin 0 -> 1268 bytes .../testtheme/22x22/actions/appointment-new@2x.png | Bin 0 -> 4017 bytes .../22x22/actions/color-test-original.png | Bin 0 -> 1047 bytes .../22x22/actions/color-test-original@2x.png | Bin 0 -> 107 bytes .../testtheme/22x22/actions/color-test-tinted.png | Bin 0 -> 1053 bytes .../22x22/actions/color-test-tinted@2x.png | Bin 0 -> 107 bytes .../actions/+testselector/appointment-new.png | Bin 0 -> 107 bytes .../testtheme/22x22@2/actions/appointment-new.png | Bin 0 -> 4017 bytes .../icons/testtheme/appointment-new.svg | 425 +++++++++++++++ .../qquickiconimage/icons/testtheme/index.theme | 21 + .../quickcontrols2/qquickiconimage/resources.qrc | 17 + .../qquickiconimage/tst_qquickiconimage.cpp | 572 +++++++++++++++++++++ 31 files changed, 1366 insertions(+) create mode 100644 tests/auto/quickcontrols2/qquickiconimage/CMakeLists.txt create mode 100644 tests/auto/quickcontrols2/qquickiconimage/data/alignment.qml create mode 100644 tests/auto/quickcontrols2/qquickiconimage/data/color.qml create mode 100644 tests/auto/quickcontrols2/qquickiconimage/data/fileSelectors.qml create mode 100644 tests/auto/quickcontrols2/qquickiconimage/data/imageProvider.qml create mode 100644 tests/auto/quickcontrols2/qquickiconimage/data/nameBindingNoSizes.qml create mode 100644 tests/auto/quickcontrols2/qquickiconimage/data/nameBindingSourceSize.qml create mode 100644 tests/auto/quickcontrols2/qquickiconimage/data/nameBindingSourceSizeWidthHeight.qml create mode 100644 tests/auto/quickcontrols2/qquickiconimage/data/root.qml create mode 100644 tests/auto/quickcontrols2/qquickiconimage/data/sourceBindingNoSizes.qml create mode 100644 tests/auto/quickcontrols2/qquickiconimage/data/sourceBindingSourceSize.qml create mode 100644 tests/auto/quickcontrols2/qquickiconimage/data/sourceBindingSourceSizeWidthHeight.qml create mode 100644 tests/auto/quickcontrols2/qquickiconimage/data/sourceBindingSourceTooLarge.qml create mode 100644 tests/auto/quickcontrols2/qquickiconimage/data/svgNoSizes.qml create mode 100644 tests/auto/quickcontrols2/qquickiconimage/data/svgSourceBindingSourceSize.qml create mode 100644 tests/auto/quickcontrols2/qquickiconimage/data/translucentColors.qml create mode 100644 tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/16x16/actions/appointment-new.png create mode 100644 tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/+testselector/appointment-new.png create mode 100644 tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/+testselector/appointment-new@2x.png create mode 100644 tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/appointment-new.png create mode 100644 tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/appointment-new@2x.png create mode 100644 tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/color-test-original.png create mode 100644 tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/color-test-original@2x.png create mode 100644 tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/color-test-tinted.png create mode 100644 tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/color-test-tinted@2x.png create mode 100644 tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22@2/actions/+testselector/appointment-new.png create mode 100644 tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22@2/actions/appointment-new.png create mode 100644 tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/appointment-new.svg create mode 100644 tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/index.theme create mode 100644 tests/auto/quickcontrols2/qquickiconimage/resources.qrc create mode 100644 tests/auto/quickcontrols2/qquickiconimage/tst_qquickiconimage.cpp (limited to 'tests/auto/quickcontrols2/qquickiconimage') diff --git a/tests/auto/quickcontrols2/qquickiconimage/CMakeLists.txt b/tests/auto/quickcontrols2/qquickiconimage/CMakeLists.txt new file mode 100644 index 0000000000..d11779bcd1 --- /dev/null +++ b/tests/auto/quickcontrols2/qquickiconimage/CMakeLists.txt @@ -0,0 +1,85 @@ +# Generated from qquickiconimage.pro. + +##################################################################### +## tst_qquickiconimage Test: +##################################################################### + +# Collect test data +file(GLOB_RECURSE test_data_glob + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/data/*.qml) +list(APPEND test_data ${test_data_glob}) +file(GLOB_RECURSE test_data_glob + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/data/icons/*) +list(APPEND test_data ${test_data_glob}) + +qt_internal_add_test(tst_qquickiconimage + SOURCES + ../shared/qtest_quickcontrols.h + ../shared/util.cpp ../shared/util.h + ../shared/visualtestutil.cpp ../shared/visualtestutil.h + tst_qquickiconimage.cpp + DEFINES + QQC2_IMPORT_PATH=\\\"${CMAKE_CURRENT_SOURCE_DIR}/../../../../src\\\" + LIBRARIES + Qt::QuickControls2ImplPrivate + Qt::QuickPrivate + PUBLIC_LIBRARIES + Qt::CorePrivate + Qt::Gui + Qt::GuiPrivate + Qt::Qml + Qt::QmlPrivate + Qt::Quick + Qt::QuickControls2 + Qt::QuickControls2Private + Qt::QuickPrivate + Qt::QuickTemplates2Private + Qt::QuickTest + Qt::TestPrivate + TESTDATA ${test_data} +) + +# Resources: +set(resources_resource_files + "icons/testtheme/16x16/actions/appointment-new.png" + "icons/testtheme/22x22/actions/+testselector/appointment-new.png" + "icons/testtheme/22x22/actions/+testselector/appointment-new@2x.png" + "icons/testtheme/22x22/actions/appointment-new.png" + "icons/testtheme/22x22/actions/appointment-new@2x.png" + "icons/testtheme/22x22/actions/color-test-original.png" + "icons/testtheme/22x22/actions/color-test-original@2x.png" + "icons/testtheme/22x22/actions/color-test-tinted.png" + "icons/testtheme/22x22/actions/color-test-tinted@2x.png" + "icons/testtheme/22x22@2/actions/+testselector/appointment-new.png" + "icons/testtheme/22x22@2/actions/appointment-new.png" + "icons/testtheme/appointment-new.svg" + "icons/testtheme/index.theme" +) + +qt_internal_add_resource(tst_qquickiconimage "resources" + PREFIX + "/" + FILES + ${resources_resource_files} +) + + +## Scopes: +##################################################################### + +qt_internal_extend_target(tst_qquickiconimage CONDITION TARGET Qt::Svg + PUBLIC_LIBRARIES + Qt::Svg +) + +qt_internal_extend_target(tst_qquickiconimage CONDITION ANDROID OR IOS + DEFINES + QT_QMLTEST_DATADIR=\\\":/data\\\" +) + +qt_internal_extend_target(tst_qquickiconimage CONDITION NOT ANDROID AND NOT IOS + DEFINES + QT_QMLTEST_DATADIR=\\\"${CMAKE_CURRENT_SOURCE_DIR}/data\\\" +) diff --git a/tests/auto/quickcontrols2/qquickiconimage/data/alignment.qml b/tests/auto/quickcontrols2/qquickiconimage/data/alignment.qml new file mode 100644 index 0000000000..e6861520b9 --- /dev/null +++ b/tests/auto/quickcontrols2/qquickiconimage/data/alignment.qml @@ -0,0 +1,16 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Controls.impl + +Row { + width: 200 + height: 200 + + IconImage { + name: "appointment-new" + sourceSize: Qt.size(22, 22) + } + Image { + source: "qrc:/icons/testtheme/22x22/actions/appointment-new.png" + } +} diff --git a/tests/auto/quickcontrols2/qquickiconimage/data/color.qml b/tests/auto/quickcontrols2/qquickiconimage/data/color.qml new file mode 100644 index 0000000000..b44b43885c --- /dev/null +++ b/tests/auto/quickcontrols2/qquickiconimage/data/color.qml @@ -0,0 +1,18 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Controls.impl + +Row { + width: 200 + height: 200 + + IconImage { + source: "qrc:/icons/testtheme/22x22/actions/color-test-original.png" + sourceSize: Qt.size(22, 22) + color: "red" + } + Image { + source: "qrc:/icons/testtheme/22x22/actions/color-test-tinted.png" + fillMode: Image.Pad + } +} diff --git a/tests/auto/quickcontrols2/qquickiconimage/data/fileSelectors.qml b/tests/auto/quickcontrols2/qquickiconimage/data/fileSelectors.qml new file mode 100644 index 0000000000..e6861520b9 --- /dev/null +++ b/tests/auto/quickcontrols2/qquickiconimage/data/fileSelectors.qml @@ -0,0 +1,16 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Controls.impl + +Row { + width: 200 + height: 200 + + IconImage { + name: "appointment-new" + sourceSize: Qt.size(22, 22) + } + Image { + source: "qrc:/icons/testtheme/22x22/actions/appointment-new.png" + } +} diff --git a/tests/auto/quickcontrols2/qquickiconimage/data/imageProvider.qml b/tests/auto/quickcontrols2/qquickiconimage/data/imageProvider.qml new file mode 100644 index 0000000000..9b18a99e35 --- /dev/null +++ b/tests/auto/quickcontrols2/qquickiconimage/data/imageProvider.qml @@ -0,0 +1,9 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Controls.impl +import QtQuick.Templates as T + +IconLabel { + icon.color: "transparent" + icon.source: "image://provider/red" +} diff --git a/tests/auto/quickcontrols2/qquickiconimage/data/nameBindingNoSizes.qml b/tests/auto/quickcontrols2/qquickiconimage/data/nameBindingNoSizes.qml new file mode 100644 index 0000000000..d457d205d5 --- /dev/null +++ b/tests/auto/quickcontrols2/qquickiconimage/data/nameBindingNoSizes.qml @@ -0,0 +1,7 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Controls.impl + +IconImage { + name: "appointment-new" +} diff --git a/tests/auto/quickcontrols2/qquickiconimage/data/nameBindingSourceSize.qml b/tests/auto/quickcontrols2/qquickiconimage/data/nameBindingSourceSize.qml new file mode 100644 index 0000000000..e6861520b9 --- /dev/null +++ b/tests/auto/quickcontrols2/qquickiconimage/data/nameBindingSourceSize.qml @@ -0,0 +1,16 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Controls.impl + +Row { + width: 200 + height: 200 + + IconImage { + name: "appointment-new" + sourceSize: Qt.size(22, 22) + } + Image { + source: "qrc:/icons/testtheme/22x22/actions/appointment-new.png" + } +} diff --git a/tests/auto/quickcontrols2/qquickiconimage/data/nameBindingSourceSizeWidthHeight.qml b/tests/auto/quickcontrols2/qquickiconimage/data/nameBindingSourceSizeWidthHeight.qml new file mode 100644 index 0000000000..5e7ebefca4 --- /dev/null +++ b/tests/auto/quickcontrols2/qquickiconimage/data/nameBindingSourceSizeWidthHeight.qml @@ -0,0 +1,10 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Controls.impl + +IconImage { + name: "appointment-new" + sourceSize: Qt.size(22, 22) + width: 16 + height: 16 +} diff --git a/tests/auto/quickcontrols2/qquickiconimage/data/root.qml b/tests/auto/quickcontrols2/qquickiconimage/data/root.qml new file mode 100644 index 0000000000..ed02d2df7a --- /dev/null +++ b/tests/auto/quickcontrols2/qquickiconimage/data/root.qml @@ -0,0 +1,6 @@ +import QtQuick + +Item { + width: 200 + height: 200 +} diff --git a/tests/auto/quickcontrols2/qquickiconimage/data/sourceBindingNoSizes.qml b/tests/auto/quickcontrols2/qquickiconimage/data/sourceBindingNoSizes.qml new file mode 100644 index 0000000000..34fc6b339c --- /dev/null +++ b/tests/auto/quickcontrols2/qquickiconimage/data/sourceBindingNoSizes.qml @@ -0,0 +1,15 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Controls.impl + +Row { + width: 200 + height: 200 + + IconImage { + source: "qrc:/icons/testtheme/22x22/actions/appointment-new.png" + } + Image { + source: "qrc:/icons/testtheme/22x22/actions/appointment-new.png" + } +} diff --git a/tests/auto/quickcontrols2/qquickiconimage/data/sourceBindingSourceSize.qml b/tests/auto/quickcontrols2/qquickiconimage/data/sourceBindingSourceSize.qml new file mode 100644 index 0000000000..9f1b629074 --- /dev/null +++ b/tests/auto/quickcontrols2/qquickiconimage/data/sourceBindingSourceSize.qml @@ -0,0 +1,16 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Controls.impl + +Row { + width: 200 + height: 200 + + IconImage { + source: "qrc:/icons/testtheme/22x22/actions/appointment-new.png" + sourceSize: Qt.size(22, 22) + } + Image { + source: "qrc:/icons/testtheme/22x22/actions/appointment-new.png" + } +} diff --git a/tests/auto/quickcontrols2/qquickiconimage/data/sourceBindingSourceSizeWidthHeight.qml b/tests/auto/quickcontrols2/qquickiconimage/data/sourceBindingSourceSizeWidthHeight.qml new file mode 100644 index 0000000000..4dc3ac7588 --- /dev/null +++ b/tests/auto/quickcontrols2/qquickiconimage/data/sourceBindingSourceSizeWidthHeight.qml @@ -0,0 +1,10 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Controls.impl + +IconImage { + source: "qrc:/icons/testtheme/22x22/actions/appointment-new.png" + sourceSize: Qt.size(22, 22) + width: 16 + height: 16 +} diff --git a/tests/auto/quickcontrols2/qquickiconimage/data/sourceBindingSourceTooLarge.qml b/tests/auto/quickcontrols2/qquickiconimage/data/sourceBindingSourceTooLarge.qml new file mode 100644 index 0000000000..a54d998aa5 --- /dev/null +++ b/tests/auto/quickcontrols2/qquickiconimage/data/sourceBindingSourceTooLarge.qml @@ -0,0 +1,8 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Controls.impl + +IconImage { + source: "qrc:/icons/testtheme/22x22/actions/appointment-new.png" + sourceSize: Qt.size(32, 32) +} diff --git a/tests/auto/quickcontrols2/qquickiconimage/data/svgNoSizes.qml b/tests/auto/quickcontrols2/qquickiconimage/data/svgNoSizes.qml new file mode 100644 index 0000000000..e29c23c5b2 --- /dev/null +++ b/tests/auto/quickcontrols2/qquickiconimage/data/svgNoSizes.qml @@ -0,0 +1,15 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Controls.impl + +Row { + width: 200 + height: 200 + + IconImage { + source: "qrc:/icons/testtheme/appointment-new.svg" + } + Image { + source: "qrc:/icons/testtheme/appointment-new.svg" + } +} diff --git a/tests/auto/quickcontrols2/qquickiconimage/data/svgSourceBindingSourceSize.qml b/tests/auto/quickcontrols2/qquickiconimage/data/svgSourceBindingSourceSize.qml new file mode 100644 index 0000000000..4674e8f14b --- /dev/null +++ b/tests/auto/quickcontrols2/qquickiconimage/data/svgSourceBindingSourceSize.qml @@ -0,0 +1,17 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Controls.impl + +Row { + width: 200 + height: 200 + + IconImage { + source: "qrc:/data/icons/testtheme/appointment-new.svg" + sourceSize: Qt.size(22, 22) + } + Image { + source: "qrc:/data/icons/testtheme/appointment-new.svg" + sourceSize: Qt.size(22, 22) + } +} diff --git a/tests/auto/quickcontrols2/qquickiconimage/data/translucentColors.qml b/tests/auto/quickcontrols2/qquickiconimage/data/translucentColors.qml new file mode 100644 index 0000000000..ad67bfe522 --- /dev/null +++ b/tests/auto/quickcontrols2/qquickiconimage/data/translucentColors.qml @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick +import QtQuick.Controls +import QtQuick.Controls.impl + +ApplicationWindow { + width: 500 + height: 500 + visible: true + + IconImage { + width: Math.min(250, parent.width) + height: Math.min(250, parent.height) + source: "qrc:/icons/testtheme/22x22/actions/color-test-original.png" + sourceSize: Qt.size(250, 0) + color: Qt.rgba(0, 0, 0, 0.5) + } +} diff --git a/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/16x16/actions/appointment-new.png b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/16x16/actions/appointment-new.png new file mode 100644 index 0000000000..4356af9516 Binary files /dev/null and b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/16x16/actions/appointment-new.png differ diff --git a/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/+testselector/appointment-new.png b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/+testselector/appointment-new.png new file mode 100644 index 0000000000..d3134a55d4 Binary files /dev/null and b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/+testselector/appointment-new.png differ diff --git a/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/+testselector/appointment-new@2x.png b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/+testselector/appointment-new@2x.png new file mode 100644 index 0000000000..250b94b019 Binary files /dev/null and b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/+testselector/appointment-new@2x.png differ diff --git a/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/appointment-new.png b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/appointment-new.png new file mode 100644 index 0000000000..04cd010a68 Binary files /dev/null and b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/appointment-new.png differ diff --git a/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/appointment-new@2x.png b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/appointment-new@2x.png new file mode 100644 index 0000000000..a63bbaf4c5 Binary files /dev/null and b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/appointment-new@2x.png differ diff --git a/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/color-test-original.png b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/color-test-original.png new file mode 100644 index 0000000000..c17d166402 Binary files /dev/null and b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/color-test-original.png differ diff --git a/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/color-test-original@2x.png b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/color-test-original@2x.png new file mode 100644 index 0000000000..d4411658f9 Binary files /dev/null and b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/color-test-original@2x.png differ diff --git a/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/color-test-tinted.png b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/color-test-tinted.png new file mode 100644 index 0000000000..6f7938e365 Binary files /dev/null and b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/color-test-tinted.png differ diff --git a/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/color-test-tinted@2x.png b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/color-test-tinted@2x.png new file mode 100644 index 0000000000..9215fc423b Binary files /dev/null and b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22/actions/color-test-tinted@2x.png differ diff --git a/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22@2/actions/+testselector/appointment-new.png b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22@2/actions/+testselector/appointment-new.png new file mode 100644 index 0000000000..250b94b019 Binary files /dev/null and b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22@2/actions/+testselector/appointment-new.png differ diff --git a/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22@2/actions/appointment-new.png b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22@2/actions/appointment-new.png new file mode 100644 index 0000000000..a63bbaf4c5 Binary files /dev/null and b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/22x22@2/actions/appointment-new.png differ diff --git a/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/appointment-new.svg b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/appointment-new.svg new file mode 100644 index 0000000000..4cb14f82f0 --- /dev/null +++ b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/appointment-new.svg @@ -0,0 +1,425 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Jakub Steiner + + + http://jimmac.musichall.cz + + New Appointment + + + appointment + new + meeting + rvsp + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/index.theme b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/index.theme new file mode 100644 index 0000000000..6ab6c15c42 --- /dev/null +++ b/tests/auto/quickcontrols2/qquickiconimage/icons/testtheme/index.theme @@ -0,0 +1,21 @@ +[Icon Theme] +Name=Test +Comment=Test Theme + +Directories=16x16/actions,22x22/actions,22x22@2/actions + +[16x16/actions] +Size=16 +Context=Actions +Type=Fixed + +[22x22/actions] +Size=22 +Context=Actions +Type=Fixed + +[22x22@2/actions] +Size=22 +Context=Actions +Scale=2 +Type=Fixed diff --git a/tests/auto/quickcontrols2/qquickiconimage/resources.qrc b/tests/auto/quickcontrols2/qquickiconimage/resources.qrc new file mode 100644 index 0000000000..6558b03909 --- /dev/null +++ b/tests/auto/quickcontrols2/qquickiconimage/resources.qrc @@ -0,0 +1,17 @@ + + + icons/testtheme/16x16/actions/appointment-new.png + icons/testtheme/22x22/actions/appointment-new.png + icons/testtheme/22x22/actions/appointment-new@2x.png + icons/testtheme/22x22@2/actions/appointment-new.png + icons/testtheme/22x22/actions/+testselector/appointment-new.png + icons/testtheme/22x22/actions/+testselector/appointment-new@2x.png + icons/testtheme/22x22@2/actions/+testselector/appointment-new.png + icons/testtheme/index.theme + icons/testtheme/appointment-new.svg + icons/testtheme/22x22/actions/color-test-original.png + icons/testtheme/22x22/actions/color-test-tinted.png + icons/testtheme/22x22/actions/color-test-original@2x.png + icons/testtheme/22x22/actions/color-test-tinted@2x.png + + diff --git a/tests/auto/quickcontrols2/qquickiconimage/tst_qquickiconimage.cpp b/tests/auto/quickcontrols2/qquickiconimage/tst_qquickiconimage.cpp new file mode 100644 index 0000000000..475981a2ae --- /dev/null +++ b/tests/auto/quickcontrols2/qquickiconimage/tst_qquickiconimage.cpp @@ -0,0 +1,572 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../shared/util.h" +#include "../shared/visualtestutil.h" + +using namespace QQuickVisualTestUtil; + +class tst_qquickiconimage : public QQmlDataTest +{ + Q_OBJECT +public: + tst_qquickiconimage(); + +private slots: + void initTestCase() override; + void defaults(); + void nameBindingSourceSize(); + void nameBindingSourceSizeWidthHeight(); + void nameBindingNoSizes(); + void sourceBindingNoSizes(); + void sourceBindingSourceSize(); + void sourceBindingSourceSizeWidthHeight(); + void sourceBindingSourceTooLarge(); + void changeSourceSize(); + void alignment_data(); + void alignment(); + void svgNoSizes(); + void svgSourceBindingSourceSize(); + void color(); + void fileSelectors(); + void imageProvider(); + void translucentColors(); + +private: + void setTheme(); + + qreal dpr; + int integerDpr; +}; + +static QImage grabItemToImage(QQuickItem *item) +{ + QSharedPointer result = item->grabToImage(); + QSignalSpy spy(result.data(), SIGNAL(ready())); + spy.wait(); + return result->image(); +} + +#define SKIP_IF_DPR_TOO_HIGH() \ + if (dpr > 2) \ + QSKIP("Test does not support device pixel ratio greater than 2") + +tst_qquickiconimage::tst_qquickiconimage() : + dpr(qGuiApp->devicePixelRatio()), + integerDpr(qCeil(dpr)) +{ + QQuickStyle::setStyle("Basic"); +} + +void tst_qquickiconimage::initTestCase() +{ + QQmlDataTest::initTestCase(); + QIcon::setThemeName(QStringLiteral("testtheme")); +} + +void tst_qquickiconimage::defaults() +{ + QQuickIconImage iconImage; + QCOMPARE(iconImage.fillMode(), QQuickImage::Pad); + QCOMPARE(iconImage.name(), QString()); + QCOMPARE(iconImage.source(), QUrl()); + QCOMPARE(iconImage.color(), QColor(Qt::transparent)); +} + +void tst_qquickiconimage::nameBindingSourceSize() +{ + // We can't have images for every DPR. + SKIP_IF_DPR_TOO_HIGH(); + + QQuickView view(testFileUrl("nameBindingSourceSize.qml")); + QCOMPARE(view.status(), QQuickView::Ready); + view.show(); + view.requestActivate(); + QVERIFY(QTest::qWaitForWindowActive(&view)); + + QQuickIconImage *iconImage = qobject_cast(view.rootObject()->childItems().at(0)); + QVERIFY(iconImage); + + QQuickItem *image = view.rootObject()->childItems().at(1); + QVERIFY(image); + + QCOMPARE(grabItemToImage(iconImage), grabItemToImage(image)); + QCOMPARE(iconImage->sourceSize().width(), 22); + QCOMPARE(iconImage->sourceSize().height(), 22); + QCOMPARE(iconImage->implicitWidth(), 22.0); + QCOMPARE(iconImage->implicitHeight(), 22.0); + QCOMPARE(iconImage->width(), 22.0); + QCOMPARE(iconImage->height(), 22.0); + + // The requested width of 16 is less than the pixmap's size on disk which + // is 22x22. Our default fillMode, Pad, would result in the image being clipped, + // so instead we change the fillMode to PreserveAspectFit. Doing so causes + // QQuickImage::updatePaintedGeometry() to set our implicit size to 22x16 to + // ensure that the aspect ratio is respected. Since we have no explicit height, + // the height (previously 22) becomes the implicit height (16). + iconImage->setWidth(16.0); + QCOMPARE(iconImage->fillMode(), QQuickImage::PreserveAspectFit); + QCOMPARE(iconImage->sourceSize().width(), 22); + QCOMPARE(iconImage->sourceSize().height(), 22); + QCOMPARE(iconImage->implicitWidth(), 22.0); + QCOMPARE(iconImage->implicitHeight(), 16.0); + QCOMPARE(iconImage->width(), 16.0); + QCOMPARE(iconImage->height(), 16.0); +} + +void tst_qquickiconimage::nameBindingSourceSizeWidthHeight() +{ + SKIP_IF_DPR_TOO_HIGH(); + + QQuickView view(testFileUrl("nameBindingSourceSizeWidthHeight.qml")); + QCOMPARE(view.status(), QQuickView::Ready); + view.show(); + + QQuickIconImage *iconImage = qobject_cast(view.rootObject()); + QVERIFY(iconImage); + QCOMPARE(iconImage->sourceSize().width(), 22); + QCOMPARE(iconImage->sourceSize().height(), 22); + QCOMPARE(iconImage->implicitWidth(), 22.0); + QCOMPARE(iconImage->implicitHeight(), 22.0); + QCOMPARE(iconImage->width(), 16.0); + QCOMPARE(iconImage->height(), 16.0); +} + +void tst_qquickiconimage::nameBindingNoSizes() +{ + SKIP_IF_DPR_TOO_HIGH(); + + QQuickView view(testFileUrl("nameBindingNoSizes.qml")); + QCOMPARE(view.status(), QQuickView::Ready); + view.show(); + + QQuickIconImage *iconImage = qobject_cast(view.rootObject()); + QVERIFY(iconImage); + // The smallest available size will be chosen. + QCOMPARE(iconImage->sourceSize().width(), 16); + QCOMPARE(iconImage->sourceSize().height(), 16); + QCOMPARE(iconImage->implicitWidth(), 16.0); + QCOMPARE(iconImage->implicitHeight(), 16.0); + QCOMPARE(iconImage->width(), 16.0); + QCOMPARE(iconImage->height(), 16.0); +} + +void tst_qquickiconimage::sourceBindingNoSizes() +{ + SKIP_IF_DPR_TOO_HIGH(); + + QQuickView view(testFileUrl("sourceBindingNoSizes.qml")); + QCOMPARE(view.status(), QQuickView::Ready); + view.show(); + view.requestActivate(); + QVERIFY(QTest::qWaitForWindowActive(&view)); + + QQuickIconImage *iconImage = qobject_cast(view.rootObject()->childItems().at(0)); + QVERIFY(iconImage); + + QQuickItem *image = view.rootObject()->childItems().at(1); + QVERIFY(image); + + QCOMPARE(iconImage->sourceSize().width(), 22 * integerDpr); + QCOMPARE(iconImage->sourceSize().height(), 22 * integerDpr); + QCOMPARE(iconImage->implicitWidth(), 22.0); + QCOMPARE(iconImage->implicitHeight(), 22.0); + QCOMPARE(iconImage->width(), 22.0); + QCOMPARE(iconImage->height(), 22.0); + QCOMPARE(grabItemToImage(iconImage), grabItemToImage(image)); +} + +void tst_qquickiconimage::sourceBindingSourceSize() +{ + SKIP_IF_DPR_TOO_HIGH(); + + QQuickView view(testFileUrl("sourceBindingSourceSize.qml")); + QCOMPARE(view.status(), QQuickView::Ready); + view.show(); + view.requestActivate(); + QVERIFY(QTest::qWaitForWindowActive(&view)); + + QQuickIconImage *iconImage = qobject_cast(view.rootObject()->childItems().at(0)); + QVERIFY(iconImage); + + QQuickItem *image = view.rootObject()->childItems().at(1); + QVERIFY(image); + + QCOMPARE(iconImage->sourceSize().width(), 22); + QCOMPARE(iconImage->sourceSize().height(), 22); + QCOMPARE(iconImage->implicitWidth(), 22.0); + QCOMPARE(iconImage->implicitHeight(), 22.0); + QCOMPARE(iconImage->width(), 22.0); + QCOMPARE(iconImage->height(), 22.0); + QCOMPARE(grabItemToImage(iconImage), grabItemToImage(image)); + + // Changing width and height should not affect sourceSize. + iconImage->setWidth(50); + QCOMPARE(iconImage->sourceSize().width(), 22); + QCOMPARE(iconImage->sourceSize().height(), 22); + iconImage->setHeight(50); + QCOMPARE(iconImage->sourceSize().width(), 22); + QCOMPARE(iconImage->sourceSize().height(), 22); +} + +void tst_qquickiconimage::sourceBindingSourceSizeWidthHeight() +{ + SKIP_IF_DPR_TOO_HIGH(); + + QQuickView view(testFileUrl("sourceBindingSourceSizeWidthHeight.qml")); + QCOMPARE(view.status(), QQuickView::Ready); + view.show(); + view.requestActivate(); + QVERIFY(QTest::qWaitForWindowActive(&view)); + + QQuickIconImage *iconImage = qobject_cast(view.rootObject()); + QVERIFY(iconImage); + QCOMPARE(iconImage->sourceSize().width(), 22); + QCOMPARE(iconImage->sourceSize().height(), 22); + QCOMPARE(iconImage->implicitWidth(), 22.0); + QCOMPARE(iconImage->implicitHeight(), 22.0); + QCOMPARE(iconImage->width(), 16.0); + QCOMPARE(iconImage->height(), 16.0); +} + +void tst_qquickiconimage::sourceBindingSourceTooLarge() +{ + SKIP_IF_DPR_TOO_HIGH(); + + QQuickView view(testFileUrl("sourceBindingSourceTooLarge.qml")); + QCOMPARE(view.status(), QQuickView::Ready); + view.show(); + view.requestActivate(); + QVERIFY(QTest::qWaitForWindowActive(&view)); + + QQuickIconImage *iconImage = qobject_cast(view.rootObject()); + QVERIFY(iconImage); + QCOMPARE(iconImage->sourceSize().width(), 32); + QCOMPARE(iconImage->sourceSize().height(), 32); + QCOMPARE(iconImage->implicitWidth(), 22.0); + QCOMPARE(iconImage->implicitHeight(), 22.0); + QCOMPARE(iconImage->width(), 22.0); + QCOMPARE(iconImage->height(), 22.0); +} + +void tst_qquickiconimage::alignment_data() +{ + QTest::addColumn("horizontalAlignment"); + QTest::addColumn("verticalAlignment"); + + QTest::newRow("AlignLeft,AlignTop") << QQuickImage::AlignLeft << QQuickImage::AlignTop; + QTest::newRow("AlignLeft,AlignVCenter") << QQuickImage::AlignLeft << QQuickImage::AlignVCenter; + QTest::newRow("AlignLeft,AlignBottom") << QQuickImage::AlignLeft << QQuickImage::AlignBottom; + QTest::newRow("AlignHCenter,AlignTop") << QQuickImage::AlignHCenter << QQuickImage::AlignTop; + QTest::newRow("AlignHCenter,AlignVCenter") << QQuickImage::AlignHCenter << QQuickImage::AlignVCenter; + QTest::newRow("AlignHCenter,AlignBottom") << QQuickImage::AlignHCenter << QQuickImage::AlignBottom; + QTest::newRow("AlignRight,AlignTop") << QQuickImage::AlignRight << QQuickImage::AlignTop; + QTest::newRow("AlignRight,AlignVCenter") << QQuickImage::AlignRight << QQuickImage::AlignVCenter; + QTest::newRow("AlignRight,AlignBottom") << QQuickImage::AlignRight << QQuickImage::AlignBottom; +} + +void tst_qquickiconimage::alignment() +{ + SKIP_IF_DPR_TOO_HIGH(); + + QFETCH(QQuickImage::HAlignment, horizontalAlignment); + QFETCH(QQuickImage::VAlignment, verticalAlignment); + + QQuickView view(testFileUrl("alignment.qml")); + QCOMPARE(view.status(), QQuickView::Ready); + view.show(); + view.requestActivate(); + QVERIFY(QTest::qWaitForWindowActive(&view)); + + QQuickIconImage *iconImage = qobject_cast(view.rootObject()->childItems().at(0)); + QVERIFY(iconImage); + + QQuickImage *image = qobject_cast(view.rootObject()->childItems().at(1)); + QVERIFY(image); + + // The default fillMode for IconImage is Image::Pad, so these two grabs + // should only be equal when the device pixel ratio is 1 or 2, as there is no + // @3x version of the image, and hence the Image will be upscaled + // and therefore blurry when the ratio is higher than 2. + if (qGuiApp->devicePixelRatio() <= 2) + QCOMPARE(grabItemToImage(iconImage), grabItemToImage(image)); + else + QVERIFY(grabItemToImage(iconImage) != grabItemToImage(image)); + + // Check that the images are what we expect in different alignment configurations. + iconImage->setWidth(200); + iconImage->setHeight(100); + iconImage->setHorizontalAlignment(horizontalAlignment); + iconImage->setVerticalAlignment(verticalAlignment); + iconImage->setFillMode(QQuickImage::Pad); + image->setWidth(200); + image->setHeight(100); + image->setHorizontalAlignment(horizontalAlignment); + image->setVerticalAlignment(verticalAlignment); + image->setFillMode(QQuickImage::Pad); + + if (qGuiApp->devicePixelRatio() <= 2) + QCOMPARE(grabItemToImage(iconImage), grabItemToImage(image)); + else + QVERIFY(grabItemToImage(iconImage) != grabItemToImage(image)); +} + +void tst_qquickiconimage::svgNoSizes() +{ +#ifndef QT_SVG_LIB + QSKIP("This test requires qtsvg"); +#else + QQuickView view(testFileUrl("svgNoSizes.qml")); + QCOMPARE(view.status(), QQuickView::Ready); + view.show(); + view.requestActivate(); + QVERIFY(QTest::qWaitForWindowActive(&view)); + + QQuickIconImage *iconImage = qobject_cast(view.rootObject()->childItems().at(0)); + QVERIFY(iconImage); + + QQuickImage *image = qobject_cast(view.rootObject()->childItems().at(1)); + QVERIFY(image); + + QCOMPARE(iconImage->sourceSize().width(), 48); + QCOMPARE(iconImage->sourceSize().height(), 48); + QCOMPARE(iconImage->implicitWidth(), 48.0); + QCOMPARE(iconImage->implicitHeight(), 48.0); + QCOMPARE(iconImage->width(), 48.0); + QCOMPARE(iconImage->height(), 48.0); + QCOMPARE(grabItemToImage(iconImage), grabItemToImage(image)); +#endif +} + +void tst_qquickiconimage::svgSourceBindingSourceSize() +{ +#ifndef QT_SVG_LIB + QSKIP("This test requires qtsvg"); +#else + QQuickView view(testFileUrl("alignment.qml")); + QCOMPARE(view.status(), QQuickView::Ready); + view.show(); + view.requestActivate(); + QVERIFY(QTest::qWaitForWindowActive(&view)); + + QQuickIconImage *iconImage = qobject_cast(view.rootObject()->childItems().at(0)); + QVERIFY(iconImage); + + QQuickImage *image = qobject_cast(view.rootObject()->childItems().at(1)); + QVERIFY(image); + + QCOMPARE(iconImage->sourceSize().width(), 22); + QCOMPARE(iconImage->sourceSize().height(), 22); + QCOMPARE(iconImage->implicitWidth(), 22.0); + QCOMPARE(iconImage->implicitHeight(), 22.0); + QCOMPARE(iconImage->width(), 22.0); + QCOMPARE(iconImage->height(), 22.0); + QCOMPARE(grabItemToImage(iconImage), grabItemToImage(image)); +#endif +} + +void tst_qquickiconimage::color() +{ + SKIP_IF_DPR_TOO_HIGH(); + + if (QGuiApplication::platformName() == QLatin1String("offscreen")) + QSKIP("grabToImage() doesn't work on the \"offscreen\" platform plugin (QTBUG-63185)"); + + QQuickView view(testFileUrl("color.qml")); + QCOMPARE(view.status(), QQuickView::Ready); + view.show(); + view.requestActivate(); + QVERIFY(QTest::qWaitForWindowActive(&view)); + + QQuickIconImage *iconImage = qobject_cast(view.rootObject()->childItems().at(0)); + QVERIFY(iconImage); + + QQuickImage *image = qobject_cast(view.rootObject()->childItems().at(1)); + QVERIFY(image); + + QImage iconImageWindowGrab = grabItemToImage(iconImage); + QCOMPARE(iconImageWindowGrab, grabItemToImage(image)); + + // Transparent pixels should remain transparent. + QCOMPARE(iconImageWindowGrab.pixelColor(0, 0), QColor(0, 0, 0, 0)); + + // Set a color after component completion. + iconImage->setColor(QColor(Qt::green)); + iconImageWindowGrab = grabItemToImage(iconImage); + const QPoint centerPixelPos(11, 11); + QCOMPARE(iconImageWindowGrab.pixelColor(centerPixelPos), QColor(Qt::green)); + + // Set a semi-transparent color after component completion. + iconImage->setColor(QColor(0, 0, 255, 127)); + iconImageWindowGrab = grabItemToImage(iconImage); + QCOMPARE(iconImageWindowGrab.pixelColor(centerPixelPos).red(), 0); + QCOMPARE(iconImageWindowGrab.pixelColor(centerPixelPos).green(), 0); + QCOMPARE(iconImageWindowGrab.pixelColor(centerPixelPos).blue(), 255); + QCOMPARE(iconImageWindowGrab.pixelColor(centerPixelPos).alpha(), 127); +} + +void tst_qquickiconimage::changeSourceSize() +{ + QQuickView view(testFileUrl("sourceBindingSourceSize.qml")); + QCOMPARE(view.status(), QQuickView::Ready); + view.show(); + view.requestActivate(); + QVERIFY(QTest::qWaitForWindowActive(&view)); + + QQuickIconImage *iconImage = qobject_cast(view.rootObject()->childItems().at(0)); + QVERIFY(iconImage); + + // Ensure that there isn't any infinite recursion when trying to change the sourceSize. + QSize sourceSize = iconImage->sourceSize(); + sourceSize.setWidth(sourceSize.width() - 1); + iconImage->setSourceSize(sourceSize); +} + + +void tst_qquickiconimage::fileSelectors() +{ + SKIP_IF_DPR_TOO_HIGH(); + + if (QGuiApplication::platformName() == QLatin1String("offscreen")) + QSKIP("grabToImage() doesn't work on the \"offscreen\" platform plugin (QTBUG-63185)"); + + QQuickView view; + QQmlFileSelector* fileSelector = new QQmlFileSelector(view.engine()); + fileSelector->setExtraSelectors(QStringList() << "testselector"); + view.setSource(testFileUrl("fileSelectors.qml")); + QCOMPARE(view.status(), QQuickView::Ready); + view.show(); + view.requestActivate(); + QVERIFY(QTest::qWaitForWindowActive(&view)); + + QQuickIconImage *iconImage = qobject_cast(view.rootObject()->childItems().at(0)); + QVERIFY(iconImage); + + QQuickItem *image = view.rootObject()->childItems().at(1); + QVERIFY(image); + + QImage iconImageWindowGrab = grabItemToImage(iconImage); + QCOMPARE(iconImageWindowGrab, grabItemToImage(image)); + + QCOMPARE(iconImageWindowGrab.pixelColor(iconImageWindowGrab.width() / 2, iconImageWindowGrab.height() / 2), QColor(Qt::blue)); +} + +class TestImageProvider : public QQuickImageProvider +{ +public: + TestImageProvider() : QQuickImageProvider(QQuickImageProvider::Pixmap) { } + + QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) override + { + QSize defaultSize(32, 32); + if (size) + *size = defaultSize; + + QPixmap pixmap(requestedSize.width() > 0 ? requestedSize.width() : defaultSize.width(), + requestedSize.height() > 0 ? requestedSize.height() : defaultSize.height()); + pixmap.fill(QColor(id).rgba()); + return pixmap; + } +}; + +// don't crash (QTBUG-63959) +void tst_qquickiconimage::imageProvider() +{ + if (QGuiApplication::platformName() == QLatin1String("offscreen")) + QSKIP("grabToImage() doesn't work on the \"offscreen\" platform plugin (QTBUG-63185)"); + + QQuickView view; + view.engine()->addImageProvider("provider", new TestImageProvider); + view.setSource(testFileUrl("imageProvider.qml")); + QCOMPARE(view.status(), QQuickView::Ready); + view.show(); + view.requestActivate(); + QVERIFY(QTest::qWaitForWindowActive(&view)); + + QQuickIconImage *iconImage = qobject_cast(view.rootObject()->findChild()); + QVERIFY(iconImage); + + QImage image = grabItemToImage(iconImage); + QVERIFY(!image.isNull()); + QCOMPARE(image.pixelColor(image.width() / 2, image.height() / 2), QColor(Qt::red)); +} + +/* + QQuickIconImage::componentComplete() calls QQuickIconImagePrivate::updateIcon(), + which loads the icon's image via QQuickImageBase::load(). That eventually calls + QQuickImageBase::requestFinished(), which calls QQuickIconImage::pixmapChange(). + That then calls QQuickIconImagePrivate::updateFillMode(), which can in turn + cause QQuickIconImage::pixmapChange() to be called again, causing recursion. + + This was a problem because it resulted in icon.color being applied twice. + + This test checks that that doesn't happen. +*/ +void tst_qquickiconimage::translucentColors() +{ + if (QGuiApplication::platformName() == QLatin1String("offscreen")) + QSKIP("grabToImage() doesn't work on the \"offscreen\" platform plugin (QTBUG-63185)"); + + // Doesn't reproduce with QQuickView. + QQmlApplicationEngine engine; + engine.load(testFileUrl("translucentColors.qml")); + QQuickWindow *window = qobject_cast(engine.rootObjects().first()); + + QQuickIconImage *iconImage = qobject_cast(window->findChild()); + QVERIFY(iconImage); + + const QImage image = grabItemToImage(iconImage); + QVERIFY(!image.isNull()); + QCOMPARE(image.pixelColor(image.width() / 2, image.height() / 2), QColor::fromRgba(0x80000000)); +} + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + Q_UNUSED(app); + tst_qquickiconimage test; + QTEST_SET_MAIN_SOURCE_PATH + return QTest::qExec(&test, argc, argv); +} + +#include "tst_qquickiconimage.moc" -- cgit v1.2.3