From 0f5882f13cb16286495c71201c08ebf3576fe8c0 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Sat, 29 Jun 2024 18:04:25 +0200 Subject: [PATCH] TaskTree: Introduce a bit of logic (NOT) Introduce ExecutableItem operator!(const ExecutableItem &item). This operator returns a copy of this executable item with DoneResult tweaked by negation. If this item reports DoneResult::Success, the returned item reports DoneResult::Error. If this item reports DoneResult::Error, the returned item reports DoneResult::Success. Change-Id: Ie609938e92bbc38ddcc66f5bc3244f864e3e59c7 Reviewed-by: hjk --- src/libs/solutions/tasking/tasktree.cpp | 8 ++++ src/libs/solutions/tasking/tasktree.h | 4 ++ tests/auto/solutions/tasking/tst_tasking.cpp | 47 ++++++++++++++++++++ 3 files changed, 59 insertions(+) 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(); }