diff --git a/src/controls/if_then_else_node.cpp b/src/controls/if_then_else_node.cpp index 7d33099c6..3532c3f6c 100644 --- a/src/controls/if_then_else_node.cpp +++ b/src/controls/if_then_else_node.cpp @@ -45,6 +45,11 @@ NodeStatus IfThenElseNode::tick() { return condition_status; } + if(condition_status == NodeStatus::SKIPPED) + { + resetChildren(); + return condition_status; + } if(condition_status == NodeStatus::SUCCESS) { child_idx_ = 1; diff --git a/src/controls/while_do_else_node.cpp b/src/controls/while_do_else_node.cpp index 40c58086e..b7035a931 100644 --- a/src/controls/while_do_else_node.cpp +++ b/src/controls/while_do_else_node.cpp @@ -42,6 +42,11 @@ NodeStatus WhileDoElseNode::tick() { return condition_status; } + if(condition_status == NodeStatus::SKIPPED) + { + resetChildren(); + return condition_status; + } NodeStatus status = NodeStatus::IDLE; diff --git a/tests/gtest_if_then_else.cpp b/tests/gtest_if_then_else.cpp index 44fecf7c9..61e000db3 100644 --- a/tests/gtest_if_then_else.cpp +++ b/tests/gtest_if_then_else.cpp @@ -174,6 +174,27 @@ TEST_F(IfThenElseTest, ConditionRunning) ASSERT_EQ(counters[0], 1); // TestA executed } +TEST_F(IfThenElseTest, ConditionSkipped) +{ + const std::string xml_text = R"( + + + + + + + + + )"; + + auto tree = factory.createTreeFromText(xml_text); + auto status = tree.tickOnce(); + + ASSERT_EQ(status, NodeStatus::SKIPPED); + ASSERT_EQ(counters[0], 0); + ASSERT_EQ(counters[1], 0); +} + TEST_F(IfThenElseTest, HaltBehavior) { // Test that halt resets the node properly diff --git a/tests/gtest_while_do_else.cpp b/tests/gtest_while_do_else.cpp index 3b08644c3..6c9fd1eb9 100644 --- a/tests/gtest_while_do_else.cpp +++ b/tests/gtest_while_do_else.cpp @@ -94,6 +94,27 @@ TEST_F(WhileDoElseTest, ConditionFalse_TwoChildren_ReturnsFailure) ASSERT_EQ(counters[0], 0); // TestA not executed } +TEST_F(WhileDoElseTest, ConditionSkipped) +{ + const std::string xml_text = R"( + + + + + + + + + )"; + + auto tree = factory.createTreeFromText(xml_text); + auto status = tree.tickOnce(); + + ASSERT_EQ(status, NodeStatus::SKIPPED); + ASSERT_EQ(counters[0], 0); + ASSERT_EQ(counters[1], 0); +} + TEST_F(WhileDoElseTest, DoBranchFails) { // When do-branch fails, WhileDoElse returns FAILURE