X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/128f797d73ba8118072767cbead7f22590b522db..a1c9bc5595a21299dab9260c6a77c0561c95c8ba:/src/tests/dolphinmainwindowtest.cpp diff --git a/src/tests/dolphinmainwindowtest.cpp b/src/tests/dolphinmainwindowtest.cpp index b22afa142..345a56504 100644 --- a/src/tests/dolphinmainwindowtest.cpp +++ b/src/tests/dolphinmainwindowtest.cpp @@ -5,6 +5,7 @@ */ #include "dolphinmainwindow.h" +#include "dolphin_generalsettings.h" #include "dolphinnewfilemenu.h" #include "dolphintabpage.h" #include "dolphintabwidget.h" @@ -17,6 +18,7 @@ #include "kitemviews/kitemlistwidget.h" #include "testdir.h" #include "views/dolphinitemlistview.h" +#include "views/viewproperties.h" #include #include @@ -30,6 +32,10 @@ #include #include +#include +#include +#include +#include #include #include @@ -49,6 +55,8 @@ private Q_SLOTS: void testOpenInNewTabTitle(); void testNewFileMenuEnabled_data(); void testNewFileMenuEnabled(); + void testCreateFileAction(); + void testCreateFileActionRequiresWritePermission(); void testWindowTitle_data(); void testWindowTitle(); void testFocusLocationBar(); @@ -60,6 +68,7 @@ private Q_SLOTS: void testAutoSaveSession(); void testInlineRename(); void testThumbnailAfterRename(); + void testViewModeAfterDynamicView(); void cleanupTestCase(); private: @@ -69,6 +78,11 @@ private: void DolphinMainWindowTest::initTestCase() { QStandardPaths::setTestModeEnabled(true); + // Use fullWidth statusbar during testing, to test out most of the features. + GeneralSettings *settings = GeneralSettings::self(); + settings->setShowStatusBar(GeneralSettings::EnumShowStatusBar::FullWidth); + settings->setShowZoomSlider(true); + settings->save(); } void DolphinMainWindowTest::init() @@ -142,20 +156,20 @@ void DolphinMainWindowTest::testSyncDesktopAndPhoneUi() do { QVERIFY2(desktopUiElement.tagName() == phoneUiElement.tagName(), qPrintable(QStringLiteral("Node mismatch: dolphinui.rc/%1::%2 and dolphinuiforphones.rc/%3::%4") - .arg(desktopUiElement.parentNode().toElement().tagName()) - .arg(desktopUiElement.tagName()) - .arg(phoneUiElement.parentNode().toElement().tagName()) - .arg(phoneUiElement.tagName()))); + .arg(desktopUiElement.parentNode().toElement().tagName(), + desktopUiElement.tagName(), + phoneUiElement.parentNode().toElement().tagName(), + phoneUiElement.tagName()))); QCOMPARE(desktopUiElement.text(), phoneUiElement.text()); const auto desktopUiElementAttributes = desktopUiElement.attributes(); const auto phoneUiElementAttributes = phoneUiElement.attributes(); for (int i = 0; i < desktopUiElementAttributes.count(); i++) { QVERIFY2(phoneUiElementAttributes.count() >= i, qPrintable(QStringLiteral("Attribute mismatch: dolphinui.rc/%1::%2 has more attributes than dolphinuiforphones.rc/%3::%4") - .arg(desktopUiElement.parentNode().toElement().tagName()) - .arg(desktopUiElement.tagName()) - .arg(phoneUiElement.parentNode().toElement().tagName()) - .arg(phoneUiElement.tagName()))); + .arg(desktopUiElement.parentNode().toElement().tagName(), + desktopUiElement.tagName(), + phoneUiElement.parentNode().toElement().tagName(), + phoneUiElement.tagName()))); if (exceptions.count(desktopUiElementAttributes.item(i).nodeName())) { continue; } @@ -165,12 +179,11 @@ void DolphinMainWindowTest::testSyncDesktopAndPhoneUi() } QVERIFY2(desktopUiElementAttributes.count() == phoneUiElementAttributes.count(), qPrintable(QStringLiteral("Attribute mismatch: dolphinui.rc/%1::%2 has fewer attributes than dolphinuiforphones.rc/%3::%4. %5 < %6") - .arg(desktopUiElement.parentNode().toElement().tagName()) - .arg(desktopUiElement.tagName()) - .arg(phoneUiElement.parentNode().toElement().tagName()) - .arg(phoneUiElement.tagName()) - .arg(phoneUiElementAttributes.count()) - .arg(desktopUiElementAttributes.count()))); + .arg(desktopUiElement.parentNode().toElement().tagName(), + desktopUiElement.tagName(), + phoneUiElement.parentNode().toElement().tagName(), + phoneUiElement.tagName()) + .arg(phoneUiElementAttributes.count(), desktopUiElementAttributes.count()))); desktopUiElement = nextUiElement(desktopUiElement); phoneUiElement = nextUiElement(phoneUiElement); @@ -192,7 +205,7 @@ void DolphinMainWindowTest::testClosingTabsWithSearchBoxVisible() QVERIFY(tabWidget); // Show search box on first tab. - tabWidget->currentTabPage()->activeViewContainer()->setSearchModeEnabled(true); + tabWidget->currentTabPage()->activeViewContainer()->setSearchBarVisible(true); tabWidget->openNewActivatedTab(QUrl::fromLocalFile(QDir::homePath())); QCOMPARE(tabWidget->count(), 2); @@ -372,6 +385,74 @@ void DolphinMainWindowTest::testNewFileMenuEnabled() QTRY_COMPARE(newFileMenu->isEnabled(), expectedEnabled); } +void DolphinMainWindowTest::testCreateFileAction() +{ + QScopedPointer testDir{new TestDir()}; + QString testDirUrl(QDir::cleanPath(testDir->url().toString())); + m_mainWindow->openDirectories({testDirUrl}, false); + m_mainWindow->show(); + QVERIFY(QTest::qWaitForWindowExposed(m_mainWindow.data())); + QVERIFY(m_mainWindow->isVisible()); + + QCOMPARE(m_mainWindow->m_activeViewContainer->view()->items().count(), 0); + + auto createFileAction = m_mainWindow->actionCollection()->action(QStringLiteral("create_file")); + QTRY_COMPARE(createFileAction->isEnabled(), true); + + createFileAction->setShortcut(QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_N)); + + QSignalSpy createFileActionSpy(createFileAction, &QAction::triggered); + + QTest::keyClick(QApplication::activeWindow(), Qt::Key_N, Qt::ControlModifier | Qt::AltModifier); + + QTRY_COMPARE(createFileActionSpy.count(), 1); + + QTRY_VERIFY(QApplication::activeModalWidget() != nullptr); + + auto newFileDialog = QApplication::activeModalWidget()->focusWidget(); + QTest::keyClick(newFileDialog, Qt::Key_X); + QTest::keyClick(newFileDialog, Qt::Key_Y); + QTest::keyClick(newFileDialog, Qt::Key_Z); + QTest::keyClick(newFileDialog, Qt::Key_Enter); + + QTRY_COMPARE(m_mainWindow->m_activeViewContainer->view()->items().count(), 1); + + QFile file(testDir->url().toLocalFile() + "/xyz.txt"); + QVERIFY(file.exists()); + QCOMPARE(file.size(), 0); +} + + void DolphinMainWindowTest::testCreateFileActionRequiresWritePermission() +{ + QScopedPointer testDir{new TestDir()}; + QString testDirUrl(QDir::cleanPath(testDir->url().toString())); + auto testDirAsFile = QFile(testDir->url().toLocalFile()); + + // make test dir read only + QVERIFY(testDirAsFile.setPermissions(QFileDevice::ReadOwner)); + + m_mainWindow->openDirectories({testDirUrl}, false); + m_mainWindow->show(); + QVERIFY(QTest::qWaitForWindowExposed(m_mainWindow.data())); + QVERIFY(m_mainWindow->isVisible()); + + QCOMPARE(m_mainWindow->m_activeViewContainer->view()->items().count(), 0); + + auto createFileAction = m_mainWindow->actionCollection()->action(QStringLiteral("create_file")); + QTRY_COMPARE(createFileAction->isEnabled(), false); + + createFileAction->setShortcut(QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_N)); + QTest::keyClick(QApplication::activeWindow(), Qt::Key_N, Qt::ControlModifier | Qt::AltModifier); + + QTRY_COMPARE(QApplication::activeModalWidget(), nullptr); + + QTRY_COMPARE(m_mainWindow->m_activeViewContainer->view()->items().count(), 0); + + QTRY_COMPARE(createFileAction->isEnabled(), false); + + QVERIFY(m_mainWindow->isVisible()); +} + void DolphinMainWindowTest::testWindowTitle_data() { QTest::addColumn("activeViewUrl"); @@ -985,6 +1066,86 @@ void DolphinMainWindowTest::testThumbnailAfterRename() QCOMPARE(view->m_model->count(), 1); } +void DolphinMainWindowTest::testViewModeAfterDynamicView() +{ + GeneralSettings *settings = GeneralSettings::self(); + settings->setDynamicView(true); + settings->save(); + + // prepare test data + QScopedPointer testDir{new TestDir()}; + QString testDirUrl(QDir::cleanPath(testDir->url().toString())); + testDir->createDir("a"); + QImage testImage(256, 256, QImage::Format_Mono); + testImage.setColorCount(1); + testImage.setColor(0, qRgba(255, 0, 0, 255)); // Index #0 = Red + for (short x = 0; x < 256; ++x) { + for (short y = 0; y < 256; ++y) { + testImage.setPixel(x, y, 0); + } + } + testImage.save(testDir->url().path() + "/a/1.jpg"); + + // open test dir and set default view mode to "Details" + m_mainWindow->openDirectories({testDirUrl}, false); + DolphinView *view = m_mainWindow->activeViewContainer()->view(); + QSignalSpy viewDirectoryLoadingCompletedSpy(view, &DolphinView::directoryLoadingCompleted); + QSignalSpy modelDirectoryLoadingCompletedSpy(view->m_model, &KFileItemModel::directoryLoadingCompleted); + m_mainWindow->show(); + QVERIFY(viewDirectoryLoadingCompletedSpy.wait()); + QVERIFY(QTest::qWaitForWindowExposed(m_mainWindow.data())); + QVERIFY(m_mainWindow->isVisible()); + m_mainWindow->actionCollection()->action(QStringLiteral("details"))->trigger(); + QCOMPARE(view->m_mode, DolphinView::DetailsView); + + // move to child folder and check that dynamic view changed view mode to icons + m_mainWindow->openFiles({testDirUrl + "/a"}, false); + view->m_model->loadDirectory(QUrl(testDirUrl + "/a")); + view->setUrl(QUrl(testDirUrl + "/a")); + QVERIFY(modelDirectoryLoadingCompletedSpy.wait()); + QCOMPARE(view->m_mode, DolphinView::IconsView); + + // go back to parent folder and check that view mode reverted to details + m_mainWindow->actionCollection()->action(KStandardAction::name(KStandardAction::Back))->trigger(); + view->m_model->loadDirectory(testDir->url()); + view->setUrl(testDir->url()); + QVERIFY(modelDirectoryLoadingCompletedSpy.wait()); + QCOMPARE(view->m_mode, DolphinView::DetailsView); + + // test for local views + settings->setGlobalViewProps(false); + settings->save(); + + // go to child folder and check DynamicViewPassed key in view properties as well as view mode + m_mainWindow->openFiles({testDirUrl + "/a"}, false); + view->m_model->loadDirectory(QUrl(testDirUrl + "/a")); + view->setUrl(QUrl(testDirUrl + "/a")); + QVERIFY(modelDirectoryLoadingCompletedSpy.wait()); + QCOMPARE(view->m_mode, DolphinView::IconsView); + QTest::qWait(100); + QVERIFY(ViewProperties(view->viewPropertiesUrl()).dynamicViewPassed()); + + // change view mode of child folder to "Details" + m_mainWindow->actionCollection()->action(QStringLiteral("details"))->trigger(); + QCOMPARE(view->m_mode, DolphinView::DetailsView); + + // go back to parent folder + m_mainWindow->actionCollection()->action(KStandardAction::name(KStandardAction::Back))->trigger(); + view->m_model->loadDirectory(testDir->url()); + view->setUrl(testDir->url()); + QVERIFY(modelDirectoryLoadingCompletedSpy.wait()); + QCOMPARE(view->m_mode, DolphinView::DetailsView); + QVERIFY(!ViewProperties(view->viewPropertiesUrl()).dynamicViewPassed()); + + // go to child folder and make sure view mode change to "Details" is permanent + m_mainWindow->openFiles({testDirUrl + "/a"}, false); + view->m_model->loadDirectory(QUrl(testDirUrl + "/a")); + view->setUrl(QUrl(testDirUrl + "/a")); + QVERIFY(modelDirectoryLoadingCompletedSpy.wait()); + QCOMPARE(view->m_mode, DolphinView::DetailsView); + QVERIFY(ViewProperties(view->viewPropertiesUrl()).dynamicViewPassed()); +} + void DolphinMainWindowTest::cleanupTestCase() { m_mainWindow->showNormal();