diff options
author | Mitch Curtis <[email protected]> | 2021-08-12 14:39:51 +0200 |
---|---|---|
committer | Mitch Curtis <[email protected]> | 2021-08-16 12:52:59 +0200 |
commit | 809339d1484cf556512534367b8170bc26baf072 (patch) | |
tree | 12871313b658f36d058b5ef25af1e247e9c46ce9 /tests/auto/quickcontrols2/dialogs | |
parent | b01b4f00eae8022c6a97d90f54dac395144ae095 (diff) |
Now that qtquickcontrols2 has been merged into qtdeclarative,
we should make it obvious that this repo should no longer be
used, by preventing it from being built.
Task-number: QTBUG-95173
Pick-to: 6.2
Change-Id: I95bd6a214f3d75a865ab163ee0a1f9ffbeb7a051
Reviewed-by: Alexandru Croitor <[email protected]>
Reviewed-by: Volker Hilsheimer <[email protected]>
Diffstat (limited to 'tests/auto/quickcontrols2/dialogs')
16 files changed, 0 insertions, 2448 deletions
diff --git a/tests/auto/quickcontrols2/dialogs/CMakeLists.txt b/tests/auto/quickcontrols2/dialogs/CMakeLists.txt deleted file mode 100644 index 94485f87..00000000 --- a/tests/auto/quickcontrols2/dialogs/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -add_subdirectory(qquickfiledialogimpl) -add_subdirectory(qquickfontdialogimpl) diff --git a/tests/auto/quickcontrols2/dialogs/dialogs.pro b/tests/auto/quickcontrols2/dialogs/dialogs.pro deleted file mode 100644 index 004641ec..00000000 --- a/tests/auto/quickcontrols2/dialogs/dialogs.pro +++ /dev/null @@ -1,3 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS += \ - qquickfiledialogimpl diff --git a/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/BLACKLIST b/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/BLACKLIST deleted file mode 100644 index 822b92dd..00000000 --- a/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/BLACKLIST +++ /dev/null @@ -1,7 +0,0 @@ -# QTBUG-92094 -[tabFocusNavigation] -* - -# QTBUG-92585 -[fileMode:OpenFiles] -* diff --git a/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/CMakeLists.txt b/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/CMakeLists.txt deleted file mode 100644 index 220e826c..00000000 --- a/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/CMakeLists.txt +++ /dev/null @@ -1,40 +0,0 @@ -# Collect test data -file(GLOB_RECURSE test_data_glob - RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} - data/*) -list(APPEND test_data ${test_data_glob}) - -qt_internal_add_test(tst_qquickfiledialogimpl - SOURCES - ../../shared/qtest_quickcontrols.h - ../../shared/util.cpp ../../shared/util.h - ../../shared/visualtestutil.cpp ../../shared/visualtestutil.h - tst_qquickfiledialogimpl.cpp - DEFINES - QQC2_IMPORT_PATH=\\\"${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/quickcontrols2\\\" - PUBLIC_LIBRARIES - Qt::CorePrivate - Qt::Gui - Qt::GuiPrivate - Qt::QmlPrivate - Qt::QuickControls2 - Qt::QuickControls2Private - Qt::QuickDialogs2Private - Qt::QuickDialogs2QuickImplPrivate - Qt::QuickDialogs2UtilsPrivate - Qt::QuickPrivate - Qt::QuickTemplates2Private - Qt::QuickTest - Qt::TestPrivate - TESTDATA ${test_data} -) - -qt_internal_extend_target(tst_qquickfiledialogimpl CONDITION ANDROID OR IOS - DEFINES - QT_QMLTEST_DATADIR=\\\":/data\\\" -) - -qt_internal_extend_target(tst_qquickfiledialogimpl CONDITION NOT ANDROID AND NOT IOS - DEFINES - QT_QMLTEST_DATADIR=\\\"${CMAKE_CURRENT_SOURCE_DIR}/data\\\" -) diff --git a/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/data/acceptRejectLabel.qml b/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/data/acceptRejectLabel.qml deleted file mode 100644 index 3cd526e3..00000000 --- a/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/data/acceptRejectLabel.qml +++ /dev/null @@ -1,67 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2021 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.Dialogs - -ApplicationWindow { - id: window - width: 640 - height: 480 - - property alias dialog: dialog - - FileDialog { - id: dialog - acceptLabel: "AcceptTest" - rejectLabel: "RejectTest" - } -} diff --git a/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/data/bindAllTxtHtmlNameFilters.qml b/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/data/bindAllTxtHtmlNameFilters.qml deleted file mode 100644 index 5010c422..00000000 --- a/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/data/bindAllTxtHtmlNameFilters.qml +++ /dev/null @@ -1,66 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2021 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.Dialogs - -ApplicationWindow { - width: 640 - height: 480 - - property alias dialog: dialog - - FileDialog { - id: dialog - objectName: "FileDialog" - nameFilters: ["All files (*)", "Text files (*.txt)", "HTML files (*.html)"] - } -} diff --git a/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/data/bindCurrentFolder.qml b/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/data/bindCurrentFolder.qml deleted file mode 100644 index 03cd61bc..00000000 --- a/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/data/bindCurrentFolder.qml +++ /dev/null @@ -1,68 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2021 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.Dialogs - -ApplicationWindow { - id: window - width: 640 - height: 480 - - property alias dialog: dialog - required property url initialFolder - - FileDialog { - id: dialog - objectName: "FileDialog" - currentFolder: window.initialFolder - } -} diff --git a/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/data/bindTitle.qml b/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/data/bindTitle.qml deleted file mode 100644 index 60657f58..00000000 --- a/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/data/bindTitle.qml +++ /dev/null @@ -1,65 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2021 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.Dialogs - -ApplicationWindow { - width: 640 - height: 480 - - property alias dialog: dialog - - FileDialog { - id: dialog - title: "Test Title" - } -} diff --git a/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/data/bindTxtHtmlNameFilters.qml b/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/data/bindTxtHtmlNameFilters.qml deleted file mode 100644 index 1e312fbc..00000000 --- a/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/data/bindTxtHtmlNameFilters.qml +++ /dev/null @@ -1,66 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2021 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.Dialogs - -ApplicationWindow { - width: 640 - height: 480 - - property alias dialog: dialog - - FileDialog { - id: dialog - objectName: "FileDialog" - nameFilters: ["Text files (*.txt)", "HTML files (*.html)"] - } -} diff --git a/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/data/fileDialog.qml b/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/data/fileDialog.qml deleted file mode 100644 index febad45c..00000000 --- a/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/data/fileDialog.qml +++ /dev/null @@ -1,73 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2021 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.Dialogs - -ApplicationWindow { - width: 640 - height: 480 - - property alias dialog: dialog - - function doneAccepted() { - dialog.done(FileDialog.Accepted) - } - - function doneRejected() { - dialog.done(FileDialog.Rejected) - } - - FileDialog { - id: dialog - objectName: "FileDialog" - } -} diff --git a/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/qquickfiledialogimpl.pro b/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/qquickfiledialogimpl.pro deleted file mode 100644 index 3f6e83d7..00000000 --- a/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/qquickfiledialogimpl.pro +++ /dev/null @@ -1,14 +0,0 @@ -CONFIG += testcase -TARGET = tst_qquickfiledialogimpl -SOURCES += tst_qquickfiledialogimpl.cpp - -macos:CONFIG -= app_bundle - -QT += core-private gui-private testlib qml-private quick-private qmltest quicktemplates2-private - -include (../../shared/util.pri) - -TESTDATA = data/* - -OTHER_FILES += \ - data/*.qml diff --git a/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/tst_qquickfiledialogimpl.cpp b/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/tst_qquickfiledialogimpl.cpp deleted file mode 100644 index a8fe4c15..00000000 --- a/tests/auto/quickcontrols2/dialogs/qquickfiledialogimpl/tst_qquickfiledialogimpl.cpp +++ /dev/null @@ -1,1349 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL3$ -** 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 http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPLv3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or later as published by the Free -** Software Foundation and appearing in the file LICENSE.GPL included in -** the packaging of this file. Please review the following information to -** ensure the GNU General Public License version 2.0 requirements will be -** met: http://www.gnu.org/licenses/gpl-2.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "../../shared/dialogtestutil.h" -#include "../../shared/util.h" -#include "../../shared/visualtestutil.h" - -#include <QtTest/qtest.h> -#include <QtTest/qsignalspy.h> -#include <QtQml/qqmlfile.h> -#include <QtQuick/private/qquicklistview_p.h> -#include <QtQuickTest/quicktest.h> -#include <QtQuickDialogs2/private/qquickfiledialog_p.h> -#include <QtQuickDialogs2QuickImpl/private/qquickplatformfiledialog_p.h> -#include <QtQuickDialogs2QuickImpl/private/qquickfiledialogdelegate_p.h> -#include <QtQuickDialogs2QuickImpl/private/qquickfolderbreadcrumbbar_p.h> -#include <QtQuickDialogs2QuickImpl/private/qquickfolderbreadcrumbbar_p_p.h> -#include <QtQuickDialogs2Utils/private/qquickfilenamefilter_p.h> -#include <QtQuickTemplates2/private/qquickapplicationwindow_p.h> -#include <QtQuickTemplates2/private/qquickcombobox_p.h> -#include <QtQuickTemplates2/private/qquickdialogbuttonbox_p.h> -#include <QtQuickTemplates2/private/qquickdialogbuttonbox_p_p.h> -#include <QtQuickTemplates2/private/qquicklabel_p.h> -#include <QtQuickTemplates2/private/qquickoverlay_p.h> - -using namespace QQuickDialogTestUtil; -using namespace QQuickVisualTestUtil; - -class tst_QQuickFileDialogImpl : public QQmlDataTest -{ - Q_OBJECT - -private slots: - void initTestCase() override; - void cleanupTestCase(); - - void defaults(); - void chooseFileViaStandardButtons(); - void chooseFileViaDoubleClick(); - void chooseFileViaTextEdit(); - void chooseFileViaEnter(); - void bindCurrentFolder_data(); - void bindCurrentFolder(); - void changeFolderViaStandardButtons(); - void changeFolderViaDoubleClick(); - void chooseFolderViaTextEdit(); - void chooseFolderViaEnter(); - void cancelDialogWhileTextEditHasFocus(); - void goUp(); - void goUpWhileTextEditHasFocus(); - void goIntoLargeFolder(); - void keyAndShortcutHandling(); - void bindNameFilters(); - void changeNameFilters(); - void changeNameFiltersAfterChangingFolder(); - void tabFocusNavigation(); - void acceptRejectLabel(); - void bindTitle(); - void itemsDisabledWhenNecessary(); - void fileMode_data(); - void fileMode(); - void defaultSuffix_data(); - void defaultSuffix(); - void done_data(); - void done(); - -private: - QQuickAbstractButton *findDialogButton(QQuickDialogButtonBox *box, const QString &buttonText); - void enterText(QWindow *window, const QString &textToEnter); - - QTemporaryDir tempDir; - QScopedPointer<QFile> tempFile1; - QScopedPointer<QFile> tempFile2; - QDir tempSubDir; - QDir tempSubSubDir; - QScopedPointer<QFile> tempSubFile1; - QScopedPointer<QFile> tempSubFile2; - QDir oldCurrentDir; -}; - -QQuickAbstractButton *tst_QQuickFileDialogImpl::findDialogButton(QQuickDialogButtonBox *box, const QString &buttonText) -{ - for (int i = 0; i < box->count(); ++i) { - auto button = qobject_cast<QQuickAbstractButton*>(box->itemAt(i)); - if (button && button->text().toUpper() == buttonText.toUpper()) - return button; - } - return nullptr; -} - -void tst_QQuickFileDialogImpl::enterText(QWindow *window, const QString &textToEnter) -{ - for (int i = 0; i < textToEnter.size(); ++i) { - const QChar key = textToEnter.at(i); - QTest::keyClick(window, key.toLatin1()); - } -} - -void tst_QQuickFileDialogImpl::initTestCase() -{ - QQmlDataTest::initTestCase(); - - QVERIFY(tempDir.isValid()); - // QTEST_QUICKCONTROLS_MAIN constructs the test case object once, - // and then calls qRun() for each style, and qRun() calls initTestCase(). - // So, we need to check if we've already made the temporary directory. - // Note that this is only necessary if the test is run with more than one style. - if (!QDir(tempDir.path()).isEmpty()) - return; - - /* - Create a couple of files within the temporary directory. The structure is: - - [temp directory] - ├── sub-dir - │ ├── sub-sub-dir - │ ├── sub-file1.txt - │ └── sub-file2.txt - ├── file1.txt - └── file2.txt - */ - tempSubDir = QDir(tempDir.path()); - QVERIFY2(tempSubDir.mkdir("sub-dir"), qPrintable(QString::fromLatin1( - "Failed to make sub-directory \"sub-dir\" in %1. Permissions are: %2") - .arg(tempDir.path()).arg(QDebug::toString(QFileInfo(tempDir.path()).permissions())))); - QVERIFY(tempSubDir.cd("sub-dir")); - - tempSubSubDir = QDir(tempSubDir.path()); - QVERIFY2(tempSubSubDir.mkdir("sub-sub-dir"), qPrintable(QString::fromLatin1( - "Failed to make sub-directory \"sub-sub-dir\" in %1. Permissions are: %2") - .arg(tempSubDir.path()).arg(QDebug::toString(QFileInfo(tempSubDir.path()).permissions())))); - QVERIFY(tempSubSubDir.cd("sub-sub-dir")); - - tempSubFile1.reset(new QFile(tempSubDir.path() + "/sub-file1.txt")); - QVERIFY(tempSubFile1->open(QIODevice::ReadWrite)); - - tempSubFile2.reset(new QFile(tempSubDir.path() + "/sub-file2.txt")); - QVERIFY(tempSubFile2->open(QIODevice::ReadWrite)); - - tempFile1.reset(new QFile(tempDir.path() + "/file1.txt")); - QVERIFY(tempFile1->open(QIODevice::ReadWrite)); - - tempFile2.reset(new QFile(tempDir.path() + "/file2.txt")); - QVERIFY(tempFile2->open(QIODevice::ReadWrite)); - - // Ensure that each test starts off in the temporary directory. - oldCurrentDir = QDir::current(); - QDir::setCurrent(tempDir.path()); -} - -void tst_QQuickFileDialogImpl::cleanupTestCase() -{ - // Just in case... - QDir::setCurrent(oldCurrentDir.path()); -} - -bool verifyFileDialogDelegates(QQuickListView *fileDialogListView, const QStringList &expectedFiles, - QString &failureMessage) -{ - if (QQuickTest::qIsPolishScheduled(fileDialogListView)) { - if (!QQuickTest::qWaitForItemPolished(fileDialogListView)) { - failureMessage = QLatin1String("Failed to polish fileDialogListView"); - return false; - } - } - - QStringList actualFiles; - for (int i = 0; i < fileDialogListView->count(); ++i) { - auto delegate = qobject_cast<QQuickFileDialogDelegate*>(findViewDelegateItem(fileDialogListView, i)); - if (!delegate) { - failureMessage = QString::fromLatin1("Delegate at index %1 is null").arg(i); - return false; - } - - // Need to call absoluteFilePath on Windows; see comment in dialogtestutil.h. - actualFiles.append(QFileInfo(delegate->file().toLocalFile()).absoluteFilePath()); - } - - if (actualFiles != expectedFiles) { - failureMessage = QString::fromLatin1("Mismatch in actual vs expected " - "delegates in fileDialogListView:\n expected: %1\n actual: %2") - .arg(QDebug::toString(expectedFiles)).arg(QDebug::toString(actualFiles)); - return false; - } - - return true; -} - -bool verifyBreadcrumbDelegates(QQuickFolderBreadcrumbBar *breadcrumbBar, const QUrl &expectedFolder, - QString &failureMessage) -{ - if (!breadcrumbBar) { - failureMessage = QLatin1String("breadcrumbBar is null"); - return false; - } - - auto breadcrumbBarListView = qobject_cast<QQuickListView*>(breadcrumbBar->contentItem()); - if (!breadcrumbBarListView) { - failureMessage = QLatin1String("breadcrumbBar's ListView is null"); - return false; - } - - if (QQuickTest::qIsPolishScheduled(breadcrumbBarListView)) { - if (!QQuickTest::qWaitForItemPolished(breadcrumbBarListView)) { - failureMessage = QLatin1String("Failed to polish breadcrumbBarListView"); - return false; - } - } - - QStringList actualCrumbs; - for (int i = 0; i < breadcrumbBarListView->count(); ++i) { - auto delegate = qobject_cast<QQuickAbstractButton*>(findViewDelegateItem(breadcrumbBarListView, i)); - if (!delegate) { - // It's a separator or some other non-crumb item. - continue; - } - - actualCrumbs.append(delegate->text()); - } - - QStringList expectedCrumbs = QQuickFolderBreadcrumbBarPrivate::crumbPathsForFolder(expectedFolder); - for (int i = 0; i < expectedCrumbs.size(); ++i) { - QString &crumbPath = expectedCrumbs[i]; - crumbPath = QQuickFolderBreadcrumbBarPrivate::folderBaseName(crumbPath); - } - - if (actualCrumbs != expectedCrumbs) { - failureMessage = QString::fromLatin1("Mismatch in actual vs expected " - "delegates in breadcrumbBarListView:\n expected: %1\n actual: %2") - .arg(QDebug::toString(expectedCrumbs)).arg(QDebug::toString(actualCrumbs)); - return false; - } - - return true; -} - -void tst_QQuickFileDialogImpl::defaults() -{ - QQuickApplicationHelper helper(this, "fileDialog.qml"); - QVERIFY2(helper.ready, helper.failureMessage()); - - QQuickWindow *window = helper.window; - window->show(); - window->requestActivate(); - QVERIFY(QTest::qWaitForWindowExposed(window)); - - QQuickFileDialog *dialog = window->property("dialog").value<QQuickFileDialog*>(); - QVERIFY(dialog); - COMPARE_URL(dialog->selectedFile(), QUrl()); - // It should default to the current directory. - COMPARE_URL(dialog->currentFolder(), QUrl::fromLocalFile(QDir().absolutePath())); - // The first file in the directory should be selected, but not until the dialog is actually open, - // as QQuickFileDialogImpl hasn't been created yet. - COMPARE_URL(dialog->currentFile(), QUrl()); - COMPARE_URLS(dialog->currentFiles(), {}); - QCOMPARE(dialog->title(), QString()); - - dialog->open(); - QQuickFileDialogImpl *quickDialog = window->findChild<QQuickFileDialogImpl*>(); - QTRY_VERIFY(quickDialog->isOpened()); - QVERIFY(quickDialog); - COMPARE_URL(quickDialog->selectedFile(), QUrl()); - COMPARE_URL(quickDialog->currentFolder(), QUrl::fromLocalFile(QDir().absolutePath())); - COMPARE_URL(dialog->currentFile(), QUrl::fromLocalFile(tempSubDir.path())); - COMPARE_URLS(dialog->currentFiles(), { QUrl::fromLocalFile(tempSubDir.path()) }); - COMPARE_URL(quickDialog->currentFile(), QUrl::fromLocalFile(tempSubDir.path())); - QCOMPARE(quickDialog->title(), QString()); -} - -void tst_QQuickFileDialogImpl::chooseFileViaStandardButtons() -{ - // Open the dialog. - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "fileDialog.qml"); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - // Select the delegate by clicking once. - QSignalSpy dialogFileChangedSpy(dialogHelper.dialog, SIGNAL(selectedFileChanged())); - QVERIFY(dialogFileChangedSpy.isValid()); - QSignalSpy dialogCurrentFileChangedSpy(dialogHelper.dialog, SIGNAL(currentFileChanged())); - QVERIFY(dialogCurrentFileChangedSpy.isValid()); - QSignalSpy quickDialogCurrentFileChangedSpy(dialogHelper.quickDialog, SIGNAL(currentFileChanged(const QUrl &))); - QVERIFY(quickDialogCurrentFileChangedSpy.isValid()); - - auto fileDialogListView = dialogHelper.quickDialog->findChild<QQuickListView*>("fileDialogListView"); - QVERIFY(fileDialogListView); - QQuickFileDialogDelegate *delegate = nullptr; - QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 2, delegate)); - COMPARE_URL(delegate->file(), QUrl::fromLocalFile(tempFile2->fileName())); - QVERIFY(clickButton(delegate)); - COMPARE_URL(dialogHelper.quickDialog->currentFile(), QUrl::fromLocalFile(tempFile2->fileName())); - COMPARE_URL(dialogHelper.dialog->currentFile(), QUrl::fromLocalFile(tempFile2->fileName())); - COMPARE_URLS(dialogHelper.dialog->currentFiles(), { QUrl::fromLocalFile(tempFile2->fileName()) }); - // Only currentFile-related signals should be emitted. - QCOMPARE(dialogFileChangedSpy.count(), 0); - QCOMPARE(dialogCurrentFileChangedSpy.count(), 1); - QCOMPARE(quickDialogCurrentFileChangedSpy.count(), 1); - - // Click the "Open" button. - QVERIFY(dialogHelper.quickDialog->footer()); - auto dialogButtonBox = dialogHelper.quickDialog->footer()->findChild<QQuickDialogButtonBox*>(); - QVERIFY(dialogButtonBox); - QQuickAbstractButton* openButton = findDialogButton(dialogButtonBox, "Open"); - QVERIFY(openButton); - QVERIFY(clickButton(openButton)); - COMPARE_URL(dialogHelper.dialog->selectedFile(), QUrl::fromLocalFile(tempFile2->fileName())); - COMPARE_URLS(dialogHelper.dialog->selectedFiles(), { QUrl::fromLocalFile(tempFile2->fileName()) }); - QCOMPARE(dialogFileChangedSpy.count(), 1); - COMPARE_URL(dialogHelper.quickDialog->selectedFile(), QUrl::fromLocalFile(tempFile2->fileName())); - QTRY_VERIFY(!dialogHelper.quickDialog->isVisible()); - QVERIFY(!dialogHelper.dialog->isVisible()); -} - -void tst_QQuickFileDialogImpl::chooseFileViaDoubleClick() -{ - // Open the dialog. - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "fileDialog.qml"); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - // Select the delegate by double-clicking. - auto fileDialogListView = dialogHelper.quickDialog->findChild<QQuickListView*>("fileDialogListView"); - QVERIFY(fileDialogListView); - QQuickFileDialogDelegate *delegate = nullptr; - QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 2, delegate)); - COMPARE_URL(delegate->file(), QUrl::fromLocalFile(tempFile2->fileName())) - QVERIFY(doubleClickButton(delegate)); - COMPARE_URL(dialogHelper.dialog->currentFile(), QUrl::fromLocalFile(tempFile2->fileName())) - COMPARE_URLS(dialogHelper.dialog->currentFiles(), { QUrl::fromLocalFile(tempFile2->fileName()) }) - COMPARE_URL(dialogHelper.dialog->selectedFile(), QUrl::fromLocalFile(tempFile2->fileName())) - COMPARE_URLS(dialogHelper.dialog->selectedFiles(), { QUrl::fromLocalFile(tempFile2->fileName()) }) - QVERIFY(!dialogHelper.dialog->isVisible()); - QTRY_VERIFY(!dialogHelper.quickDialog->isVisible()); -} - -void tst_QQuickFileDialogImpl::chooseFileViaTextEdit() -{ - // Open the dialog. - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "fileDialog.qml"); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - // Get the text edit visible with Ctrl+L. - const auto editPathKeySequence = QKeySequence(Qt::CTRL | Qt::Key_L); - QTest::keySequence(dialogHelper.window(), editPathKeySequence); - auto breadcrumbBar = dialogHelper.quickDialog->findChild<QQuickFolderBreadcrumbBar*>(); - QVERIFY(breadcrumbBar); - QVERIFY(breadcrumbBar->textField()->isVisible()); - QCOMPARE(breadcrumbBar->textField()->text(), dialogHelper.dialog->currentFolder().toLocalFile()); - QCOMPARE(breadcrumbBar->textField()->selectedText(), breadcrumbBar->textField()->text()); - - // Enter the path to the file in the text edit. - enterText(dialogHelper.window(), tempFile2->fileName()); - QCOMPARE(breadcrumbBar->textField()->text(), tempFile2->fileName()); - - // Hit enter to accept. - QTest::keyClick(dialogHelper.window(), Qt::Key_Return); - COMPARE_URL(dialogHelper.quickDialog->selectedFile(), QUrl::fromLocalFile(tempFile2->fileName())); - COMPARE_URL(dialogHelper.dialog->selectedFile(), QUrl::fromLocalFile(tempFile2->fileName())); - COMPARE_URLS(dialogHelper.dialog->selectedFiles(), { QUrl::fromLocalFile(tempFile2->fileName()) }); - QVERIFY(!dialogHelper.dialog->isVisible()); - QTRY_VERIFY(!dialogHelper.quickDialog->isVisible()); -} - -void tst_QQuickFileDialogImpl::chooseFileViaEnter() -{ - // Open the dialog. - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "fileDialog.qml"); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - // Before moving down, the first delegate in the view should be selected and have focus. - COMPARE_URL(dialogHelper.dialog->currentFile(), QUrl::fromLocalFile(tempSubDir.path())); - auto fileDialogListView = dialogHelper.quickDialog->findChild<QQuickListView*>("fileDialogListView"); - QVERIFY(fileDialogListView); - QQuickFileDialogDelegate *subDirDelegate = nullptr; - QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 0, subDirDelegate)); - COMPARE_URL(subDirDelegate->file(), QUrl::fromLocalFile(tempSubDir.path())); - QVERIFY(subDirDelegate->hasActiveFocus()); - - // Select the first file in the view by navigating with the down key. - QTest::keyClick(dialogHelper.window(), Qt::Key_Down); - COMPARE_URL(dialogHelper.dialog->currentFile(), QUrl::fromLocalFile(tempFile1->fileName())); - - // Select the delegate by pressing enter. - QTest::keyClick(dialogHelper.window(), Qt::Key_Return); - COMPARE_URL(dialogHelper.dialog->selectedFile(), QUrl::fromLocalFile(tempFile1->fileName())); - COMPARE_URLS(dialogHelper.dialog->selectedFiles(), { QUrl::fromLocalFile(tempFile1->fileName()) }); - QVERIFY(!dialogHelper.dialog->isVisible()); - QTRY_VERIFY(!dialogHelper.quickDialog->isVisible()); - QCOMPARE(dialogHelper.dialog->result(), QQuickFileDialog::Accepted); -} - -void tst_QQuickFileDialogImpl::bindCurrentFolder_data() -{ - QTest::addColumn<QUrl>("initialFolder"); - QTest::addColumn<QUrl>("expectedFolder"); - QTest::addColumn<QStringList>("expectedVisibleFiles"); - - const auto currentDirUrl = QUrl::fromLocalFile(QDir::current().path()); - const auto tempSubDirUrl = QUrl::fromLocalFile(tempSubDir.path()); - const auto tempSubFile1Url = QUrl::fromLocalFile(tempSubFile1->fileName()); - - const QStringList currentDirFiles = { tempSubDir.path(), tempFile1->fileName(), tempFile2->fileName() }; - const QStringList tempSubDirFiles = { tempSubSubDir.path(), tempSubFile1->fileName(), tempSubFile2->fileName() }; - - // Setting the folder to "sub-dir" should result in "sub-file1.txt" and "sub-file2.txt" being visible. - QTest::addRow("sub-dir") << tempSubDirUrl << tempSubDirUrl << tempSubDirFiles; - // Setting a file as the folder shouldn't work, and the dialog shouldn't change its folder. - QTest::addRow("sub-dir/sub-file1.txt") << tempSubFile1Url << currentDirUrl << currentDirFiles; -} - -void tst_QQuickFileDialogImpl::bindCurrentFolder() -{ - QFETCH(QUrl, initialFolder); - QFETCH(QUrl, expectedFolder); - QFETCH(QStringList, expectedVisibleFiles); - - // Open the dialog. - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "bindCurrentFolder.qml", {}, - {{ "initialFolder", initialFolder }}); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - COMPARE_URL(dialogHelper.dialog->currentFolder(), expectedFolder); - - auto fileDialogListView = dialogHelper.quickDialog->findChild<QQuickListView*>("fileDialogListView"); - QVERIFY(fileDialogListView); - QString failureMessage; - // Even waiting for ListView polish and that the FolderListModel's status is ready aren't enough - // on Windows, apparently, as sometimes there just aren't any delegates by the time we do the check. - // So, we use QTRY_VERIFY2 each time we call this function just to be safe. - QTRY_VERIFY2(verifyFileDialogDelegates(fileDialogListView, expectedVisibleFiles, failureMessage), qPrintable(failureMessage)); - - // Check that the breadcrumb bar is correct by constructing the expected files from the expectedFolder. - auto breadcrumbBar = dialogHelper.quickDialog->findChild<QQuickFolderBreadcrumbBar*>(); - QVERIFY(breadcrumbBar); - QVERIFY2(verifyBreadcrumbDelegates(breadcrumbBar, expectedFolder, failureMessage), qPrintable(failureMessage)); -} - -void tst_QQuickFileDialogImpl::changeFolderViaStandardButtons() -{ - // Open the dialog. - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "fileDialog.qml"); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - // Select the delegate by clicking once. - auto fileDialogListView = dialogHelper.quickDialog->findChild<QQuickListView*>("fileDialogListView"); - QVERIFY(fileDialogListView); - QQuickFileDialogDelegate *delegate = nullptr; - QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 0, delegate)); - COMPARE_URL(delegate->file(), QUrl::fromLocalFile(tempSubDir.path())); - QVERIFY(clickButton(delegate)); - // The selectedFile and currentFolder shouldn't change yet. - COMPARE_URL(dialogHelper.dialog->selectedFile(), QUrl()); - COMPARE_URLS(dialogHelper.dialog->selectedFiles(), {}); - COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(tempDir.path())); - // The currentFile should, though. - COMPARE_URL(dialogHelper.dialog->currentFile(), QUrl::fromLocalFile(tempSubDir.path())); - COMPARE_URLS(dialogHelper.dialog->currentFiles(), { QUrl::fromLocalFile(tempSubDir.path()) }); - - // Click the "Open" button. The dialog should navigate to that directory, but still be open. - QVERIFY(dialogHelper.quickDialog->footer()); - auto dialogButtonBox = dialogHelper.quickDialog->footer()->findChild<QQuickDialogButtonBox*>(); - QVERIFY(dialogButtonBox); - QQuickAbstractButton* openButton = findDialogButton(dialogButtonBox, "Open"); - QVERIFY(openButton); - QVERIFY(clickButton(openButton)); - COMPARE_URL(dialogHelper.dialog->selectedFile(), QUrl()); - COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(tempSubDir.path())); - QVERIFY(dialogHelper.dialog->isVisible()); - - dialogHelper.dialog->close(); - QVERIFY(!dialogHelper.dialog->isVisible()); - QTRY_VERIFY(!dialogHelper.quickDialog->isVisible()); -} - -void tst_QQuickFileDialogImpl::changeFolderViaDoubleClick() -{ - // Open the dialog. - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "fileDialog.qml"); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - // Select the "sub-dir" delegate by double-clicking. - auto fileDialogListView = dialogHelper.quickDialog->findChild<QQuickListView*>("fileDialogListView"); - QVERIFY(fileDialogListView); - QQuickFileDialogDelegate *subDirDelegate = nullptr; - QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 0, subDirDelegate)); - COMPARE_URL(subDirDelegate->file(), QUrl::fromLocalFile(tempSubDir.path())); - QVERIFY(doubleClickButton(subDirDelegate)); - // The first file in the directory should be selected, which is "sub-sub-dir". - COMPARE_URL(dialogHelper.dialog->currentFile(), QUrl::fromLocalFile(tempSubSubDir.path())); - COMPARE_URLS(dialogHelper.dialog->currentFiles(), { QUrl::fromLocalFile(tempSubSubDir.path()) }); - QQuickFileDialogDelegate *subSubDirDelegate = nullptr; - QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 0, subSubDirDelegate)); - QCOMPARE(subSubDirDelegate->isHighlighted(), true); - COMPARE_URL(dialogHelper.dialog->selectedFile(), QUrl()); - COMPARE_URLS(dialogHelper.dialog->selectedFiles(), {}); - COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(tempSubDir.path())); - // Since we only chose a folder, the dialog should still be open. - QVERIFY(dialogHelper.dialog->isVisible()); - - dialogHelper.dialog->close(); - QVERIFY(!dialogHelper.dialog->isVisible()); - QTRY_VERIFY(!dialogHelper.quickDialog->isVisible()); -} - -void tst_QQuickFileDialogImpl::chooseFolderViaTextEdit() -{ - // Open the dialog. - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "fileDialog.qml"); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - // Get the text edit visible with Ctrl+L. - const auto editPathKeySequence = QKeySequence(Qt::CTRL | Qt::Key_L); - QTest::keySequence(dialogHelper.window(), editPathKeySequence); - auto breadcrumbBar = dialogHelper.quickDialog->findChild<QQuickFolderBreadcrumbBar*>(); - QVERIFY(breadcrumbBar); - QVERIFY(breadcrumbBar->textField()->isVisible()); - QCOMPARE(breadcrumbBar->textField()->text(), dialogHelper.dialog->currentFolder().toLocalFile()); - QCOMPARE(breadcrumbBar->textField()->selectedText(), breadcrumbBar->textField()->text()); - - // Enter the path to the folder in the text edit. - enterText(dialogHelper.window(), tempSubDir.path()); - QCOMPARE(breadcrumbBar->textField()->text(), tempSubDir.path()); - - // Hit enter to accept. - QTest::keyClick(dialogHelper.window(), Qt::Key_Return); - // The first file in the directory should be selected, which is "sub-sub-dir". - COMPARE_URL(dialogHelper.dialog->currentFile(), QUrl::fromLocalFile(tempSubSubDir.path())); - auto fileDialogListView = dialogHelper.quickDialog->findChild<QQuickListView*>("fileDialogListView"); - QVERIFY(fileDialogListView); - QQuickFileDialogDelegate *subSubDirDelegate = nullptr; - QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 0, subSubDirDelegate)); - QCOMPARE(subSubDirDelegate->isHighlighted(), true); - COMPARE_URL(dialogHelper.dialog->selectedFile(), QUrl()); - COMPARE_URLS(dialogHelper.dialog->selectedFiles(), {}); - COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(tempSubDir.path())); - QTRY_VERIFY(dialogHelper.dialog->isVisible()); - - dialogHelper.dialog->close(); - QVERIFY(!dialogHelper.dialog->isVisible()); - QTRY_VERIFY(!dialogHelper.quickDialog->isVisible()); -} - -void tst_QQuickFileDialogImpl::chooseFolderViaEnter() -{ - // Open the dialog. - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "fileDialog.qml"); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - // Fhe first delegate in the view should be selected and have focus. - COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(tempDir.path())); - COMPARE_URL(dialogHelper.dialog->currentFile(), QUrl::fromLocalFile(tempSubDir.path())); - COMPARE_URLS(dialogHelper.dialog->currentFiles(), { QUrl::fromLocalFile(tempSubDir.path()) }); - auto fileDialogListView = dialogHelper.quickDialog->findChild<QQuickListView*>("fileDialogListView"); - QVERIFY(fileDialogListView); - QQuickFileDialogDelegate *subDirDelegate = nullptr; - QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 0, subDirDelegate)); - COMPARE_URL(subDirDelegate->file(), QUrl::fromLocalFile(tempSubDir.path())); - QVERIFY(subDirDelegate->hasActiveFocus()); - - // Select the delegate by pressing enter. - QTest::keyClick(dialogHelper.window(), Qt::Key_Return); - COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(tempSubDir.path())); - // The first file in the new directory should be selected, which is "sub-sub-dir". - COMPARE_URL(dialogHelper.dialog->currentFile(), QUrl::fromLocalFile(tempSubSubDir.path())); - // Since we only chose a folder, the dialog should still be open. - QVERIFY(dialogHelper.dialog->isVisible()); - - dialogHelper.dialog->close(); - QVERIFY(!dialogHelper.dialog->isVisible()); - QTRY_VERIFY(!dialogHelper.quickDialog->isVisible()); -} - -void tst_QQuickFileDialogImpl::cancelDialogWhileTextEditHasFocus() -{ - // Open the dialog. - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "fileDialog.qml"); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - // Get the text edit visible with Ctrl+L. - const auto editPathKeySequence = QKeySequence(Qt::CTRL | Qt::Key_L); - QTest::keySequence(dialogHelper.window(), editPathKeySequence); - auto breadcrumbBar = dialogHelper.quickDialog->findChild<QQuickFolderBreadcrumbBar*>(); - QVERIFY(breadcrumbBar); - QVERIFY(breadcrumbBar->textField()->hasActiveFocus()); - - // Close it via the cancel button. - auto dialogButtonBox = dialogHelper.quickDialog->footer()->findChild<QQuickDialogButtonBox*>(); - QVERIFY(dialogButtonBox); - const QString cancelText = QQuickDialogButtonBoxPrivate::buttonText(QPlatformDialogHelper::Cancel); - auto cancelButton = findDialogButton(dialogButtonBox, cancelText); - QVERIFY(cancelButton); - QVERIFY(clickButton(cancelButton)); - - // Open it again. The text field should not be visible, but the breadcrumb bar itself should be. - dialogHelper.dialog->open(); - QVERIFY(dialogHelper.dialog->isVisible()); - QTRY_VERIFY(dialogHelper.quickDialog->isOpened()); - QVERIFY(breadcrumbBar->isVisible()); - // The ListView that contains the breadcrumb delegates should be visible. - QVERIFY(breadcrumbBar->contentItem()->isVisible()); - QVERIFY(!breadcrumbBar->textField()->isVisible()); -} - -void tst_QQuickFileDialogImpl::goUp() -{ - // Open the dialog. Start off in "sub-dir". - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "bindCurrentFolder.qml", {}, - {{ "initialFolder", QUrl::fromLocalFile(tempSubDir.path()) }}); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - // Go up a directory via the button next to the breadcrumb bar. - auto breadcrumbBar = dialogHelper.quickDialog->findChild<QQuickFolderBreadcrumbBar*>(); - QVERIFY(breadcrumbBar); - auto barListView = qobject_cast<QQuickListView*>(breadcrumbBar->contentItem()); - QVERIFY(barListView); - if (QQuickTest::qIsPolishScheduled(barListView)) - QVERIFY(QQuickTest::qWaitForItemPolished(barListView)); - QVERIFY(clickButton(breadcrumbBar->upButton())); - COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(tempDir.path())); - // The previous directory that we were in should now be selected (matches e.g. Windows and Ubuntu). - COMPARE_URL(dialogHelper.dialog->currentFile(), QUrl::fromLocalFile(tempSubDir.path())); - COMPARE_URLS(dialogHelper.dialog->currentFiles(), { QUrl::fromLocalFile(tempSubDir.path()) }); - auto fileDialogListView = dialogHelper.quickDialog->findChild<QQuickListView*>("fileDialogListView"); - QVERIFY(fileDialogListView); - QQuickFileDialogDelegate *subDirDelegate = nullptr; - QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 0, subDirDelegate)); - QCOMPARE(subDirDelegate->isHighlighted(), true); - - // Go up a directory via the keyboard shortcut next to the breadcrumb bar. - const auto goUpKeySequence = QKeySequence(Qt::ALT | Qt::Key_Up); - QTest::keySequence(dialogHelper.window(), goUpKeySequence); - QDir tempParentDir(tempDir.path()); - QVERIFY(tempParentDir.cdUp()); - COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(tempParentDir.path())); - COMPARE_URL(dialogHelper.dialog->currentFile(), QUrl::fromLocalFile(tempDir.path())); - COMPARE_URLS(dialogHelper.dialog->currentFiles(), { QUrl::fromLocalFile(tempDir.path()) }); -} - -void tst_QQuickFileDialogImpl::goUpWhileTextEditHasFocus() -{ - // Open the dialog. - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "bindCurrentFolder.qml", {}, - {{ "initialFolder", QUrl::fromLocalFile(tempSubDir.path()) }}); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - // Get the text edit visible with Ctrl+L. - const auto editPathKeySequence = QKeySequence(Qt::CTRL | Qt::Key_L); - QTest::keySequence(dialogHelper.window(), editPathKeySequence); - auto breadcrumbBar = dialogHelper.quickDialog->findChild<QQuickFolderBreadcrumbBar*>(); - QVERIFY(breadcrumbBar); - QVERIFY(breadcrumbBar->textField()->hasActiveFocus()); - - // Go up a directory via the button next to the breadcrumb bar. - auto barListView = qobject_cast<QQuickListView*>(breadcrumbBar->contentItem()); - QVERIFY(barListView); - if (QQuickTest::qIsPolishScheduled(barListView)) - QVERIFY(QQuickTest::qWaitForItemPolished(barListView)); - QVERIFY(clickButton(breadcrumbBar->upButton())); - // The path should have changed to the parent directory. - COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(tempDir.path())); - // The text edit should be hidden when it loses focus. - QVERIFY(!breadcrumbBar->textField()->hasActiveFocus()); - QVERIFY(!breadcrumbBar->textField()->isVisible()); - // The focus should be given to the first delegate. - QVERIFY(dialogHelper.window()->activeFocusItem()); - auto fileDialogListView = dialogHelper.quickDialog->findChild<QQuickListView*>("fileDialogListView"); - QVERIFY(fileDialogListView); - QQuickFileDialogDelegate *firstDelegate = nullptr; - QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 0, firstDelegate)); - QCOMPARE(dialogHelper.window()->activeFocusItem(), firstDelegate); -} - -void tst_QQuickFileDialogImpl::goIntoLargeFolder() -{ - // Create a throwaway directory with a lot of folders within it... - QTemporaryDir anotherTempDir; - QVERIFY(anotherTempDir.isValid()); - for (int i = 0; i < 30; ++i) { - QDir newDir(anotherTempDir.path()); - QVERIFY(newDir.exists()); - // Pad with zeroes so that the directories are ordered as we expect. - QVERIFY(newDir.mkdir(QString::fromLatin1("dir%1").arg(i, 2, 10, QLatin1Char('0')))); - } - - // ... and within one of those folders, more folders. - QDir dir20(anotherTempDir.path() + "/dir20"); - QVERIFY(dir20.exists()); - for (int i = 0; i < 30; ++i) { - QDir newDir(dir20.path()); - QVERIFY(newDir.exists()); - QVERIFY(newDir.mkdir(QString::fromLatin1("subdir%1").arg(i, 2, 10, QLatin1Char('0')))); - } - - // Open the dialog. Start off in the throwaway directory. - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "bindCurrentFolder.qml", {}, - {{ "initialFolder", QUrl::fromLocalFile(anotherTempDir.path()) }}); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - // If the screen is so tall that the contentItem is not vertically larger than the view, - // then the test makes no sense. - auto fileDialogListView = dialogHelper.quickDialog->findChild<QQuickListView*>("fileDialogListView"); - QVERIFY(fileDialogListView); - if (QQuickTest::qIsPolishScheduled(fileDialogListView)) - QVERIFY(QQuickTest::qWaitForItemPolished(fileDialogListView)); - // Just to be safe, make sure it's at least twice as big. - if (fileDialogListView->contentItem()->height() < fileDialogListView->height() * 2) { - QSKIP(qPrintable(QString::fromLatin1("Expected height of fileDialogListView's contentItem (%1)" \ - " to be at least twice as big as the ListView's height (%2)") - .arg(fileDialogListView->contentItem()->height()).arg(fileDialogListView->height()))); - } - - // Scroll down to dir20. The view should be somewhere past the middle. - QVERIFY(QMetaObject::invokeMethod(fileDialogListView, "positionViewAtIndex", Qt::DirectConnection, - Q_ARG(int, 20), Q_ARG(int, QQuickItemView::PositionMode::Center))); - QVERIFY(fileDialogListView->contentY() > 0); - - // Go into it. The view should start at the top of the directory, not at the same contentY - // that it had in the previous directory. - QQuickFileDialogDelegate *dir20Delegate = nullptr; - QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 20, dir20Delegate)); - COMPARE_URL(dir20Delegate->file(), QUrl::fromLocalFile(dir20.path())); - QVERIFY(doubleClickButton(dir20Delegate)); - COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(dir20.path())); - COMPARE_URL(dialogHelper.quickDialog->currentFolder(), QUrl::fromLocalFile(dir20.path())); - QCOMPARE(fileDialogListView->contentY(), 0); -} - -void tst_QQuickFileDialogImpl::keyAndShortcutHandling() -{ - // Open the dialog. - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "fileDialog.qml"); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - // Get the text edit visible with Ctrl+L. - const auto editPathKeySequence = QKeySequence(Qt::CTRL | Qt::Key_L); - QTest::keySequence(dialogHelper.window(), editPathKeySequence); - auto breadcrumbBar = dialogHelper.quickDialog->findChild<QQuickFolderBreadcrumbBar*>(); - QVERIFY(breadcrumbBar); - QVERIFY(breadcrumbBar->textField()->isVisible()); - QCOMPARE(breadcrumbBar->textField()->text(), dialogHelper.dialog->currentFolder().toLocalFile()); - QCOMPARE(breadcrumbBar->textField()->selectedText(), breadcrumbBar->textField()->text()); - - // Ctrl+L shouldn't hide it. - QTest::keySequence(dialogHelper.window(), editPathKeySequence); - QVERIFY(breadcrumbBar->textField()->isVisible()); - - // Cancel it with the escape key. - QTest::keyClick(dialogHelper.window(), Qt::Key_Escape); - QVERIFY(!breadcrumbBar->textField()->isVisible()); - QVERIFY(dialogHelper.dialog->isVisible()); - - // Make it visible. - QTest::keySequence(dialogHelper.window(), editPathKeySequence); - QVERIFY(breadcrumbBar->textField()->isVisible()); - - // Cancel it with the escape key again. - QTest::keyClick(dialogHelper.window(), Qt::Key_Escape); - QVERIFY(!breadcrumbBar->textField()->isVisible()); - QVERIFY(dialogHelper.dialog->isVisible()); - - // Pressing escape now should close the dialog. - QTest::keyClick(dialogHelper.window(), Qt::Key_Escape); - QVERIFY(!dialogHelper.dialog->isVisible()); - QTRY_VERIFY(!dialogHelper.quickDialog->isVisible()); -} - -void tst_QQuickFileDialogImpl::bindNameFilters() -{ - // Open the dialog. - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "bindTxtHtmlNameFilters.qml"); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - // Only "sub-dir", "text1.txt" and "text2.txt" should be visible, since *.txt is the first filter. - auto fileDialogListView = dialogHelper.quickDialog->findChild<QQuickListView*>("fileDialogListView"); - QVERIFY(fileDialogListView); - QString failureMessage; - QTRY_VERIFY2(verifyFileDialogDelegates(fileDialogListView, - { tempSubDir.path(), tempFile1->fileName(), tempFile2->fileName() }, failureMessage), qPrintable(failureMessage)); -} - -void tst_QQuickFileDialogImpl::changeNameFilters() -{ - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "fileDialog.qml"); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - - // Open the dialog and check that selectedNameFilter is correct. - // By default, QFileDialogOptions::defaultNameFilterString() is used. - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - QCOMPARE(dialogHelper.dialog->selectedNameFilter()->name(), "All Files"); - QCOMPARE(dialogHelper.quickDialog->selectedNameFilter()->name(), "All Files"); - QCOMPARE(dialogHelper.dialog->selectedNameFilter()->index(), 0); - QCOMPARE(dialogHelper.quickDialog->selectedNameFilter()->index(), 0); - QCOMPARE(dialogHelper.dialog->selectedNameFilter()->extensions(), { "*" }); - QCOMPARE(dialogHelper.quickDialog->selectedNameFilter()->extensions(), { "*" }); - QCOMPARE(dialogHelper.dialog->selectedNameFilter()->globs(), { "*" }); - QCOMPARE(dialogHelper.quickDialog->selectedNameFilter()->globs(), { "*" }); - - // Close the dialog. - dialogHelper.dialog->close(); - QVERIFY(!dialogHelper.dialog->isVisible()); - QTRY_VERIFY(!dialogHelper.quickDialog->isVisible()); - - // Set .txt and .html filters. - QSignalSpy nameFiltersChangedSpy(dialogHelper.dialog, SIGNAL(nameFiltersChanged())); - QVERIFY(nameFiltersChangedSpy.isValid()); - const QStringList nameFilters = { "Text files (*.txt)", "HTML files (*.html)" }; - dialogHelper.dialog->setNameFilters(nameFilters); - QCOMPARE(dialogHelper.dialog->nameFilters(), nameFilters); - QCOMPARE(nameFiltersChangedSpy.count(), 1); - QCOMPARE(dialogHelper.dialog->selectedNameFilter()->name(), "Text files"); - QCOMPARE(dialogHelper.dialog->selectedNameFilter()->index(), 0); - QCOMPARE(dialogHelper.dialog->selectedNameFilter()->extensions(), { "txt" }); - QCOMPARE(dialogHelper.dialog->selectedNameFilter()->globs(), { "*.txt" }); - - // Re-open the dialog. - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - // QQuickFileDialogImpl's values only get set before opening. - QCOMPARE(dialogHelper.quickDialog->selectedNameFilter()->name(), "Text files"); - QCOMPARE(dialogHelper.quickDialog->selectedNameFilter()->index(), 0); - QCOMPARE(dialogHelper.quickDialog->selectedNameFilter()->extensions(), { "txt" }); - QCOMPARE(dialogHelper.quickDialog->selectedNameFilter()->globs(), { "*.txt" }); - - // Only "sub-dir", "text1.txt" and "text2.txt" should be visible, since *.txt is the first filter. - auto fileDialogListView = dialogHelper.quickDialog->findChild<QQuickListView*>("fileDialogListView"); - QVERIFY(fileDialogListView); - QString failureMessage; - QTRY_VERIFY2(verifyFileDialogDelegates(fileDialogListView, - { tempSubDir.path(), tempFile1->fileName(), tempFile2->fileName() }, failureMessage), qPrintable(failureMessage)); - - // Open the ComboBox's popup. - const QQuickComboBox *comboBox = dialogHelper.quickDialog->findChild<QQuickComboBox*>(); - QVERIFY(comboBox); - const QPoint comboBoxCenterPos = comboBox->mapToScene({ comboBox->width() / 2, comboBox->height() / 2 }).toPoint(); - QTest::mouseClick(dialogHelper.window(), Qt::LeftButton, Qt::NoModifier, comboBoxCenterPos); - QTRY_VERIFY(comboBox->popup()->isOpened()); - - // Select the .html delegate and close the combobox popup. The only visible entry should be the sub-dir. - QQuickListView *comboBoxPopupListView = qobject_cast<QQuickListView*>(comboBox->popup()->contentItem()); - QVERIFY(comboBoxPopupListView); - { - QQuickAbstractButton *htmlDelegate = nullptr; - QTRY_VERIFY(findViewDelegateItem(comboBoxPopupListView, 1, htmlDelegate)); - QVERIFY(clickButton(htmlDelegate)); - } - QTRY_VERIFY(!comboBox->popup()->isVisible()); - // Use QTRY_VERIFY2 here to fix a failure on QEMU armv7 (QT_QPA_PLATFORM=offscreen). - // Not sure why it's necessary. - QTRY_VERIFY2(verifyFileDialogDelegates(fileDialogListView, { tempSubDir.path() }, failureMessage), qPrintable(failureMessage)); - - // Open the popup again. - QTest::mouseClick(dialogHelper.window(), Qt::LeftButton, Qt::NoModifier, comboBoxCenterPos); - QTRY_VERIFY(comboBox->popup()->isOpened()); - - // Select .txt and close the combobox popup. The original entries should be visible. - { - QQuickAbstractButton *txtDelegate = nullptr; - QTRY_VERIFY(findViewDelegateItem(comboBoxPopupListView, 0, txtDelegate)); - QCOMPARE(txtDelegate->text(), nameFilters.at(0)); - QVERIFY(clickButton(txtDelegate)); - } - QTRY_VERIFY(!comboBox->popup()->isVisible()); - QTRY_VERIFY2(verifyFileDialogDelegates(fileDialogListView, - { tempSubDir.path(), tempFile1->fileName(), tempFile2->fileName() }, failureMessage), qPrintable(failureMessage)); -} - -void tst_QQuickFileDialogImpl::changeNameFiltersAfterChangingFolder() -{ - // Open the dialog. - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "bindAllTxtHtmlNameFilters.qml"); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - // Go into the "sub-dir" folder. - auto fileDialogListView = dialogHelper.quickDialog->findChild<QQuickListView*>("fileDialogListView"); - QVERIFY(fileDialogListView); - QString failureMessage; - QTRY_VERIFY2(verifyFileDialogDelegates(fileDialogListView, - { tempSubDir.path(), tempFile1->fileName(), tempFile2->fileName() }, failureMessage), qPrintable(failureMessage)); - QQuickFileDialogDelegate *subDirDelegate = nullptr; - QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 0, subDirDelegate)); - QVERIFY(doubleClickButton(subDirDelegate)); - COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(tempSubDir.path())); - COMPARE_URL(dialogHelper.quickDialog->currentFolder(), QUrl::fromLocalFile(tempSubDir.path())); - - // Open the ComboBox's popup. - const QQuickComboBox *comboBox = dialogHelper.quickDialog->findChild<QQuickComboBox*>(); - QVERIFY(comboBox); - const QPoint comboBoxCenterPos = comboBox->mapToScene({ comboBox->width() / 2, comboBox->height() / 2 }).toPoint(); - QTest::mouseClick(dialogHelper.window(), Qt::LeftButton, Qt::NoModifier, comboBoxCenterPos); - QTRY_VERIFY(comboBox->popup()->isOpened()); - - // Select the .html delegate, close the combobox popup, and ensure that the change had an effect. - QQuickListView *comboBoxPopupListView = qobject_cast<QQuickListView*>(comboBox->popup()->contentItem()); - QVERIFY(comboBoxPopupListView); - { - QQuickAbstractButton *htmlDelegate = nullptr; - QTRY_VERIFY(findViewDelegateItem(comboBoxPopupListView, 2, htmlDelegate)); - QVERIFY(clickButton(htmlDelegate)); - } - QTRY_VERIFY(!comboBox->popup()->isVisible()); - // There are no HTML files in "sub-dir", so there should only be the one "sub-sub-dir" delegate. - QTRY_VERIFY2(verifyFileDialogDelegates(fileDialogListView, { tempSubSubDir.path() }, failureMessage), qPrintable(failureMessage)); -} - -void tst_QQuickFileDialogImpl::tabFocusNavigation() -{ - // Open the dialog. - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "bindTxtHtmlNameFilters.qml"); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - QList<QQuickItem*> expectedFocusItems; - - // The initial focus should be on the first delegate. - auto fileDialogListView = dialogHelper.quickDialog->findChild<QQuickListView*>("fileDialogListView"); - QVERIFY(fileDialogListView); - QQuickFileDialogDelegate *firstDelegate = nullptr; - QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 0, firstDelegate)); - expectedFocusItems << firstDelegate; - - // Tab should move to the name filters combobox. - QQuickComboBox *comboBox = dialogHelper.quickDialog->findChild<QQuickComboBox*>(); - QVERIFY(comboBox); - expectedFocusItems << comboBox; - - // Next, the left-most dialog button. - auto dialogButtonBox = dialogHelper.quickDialog->footer()->findChild<QQuickDialogButtonBox*>(); - QVERIFY(dialogButtonBox); - QCOMPARE(dialogButtonBox->count(), 2); - auto leftMostButton = qobject_cast<QQuickAbstractButton*>(dialogButtonBox->itemAt(0)); - QVERIFY(leftMostButton); - expectedFocusItems << leftMostButton; - - // Then, the right-most dialog button. - auto rightMostButton = qobject_cast<QQuickAbstractButton*>(dialogButtonBox->itemAt(1)); - QVERIFY(rightMostButton); - expectedFocusItems << rightMostButton; - - // Then, the up button. - auto breadcrumbBar = dialogHelper.quickDialog->findChild<QQuickFolderBreadcrumbBar*>(); - QVERIFY(breadcrumbBar); - expectedFocusItems << breadcrumbBar->upButton(); - - // Finally, add each bread crumb delegate. - for (int i = 0; i < fileDialogListView->count(); ++i) { - QQuickFileDialogDelegate *delegate = nullptr; - QTRY_VERIFY(findViewDelegateItem(fileDialogListView, i, delegate)); - expectedFocusItems << delegate; - } - - // Tab through each item, checking the focus after each. - for (auto expectedFocusItem : qAsConst(expectedFocusItems)) { - // Check the focus item first so that we account for the first item. - // Print detailed failure message as workaround for QTBUG-92102. - QVERIFY2(dialogHelper.window()->activeFocusItem() == expectedFocusItem, qPrintable(QString::fromLatin1( - "\n Actual: %1\n Expected: %2").arg(QDebug::toString(dialogHelper.window()->activeFocusItem())) - .arg(QDebug::toString(expectedFocusItem)))); - - if (expectedFocusItem != expectedFocusItems.last()) - QTest::keyClick(dialogHelper.window(), Qt::Key_Tab); - } - - // Ensure the order is reversed when shift-tabbing. - std::reverse(expectedFocusItems.begin(), expectedFocusItems.end()); - // We know the first (last) item has focus already, so skip it. - expectedFocusItems.removeFirst(); - for (auto expectedFocusItem : qAsConst(expectedFocusItems)) { - QTest::keyClick(dialogHelper.window(), Qt::Key_Tab, Qt::ShiftModifier); - - QCOMPARE(dialogHelper.window()->activeFocusItem(), expectedFocusItem); - } -} - -void tst_QQuickFileDialogImpl::acceptRejectLabel() -{ - // Open the dialog. - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "acceptRejectLabel.qml"); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - // Check that the accept and reject buttons' labels have changed. - auto dialogButtonBox = dialogHelper.quickDialog->footer()->findChild<QQuickDialogButtonBox*>(); - QVERIFY(dialogButtonBox); - QVERIFY(findDialogButton(dialogButtonBox, "AcceptTest")); - QVERIFY(findDialogButton(dialogButtonBox, "RejectTest")); - - // Close the dialog. - dialogHelper.dialog->close(); - QVERIFY(!dialogHelper.dialog->isVisible()); - QTRY_VERIFY(!dialogHelper.quickDialog->isVisible()); - - // Reset back to the default text. - dialogHelper.dialog->resetAcceptLabel(); - dialogHelper.dialog->resetRejectLabel(); - - // Re-open the dialog. - dialogHelper.dialog->open(); - QVERIFY(dialogHelper.dialog->isVisible()); - QTRY_VERIFY(dialogHelper.quickDialog->isOpened()); - - // Check that the defaults are back. - const QString openText = QQuickDialogButtonBoxPrivate::buttonText(QPlatformDialogHelper::Open); - QVERIFY2(findDialogButton(dialogButtonBox, openText), qPrintable(QString::fromLatin1( - "Failed to find dialog button with text \"%1\"").arg(openText))); - const QString cancelText = QQuickDialogButtonBoxPrivate::buttonText(QPlatformDialogHelper::Cancel); - QVERIFY2(findDialogButton(dialogButtonBox, cancelText), qPrintable(QString::fromLatin1( - "Failed to find dialog button with text \"%1\"").arg(cancelText))); -} - -void tst_QQuickFileDialogImpl::bindTitle() -{ - // Open the dialog. - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "bindTitle.qml"); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - // Open the dialog and check that the correct title is displayed. - QQuickFileDialog *dialog = dialogHelper.window()->property("dialog").value<QQuickFileDialog*>(); - QVERIFY(dialog); - const QString expectedTitle = QLatin1String("Test Title"); - QCOMPARE(dialogHelper.dialog->title(), expectedTitle); - QCOMPARE(dialogHelper.quickDialog->title(), expectedTitle); - auto header = dialogHelper.quickDialog->header(); - QVERIFY(header); - auto dialogTitleBarLabel = dialogHelper.quickDialog->header()->findChild<QQuickLabel*>("dialogTitleBarLabel"); - QVERIFY(dialogTitleBarLabel); - QCOMPARE(dialogTitleBarLabel->text(), expectedTitle); -} - -void tst_QQuickFileDialogImpl::itemsDisabledWhenNecessary() -{ - QTemporaryDir anotherTempDir; - QVERIFY(anotherTempDir.isValid()); - QDir subDir(anotherTempDir.path()); - QVERIFY(subDir.mkdir("emptyDir")); - QVERIFY(subDir.cd("emptyDir")); - - // Open the dialog. - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "bindCurrentFolder.qml", {}, - {{ "initialFolder", QUrl::fromLocalFile(subDir.path()) }}); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(subDir.path())); - COMPARE_URL(dialogHelper.quickDialog->currentFolder(), QUrl::fromLocalFile(subDir.path())); - - // We opened it in a folder that has no files, so the Open button should be disabled. - QVERIFY(dialogHelper.quickDialog->footer()); - auto dialogButtonBox = dialogHelper.quickDialog->footer()->findChild<QQuickDialogButtonBox*>(); - QVERIFY(dialogButtonBox); - QQuickAbstractButton* openButton = findDialogButton(dialogButtonBox, "Open"); - QVERIFY(openButton); - QCOMPARE(openButton->isEnabled(), false); - - // Now go up. The Open button should now be enabled. - auto breadcrumbBar = dialogHelper.quickDialog->findChild<QQuickFolderBreadcrumbBar*>(); - QVERIFY(breadcrumbBar); - QVERIFY(clickButton(breadcrumbBar->upButton())); - QCOMPARE(openButton->isEnabled(), true); - COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(anotherTempDir.path())); - COMPARE_URL(dialogHelper.quickDialog->currentFolder(), QUrl::fromLocalFile(anotherTempDir.path())); - - // Get the text edit visible with Ctrl+L. The Open button should now be disabled. - const auto editPathKeySequence = QKeySequence(Qt::CTRL | Qt::Key_L); - QTest::keySequence(dialogHelper.window(), editPathKeySequence); - QVERIFY(breadcrumbBar->textField()->isVisible()); - QCOMPARE(openButton->isEnabled(), false); - - // Hide it with the escape key. The Open button should now be enabled. - QTest::keyClick(dialogHelper.window(), Qt::Key_Escape); - QVERIFY(!breadcrumbBar->textField()->isVisible()); - QCOMPARE(openButton->isEnabled(), true); -} - -void tst_QQuickFileDialogImpl::fileMode_data() -{ - QTest::addColumn<QQuickFileDialog::FileMode>("fileMode"); - - QTest::newRow("OpenFile") << QQuickFileDialog::OpenFile; - QTest::newRow("OpenFiles") << QQuickFileDialog::OpenFiles; - QTest::newRow("SaveFile") << QQuickFileDialog::SaveFile; -} - -void tst_QQuickFileDialogImpl::fileMode() -{ - QFETCH(QQuickFileDialog::FileMode, fileMode); - - // Open the dialog. - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "fileDialog.qml"); - dialogHelper.dialog->setFileMode(fileMode); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - // Select the first file (not a directory). - auto fileDialogListView = dialogHelper.quickDialog->findChild<QQuickListView*>("fileDialogListView"); - QVERIFY(fileDialogListView); - QQuickFileDialogDelegate *tempFile1Delegate = nullptr; - QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 1, tempFile1Delegate)); - COMPARE_URL(tempFile1Delegate->file(), QUrl::fromLocalFile(tempFile1->fileName())); - QVERIFY(clickButton(tempFile1Delegate)); - COMPARE_URL(dialogHelper.dialog->currentFile(), QUrl::fromLocalFile(tempFile1->fileName())); - COMPARE_URLS(dialogHelper.dialog->currentFiles(), { QUrl::fromLocalFile(tempFile1->fileName()) }); - - // All modes should support opening an existing file, so the Open button should be enabled. - QVERIFY(dialogHelper.quickDialog->footer()); - auto dialogButtonBox = dialogHelper.quickDialog->footer()->findChild<QQuickDialogButtonBox*>(); - QVERIFY(dialogButtonBox); - QQuickAbstractButton* openButton = findDialogButton(dialogButtonBox, "Open"); - QVERIFY(openButton); - QCOMPARE(openButton->isEnabled(), true); - - // Only the OpenFiles mode should allow multiple files to be selected, however. - QQuickFileDialogDelegate *tempFile2Delegate = nullptr; - QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 2, tempFile2Delegate)); - COMPARE_URL(tempFile2Delegate->file(), QUrl::fromLocalFile(tempFile2->fileName())); - QTest::keyPress(dialogHelper.window(), Qt::Key_Shift); - QVERIFY(clickButton(tempFile2Delegate)); - QTest::keyRelease(dialogHelper.window(), Qt::Key_Shift); - if (fileMode == QQuickFileDialog::OpenFiles) { - // currentFile() always points to the first file in the list of selected files. - COMPARE_URL(dialogHelper.dialog->currentFile(), QUrl::fromLocalFile(tempFile1->fileName())); - const QList<QUrl> expectedSelectedFiles = { - QUrl::fromLocalFile(tempFile1->fileName()), QUrl::fromLocalFile(tempFile2->fileName()) }; - COMPARE_URLS(dialogHelper.dialog->currentFiles(), expectedSelectedFiles); - } else { - // OpenFile and SaveFile dialogs should have tempFile2 selected since it was clicked, - // but the shift should do nothing, so tempFile1 should no longer be selected. - COMPARE_URL(dialogHelper.dialog->currentFile(), QUrl::fromLocalFile(tempFile2->fileName())); - COMPARE_URLS(dialogHelper.dialog->currentFiles(), { QUrl::fromLocalFile(tempFile2->fileName()) }); - } - - // Get the text edit visible with Ctrl+L. - const auto editPathKeySequence = QKeySequence(Qt::CTRL | Qt::Key_L); - QTest::keySequence(dialogHelper.window(), editPathKeySequence); - auto breadcrumbBar = dialogHelper.quickDialog->findChild<QQuickFolderBreadcrumbBar*>(); - QVERIFY(breadcrumbBar); - QVERIFY(breadcrumbBar->textField()->isVisible()); - - // Typing in the name of an non-existent file should only work for SaveFile. - const QString nonExistentFilePath = "/foo/bar.txt"; - enterText(dialogHelper.window(), nonExistentFilePath); - QCOMPARE(breadcrumbBar->textField()->text(), nonExistentFilePath); - QTest::keyClick(dialogHelper.window(), Qt::Key_Return); - if (fileMode == QQuickFileDialog::SaveFile) { - COMPARE_URL(dialogHelper.dialog->selectedFile(), QUrl::fromLocalFile(nonExistentFilePath)); - COMPARE_URLS(dialogHelper.dialog->selectedFiles(), { QUrl::fromLocalFile(nonExistentFilePath) }); - QVERIFY(!dialogHelper.dialog->isVisible()); - QTRY_VERIFY(!dialogHelper.quickDialog->isVisible()); - } else { - // For OpenFile(s), we do what Qt Quick Dialogs 1.x did, and restore the previous (valid) dir path. - // The currentFile(s) should remain unchanged too. - QVERIFY(dialogHelper.dialog->isVisible()); - COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(tempDir.path())); - QCOMPARE(breadcrumbBar->textField()->text(), tempDir.path()); - - // Should be unchanged from the last time. - if (fileMode == QQuickFileDialog::OpenFiles) { - COMPARE_URL(dialogHelper.dialog->currentFile(), QUrl::fromLocalFile(tempFile1->fileName())); - const QList<QUrl> expectedSelectedFiles = { - QUrl::fromLocalFile(tempFile1->fileName()), QUrl::fromLocalFile(tempFile2->fileName()) }; - COMPARE_URLS(dialogHelper.dialog->currentFiles(), expectedSelectedFiles); - } else { // OpenFile - COMPARE_URL(dialogHelper.dialog->currentFile(), QUrl::fromLocalFile(tempFile2->fileName())); - COMPARE_URLS(dialogHelper.dialog->currentFiles(), { QUrl::fromLocalFile(tempFile2->fileName()) }); - } - } -} - -void tst_QQuickFileDialogImpl::defaultSuffix_data() -{ - QTest::addColumn<QString>("defaultSuffix"); - - QTest::newRow("txt") << "txt"; - QTest::newRow(".txt") << ".txt"; -} - -void tst_QQuickFileDialogImpl::defaultSuffix() -{ - QFETCH(QString, defaultSuffix); - - // Simplify the test by using a directory with no files, and add a single file there. - QFile tempFile1(tempSubSubDir.path() + "/file1"); - QVERIFY(tempFile1.open(QIODevice::ReadWrite)); - - // Open the dialog. - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "bindCurrentFolder.qml", {}, - {{ "initialFolder", QUrl::fromLocalFile(tempSubSubDir.path()) }}); - dialogHelper.dialog->setDefaultSuffix(defaultSuffix); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(tempSubSubDir.path())); - - // There should be one extension-less file: "file1". - auto fileDialogListView = dialogHelper.quickDialog->findChild<QQuickListView*>("fileDialogListView"); - QVERIFY(fileDialogListView); - QString failureMessage; - const QStringList expectedVisibleFiles = { tempFile1.fileName() }; - QTRY_VERIFY2(verifyFileDialogDelegates(fileDialogListView, expectedVisibleFiles, failureMessage), qPrintable(failureMessage)); - - // Choose the delegate. The suffix should be added to the delegates. - QQuickFileDialogDelegate *file1Delegate = nullptr; - QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 0, file1Delegate)); - COMPARE_URL(file1Delegate->file(), QUrl::fromLocalFile(tempFile1.fileName())); - QVERIFY(doubleClickButton(file1Delegate)); - QVERIFY(!dialogHelper.dialog->isVisible()); - QTRY_VERIFY(!dialogHelper.quickDialog->isVisible()); - const QUrl fileUrlWithSuffix = QUrl::fromLocalFile(tempFile1.fileName() + ".txt"); - COMPARE_URL(dialogHelper.dialog->selectedFile(), fileUrlWithSuffix); - COMPARE_URLS(dialogHelper.dialog->selectedFiles(), { fileUrlWithSuffix }); -} - -void tst_QQuickFileDialogImpl::done_data() -{ - QTest::addColumn<QQuickFileDialog::StandardCode>("result"); - - QTest::newRow("Accepted") << QQuickFileDialog::Accepted; - QTest::newRow("Rejected") << QQuickFileDialog::Rejected; -} - -void tst_QQuickFileDialogImpl::done() -{ - QFETCH(QQuickFileDialog::StandardCode, result); - - // Open the dialog. - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "fileDialog.qml"); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - switch (result) { - case QQuickFileDialog::Accepted: - QVERIFY(QMetaObject::invokeMethod(dialogHelper.window(), "doneAccepted")); - break; - case QQuickFileDialog::Rejected: - QVERIFY(QMetaObject::invokeMethod(dialogHelper.window(), "doneRejected")); - break; - } - - QVERIFY(!dialogHelper.dialog->isVisible()); - QTRY_VERIFY(!dialogHelper.quickDialog->isVisible()); - QCOMPARE(dialogHelper.dialog->result(), result); -} - -int main(int argc, char *argv[]) -{ - // We need to set this attribute, and this (defining main() ourselves and - // calling QTEST_MAIN_IMPL) seems to be the nicest way to do it without - // duplicating too much code. - // We also don't want to run this for every style, as each one will have - // different ways of implementing the dialogs. - QCoreApplication::setAttribute(Qt::AA_DontUseNativeDialogs); - // For now we only test one style. - QQuickStyle::setStyle("Basic"); - QTEST_MAIN_IMPL(tst_QQuickFileDialogImpl) -} - -#include "tst_qquickfiledialogimpl.moc" diff --git a/tests/auto/quickcontrols2/dialogs/qquickfontdialogimpl/BLACKLIST b/tests/auto/quickcontrols2/dialogs/qquickfontdialogimpl/BLACKLIST deleted file mode 100644 index acabf6c5..00000000 --- a/tests/auto/quickcontrols2/dialogs/qquickfontdialogimpl/BLACKLIST +++ /dev/null @@ -1,4 +0,0 @@ -# See qtbase/src/testlib/qtestblacklist.cpp for format -# QTBUG-94225 -[listViews] -b2qt diff --git a/tests/auto/quickcontrols2/dialogs/qquickfontdialogimpl/CMakeLists.txt b/tests/auto/quickcontrols2/dialogs/qquickfontdialogimpl/CMakeLists.txt deleted file mode 100644 index b631dc8b..00000000 --- a/tests/auto/quickcontrols2/dialogs/qquickfontdialogimpl/CMakeLists.txt +++ /dev/null @@ -1,39 +0,0 @@ -# Collect test data -file(GLOB_RECURSE test_data_glob - RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} - data/*) -list(APPEND test_data ${test_data_glob}) - -qt_internal_add_test(tst_qquickfontdialogimpl - SOURCES - ../../shared/qtest_quickcontrols.h - ../../shared/util.cpp ../../shared/util.h - ../../shared/visualtestutil.cpp ../../shared/visualtestutil.h - tst_qquickfontdialogimpl.cpp - DEFINES - QQC2_IMPORT_PATH=\\\"${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/quickcontrols2\\\" - PUBLIC_LIBRARIES - Qt::CorePrivate - Qt::Gui - Qt::GuiPrivate - Qt::QmlPrivate - Qt::QuickControls2 - Qt::QuickControls2Private - Qt::QuickDialogs2Private - Qt::QuickDialogs2QuickImplPrivate - Qt::QuickPrivate - Qt::QuickTemplates2Private - Qt::QuickTest - Qt::TestPrivate - TESTDATA ${test_data} -) - -qt_internal_extend_target(tst_qquickfontdialogimpl CONDITION ANDROID OR IOS - DEFINES - QT_QMLTEST_DATADIR=\\\":/data\\\" -) - -qt_internal_extend_target(tst_qquickfontdialogimpl CONDITION NOT ANDROID AND NOT IOS - DEFINES - QT_QMLTEST_DATADIR=\\\"${CMAKE_CURRENT_SOURCE_DIR}/data\\\" -) diff --git a/tests/auto/quickcontrols2/dialogs/qquickfontdialogimpl/data/fontDialog.qml b/tests/auto/quickcontrols2/dialogs/qquickfontdialogimpl/data/fontDialog.qml deleted file mode 100644 index 4979d473..00000000 --- a/tests/auto/quickcontrols2/dialogs/qquickfontdialogimpl/data/fontDialog.qml +++ /dev/null @@ -1,65 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2021 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.Dialogs - -ApplicationWindow { - width: 640 - height: 480 - - property alias dialog: dialog - - FontDialog { - id: dialog - objectName: "FontDialog" - } -} diff --git a/tests/auto/quickcontrols2/dialogs/qquickfontdialogimpl/tst_qquickfontdialogimpl.cpp b/tests/auto/quickcontrols2/dialogs/qquickfontdialogimpl/tst_qquickfontdialogimpl.cpp deleted file mode 100644 index 42f60f1b..00000000 --- a/tests/auto/quickcontrols2/dialogs/qquickfontdialogimpl/tst_qquickfontdialogimpl.cpp +++ /dev/null @@ -1,520 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL3$ -** 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 http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPLv3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or later as published by the Free -** Software Foundation and appearing in the file LICENSE.GPL included in -** the packaging of this file. Please review the following information to -** ensure the GNU General Public License version 2.0 requirements will be -** met: http://www.gnu.org/licenses/gpl-2.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "../../shared/dialogtestutil.h" -#include "../../shared/util.h" -#include "../../shared/visualtestutil.h" - -#include <QtTest/qtest.h> -#include <QtTest/qsignalspy.h> -#include <QtQml/qqmlfile.h> -#include <QtQuick/private/qquicklistview_p.h> -#include <QtQuickTemplates2/private/qquickitemdelegate_p.h> -#include <QtQuickDialogs2/private/qquickfontdialog_p.h> -#include <QtQuickDialogs2QuickImpl/private/qquickfontdialogimpl_p.h> -#include <QtQuickTest/quicktest.h> -#include <QtQuickTemplates2/private/qquickapplicationwindow_p.h> -#include <QtQuickTemplates2/private/qquickcombobox_p.h> -#include <QtQuickTemplates2/private/qquicktextfield_p.h> -#include <QtQuickTemplates2/private/qquickdialogbuttonbox_p.h> -#include <QtQuickTemplates2/private/qquickdialogbuttonbox_p_p.h> -#include <QtQuickTemplates2/private/qquicklabel_p.h> -#include <QtQuickTemplates2/private/qquickoverlay_p.h> - -using namespace QQuickDialogTestUtil; -using namespace QQuickVisualTestUtil; - -class tst_QQuickFontDialogImpl : public QQmlDataTest -{ - Q_OBJECT - -private slots: - void writingSystem(); - void listViews(); - void effects(); - void changeFontSize(); - void changeDialogTitle(); - void searchFamily(); - -private: - QQuickAbstractButton *findDialogButton(QQuickDialogButtonBox *box, const QString &buttonText) - { - for (int i = 0; i < box->count(); ++i) { - auto button = qobject_cast<QQuickAbstractButton *>(box->itemAt(i)); - if (button && button->text().toUpper() == buttonText.toUpper()) - return button; - } - return nullptr; - } - - bool closePopup(DialogTestHelper<QQuickFontDialog, QQuickFontDialogImpl> *dialogHelper, - QString dialogButton, QString &failureMessage) - { - auto dialogButtonBox = - dialogHelper->quickDialog->footer()->findChild<QQuickDialogButtonBox *>(); - - if (!dialogButtonBox) { - failureMessage = QLatin1String("dialogButtonBox is null"); - return false; - } - - QQuickAbstractButton *openButton = findDialogButton(dialogButtonBox, dialogButton); - - if (!openButton) { - failureMessage = - QLatin1String("Couldn't find a button with text '%1'").arg(dialogButton); - return false; - } - - bool clicked = clickButton(openButton); - - if (!clicked) { - failureMessage = QLatin1String("'%1' button was never clicked").arg(dialogButton); - return false; - } - - bool visible = dialogHelper->dialog->isVisible(); - if (visible) { - failureMessage = QLatin1String("Dialog is still visible after clicking the '%1' button") - .arg(dialogButton); - return false; - } - return true; - } -}; - -#define CREATE_DIALOG_TEST_HELPER \ - DialogTestHelper<QQuickFontDialog, QQuickFontDialogImpl> dialogHelper(this, "fontDialog.qml"); \ - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); \ - QVERIFY(dialogHelper.waitForWindowActive()); - -#define CLOSE_DIALOG(BUTTON) \ - QString errorMessage; \ - QVERIFY2(closePopup(&dialogHelper, BUTTON, errorMessage), qPrintable(errorMessage)); \ - QTRY_VERIFY(!dialogHelper.quickDialog->isVisible()); - -void tst_QQuickFontDialogImpl::writingSystem() -{ - CREATE_DIALOG_TEST_HELPER - - // Open the dialog. - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - const QQuickTextEdit *sampleEdit = - dialogHelper.quickDialog->findChild<QQuickTextEdit *>("sampleEdit"); - QVERIFY(sampleEdit); - - QCOMPARE(sampleEdit->text(), QFontDatabase::writingSystemSample(QFontDatabase::Any)); - - // Check that the font family list view exist and add signal spy. - const QQuickListView *fontFamilyListView = - dialogHelper.quickDialog->findChild<QQuickListView *>("familyListView"); - QVERIFY(fontFamilyListView); - QSignalSpy fontFamilyModelSpy(fontFamilyListView, SIGNAL(modelChanged())); - - // Open the ComboBox's popup. - const QQuickComboBox *writingSystemComboBox = dialogHelper.quickDialog->findChild<QQuickComboBox*>(); - QVERIFY(writingSystemComboBox); - const QPoint comboBoxCenterPos = writingSystemComboBox->mapToScene({ writingSystemComboBox->width() / 2, writingSystemComboBox->height() / 2 }).toPoint(); - QTest::mouseClick(dialogHelper.window(), Qt::LeftButton, Qt::NoModifier, comboBoxCenterPos); - QTRY_VERIFY(writingSystemComboBox->popup()->isOpened()); - - // "Any" should be selected by default. - QQuickListView *comboBoxPopupListView = qobject_cast<QQuickListView*>(writingSystemComboBox->popup()->contentItem()); - QVERIFY(comboBoxPopupListView); - const int anyIndex = QFontDatabase::Any; - QQuickAbstractButton *anyDelegate = qobject_cast<QQuickAbstractButton*>(findViewDelegateItem(comboBoxPopupListView, anyIndex)); - QVERIFY(anyDelegate); - QCOMPARE(anyDelegate->text(), QFontDatabase::writingSystemName(QFontDatabase::Any)); - - QCOMPARE(fontFamilyModelSpy.count(), 0); - - // Select "Japanese" from the ComboBox. - const int japaneseIndex = QFontDatabase::Japanese; - QQuickAbstractButton *japaneseDelegate = qobject_cast<QQuickAbstractButton*>(findViewDelegateItem(comboBoxPopupListView, japaneseIndex)); - QVERIFY(japaneseDelegate); - QCOMPARE(japaneseDelegate->text(), QFontDatabase::writingSystemName(QFontDatabase::Japanese)); - QVERIFY(clickButton(japaneseDelegate)); - QTRY_VERIFY(!writingSystemComboBox->popup()->isVisible()); - - // Check that the contents of the font family listview changed - QCOMPARE(fontFamilyModelSpy.count(), 1); - - // And that the sample text is correctly set - QCOMPARE(sampleEdit->text(), QFontDatabase::writingSystemSample(QFontDatabase::Japanese)); - - // Then accept it to close it. - auto dialogButtonBox = dialogHelper.quickDialog->footer()->findChild<QQuickDialogButtonBox*>(); - QVERIFY(dialogButtonBox); - QQuickAbstractButton* openButton = findDialogButton(dialogButtonBox, "Ok"); - QVERIFY(openButton); - QVERIFY(clickButton(openButton)); - QVERIFY(!dialogHelper.dialog->isVisible()); - QTRY_VERIFY(!dialogHelper.quickDialog->isVisible()); -} - -void tst_QQuickFontDialogImpl::listViews() -{ - CREATE_DIALOG_TEST_HELPER - - // Open the dialog. - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - QQuickListView *fontFamilyListView = - dialogHelper.quickDialog->findChild<QQuickListView *>("familyListView"); - QVERIFY(fontFamilyListView); - - const QQuickListView *fontStyleListView = - dialogHelper.quickDialog->findChild<QQuickListView *>("styleListView"); - QVERIFY(fontStyleListView); - - const QQuickListView *fontSizeListView = - dialogHelper.quickDialog->findChild<QQuickListView *>("sizeListView"); - QVERIFY(fontSizeListView); - - QSignalSpy currentFontSpy(dialogHelper.dialog, SIGNAL(currentFontChanged())); - QSignalSpy styleModelSpy(fontStyleListView, SIGNAL(modelChanged())); - QSignalSpy sizeModelSpy(fontSizeListView, SIGNAL(modelChanged())); - - QCOMPARE(fontFamilyListView->currentIndex(), 0); - QCOMPARE(fontStyleListView->currentIndex(), 0); - QCOMPARE(fontSizeListView->currentIndex(), 0); - - auto fontListModel = QFontDatabase::families(QFontDatabase::WritingSystem::Any); - fontListModel.removeIf(QFontDatabase::isPrivateFamily); - - // In case the font database contains a significant number of font families - const int maxNumberOfFamiliesToTest = 10; - - for (auto i = 1; i < qMin(fontListModel.size(), maxNumberOfFamiliesToTest); ++i) { - currentFontSpy.clear(); - styleModelSpy.clear(); - sizeModelSpy.clear(); - - const QString err = QString("LOOP INDEX %1, EXPECTED %2, ACTUAL %3").arg(i); - - const QFont currentFont = dialogHelper.dialog->currentFont(); - - const auto oldStyleModel = fontStyleListView->model(); - const auto oldSizeModel = fontSizeListView->model(); - - const QString expected1 = fontListModel[i - 1], actual1 = currentFont.family(); - QVERIFY2(expected1 == actual1, qPrintable(err.arg(expected1, actual1))); - - QQuickAbstractButton *fontDelegate = - qobject_cast<QQuickAbstractButton *>(findViewDelegateItem(fontFamilyListView, i)); - QVERIFY2(fontDelegate, qPrintable(QString("LOOP INDEX %1").arg(i))); - - QVERIFY2(clickButton(fontDelegate), qPrintable(QString("LOOP INDEX %1").arg(i))); - - const QString expected2 = fontListModel[i], - actual2 = dialogHelper.dialog->currentFont().family(); - QVERIFY2(expected2 == actual2, qPrintable(err.arg(expected2, actual2).append(" font: ").append(fontDelegate->text()))); - QVERIFY2(currentFontSpy.count() == 1, qPrintable(err.arg(1, currentFontSpy.count()))); - QVERIFY2((oldStyleModel == fontStyleListView->model()) != (styleModelSpy.count() == 1), - qPrintable(QString("LOOP INDEX %1").arg(i))); - QVERIFY2((oldSizeModel == fontSizeListView->model()) != (sizeModelSpy.count() == 1), - qPrintable(QString("LOOP INDEX %1").arg(i))); - } - - // Then accept it to close it. - QVERIFY(dialogHelper.dialog->currentFont() != dialogHelper.dialog->selectedFont()); - - CLOSE_DIALOG("Ok"); - - QVERIFY(dialogHelper.dialog->currentFont() == dialogHelper.dialog->selectedFont()); -} - -void tst_QQuickFontDialogImpl::effects() -{ - CREATE_DIALOG_TEST_HELPER - - // Open the dialog. - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - QSignalSpy currentFontSpy(dialogHelper.dialog, SIGNAL(currentFontChanged())); - - QQuickCheckBox *underlineCheckBox = - dialogHelper.quickDialog->findChild<QQuickCheckBox *>("underlineEffect"); - QVERIFY(underlineCheckBox); - - QQuickCheckBox *strikeoutCheckBox = - dialogHelper.quickDialog->findChild<QQuickCheckBox *>("strikeoutEffect"); - QVERIFY(strikeoutCheckBox); - - QVERIFY(!dialogHelper.dialog->currentFont().underline()); - QVERIFY(!dialogHelper.dialog->currentFont().strikeOut()); - - QVERIFY(clickButton(underlineCheckBox)); - - QCOMPARE(currentFontSpy.count(), 1); - QVERIFY(dialogHelper.dialog->currentFont().underline()); - QVERIFY(!dialogHelper.dialog->currentFont().strikeOut()); - - QVERIFY(clickButton(underlineCheckBox)); - - QCOMPARE(currentFontSpy.count(), 2); - QVERIFY(!dialogHelper.dialog->currentFont().underline()); - QVERIFY(!dialogHelper.dialog->currentFont().strikeOut()); - - QVERIFY(clickButton(strikeoutCheckBox)); - - QCOMPARE(currentFontSpy.count(), 3); - QVERIFY(!dialogHelper.dialog->currentFont().underline()); - QVERIFY(dialogHelper.dialog->currentFont().strikeOut()); - - QVERIFY(clickButton(strikeoutCheckBox)); - - QCOMPARE(currentFontSpy.count(), 4); - QVERIFY(!dialogHelper.dialog->currentFont().underline()); - QVERIFY(!dialogHelper.dialog->currentFont().strikeOut()); - - // Then accept it to close it. - CLOSE_DIALOG("Ok"); -} - -void tst_QQuickFontDialogImpl::changeFontSize() -{ - CREATE_DIALOG_TEST_HELPER - - // Open the dialog. - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - QQuickTextField *sizeEdit = dialogHelper.quickDialog->findChild<QQuickTextField *>("sizeEdit"); - QVERIFY(sizeEdit); - - QQuickListView *fontSizeListView = - dialogHelper.quickDialog->findChild<QQuickListView *>("sizeListView"); - QVERIFY(fontSizeListView); - - const QQuickItemDelegate *firstSizeDelegate = - qobject_cast<QQuickItemDelegate *>(findViewDelegateItem(fontSizeListView, 0)); - - QCOMPARE(dialogHelper.dialog->currentFont().pointSize(), firstSizeDelegate->text().toInt()); - - sizeEdit->setText("15"); - QCOMPARE(dialogHelper.dialog->currentFont().pointSize(), 15); - - sizeEdit->setText("22"); - QCOMPARE(dialogHelper.dialog->currentFont().pointSize(), 22); - - QVERIFY(dialogHelper.dialog->currentFont() != dialogHelper.dialog->selectedFont()); - - // Then accept it to close it. - CLOSE_DIALOG("Ok"); - - QVERIFY(dialogHelper.dialog->currentFont() == dialogHelper.dialog->selectedFont()); -} - -void tst_QQuickFontDialogImpl::changeDialogTitle() -{ - CREATE_DIALOG_TEST_HELPER - - // Open the dialog. - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - const auto dialogButtonBox = - dialogHelper.quickDialog->footer()->findChild<QQuickDialogButtonBox *>(); - QVERIFY(dialogButtonBox); - QQuickAbstractButton *cancelButton = findDialogButton(dialogButtonBox, "Cancel"); - QVERIFY(cancelButton); - - const QQuickLabel *titleLabel = dialogHelper.quickDialog->header()->findChild<QQuickLabel *>(); - QVERIFY(titleLabel); - - QCOMPARE(titleLabel->text(), QString()); - - const QString newTitle1 = QLatin1String("Some random title #1"); - - // Dialog must be closed for the title to update - QVERIFY(clickButton(cancelButton)); - QVERIFY(!dialogHelper.dialog->isVisible()); - QTRY_VERIFY(!dialogHelper.quickDialog->isVisible()); - - dialogHelper.dialog->setTitle(newTitle1); - - // Reopen the dialog - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - QVERIFY(dialogHelper.dialog->isVisible()); - QTRY_VERIFY(dialogHelper.quickDialog->isVisible()); - - QCOMPARE(titleLabel->text(), newTitle1); - - const QString newTitle2 = QLatin1String("Some random other title #2"); - - dialogHelper.dialog->setTitle(newTitle2); - - // Shouldn't update unless you reopen the dialog - QCOMPARE(titleLabel->text(), newTitle1); - - QVERIFY(clickButton(cancelButton)); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - // Should now be updated - QCOMPARE(titleLabel->text(), newTitle2); - - CLOSE_DIALOG("Ok"); -} - -/* - Represents the expected search logic we use when the user types text into - one of the read-only text edits. - - As we test against real fonts installed on the system and hence cannot use - a hard-coded list, we need this helper to ensure that the (non-trivial) - searching behavior matches what we expect. -*/ -class ListSearchHelper -{ -public: - ListSearchHelper(const QStringList &model) - : m_model(model) - { - } - - int expectedCurrentIndexForSearch(const QString &searchText) - { - bool redo = false; - - do { - m_searchText.append(searchText); - - for (int i = 0; i < m_model.count(); ++i) { - if (m_model.at(i).startsWith(m_searchText, Qt::CaseInsensitive)) - return i; - } - - m_searchText.clear(); - - redo = !redo; - } while (redo); - - return -1; - } - -private: - QStringList m_model; - QString m_searchText; -}; - -void tst_QQuickFontDialogImpl::searchFamily() -{ - CREATE_DIALOG_TEST_HELPER - - // Open the dialog. - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - - const QQuickTextField *familyEdit = - dialogHelper.quickDialog->findChild<QQuickTextField *>("familyEdit"); - QVERIFY(familyEdit); - - QQuickListView *fontFamilyListView = - dialogHelper.quickDialog->findChild<QQuickListView *>("familyListView"); - QVERIFY(fontFamilyListView); - - const QPoint familyEditCenterPos = - familyEdit->mapToScene({ familyEdit->width() / 2, familyEdit->height() / 2 }).toPoint(); - QTest::mouseClick(dialogHelper.window(), Qt::LeftButton, Qt::NoModifier, familyEditCenterPos); - QVERIFY(familyEdit->hasActiveFocus()); - - QSignalSpy familyListViewCurrentIndexSpy(fontFamilyListView, SIGNAL(currentIndexChanged())); - QVERIFY(familyListViewCurrentIndexSpy.isValid()); - - const QString alphabet("abcdefghijklmnopqrstuvwxyz"); - QStringList model = QFontDatabase::families(QFontDatabase::WritingSystem::Any); - model.removeIf(QFontDatabase::isPrivateFamily); - - ListSearchHelper listSearchHelper(model); - - // For each letter in the alphabet, press the corresponding key - // and check that the relevant delegate item in familyListView is selected. - for (auto alphabet_it = alphabet.cbegin(); alphabet_it != alphabet.cend(); alphabet_it++) { - const int previousIndex = fontFamilyListView->currentIndex(); - - const char keyEntered = alphabet_it->toLatin1(); - QTest::keyClick(dialogHelper.window(), keyEntered); - - int expectedListViewIndex = listSearchHelper.expectedCurrentIndexForSearch(QString(keyEntered)); - if (expectedListViewIndex == -1) { - // There was no match, so the currentIndex should remain unchanged. - expectedListViewIndex = previousIndex; - } - if (fontFamilyListView->currentIndex() == expectedListViewIndex) { - // Working as expected; keep testing. - continue; - } - - // Get the actual text of the current delegate item and the expected text. - auto currentDelegateItem = findViewDelegateItem(fontFamilyListView, fontFamilyListView->currentIndex()); - QVERIFY(currentDelegateItem); - const auto actualDelegateText = currentDelegateItem->property("text").toString(); - const auto expectedDelegateText = expectedListViewIndex != -1 ? model.at(expectedListViewIndex) : "(none)"; - - QFAIL(qPrintable(QString::fromLatin1("Expected fontFamilyListView to" - " change its currentIndex to %1 (%2) after typing '%3', but it is %4 (%5)") - .arg(expectedListViewIndex) - .arg(expectedDelegateText) - .arg(keyEntered) - .arg(fontFamilyListView->currentIndex()) - .arg(actualDelegateText))); - } - - CLOSE_DIALOG("Ok"); -} - -int main(int argc, char *argv[]) -{ - // We need to set this attribute, and this (defining main() ourselves and - // calling QTEST_MAIN_IMPL) seems to be the nicest way to do it without - // duplicating too much code. - // We also don't want to run this for every style, as each one will have - // different ways of implementing the dialogs. - QCoreApplication::setAttribute(Qt::AA_DontUseNativeDialogs); - // For now we only test one style. - // TODO: use Basic - QQuickStyle::setStyle("Fusion"); - QTEST_MAIN_IMPL(tst_QQuickFontDialogImpl) -} - -#include "tst_qquickfontdialogimpl.moc" |