diff --git a/src/libs/solutions/tasking/tasktree.cpp b/src/libs/solutions/tasking/tasktree.cpp index 91bdaf2d9e1..c34c7696e58 100644 --- a/src/libs/solutions/tasking/tasktree.cpp +++ b/src/libs/solutions/tasking/tasktree.cpp @@ -1510,6 +1510,14 @@ ExecutableItem ExecutableItem::withLog(const QString &logName) const }; } +ExecutableItem operator!(const ExecutableItem &item) +{ + return Group { + item, + onGroupDone([](DoneWith doneWith) { return toDoneResult(doneWith == DoneWith::Error); }) + }; +} + ExecutableItem ExecutableItem::withCancelImpl( const std::function &)> &connectWrapper) const { diff --git a/src/libs/solutions/tasking/tasktree.h b/src/libs/solutions/tasking/tasktree.h index 308069edccf..bdb270d6095 100644 --- a/src/libs/solutions/tasking/tasktree.h +++ b/src/libs/solutions/tasking/tasktree.h @@ -308,10 +308,14 @@ protected: ExecutableItem(const TaskHandler &handler) : GroupItem(handler) {} private: + friend ExecutableItem operator!(const ExecutableItem &item); + ExecutableItem withCancelImpl( const std::function &)> &connectWrapper) const; }; +TASKING_EXPORT ExecutableItem operator!(const ExecutableItem &item); + class TASKING_EXPORT Group : public ExecutableItem { public: diff --git a/tests/auto/solutions/tasking/tst_tasking.cpp b/tests/auto/solutions/tasking/tst_tasking.cpp index 261f0cc5c73..5fa411f34e2 100644 --- a/tests/auto/solutions/tasking/tst_tasking.cpp +++ b/tests/auto/solutions/tasking/tst_tasking.cpp @@ -3213,6 +3213,53 @@ void tst_Tasking::testTree_data() << TestData{storage, taskError, {{0, Handler::GroupError}}, 1, DoneWith::Error, 1}; } + { + // This test check if ExecutableItem's negation works OK + + const Group negateSuccessTask { + storage, + !createSuccessTask(0) + }; + + const Group negateErrorTask { + storage, + !createFailingTask(0) + }; + + const Group negateSuccessGroup { + storage, + !Group { + createSuccessTask(0) + } + }; + + const Group negateErrorGroup { + storage, + !Group { + createFailingTask(0) + } + }; + + const Group doubleNegation { + storage, + !!createSuccessTask(0) + }; + + const Log successLog {{0, Handler::Setup}, {0, Handler::Success}}; + const Log errorLog {{0, Handler::Setup}, {0, Handler::Error}}; + + QTest::newRow("NegateSuccessTask") + << TestData{storage, negateSuccessTask, successLog, 1, DoneWith::Error, 1}; + QTest::newRow("NegateErrorTask") + << TestData{storage, negateErrorTask, errorLog, 1, DoneWith::Success, 1}; + QTest::newRow("NegateSuccessGroup") + << TestData{storage, negateSuccessGroup, successLog, 1, DoneWith::Error, 1}; + QTest::newRow("NegateErrorGroup") + << TestData{storage, negateErrorGroup, errorLog, 1, DoneWith::Success, 1}; + QTest::newRow("DoubleNegation") + << TestData{storage, doubleNegation, successLog, 1, DoneWith::Success, 1}; + } + // This test checks if storage shadowing works OK. QTest::newRow("StorageShadowing") << storageShadowingData(); }