aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/quickdialogs/qquickfiledialogimpl/tst_qquickfiledialogimpl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/quickdialogs/qquickfiledialogimpl/tst_qquickfiledialogimpl.cpp')
-rw-r--r--tests/auto/quickdialogs/qquickfiledialogimpl/tst_qquickfiledialogimpl.cpp701
1 files changed, 393 insertions, 308 deletions
diff --git a/tests/auto/quickdialogs/qquickfiledialogimpl/tst_qquickfiledialogimpl.cpp b/tests/auto/quickdialogs/qquickfiledialogimpl/tst_qquickfiledialogimpl.cpp
index e70c7e7171..2718bf52a0 100644
--- a/tests/auto/quickdialogs/qquickfiledialogimpl/tst_qquickfiledialogimpl.cpp
+++ b/tests/auto/quickdialogs/qquickfiledialogimpl/tst_qquickfiledialogimpl.cpp
@@ -26,6 +26,7 @@
**
****************************************************************************/
+#include <QtCore/qloggingcategory.h>
#include <QtTest/qtest.h>
#include <QtTest/qsignalspy.h>
#include <QtQml/qqmlfile.h>
@@ -36,6 +37,7 @@
#include <QtQuickDialogs2/private/qquickfiledialog_p.h>
#include <QtQuickDialogs2QuickImpl/private/qquickplatformfiledialog_p.h>
#include <QtQuickDialogs2QuickImpl/private/qquickfiledialogdelegate_p.h>
+#include <QtQuickDialogs2QuickImpl/private/qquickfiledialogimpl_p_p.h>
#include <QtQuickDialogs2QuickImpl/private/qquickfolderbreadcrumbbar_p.h>
#include <QtQuickDialogs2QuickImpl/private/qquickfolderbreadcrumbbar_p_p.h>
#include <QtQuickDialogs2Utils/private/qquickfilenamefilter_p.h>
@@ -51,6 +53,8 @@ using namespace QQuickVisualTestUtils;
using namespace QQuickDialogTestUtils;
using namespace QQuickControlsTestUtils;
+Q_LOGGING_CATEGORY(lcTest, "qt.quick.dialogs.tests.quickfiledialogimpl")
+
class tst_QQuickFileDialogImpl : public QQmlDataTest
{
Q_OBJECT
@@ -69,6 +73,7 @@ public:
private slots:
void initTestCase() override;
+ void init() override;
void cleanupTestCase();
void defaults();
@@ -79,14 +84,17 @@ private slots:
void bindCurrentFolder_data();
void bindCurrentFolder();
void changeFolderViaStandardButtons();
+ void changeFolderViaDoubleClick_data();
void changeFolderViaDoubleClick();
void chooseFolderViaTextEdit();
void chooseFolderViaEnter();
void chooseFileAndThenFolderViaTextEdit();
void cancelDialogWhileTextEditHasFocus();
+ void closingDialogCancels();
void goUp();
void goUpWhileTextEditHasFocus();
void goIntoLargeFolder();
+ void goUpIntoLargeFolder();
void keyAndShortcutHandling();
void bindNameFilters();
void changeNameFilters();
@@ -101,6 +109,8 @@ private slots:
void defaultSuffix();
void done_data();
void done();
+ void setSelectedFile_data();
+ void setSelectedFile();
private:
QTemporaryDir tempDir;
@@ -110,11 +120,23 @@ private:
QDir tempSubSubDir;
QScopedPointer<QFile> tempSubFile1;
QScopedPointer<QFile> tempSubFile2;
+
+ QTemporaryDir largeTempDir;
+ QStringList largeTempDirPaths;
+ QDir largeTempDirLargeSubDir;
+ const int largeTempDirLargeSubDirIndex = 80;
+
QDir oldCurrentDir;
+
+ const QKeySequence goUpKeySequence = QKeySequence(Qt::ALT | Qt::Key_Up);
+ const QKeySequence editPathKeySequence = QKeySequence(Qt::CTRL | Qt::Key_L);
};
+// We don't want to fail on warnings until QTBUG-98964 is fixed,
+// as we deliberately prevent deferred execution in some of the tests here,
+// which causes warnings.
tst_QQuickFileDialogImpl::tst_QQuickFileDialogImpl()
- : QQmlDataTest(QT_QMLTEST_DATADIR)
+ : QQmlDataTest(QT_QMLTEST_DATADIR, FailOnWarningsPolicy::DoNotFailOnWarnings)
{
}
@@ -122,7 +144,7 @@ void tst_QQuickFileDialogImpl::initTestCase()
{
QQmlDataTest::initTestCase();
- qputenv("QT_QUICK_DIALOGS_SHOW_DIRS_FIRST", "1");
+ qputenv("QT_QUICK_DIALOGS_PRESELECT_FIRST_FILE", "1");
QVERIFY(tempDir.isValid());
// QTEST_QUICKCONTROLS_MAIN constructs the test case object once,
@@ -167,58 +189,143 @@ void tst_QQuickFileDialogImpl::initTestCase()
tempFile2.reset(new QFile(tempDir.path() + "/file2.txt"));
QVERIFY(tempFile2->open(QIODevice::ReadWrite));
+ /*
+ Create another temporary directory that contains a large amount of folders.
+ */
+ QVERIFY(largeTempDir.isValid());
+ const static int largeFileCount = 100;
+ const QDir largeTempDirectory(largeTempDir.path());
+ for (int i = 0; i < largeFileCount; ++i) {
+ // Pad with zeroes so that the directories are ordered as we expect.
+ const QString dirName = QString::fromLatin1("dir%1").arg(i, 3, 10, QLatin1Char('0'));
+ QVERIFY(largeTempDirectory.mkdir(dirName));
+ largeTempDirPaths.append(largeTempDirectory.filePath(dirName));
+ }
+
+ // ... and within one of those folders, more folders.
+ largeTempDirLargeSubDir = QDir(largeTempDir.path() + "/dir"
+ + QString::fromLatin1("%1").arg(largeTempDirLargeSubDirIndex, 3, 10, QLatin1Char('0')));
+ QVERIFY(largeTempDirLargeSubDir.exists());
+ const QDir largeTempSubDirectory = QDir(largeTempDirLargeSubDir.path());
+ for (int i = 0; i < largeFileCount; ++i)
+ QVERIFY(largeTempSubDirectory.mkdir(QString::fromLatin1("sub-dir%1").arg(i, 3, 10, QLatin1Char('0'))));
+
// Ensure that each test starts off in the temporary directory.
oldCurrentDir = QDir::current();
QDir::setCurrent(tempDir.path());
}
+void tst_QQuickFileDialogImpl::init()
+{
+ // Do this before each test function in case the test sets it.
+ qputenv("QT_QUICK_DIALOGS_SHOW_DIRS_FIRST", "1");
+}
+
void tst_QQuickFileDialogImpl::cleanupTestCase()
{
// Just in case...
QDir::setCurrent(oldCurrentDir.path());
}
-void tst_QQuickFileDialogImpl::defaults()
+#define VERIFY_FILE_SELECTED(expectedCurrentFolderUrl, expectedCurrentFileUrl) \
+{ \
+ COMPARE_URL(dialogHelper.dialog->selectedFile(), expectedCurrentFileUrl); \
+ COMPARE_URLS(dialogHelper.dialog->selectedFiles(), { expectedCurrentFileUrl }); \
+ /* We also test the deprecated currentFile* API until it's removed. */ \
+ COMPARE_URL(dialogHelper.dialog->currentFile(), expectedCurrentFileUrl); \
+ COMPARE_URLS(dialogHelper.dialog->currentFiles(), { expectedCurrentFileUrl }); \
+ COMPARE_URL(dialogHelper.quickDialog->selectedFile(), expectedCurrentFileUrl); \
+ COMPARE_URL(dialogHelper.dialog->currentFolder(), expectedCurrentFolderUrl); \
+ COMPARE_URL(dialogHelper.quickDialog->currentFolder(), expectedCurrentFolderUrl); \
+}
+
+#define VERIFY_DELEGATE_CURRENT(expectedCurrentFileUrl, expectedCurrentIndex) \
+{ \
+ QTRY_COMPARE(dialogHelper.fileDialogListView->currentIndex(), expectedCurrentIndex); \
+ QQuickFileDialogDelegate *fileDelegate = nullptr; \
+ QTRY_VERIFY(findViewDelegateItem(dialogHelper.fileDialogListView, expectedCurrentIndex, fileDelegate)); \
+ COMPARE_URL(fileDelegate->file(), expectedCurrentFileUrl); \
+}
+
+#define VERIFY_DELEGATE_FOCUSED(expectedCurrentIndex) \
+{ \
+ QTRY_COMPARE(dialogHelper.fileDialogListView->currentIndex(), expectedCurrentIndex); \
+ QQuickFileDialogDelegate *fileDelegate = nullptr; \
+ QTRY_VERIFY(findViewDelegateItem(dialogHelper.fileDialogListView, expectedCurrentIndex, fileDelegate)); \
+ QVERIFY2(fileDelegate->hasActiveFocus(), qPrintable(QString::fromLatin1( \
+ "Expected delegate at index %1 to have focus, but %2 has it") \
+ .arg(QString::number(expectedCurrentIndex)) \
+ .arg(QDebug::toString(dialogHelper.window()->activeFocusItem())))); \
+ QVERIFY(fileDelegate->isHighlighted()); \
+}
+
+/*
+ Checks that currentFolder, selectedFile, and currentIndex are what we expect.
+
+ It also checks that the relevant delegate in the view is current, has focus, and is highlighted.
+ As the FolderListModel (the view's model) is asynchronous, we need to wait for the currentIndex to change.
+
+ Can only be called when the dialog is open.
+*/
+#define VERIFY_FILE_SELECTED_AND_FOCUSED(expectedCurrentFolderUrl, expectedCurrentFileUrl, expectedCurrentIndex) \
+VERIFY_FILE_SELECTED(expectedCurrentFolderUrl, expectedCurrentFileUrl) \
+VERIFY_DELEGATE_CURRENT(expectedCurrentFileUrl, expectedCurrentIndex) \
+VERIFY_DELEGATE_FOCUSED(expectedCurrentIndex)
+
+class FileDialogTestHelper : public DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl>
{
- QQuickApplicationHelper helper(this, "fileDialog.qml");
- QVERIFY2(helper.ready, helper.failureMessage());
+public:
+ FileDialogTestHelper(QQmlDataTest *testCase, const QString &testFilePath,
+ const QStringList &qmlImportPaths = {}, const QVariantMap &initialProperties = {});
- QQuickWindow *window = helper.window;
- window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowExposed(window));
+ bool openDialog() override;
- QQuickFileDialog *dialog = window->property("dialog").value<QQuickFileDialog*>();
- QVERIFY(dialog);
- COMPARE_URL(dialog->selectedFile(), QUrl());
+ QPointer<QQuickListView> fileDialogListView;
+};
+
+FileDialogTestHelper::FileDialogTestHelper(QQmlDataTest *testCase, const QString &testFilePath,
+ const QStringList &qmlImportPaths, const QVariantMap &initialProperties)
+ : DialogTestHelper(testCase, testFilePath, qmlImportPaths, initialProperties)
+{
+}
+
+bool FileDialogTestHelper::openDialog()
+{
+ if (!DialogTestHelper::openDialog())
+ return false;
+
+ fileDialogListView = quickDialog->findChild<QQuickListView*>("fileDialogListView");
+ return fileDialogListView != nullptr;
+}
+
+void tst_QQuickFileDialogImpl::defaults()
+{
+ FileDialogTestHelper dialogHelper(this, "fileDialog.qml");
+ QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage());
+ QVERIFY(dialogHelper.waitForWindowActive());
+
+ COMPARE_URL(dialogHelper.dialog->selectedFile(), QUrl());
// It should default to the current directory.
- COMPARE_URL(dialog->currentFolder(), QUrl::fromLocalFile(QDir().absolutePath()));
+ COMPARE_URL(dialogHelper.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());
+ COMPARE_URL(dialogHelper.dialog->currentFile(), QUrl());
+ COMPARE_URLS(dialogHelper.dialog->currentFiles(), {});
+ QCOMPARE(dialogHelper.dialog->title(), QString());
- dialog->open();
- QQuickFileDialogImpl *quickDialog = window->findChild<QQuickFileDialogImpl*>();
- QTRY_VERIFY(quickDialog->isOpened());
+ QVERIFY(dialogHelper.openDialog());
+ QTRY_VERIFY(dialogHelper.isQuickDialogOpen());
+ QQuickFileDialogImpl *quickDialog = dialogHelper.window()->findChild<QQuickFileDialogImpl*>();
QVERIFY(quickDialog);
- COMPARE_URL(quickDialog->currentFolder(), QUrl::fromLocalFile(QDir().absolutePath()));
- COMPARE_URL(dialog->selectedFile(), QUrl::fromLocalFile(tempSubDir.path()));
- COMPARE_URLS(dialog->selectedFiles(), { QUrl::fromLocalFile(tempSubDir.path()) });
- COMPARE_URL(dialog->currentFile(), dialog->selectedFile());
- COMPARE_URLS(dialog->currentFiles(), dialog->selectedFiles());
+ VERIFY_FILE_SELECTED_AND_FOCUSED(QUrl::fromLocalFile(QDir().absolutePath()), QUrl::fromLocalFile(tempSubDir.path()), 0);
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());
+ FileDialogTestHelper dialogHelper(this, "fileDialog.qml");
+ OPEN_QUICK_DIALOG();
// Select the delegate by clicking once.
QSignalSpy dialogSelectedFileChangedSpy(dialogHelper.dialog, SIGNAL(selectedFileChanged()));
@@ -226,16 +333,11 @@ void tst_QQuickFileDialogImpl::chooseFileViaStandardButtons()
QSignalSpy dialogCurrentFileChangedSpy(dialogHelper.dialog, SIGNAL(currentFileChanged()));
QVERIFY(dialogCurrentFileChangedSpy.isValid());
- auto fileDialogListView = dialogHelper.quickDialog->findChild<QQuickListView*>("fileDialogListView");
- QVERIFY(fileDialogListView);
QQuickFileDialogDelegate *delegate = nullptr;
- QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 2, delegate));
+ QTRY_VERIFY(findViewDelegateItem(dialogHelper.fileDialogListView, 2, delegate));
COMPARE_URL(delegate->file(), QUrl::fromLocalFile(tempFile2->fileName()));
QVERIFY(clickButton(delegate));
- COMPARE_URL(dialogHelper.dialog->selectedFile(), QUrl::fromLocalFile(tempFile2->fileName()));
- COMPARE_URL(dialogHelper.quickDialog->selectedFile(), QUrl::fromLocalFile(tempFile2->fileName()));
- COMPARE_URL(dialogHelper.dialog->currentFile(), dialogHelper.dialog->selectedFile());
- COMPARE_URLS(dialogHelper.dialog->currentFiles(), { dialogHelper.dialog->selectedFile() });
+ VERIFY_FILE_SELECTED_AND_FOCUSED(QUrl::fromLocalFile(tempDir.path()), QUrl::fromLocalFile(tempFile2->fileName()), 2);
QCOMPARE(dialogSelectedFileChangedSpy.count(), 1);
QCOMPARE(dialogCurrentFileChangedSpy.count(), 1);
@@ -258,17 +360,12 @@ void tst_QQuickFileDialogImpl::chooseFileViaStandardButtons()
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());
+ FileDialogTestHelper dialogHelper(this, "fileDialog.qml");
+ OPEN_QUICK_DIALOG();
// Select the delegate by double-clicking.
- auto fileDialogListView = dialogHelper.quickDialog->findChild<QQuickListView*>("fileDialogListView");
- QVERIFY(fileDialogListView);
QQuickFileDialogDelegate *delegate = nullptr;
- QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 2, delegate));
+ QTRY_VERIFY(findViewDelegateItem(dialogHelper.fileDialogListView, 2, delegate));
COMPARE_URL(delegate->file(), QUrl::fromLocalFile(tempFile2->fileName()))
QVERIFY(doubleClickButton(delegate));
COMPARE_URL(dialogHelper.dialog->currentFile(), QUrl::fromLocalFile(tempFile2->fileName()))
@@ -282,14 +379,15 @@ void tst_QQuickFileDialogImpl::chooseFileViaDoubleClick()
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());
+ FileDialogTestHelper dialogHelper(this, "fileDialog.qml");
+ OPEN_QUICK_DIALOG();
+ // Ensure that fileDialogListView has loaded its items, as we force active focus
+ // on the current item when we set it in setFileDialogListViewCurrentIndex(),
+ // which can make the TextField's visibility check
+ // below fail due to it being hidden when it loses activeFocus.
+ VERIFY_FILE_SELECTED_AND_FOCUSED(QUrl::fromLocalFile(tempDir.path()), QUrl::fromLocalFile(tempSubDir.path()), 0);
// 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);
@@ -313,20 +411,11 @@ void tst_QQuickFileDialogImpl::chooseFileViaTextEdit()
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());
+ FileDialogTestHelper dialogHelper(this, "fileDialog.qml");
+ OPEN_QUICK_DIALOG();
// 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());
+ VERIFY_FILE_SELECTED_AND_FOCUSED(QUrl::fromLocalFile(tempDir.path()), QUrl::fromLocalFile(tempSubDir.path()), 0);
// Select the first file in the view by navigating with the down key.
QTest::keyClick(dialogHelper.window(), Qt::Key_Down);
@@ -367,21 +456,16 @@ void tst_QQuickFileDialogImpl::bindCurrentFolder()
QFETCH(QStringList, expectedVisibleFiles);
// Open the dialog.
- DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "bindCurrentFolder.qml", {},
+ FileDialogTestHelper dialogHelper(this, "bindCurrentFolder.qml", {},
{{ "initialFolder", initialFolder }});
- QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage());
- QVERIFY(dialogHelper.waitForWindowActive());
- QVERIFY(dialogHelper.openDialog());
- QTRY_VERIFY(dialogHelper.isQuickDialogOpen());
+ OPEN_QUICK_DIALOG();
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));
+ QTRY_VERIFY2(verifyFileDialogDelegates(dialogHelper.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*>();
@@ -392,25 +476,16 @@ void tst_QQuickFileDialogImpl::bindCurrentFolder()
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());
+ FileDialogTestHelper dialogHelper(this, "fileDialog.qml");
+ OPEN_QUICK_DIALOG();
// Select the delegate by clicking once.
- auto fileDialogListView = dialogHelper.quickDialog->findChild<QQuickListView*>("fileDialogListView");
- QVERIFY(fileDialogListView);
QQuickFileDialogDelegate *delegate = nullptr;
- QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 0, delegate));
+ QTRY_VERIFY(findViewDelegateItem(dialogHelper.fileDialogListView, 0, delegate));
COMPARE_URL(delegate->file(), QUrl::fromLocalFile(tempSubDir.path()));
QVERIFY(clickButton(delegate));
// The selectedFile should change, but not currentFolder.
- COMPARE_URL(dialogHelper.dialog->selectedFile(), QUrl::fromLocalFile(tempSubDir.path()));
- COMPARE_URLS(dialogHelper.dialog->selectedFiles(), { QUrl::fromLocalFile(tempSubDir.path()) });
- COMPARE_URL(dialogHelper.dialog->currentFile(), dialogHelper.dialog->selectedFile());
- COMPARE_URLS(dialogHelper.dialog->currentFiles(), dialogHelper.dialog->selectedFiles());
- COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(tempDir.path()));
+ VERIFY_FILE_SELECTED_AND_FOCUSED(QUrl::fromLocalFile(tempDir.path()), QUrl::fromLocalFile(tempSubDir.path()), 0);
// Click the "Open" button. The dialog should navigate to that directory, but still be open.
QVERIFY(dialogHelper.quickDialog->footer());
@@ -428,33 +503,38 @@ void tst_QQuickFileDialogImpl::changeFolderViaStandardButtons()
QTRY_VERIFY(!dialogHelper.quickDialog->isVisible());
}
+void tst_QQuickFileDialogImpl::changeFolderViaDoubleClick_data()
+{
+ QTest::addColumn<bool>("showDirsFirst");
+
+ QTest::newRow("showDirsFirst=true") << true;
+ QTest::newRow("showDirsFirst=false") << false;
+}
+
void tst_QQuickFileDialogImpl::changeFolderViaDoubleClick()
{
+ QFETCH(bool, showDirsFirst);
+
+ qputenv("QT_QUICK_DIALOGS_SHOW_DIRS_FIRST", showDirsFirst ? "true" : "false");
+
// 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());
+ FileDialogTestHelper dialogHelper(this, "fileDialog.qml");
+ OPEN_QUICK_DIALOG();
// 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));
+ const int subDirIndex = showDirsFirst ? 0 : 2;
+ QTRY_VERIFY(findViewDelegateItem(dialogHelper.fileDialogListView, subDirIndex, 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->selectedFile(), QUrl::fromLocalFile(tempSubSubDir.path()));
- COMPARE_URLS(dialogHelper.dialog->selectedFiles(), { QUrl::fromLocalFile(tempSubSubDir.path()) });
- COMPARE_URL(dialogHelper.dialog->currentFile(), dialogHelper.dialog->selectedFile());
- COMPARE_URLS(dialogHelper.dialog->currentFiles(), { dialogHelper.dialog->selectedFiles() });
- QQuickFileDialogDelegate *subSubDirDelegate = nullptr;
- QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 0, subSubDirDelegate));
- QCOMPARE(subSubDirDelegate->isHighlighted(), true);
- COMPARE_URL(dialogHelper.dialog->selectedFile(), QUrl::fromLocalFile(tempSubSubDir.path()));
- COMPARE_URLS(dialogHelper.dialog->selectedFiles(), { QUrl::fromLocalFile(tempSubSubDir.path()) });
- COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(tempSubDir.path()));
+ const QStringList expectedVisibleFiles = showDirsFirst
+ ? QStringList { tempSubSubDir.path(), tempSubFile1->fileName(), tempSubFile2->fileName() }
+ : QStringList { tempSubFile1->fileName(), tempSubFile2->fileName(), tempSubSubDir.path() };
+ QString failureMessage;
+ QTRY_VERIFY2(verifyFileDialogDelegates(dialogHelper.fileDialogListView, expectedVisibleFiles, failureMessage), qPrintable(failureMessage));
+ // The first file in the directory should now be selected.
+ const QUrl firstFileUrl = showDirsFirst ? QUrl::fromLocalFile(tempSubSubDir.path()) : QUrl::fromLocalFile(tempSubFile1->fileName());
+ VERIFY_FILE_SELECTED_AND_FOCUSED(QUrl::fromLocalFile(tempSubDir.path()), firstFileUrl, 0);
// Since we only chose a folder, the dialog should still be open.
QVERIFY(dialogHelper.dialog->isVisible());
@@ -466,11 +546,10 @@ void tst_QQuickFileDialogImpl::changeFolderViaDoubleClick()
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());
+ FileDialogTestHelper dialogHelper(this, "fileDialog.qml");
+ OPEN_QUICK_DIALOG();
+ // See comment in chooseFileViaTextEdit for why we check for this.
+ VERIFY_FILE_SELECTED_AND_FOCUSED(QUrl::fromLocalFile(tempDir.path()), QUrl::fromLocalFile(tempSubDir.path()), 0);
// Get the text edit visible with Ctrl+L.
const auto editPathKeySequence = QKeySequence(Qt::CTRL | Qt::Key_L);
@@ -488,16 +567,10 @@ void tst_QQuickFileDialogImpl::chooseFolderViaTextEdit()
// 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->selectedFile(), 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::fromLocalFile(tempSubSubDir.path()));
- COMPARE_URLS(dialogHelper.dialog->selectedFiles(), { QUrl::fromLocalFile(tempSubSubDir.path()) });
- COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(tempSubDir.path()));
- QTRY_VERIFY(dialogHelper.dialog->isVisible());
+ // Note that the TextEdit will still have focus, so we can't use VERIFY_FILE_SELECTED_AND_FOCUSED.
+ VERIFY_FILE_SELECTED(QUrl::fromLocalFile(tempSubDir.path()), QUrl::fromLocalFile(tempSubSubDir.path()));
+ VERIFY_DELEGATE_CURRENT(QUrl::fromLocalFile(tempSubSubDir.path()), 0)
+ QVERIFY(dialogHelper.dialog->isVisible());
dialogHelper.dialog->close();
QVERIFY(!dialogHelper.dialog->isVisible());
@@ -507,28 +580,19 @@ void tst_QQuickFileDialogImpl::chooseFolderViaTextEdit()
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());
+ FileDialogTestHelper dialogHelper(this, "fileDialog.qml");
+ OPEN_QUICK_DIALOG();
// The 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());
+ VERIFY_FILE_SELECTED_AND_FOCUSED(QUrl::fromLocalFile(tempDir.path()), QUrl::fromLocalFile(tempSubDir.path()), 0);
// Select the delegate by pressing enter.
QTest::keyClick(dialogHelper.window(), Qt::Key_Return);
- COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(tempSubDir.path()));
+ const QStringList expectedVisibleFiles = { tempSubSubDir.path(), tempSubFile1->fileName(), tempSubFile2->fileName() };
+ QString failureMessage;
+ QTRY_VERIFY2(verifyFileDialogDelegates(dialogHelper.fileDialogListView, expectedVisibleFiles, failureMessage), qPrintable(failureMessage));
// The first file in the new directory should be selected, which is "sub-sub-dir".
- COMPARE_URL(dialogHelper.dialog->currentFile(), QUrl::fromLocalFile(tempSubSubDir.path()));
+ VERIFY_FILE_SELECTED_AND_FOCUSED(QUrl::fromLocalFile(tempSubDir.path()), QUrl::fromLocalFile(tempSubSubDir.path()), 0);
// Since we only chose a folder, the dialog should still be open.
QVERIFY(dialogHelper.dialog->isVisible());
@@ -540,14 +604,12 @@ void tst_QQuickFileDialogImpl::chooseFolderViaEnter()
void tst_QQuickFileDialogImpl::chooseFileAndThenFolderViaTextEdit()
{
// 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());
+ FileDialogTestHelper dialogHelper(this, "fileDialog.qml");
+ OPEN_QUICK_DIALOG();
+ // See comment in chooseFileViaTextEdit for why we check for this.
+ VERIFY_FILE_SELECTED_AND_FOCUSED(QUrl::fromLocalFile(tempDir.path()), QUrl::fromLocalFile(tempSubDir.path()), 0);
// 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);
@@ -589,17 +651,9 @@ void tst_QQuickFileDialogImpl::chooseFileAndThenFolderViaTextEdit()
// 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->selectedFile(), 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);
- // We just changed directories, so the actual selected file shouldn't change.
- COMPARE_URL(dialogHelper.dialog->selectedFile(), QUrl::fromLocalFile(tempSubSubDir.path()));
- COMPARE_URLS(dialogHelper.dialog->selectedFiles(), { QUrl::fromLocalFile(tempSubSubDir.path()) });
- COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(tempSubDir.path()));
- QTRY_VERIFY(dialogHelper.dialog->isVisible());
+ // Note that the TextEdit will still have focus, so we can't use VERIFY_FILE_SELECTED_AND_FOCUSED.
+ VERIFY_FILE_SELECTED(QUrl::fromLocalFile(tempSubDir.path()), QUrl::fromLocalFile(tempSubSubDir.path()));
+ VERIFY_DELEGATE_CURRENT(QUrl::fromLocalFile(tempSubSubDir.path()), 0)
// Close the dialog.
dialogHelper.dialog->close();
@@ -610,14 +664,12 @@ void tst_QQuickFileDialogImpl::chooseFileAndThenFolderViaTextEdit()
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());
+ FileDialogTestHelper dialogHelper(this, "fileDialog.qml");
+ OPEN_QUICK_DIALOG();
+ // See comment in chooseFileViaTextEdit for why we check for this.
+ VERIFY_FILE_SELECTED_AND_FOCUSED(QUrl::fromLocalFile(tempDir.path()), QUrl::fromLocalFile(tempSubDir.path()), 0);
// 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);
@@ -641,17 +693,42 @@ void tst_QQuickFileDialogImpl::cancelDialogWhileTextEditHasFocus()
QVERIFY(!breadcrumbBar->textField()->isVisible());
}
+void tst_QQuickFileDialogImpl::closingDialogCancels()
+{
+ // Open the dialog.
+ DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "fileDialog.qml");
+ OPEN_QUICK_DIALOG();
+
+ QSignalSpy accepted(dialogHelper.dialog, &QQuickAbstractDialog::accepted);
+ QSignalSpy rejected(dialogHelper.dialog, &QQuickAbstractDialog::rejected);
+
+ // Accept the dialog.
+ QVERIFY(QMetaObject::invokeMethod(dialogHelper.window(), "doneAccepted"));
+ QVERIFY(!dialogHelper.dialog->isVisible());
+ QTRY_VERIFY(!dialogHelper.quickDialog->isVisible());
+ QCOMPARE(accepted.size(), 1);
+ QCOMPARE(rejected.size(), 0);
+
+ // Re-open the dialog.
+ accepted.clear();
+ OPEN_QUICK_DIALOG();
+
+ // Close the dialog.
+ CLOSE_QUICK_DIALOG();
+ QCOMPARE(accepted.size(), 0);
+ QCOMPARE(rejected.size(), 1);
+}
+
void tst_QQuickFileDialogImpl::goUp()
{
// Open the dialog. Start off in "sub-dir".
- DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "bindCurrentFolder.qml", {},
+ FileDialogTestHelper dialogHelper(this, "bindCurrentFolder.qml", {},
{{ "initialFolder", QUrl::fromLocalFile(tempSubDir.path()) }});
- QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage());
- QVERIFY(dialogHelper.waitForWindowActive());
- QVERIFY(dialogHelper.openDialog());
- QTRY_VERIFY(dialogHelper.isQuickDialogOpen());
+ OPEN_QUICK_DIALOG();
// Go up a directory via the button next to the breadcrumb bar.
+ qCDebug(lcTest) << "going up to" << tempDir.path() << "- files in that dir:\n"
+ << QQuickFileDialogImplPrivate::get(dialogHelper.quickDialog)->fileList(QDir(tempDir.path()));
auto breadcrumbBar = dialogHelper.quickDialog->findChild<QQuickFolderBreadcrumbBar*>();
QVERIFY(breadcrumbBar);
auto barListView = qobject_cast<QQuickListView*>(breadcrumbBar->contentItem());
@@ -659,38 +736,33 @@ void tst_QQuickFileDialogImpl::goUp()
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);
+ VERIFY_FILE_SELECTED_AND_FOCUSED(QUrl::fromLocalFile(tempDir.path()), QUrl::fromLocalFile(tempSubDir.path()), 0);
- // 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);
+ // Go up a directory via the keyboard shortcut.
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()) });
+ const auto filesInTempParentDir = QQuickFileDialogImplPrivate::get(dialogHelper.quickDialog)->fileList(tempParentDir);
+ qCDebug(lcTest) << "going up to" << tempParentDir.path() << "- files in that dir:\n" << filesInTempParentDir;
+ QTest::keySequence(dialogHelper.window(), goUpKeySequence);
+ // Ubuntu on QEMU arm shows no files in /tmp even if there are.
+ if (!filesInTempParentDir.isEmpty()) {
+ const int expectedCurrentIndex = filesInTempParentDir.indexOf(QFileInfo(tempDir.path()));
+ QVERIFY(expectedCurrentIndex != -1);
+ VERIFY_FILE_SELECTED_AND_FOCUSED(QUrl::fromLocalFile(tempParentDir.path()), QUrl::fromLocalFile(tempDir.path()), expectedCurrentIndex);
+ }
}
void tst_QQuickFileDialogImpl::goUpWhileTextEditHasFocus()
{
// Open the dialog.
- DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "bindCurrentFolder.qml", {},
+ FileDialogTestHelper dialogHelper(this, "bindCurrentFolder.qml", {},
{{ "initialFolder", QUrl::fromLocalFile(tempSubDir.path()) }});
- QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage());
- QVERIFY(dialogHelper.waitForWindowActive());
- QVERIFY(dialogHelper.openDialog());
- QTRY_VERIFY(dialogHelper.isQuickDialogOpen());
+ OPEN_QUICK_DIALOG();
+ // See comment in chooseFileViaTextEdit for why we check for this.
+ VERIFY_FILE_SELECTED_AND_FOCUSED(QUrl::fromLocalFile(tempSubDir.path()), QUrl::fromLocalFile(tempSubSubDir.path()), 0);
// 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);
@@ -709,82 +781,72 @@ void tst_QQuickFileDialogImpl::goUpWhileTextEditHasFocus()
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));
+ QTRY_VERIFY(findViewDelegateItem(dialogHelper.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());
+ // Open the dialog. Start off in the large directory.
+ FileDialogTestHelper dialogHelper(this, "bindCurrentFolder.qml", {},
+ {{ "initialFolder", QUrl::fromLocalFile(largeTempDir.path()) }});
+ OPEN_QUICK_DIALOG();
// 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));
+ if (QQuickTest::qIsPolishScheduled(dialogHelper.fileDialogListView))
+ QVERIFY(QQuickTest::qWaitForItemPolished(dialogHelper.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)" \
+ if (dialogHelper.fileDialogListView->contentItem()->height() < dialogHelper.fileDialogListView->height() * 2) {
+ QSKIP(qPrintable(QString::fromLatin1("Expected height of dialogHelper.fileDialogListView's contentItem (%1)" \
" to be at least twice as big as the ListView's height (%2)")
- .arg(fileDialogListView->contentItem()->height()).arg(fileDialogListView->height())));
+ .arg(dialogHelper.fileDialogListView->contentItem()->height()).arg(dialogHelper.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);
+ // Scroll down to largeTempDirLargeSubDirIndex. The view should be somewhere towards the end.
+ QVERIFY(QMetaObject::invokeMethod(dialogHelper.fileDialogListView, "positionViewAtIndex", Qt::DirectConnection,
+ Q_ARG(int, largeTempDirLargeSubDirIndex), Q_ARG(int, QQuickItemView::PositionMode::Center)));
+ QVERIFY(dialogHelper.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);
+ QQuickFileDialogDelegate *subDirDelegate = nullptr;
+ QTRY_VERIFY(findViewDelegateItem(dialogHelper.fileDialogListView, largeTempDirLargeSubDirIndex, subDirDelegate));
+ COMPARE_URL(subDirDelegate->file(), QUrl::fromLocalFile(largeTempDirLargeSubDir.path()));
+ QVERIFY(doubleClickButton(subDirDelegate));
+ COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(largeTempDirLargeSubDir.path()));
+ COMPARE_URL(dialogHelper.quickDialog->currentFolder(), QUrl::fromLocalFile(largeTempDirLargeSubDir.path()));
+ QCOMPARE(dialogHelper.fileDialogListView->contentY(), 0);
+}
+
+void tst_QQuickFileDialogImpl::goUpIntoLargeFolder()
+{
+ // Open the dialog. Start off in the large sub-directory.
+ FileDialogTestHelper dialogHelper(this, "bindCurrentFolder.qml", {},
+ {{ "initialFolder", QUrl::fromLocalFile(largeTempDirLargeSubDir.path()) }});
+ OPEN_QUICK_DIALOG();
+ // We didn't set an initial selectedFile, so the first file in the directory will be selected.
+ VERIFY_FILE_SELECTED_AND_FOCUSED(QUrl::fromLocalFile(largeTempDirLargeSubDir.path()),
+ QUrl::fromLocalFile(largeTempDirLargeSubDir.path() + "/sub-dir000"), 0);
+
+ // Go up a directory via the keyboard shortcut.
+ QTest::keySequence(dialogHelper.window(), goUpKeySequence);
+ QString failureMessage;
+ QTRY_VERIFY2(verifyFileDialogDelegates(dialogHelper.fileDialogListView,
+ largeTempDirPaths, failureMessage), qPrintable(failureMessage));
+ VERIFY_FILE_SELECTED_AND_FOCUSED(QUrl::fromLocalFile(largeTempDir.path()),
+ QUrl::fromLocalFile(largeTempDirLargeSubDir.path()), largeTempDirLargeSubDirIndex);
}
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());
+ FileDialogTestHelper dialogHelper(this, "fileDialog.qml");
+ OPEN_QUICK_DIALOG();
+ VERIFY_FILE_SELECTED_AND_FOCUSED(QUrl::fromLocalFile(tempDir.path()), QUrl::fromLocalFile(tempSubDir.path()), 0);
// 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);
@@ -819,23 +881,18 @@ void tst_QQuickFileDialogImpl::keyAndShortcutHandling()
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());
+ FileDialogTestHelper dialogHelper(this, "bindTxtHtmlNameFilters.qml");
+ OPEN_QUICK_DIALOG();
// 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,
+ QTRY_VERIFY2(verifyFileDialogDelegates(dialogHelper.fileDialogListView,
{ tempSubDir.path(), tempFile1->fileName(), tempFile2->fileName() }, failureMessage), qPrintable(failureMessage));
}
void tst_QQuickFileDialogImpl::changeNameFilters()
{
- DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "fileDialog.qml");
+ FileDialogTestHelper dialogHelper(this, "fileDialog.qml");
QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage());
QVERIFY(dialogHelper.waitForWindowActive());
@@ -879,10 +936,8 @@ void tst_QQuickFileDialogImpl::changeNameFilters()
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,
+ QTRY_VERIFY2(verifyFileDialogDelegates(dialogHelper.fileDialogListView,
{ tempSubDir.path(), tempFile1->fileName(), tempFile2->fileName() }, failureMessage), qPrintable(failureMessage));
// Open the ComboBox's popup.
@@ -903,7 +958,7 @@ void tst_QQuickFileDialogImpl::changeNameFilters()
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));
+ QTRY_VERIFY2(verifyFileDialogDelegates(dialogHelper.fileDialogListView, { tempSubDir.path() }, failureMessage), qPrintable(failureMessage));
// Open the popup again.
QTest::mouseClick(dialogHelper.window(), Qt::LeftButton, Qt::NoModifier, comboBoxCenterPos);
@@ -917,27 +972,22 @@ void tst_QQuickFileDialogImpl::changeNameFilters()
QVERIFY(clickButton(txtDelegate));
}
QTRY_VERIFY(!comboBox->popup()->isVisible());
- QTRY_VERIFY2(verifyFileDialogDelegates(fileDialogListView,
+ QTRY_VERIFY2(verifyFileDialogDelegates(dialogHelper.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());
+ FileDialogTestHelper dialogHelper(this, "bindAllTxtHtmlNameFilters.qml");
+ OPEN_QUICK_DIALOG();
// Go into the "sub-dir" folder.
- auto fileDialogListView = dialogHelper.quickDialog->findChild<QQuickListView*>("fileDialogListView");
- QVERIFY(fileDialogListView);
QString failureMessage;
- QTRY_VERIFY2(verifyFileDialogDelegates(fileDialogListView,
+ QTRY_VERIFY2(verifyFileDialogDelegates(dialogHelper.fileDialogListView,
{ tempSubDir.path(), tempFile1->fileName(), tempFile2->fileName() }, failureMessage), qPrintable(failureMessage));
QQuickFileDialogDelegate *subDirDelegate = nullptr;
- QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 0, subDirDelegate));
+ QTRY_VERIFY(findViewDelegateItem(dialogHelper.fileDialogListView, 0, subDirDelegate));
QVERIFY(doubleClickButton(subDirDelegate));
COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(tempSubDir.path()));
COMPARE_URL(dialogHelper.quickDialog->currentFolder(), QUrl::fromLocalFile(tempSubDir.path()));
@@ -959,25 +1009,20 @@ void tst_QQuickFileDialogImpl::changeNameFiltersAfterChangingFolder()
}
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));
+ QTRY_VERIFY2(verifyFileDialogDelegates(dialogHelper.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());
+ FileDialogTestHelper dialogHelper(this, "bindTxtHtmlNameFilters.qml");
+ OPEN_QUICK_DIALOG();
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));
+ QTRY_VERIFY(findViewDelegateItem(dialogHelper.fileDialogListView, 0, firstDelegate));
expectedFocusItems << firstDelegate;
// Tab should move to the name filters combobox.
@@ -1004,9 +1049,9 @@ void tst_QQuickFileDialogImpl::tabFocusNavigation()
expectedFocusItems << breadcrumbBar->upButton();
// Finally, add each bread crumb delegate.
- for (int i = 0; i < fileDialogListView->count(); ++i) {
+ for (int i = 0; i < dialogHelper.fileDialogListView->count(); ++i) {
QQuickFileDialogDelegate *delegate = nullptr;
- QTRY_VERIFY(findViewDelegateItem(fileDialogListView, i, delegate));
+ QTRY_VERIFY(findViewDelegateItem(dialogHelper.fileDialogListView, i, delegate));
expectedFocusItems << delegate;
}
@@ -1036,11 +1081,8 @@ void tst_QQuickFileDialogImpl::tabFocusNavigation()
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());
+ FileDialogTestHelper dialogHelper(this, "acceptRejectLabel.qml");
+ OPEN_QUICK_DIALOG();
// Check that the accept and reject buttons' labels have changed.
auto dialogButtonBox = dialogHelper.quickDialog->footer()->findChild<QQuickDialogButtonBox*>();
@@ -1074,11 +1116,8 @@ void tst_QQuickFileDialogImpl::acceptRejectLabel()
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());
+ FileDialogTestHelper dialogHelper(this, "bindTitle.qml");
+ OPEN_QUICK_DIALOG();
// Open the dialog and check that the correct title is displayed.
QQuickFileDialog *dialog = dialogHelper.window()->property("dialog").value<QQuickFileDialog*>();
@@ -1102,12 +1141,9 @@ void tst_QQuickFileDialogImpl::itemsDisabledWhenNecessary()
QVERIFY(subDir.cd("emptyDir"));
// Open the dialog.
- DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "bindCurrentFolder.qml", {},
+ FileDialogTestHelper dialogHelper(this, "bindCurrentFolder.qml", {},
{{ "initialFolder", QUrl::fromLocalFile(subDir.path()) }});
- QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage());
- QVERIFY(dialogHelper.waitForWindowActive());
- QVERIFY(dialogHelper.openDialog());
- QTRY_VERIFY(dialogHelper.isQuickDialogOpen());
+ OPEN_QUICK_DIALOG();
COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(subDir.path()));
COMPARE_URL(dialogHelper.quickDialog->currentFolder(), QUrl::fromLocalFile(subDir.path()));
@@ -1128,7 +1164,6 @@ void tst_QQuickFileDialogImpl::itemsDisabledWhenNecessary()
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);
@@ -1153,18 +1188,13 @@ void tst_QQuickFileDialogImpl::fileMode()
QFETCH(QQuickFileDialog::FileMode, fileMode);
// Open the dialog.
- DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "fileDialog.qml");
+ FileDialogTestHelper dialogHelper(this, "fileDialog.qml");
dialogHelper.dialog->setFileMode(fileMode);
- QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage());
- QVERIFY(dialogHelper.waitForWindowActive());
- QVERIFY(dialogHelper.openDialog());
- QTRY_VERIFY(dialogHelper.isQuickDialogOpen());
+ OPEN_QUICK_DIALOG();
// 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));
+ QTRY_VERIFY(findViewDelegateItem(dialogHelper.fileDialogListView, 1, tempFile1Delegate));
COMPARE_URL(tempFile1Delegate->file(), QUrl::fromLocalFile(tempFile1->fileName()));
QVERIFY(clickButton(tempFile1Delegate));
COMPARE_URL(dialogHelper.dialog->currentFile(), QUrl::fromLocalFile(tempFile1->fileName()));
@@ -1180,7 +1210,7 @@ void tst_QQuickFileDialogImpl::fileMode()
// Only the OpenFiles mode should allow multiple files to be selected, however.
QQuickFileDialogDelegate *tempFile2Delegate = nullptr;
- QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 2, tempFile2Delegate));
+ QTRY_VERIFY(findViewDelegateItem(dialogHelper.fileDialogListView, 2, tempFile2Delegate));
COMPARE_URL(tempFile2Delegate->file(), QUrl::fromLocalFile(tempFile2->fileName()));
QTest::keyPress(dialogHelper.window(), Qt::Key_Shift);
QVERIFY(clickButton(tempFile2Delegate));
@@ -1199,7 +1229,6 @@ void tst_QQuickFileDialogImpl::fileMode()
}
// 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);
@@ -1252,25 +1281,20 @@ void tst_QQuickFileDialogImpl::defaultSuffix()
QVERIFY(tempFile1.open(QIODevice::ReadWrite));
// Open the dialog.
- DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "bindCurrentFolder.qml", {},
+ FileDialogTestHelper 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());
+ OPEN_QUICK_DIALOG();
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));
+ QTRY_VERIFY2(verifyFileDialogDelegates(dialogHelper.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));
+ QTRY_VERIFY(findViewDelegateItem(dialogHelper.fileDialogListView, 0, file1Delegate));
COMPARE_URL(file1Delegate->file(), QUrl::fromLocalFile(tempFile1.fileName()));
QVERIFY(doubleClickButton(file1Delegate));
QVERIFY(!dialogHelper.dialog->isVisible());
@@ -1293,11 +1317,8 @@ 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());
+ FileDialogTestHelper dialogHelper(this, "fileDialog.qml");
+ OPEN_QUICK_DIALOG();
switch (result) {
case QQuickFileDialog::Accepted:
@@ -1313,6 +1334,70 @@ void tst_QQuickFileDialogImpl::done()
QCOMPARE(dialogHelper.dialog->result(), result);
}
+void tst_QQuickFileDialogImpl::setSelectedFile_data()
+{
+ fileMode_data();
+}
+
+void tst_QQuickFileDialogImpl::setSelectedFile()
+{
+ QFETCH(QQuickFileDialog::FileMode, fileMode);
+
+ // Open the dialog.
+ const auto tempFile1Url = QUrl::fromLocalFile(tempFile1->fileName());
+ const QVariantMap initialProperties = {
+ { "tempFile1Url", QVariant::fromValue(tempFile1Url) },
+ { "fileMode", QVariant::fromValue(fileMode) }
+ };
+ FileDialogTestHelper dialogHelper(
+ this, "setSelectedFile.qml", {}, initialProperties);
+ OPEN_QUICK_DIALOG();
+
+ // The selected file should be what we set.
+ VERIFY_FILE_SELECTED_AND_FOCUSED(QUrl::fromLocalFile(tempDir.path()), tempFile1Url, 1);
+
+ // Select the next file in the view by navigating with the down key.
+ // We know it already has focus, as VERIFY_FILE_SELECTED_AND_FOCUSED checks that.
+ QTest::keyClick(dialogHelper.window(), Qt::Key_Down);
+ const auto tempFile2Url = QUrl::fromLocalFile(tempFile2->fileName());
+ COMPARE_URL(dialogHelper.quickDialog->selectedFile(), tempFile2Url);
+ COMPARE_URL(dialogHelper.dialog->selectedFile(), tempFile2Url);
+
+ // Select the delegate by pressing enter.
+ QTest::keyClick(dialogHelper.window(), Qt::Key_Return);
+ COMPARE_URL(dialogHelper.dialog->selectedFile(), tempFile2Url);
+ COMPARE_URLS(dialogHelper.dialog->selectedFiles(), { tempFile2Url });
+ QVERIFY(!dialogHelper.dialog->isVisible());
+ QTRY_VERIFY(!dialogHelper.quickDialog->isVisible());
+ QCOMPARE(dialogHelper.dialog->result(), QQuickFileDialog::Accepted);
+
+ // Set a different initial selectedFile and re-open.
+ dialogHelper.dialog->setSelectedFile(QUrl::fromLocalFile(tempFile1->fileName()));
+ QVERIFY(dialogHelper.openDialog());
+ QTRY_VERIFY(dialogHelper.isQuickDialogOpen());
+ VERIFY_FILE_SELECTED_AND_FOCUSED(QUrl::fromLocalFile(tempDir.path()), tempFile1Url, 1);
+
+ // Close it.
+ dialogHelper.dialog->close();
+ QVERIFY(!dialogHelper.dialog->isVisible());
+ QTRY_VERIFY(!dialogHelper.quickDialog->isVisible());
+
+ // Try to set an invalid selectedFile; it should be a no-op for modes other than SaveFile,
+ // and the previous selectedFile should still be selected.
+ const QString invalidPath = tempDir.path() + "/does-not-exist.txt";
+ if (fileMode != QQuickFileDialog::SaveFile) {
+ QTest::ignoreMessage(QtWarningMsg, QRegularExpression(QLatin1String(".*QML FileDialog: Cannot set ")
+ + invalidPath + QLatin1String(" as a selected file because it doesn't exist")));
+ }
+ dialogHelper.dialog->setSelectedFile(QUrl::fromLocalFile(invalidPath));
+ QVERIFY(dialogHelper.openDialog());
+ if (fileMode != QQuickFileDialog::SaveFile) {
+ VERIFY_FILE_SELECTED_AND_FOCUSED(QUrl::fromLocalFile(tempDir.path()), tempFile1Url, 1);
+ } else {
+ QTRY_COMPARE(dialogHelper.fileDialogListView->currentIndex(), -1);
+ }
+}
+
QTEST_MAIN(tst_QQuickFileDialogImpl)
#include "tst_qquickfiledialogimpl.moc"