From 2b00256ebf3b06bfcaf39f781ace42c0474a1257 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 1 Feb 2023 11:50:03 +0100 Subject: [PATCH] Squish: Fix removing a test case The action has been present but forgotten to get implemented. Change-Id: I7979f852e5b8f89a8014cc05748fb97d35be27e4 Reviewed-by: David Schulz --- src/plugins/squish/squishfilehandler.cpp | 42 +++++++++++++++++++ src/plugins/squish/squishfilehandler.h | 2 + src/plugins/squish/squishnavigationwidget.cpp | 3 ++ src/plugins/squish/squishtesttreemodel.cpp | 14 +++++++ src/plugins/squish/squishtesttreemodel.h | 1 + src/plugins/squish/suiteconf.cpp | 11 +++++ src/plugins/squish/suiteconf.h | 1 + 7 files changed, 74 insertions(+) diff --git a/src/plugins/squish/squishfilehandler.cpp b/src/plugins/squish/squishfilehandler.cpp index aa3843d1ad6..808b3491e14 100644 --- a/src/plugins/squish/squishfilehandler.cpp +++ b/src/plugins/squish/squishfilehandler.cpp @@ -12,6 +12,7 @@ #include "suiteconf.h" #include "squishtr.h" +#include #include #include #include @@ -308,6 +309,47 @@ void SquishFileHandler::closeAllTestSuites() ProjectExplorer::SessionManager::setValue(SK_OpenSuites, suitePathsAsStringList()); } +static void closeOpenedEditorsFor(const Utils::FilePath &filePath) +{ + const QList openDocuments = Utils::filtered( + Core::DocumentModel::openedDocuments(), [filePath](Core::IDocument *doc) { + return doc->filePath().isChildOf(filePath); + }); + // for now just ignore modifications - files will be removed completely + Core::EditorManager::closeDocuments(openDocuments, false); +} + +void SquishFileHandler::deleteTestCase(const QString &suiteName, const QString &testCaseName) +{ + if (!m_suites.contains(suiteName)) + return; + + if (SquishMessages::simpleQuestion(Tr::tr("Confirm Delete"), + Tr::tr("Are you sure you want to delete Test Case \"%1\" " + "from the file system?").arg(testCaseName)) + != QMessageBox::Yes) { + return; + } + + const Utils::FilePath suiteConfPath = m_suites.value(suiteName); + SuiteConf suiteConf = SuiteConf::readSuiteConf(suiteConfPath); + const Utils::FilePath testCaseDirectory = suiteConfPath.parentDir().pathAppended(testCaseName); + closeOpenedEditorsFor(testCaseDirectory); + QString error; + if (!testCaseDirectory.removeRecursively(&error)) { + QString detail = Tr::tr("Deletion of Test Case failed."); + if (!error.isEmpty()) + detail.append('\n').append(error); + SquishMessages::criticalMessage(detail); + } else { + Core::DocumentManager::expectFileChange(suiteConfPath); + suiteConf.removeTestCase(testCaseName); + bool ok = suiteConf.write(); + QTC_CHECK(ok); + emit testCaseRemoved(suiteName, testCaseName); + } +} + void SquishFileHandler::closeAllInternal() { // TODO close respective editors if there are any diff --git a/src/plugins/squish/squishfilehandler.h b/src/plugins/squish/squishfilehandler.h index 521caa7ac38..f784a40a481 100644 --- a/src/plugins/squish/squishfilehandler.h +++ b/src/plugins/squish/squishfilehandler.h @@ -25,6 +25,7 @@ public: void openTestSuite(const Utils::FilePath &suiteConfPath, bool isReopen = false); void closeTestSuite(const QString &suiteName); void closeAllTestSuites(); + void deleteTestCase(const QString &suiteName, const QString &testCaseName); void runTestCase(const QString &suiteName, const QString &testCaseName); void runTestSuite(const QString &suiteName); void recordTestCase(const QString &suiteName, const QString &testCaseName); @@ -39,6 +40,7 @@ signals: void testTreeItemCreated(SquishTestTreeItem *item); void suiteTreeItemRemoved(const QString &suiteName); void suiteTreeItemModified(SquishTestTreeItem *item, const QString &displayName); + void testCaseRemoved(const QString &suiteName, const QString &testCaseName); void suitesOpened(); private: diff --git a/src/plugins/squish/squishnavigationwidget.cpp b/src/plugins/squish/squishnavigationwidget.cpp index aea8c6b2646..ce965013987 100644 --- a/src/plugins/squish/squishnavigationwidget.cpp +++ b/src/plugins/squish/squishnavigationwidget.cpp @@ -106,6 +106,9 @@ void SquishNavigationWidget::contextMenuEvent(QContextMenuEvent *event) connect(runThisTestCase, &QAction::triggered, [suiteName, caseName] { SquishFileHandler::instance()->runTestCase(suiteName, caseName); }); + connect(deleteTestCase, &QAction::triggered, [suiteName, caseName] { + SquishFileHandler::instance()->deleteTestCase(suiteName, caseName); + }); break; } case SquishTestTreeItem::SquishSuite: { diff --git a/src/plugins/squish/squishtesttreemodel.cpp b/src/plugins/squish/squishtesttreemodel.cpp index 6cd994dc761..5b826d4882d 100644 --- a/src/plugins/squish/squishtesttreemodel.cpp +++ b/src/plugins/squish/squishtesttreemodel.cpp @@ -180,6 +180,8 @@ SquishTestTreeModel::SquishTestTreeModel(QObject *parent) this, &SquishTestTreeModel::onSuiteTreeItemModified); connect(m_squishFileHandler, &SquishFileHandler::suiteTreeItemRemoved, this, &SquishTestTreeModel::onSuiteTreeItemRemoved); + connect(m_squishFileHandler, &SquishFileHandler::testCaseRemoved, + this, &SquishTestTreeModel::onTestCaseRemoved); connect(m_squishFileHandler, &SquishFileHandler::clearedSharedFolders, this, [this] { m_squishSharedFolders->removeChildren(); }); @@ -450,6 +452,18 @@ void SquishTestTreeModel::onSuiteTreeItemModified(SquishTestTreeItem *item, cons delete item; } +void SquishTestTreeModel::onTestCaseRemoved(const QString &suiteName, const QString &testCase) +{ + if (SquishTestTreeItem *suite = findSuite(suiteName)) { + auto item = suite->findChildAtLevel(1, [this, testCase](const Utils::TreeItem *it) { + return data(it->index(), Qt::DisplayRole).toString() == testCase; + }); + QTC_ASSERT(item, return); + const QModelIndex idx = item->index(); + removeTreeItem(idx.row(), idx.parent()); + } +} + /************************************** SquishTestTreeSortModel **********************************/ SquishTestTreeSortModel::SquishTestTreeSortModel(SquishTestTreeModel *sourceModel, QObject *parent) diff --git a/src/plugins/squish/squishtesttreemodel.h b/src/plugins/squish/squishtesttreemodel.h index 6335c372211..fe17c67c6c2 100644 --- a/src/plugins/squish/squishtesttreemodel.h +++ b/src/plugins/squish/squishtesttreemodel.h @@ -81,6 +81,7 @@ private: SquishTestTreeItem *findSuite(const QString &displayName) const; void onSuiteTreeItemRemoved(const QString &suiteName); void onSuiteTreeItemModified(SquishTestTreeItem *item, const QString &display); + void onTestCaseRemoved(const QString &suiteName, const QString &testCase); Utils::TreeItem *m_squishSharedFolders; Utils::TreeItem *m_squishSuitesRoot; SquishFileHandler *m_squishFileHandler; diff --git a/src/plugins/squish/suiteconf.cpp b/src/plugins/squish/suiteconf.cpp index 2996375b620..9513b566698 100644 --- a/src/plugins/squish/suiteconf.cpp +++ b/src/plugins/squish/suiteconf.cpp @@ -242,6 +242,17 @@ void SuiteConf::addTestCase(const QString &name) m_testcases = joinItems(current); } +void SuiteConf::removeTestCase(const QString &name) +{ + QStringList current = testCases(); + int position = current.indexOf(name); + if (position == -1) // it had been an unlisted test case + return; + + current.remove(position); + m_testcases = joinItems(current); +} + void SuiteConf::setLanguage(const QString &language) { if (language == "Python") diff --git a/src/plugins/squish/suiteconf.h b/src/plugins/squish/suiteconf.h index b9ff2f259b4..0545dc875c6 100644 --- a/src/plugins/squish/suiteconf.h +++ b/src/plugins/squish/suiteconf.h @@ -35,6 +35,7 @@ public: QString scriptExtension() const; QStringList testCases() const; void addTestCase(const QString &testCase); + void removeTestCase(const QString &testCase); QStringList usedTestCases() const;