diff options
author | Mitch Curtis <mitch.curtis@qt.io> | 2022-05-18 14:27:11 +0800 |
---|---|---|
committer | Mitch Curtis <mitch.curtis@qt.io> | 2022-07-06 20:19:02 +0800 |
commit | a2370b0298e01cf4178044dc28a48d8212be4fd6 (patch) | |
tree | 8e78db01f383e536bcef8c8237e210da45e54522 /tests | |
parent | 405e12b171f444c4ada02b6ab4dc84f10a7b8b42 (diff) |
tst_qquickfiledialogimpl: refactor duplicated code into helpers
Change-Id: I1445d41dbbbe346506195c160e87d0b05770d22c
Reviewed-by: Oliver Eftevaag <oliver.eftevaag@qt.io>
(cherry picked from commit f047980dea361479865975c716736fdf46fd109c)
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/quickdialogs/qquickfiledialogimpl/tst_qquickfiledialogimpl.cpp | 475 |
1 files changed, 185 insertions, 290 deletions
diff --git a/tests/auto/quickdialogs/qquickfiledialogimpl/tst_qquickfiledialogimpl.cpp b/tests/auto/quickdialogs/qquickfiledialogimpl/tst_qquickfiledialogimpl.cpp index 9cc58377b3..e8b0701fb2 100644 --- a/tests/auto/quickdialogs/qquickfiledialogimpl/tst_qquickfiledialogimpl.cpp +++ b/tests/auto/quickdialogs/qquickfiledialogimpl/tst_qquickfiledialogimpl.cpp @@ -188,47 +188,105 @@ void tst_QQuickFileDialogImpl::cleanupTestCase() 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())); @@ -236,16 +294,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); @@ -268,17 +321,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())) @@ -292,11 +340,8 @@ 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(); // Get the text edit visible with Ctrl+L. const auto editPathKeySequence = QKeySequence(Qt::CTRL | Qt::Key_L); @@ -323,19 +368,14 @@ 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); - QCOMPARE(fileDialogListView->currentIndex(), 0); + QCOMPARE(dialogHelper.fileDialogListView->currentIndex(), 0); QQuickFileDialogDelegate *subDirDelegate = nullptr; - QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 0, subDirDelegate)); + QTRY_VERIFY(findViewDelegateItem(dialogHelper.fileDialogListView, 0, subDirDelegate)); COMPARE_URL(subDirDelegate->file(), QUrl::fromLocalFile(tempSubDir.path())); QVERIFY(subDirDelegate->hasActiveFocus()); @@ -378,21 +418,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*>(); @@ -403,25 +438,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()); @@ -454,30 +480,18 @@ void tst_QQuickFileDialogImpl::changeFolderViaDoubleClick() 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; const int subDirIndex = showDirsFirst ? 0 : 2; - QTRY_VERIFY(findViewDelegateItem(fileDialogListView, subDirIndex, subDirDelegate)); + 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 now be selected. const QUrl firstFileUrl = showDirsFirst ? QUrl::fromLocalFile(tempSubSubDir.path()) : QUrl::fromLocalFile(tempSubFile1->fileName()); - COMPARE_URL(dialogHelper.dialog->selectedFile(), firstFileUrl); - COMPARE_URLS(dialogHelper.dialog->selectedFiles(), { firstFileUrl }); - COMPARE_URL(dialogHelper.dialog->currentFile(), dialogHelper.dialog->selectedFile()); - COMPARE_URLS(dialogHelper.dialog->currentFiles(), { dialogHelper.dialog->selectedFiles() }); - COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(tempSubDir.path())); - QQuickFileDialogDelegate *firstDelegateInSubDir = nullptr; - QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 0, firstDelegateInSubDir)); - QCOMPARE(firstDelegateInSubDir->isHighlighted(), true); + 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()); @@ -489,11 +503,8 @@ 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(); // Get the text edit visible with Ctrl+L. const auto editPathKeySequence = QKeySequence(Qt::CTRL | Qt::Key_L); @@ -511,16 +522,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()); @@ -530,28 +535,16 @@ 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())); // 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()); @@ -563,11 +556,8 @@ 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(); // Get the text edit visible with Ctrl+L. const auto editPathKeySequence = QKeySequence(Qt::CTRL | Qt::Key_L); @@ -612,17 +602,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(); @@ -633,11 +615,8 @@ 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(); // Get the text edit visible with Ctrl+L. const auto editPathKeySequence = QKeySequence(Qt::CTRL | Qt::Key_L); @@ -667,12 +646,9 @@ void tst_QQuickFileDialogImpl::cancelDialogWhileTextEditHasFocus() 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. auto breadcrumbBar = dialogHelper.quickDialog->findChild<QQuickFolderBreadcrumbBar*>(); @@ -682,15 +658,8 @@ 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. const auto goUpKeySequence = QKeySequence(Qt::ALT | Qt::Key_Up); @@ -700,17 +669,16 @@ void tst_QQuickFileDialogImpl::goUp() 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()) }); + // TODO: use the line below instead when QTBUG-103547 is fixed +// VERIFY_FILE_SELECTED_AND_FOCUSED(QUrl::fromLocalFile(tempParentDir.path()), QUrl::fromLocalFile(tempDir.path()), 0); } 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(); // Get the text edit visible with Ctrl+L. const auto editPathKeySequence = QKeySequence(Qt::CTRL | Qt::Key_L); @@ -732,10 +700,8 @@ 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); } @@ -761,50 +727,42 @@ void tst_QQuickFileDialogImpl::goIntoLargeFolder() } // Open the dialog. Start off in the throwaway directory. - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper(this, "bindCurrentFolder.qml", {}, + FileDialogTestHelper 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_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, + QVERIFY(QMetaObject::invokeMethod(dialogHelper.fileDialogListView, "positionViewAtIndex", Qt::DirectConnection, Q_ARG(int, 20), Q_ARG(int, QQuickItemView::PositionMode::Center))); - QVERIFY(fileDialogListView->contentY() > 0); + 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)); + QTRY_VERIFY(findViewDelegateItem(dialogHelper.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); + QCOMPARE(dialogHelper.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()); + FileDialogTestHelper dialogHelper(this, "fileDialog.qml"); + OPEN_QUICK_DIALOG(); // Get the text edit visible with Ctrl+L. const auto editPathKeySequence = QKeySequence(Qt::CTRL | Qt::Key_L); @@ -842,23 +800,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()); @@ -902,10 +855,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. @@ -926,7 +877,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); @@ -940,27 +891,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())); @@ -982,25 +928,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. @@ -1027,9 +968,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; } @@ -1059,11 +1000,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*>(); @@ -1097,11 +1035,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*>(); @@ -1125,12 +1060,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())); @@ -1176,18 +1108,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())); @@ -1203,7 +1130,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)); @@ -1275,25 +1202,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()); @@ -1316,11 +1238,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: @@ -1346,36 +1265,22 @@ void tst_QQuickFileDialogImpl::setSelectedFile() QFETCH(QQuickFileDialog::FileMode, fileMode); // Open the dialog. + const auto tempFile1Url = QUrl::fromLocalFile(tempFile1->fileName()); const QVariantMap initialProperties = { - { "tempFile1Url", QVariant::fromValue(QUrl::fromLocalFile(tempFile1->fileName())) }, + { "tempFile1Url", QVariant::fromValue(tempFile1Url) }, { "fileMode", QVariant::fromValue(fileMode) } }; - DialogTestHelper<QQuickFileDialog, QQuickFileDialogImpl> dialogHelper( + FileDialogTestHelper dialogHelper( this, "setSelectedFile.qml", {}, initialProperties); - QVERIFY2(dialogHelper.isWindowInitialized(), dialogHelper.failureMessage()); - QVERIFY(dialogHelper.waitForWindowActive()); - QVERIFY(dialogHelper.openDialog()); - QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); + OPEN_QUICK_DIALOG(); // The selected file should be what we set. - const auto tempFile1Url = QUrl::fromLocalFile(tempFile1->fileName()); - COMPARE_URL(dialogHelper.dialog->selectedFile(), tempFile1Url); - COMPARE_URL(dialogHelper.quickDialog->selectedFile(), tempFile1Url); - COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(tempDir.path())); - COMPARE_URL(dialogHelper.quickDialog->currentFolder(), QUrl::fromLocalFile(tempDir.path())); - // Check that the relevant delegate in the view is current and has focus. - auto fileDialogListView = dialogHelper.quickDialog->findChild<QQuickListView*>("fileDialogListView"); - QVERIFY(fileDialogListView); - QQuickFileDialogDelegate *tempFile1Delegate = nullptr; - QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 1, tempFile1Delegate)); - COMPARE_URL(tempFile1Delegate->file(), tempFile1Url); - QCOMPARE(fileDialogListView->currentIndex(), 1); - QVERIFY(tempFile1Delegate->hasActiveFocus()); + VERIFY_FILE_SELECTED_AND_FOCUSED(QUrl::fromLocalFile(tempDir.path()), tempFile1Url, 1); // Next, we select a different file via the UI, close the dialog, set selectedFile again and check that it's still respected. // Select the first file in the view by navigating with the down key. - QCOMPARE(dialogHelper.window()->activeFocusItem(), tempFile1Delegate); + // 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); @@ -1393,17 +1298,7 @@ void tst_QQuickFileDialogImpl::setSelectedFile() dialogHelper.dialog->setSelectedFile(QUrl::fromLocalFile(tempFile2->fileName())); QVERIFY(dialogHelper.openDialog()); QTRY_VERIFY(dialogHelper.isQuickDialogOpen()); - // TODO: move this duplicated code into a helper - COMPARE_URL(dialogHelper.dialog->selectedFile(), tempFile2Url); - COMPARE_URL(dialogHelper.quickDialog->selectedFile(), tempFile2Url); - COMPARE_URL(dialogHelper.dialog->currentFolder(), QUrl::fromLocalFile(tempDir.path())); - COMPARE_URL(dialogHelper.quickDialog->currentFolder(), QUrl::fromLocalFile(tempDir.path())); - // Check that the relevant delegate in the view is current and has focus. - QQuickFileDialogDelegate *tempFile2Delegate = nullptr; - QTRY_VERIFY(findViewDelegateItem(fileDialogListView, 2, tempFile2Delegate)); - COMPARE_URL(tempFile2Delegate->file(), tempFile2Url); - QCOMPARE(fileDialogListView->currentIndex(), 2); - QVERIFY(tempFile2Delegate->hasActiveFocus()); + VERIFY_FILE_SELECTED_AND_FOCUSED(QUrl::fromLocalFile(tempDir.path()), tempFile2Url, 2); } QTEST_MAIN(tst_QQuickFileDialogImpl) |