diff --git a/src/controls/sequence_star_node.cpp b/src/controls/sequence_star_node.cpp index f557611ca..a697278ed 100644 --- a/src/controls/sequence_star_node.cpp +++ b/src/controls/sequence_star_node.cpp @@ -68,7 +68,7 @@ NodeStatus SequenceStarNode::tick() void SequenceStarNode::halt() { - // DO NOT reset current_child_idx_ on halt + current_child_idx_ = 0; ControlNode::halt(); } diff --git a/tests/gtest_sequence.cpp b/tests/gtest_sequence.cpp index 6ac5c6bf7..7646f6cec 100644 --- a/tests/gtest_sequence.cpp +++ b/tests/gtest_sequence.cpp @@ -386,143 +386,3 @@ TEST_F(ComplexSequenceWithMemoryTest, Conditions1ToFalse) ASSERT_EQ(NodeStatus::IDLE, action_2.status()); } -TEST_F(ComplexSequenceWithMemoryTest, Conditions2ToFalse) -{ - BT::NodeStatus state = root.executeTick(); - - condition_2.setExpectedResult(NodeStatus::FAILURE); - state = root.executeTick(); - // change in condition_2 does not affect the state of the tree, - // since the seq_conditions was executed already - ASSERT_EQ(NodeStatus::RUNNING, state); - ASSERT_EQ(NodeStatus::SUCCESS, seq_conditions.status()); - ASSERT_EQ(NodeStatus::IDLE, condition_1.status()); - ASSERT_EQ(NodeStatus::IDLE, condition_2.status()); - ASSERT_EQ(NodeStatus::RUNNING, seq_actions.status()); - ASSERT_EQ(NodeStatus::RUNNING, action_1.status()); - ASSERT_EQ(NodeStatus::IDLE, action_2.status()); -} - -TEST_F(ComplexSequenceWithMemoryTest, Action1DoneSeq) -{ - root.executeTick(); - - condition_2.setExpectedResult(NodeStatus::FAILURE); - root.executeTick(); - - // change in condition_2 does not affect the state of the tree, - // since the seq_conditions was executed already - ASSERT_EQ(NodeStatus::SUCCESS, seq_conditions.status()); - ASSERT_EQ(NodeStatus::IDLE, condition_1.status()); - ASSERT_EQ(NodeStatus::IDLE, condition_2.status()); - ASSERT_EQ(NodeStatus::RUNNING, seq_actions.status()); - ASSERT_EQ(NodeStatus::RUNNING, action_1.status()); - ASSERT_EQ(NodeStatus::IDLE, action_2.status()); - - std::this_thread::sleep_for(milliseconds(150)); - root.executeTick(); - - ASSERT_EQ(NodeStatus::SUCCESS, seq_conditions.status()); - ASSERT_EQ(NodeStatus::IDLE, condition_1.status()); - ASSERT_EQ(NodeStatus::IDLE, condition_2.status()); - ASSERT_EQ(NodeStatus::RUNNING, seq_actions.status()); - ASSERT_EQ(NodeStatus::SUCCESS, action_1.status()); - ASSERT_EQ(NodeStatus::RUNNING, action_2.status()); - - std::this_thread::sleep_for(milliseconds(150)); - root.executeTick(); - - ASSERT_EQ(NodeStatus::SUCCESS, root.status()); - ASSERT_EQ(NodeStatus::IDLE, seq_conditions.status()); - ASSERT_EQ(NodeStatus::IDLE, condition_1.status()); - ASSERT_EQ(NodeStatus::IDLE, condition_2.status()); - ASSERT_EQ(NodeStatus::IDLE, seq_actions.status()); - ASSERT_EQ(NodeStatus::IDLE, action_1.status()); - ASSERT_EQ(NodeStatus::IDLE, action_2.status()); -} - -TEST_F(ComplexSequenceWithMemoryTest, Action2FailureSeq) -{ - root.executeTick(); - std::this_thread::sleep_for(milliseconds(150)); - root.executeTick(); - - ASSERT_EQ(NodeStatus::SUCCESS, seq_conditions.status()); - ASSERT_EQ(NodeStatus::IDLE, condition_1.status()); - ASSERT_EQ(NodeStatus::IDLE, condition_2.status()); - ASSERT_EQ(NodeStatus::RUNNING, seq_actions.status()); - ASSERT_EQ(NodeStatus::SUCCESS, action_1.status()); - ASSERT_EQ(NodeStatus::RUNNING, action_2.status()); - - action_2.setExpectedResult(NodeStatus::FAILURE); - std::this_thread::sleep_for(milliseconds(150)); - root.executeTick(); - - // failure in action_2 does not affect the state of already - // executed nodes (seq_conditions and action_1) - ASSERT_EQ(NodeStatus::FAILURE, root.status()); - ASSERT_EQ(NodeStatus::SUCCESS, seq_conditions.status()); - ASSERT_EQ(NodeStatus::IDLE, condition_1.status()); - ASSERT_EQ(NodeStatus::IDLE, condition_2.status()); - ASSERT_EQ(NodeStatus::IDLE, seq_actions.status()); - ASSERT_EQ(NodeStatus::SUCCESS, action_1.status()); - ASSERT_EQ(NodeStatus::IDLE, action_2.status()); - - action_2.setExpectedResult(NodeStatus::SUCCESS); - root.executeTick(); - - ASSERT_EQ(NodeStatus::SUCCESS, seq_conditions.status()); - ASSERT_EQ(NodeStatus::IDLE, condition_1.status()); - ASSERT_EQ(NodeStatus::IDLE, condition_2.status()); - ASSERT_EQ(NodeStatus::RUNNING, seq_actions.status()); - ASSERT_EQ(NodeStatus::SUCCESS, action_1.status()); - ASSERT_EQ(NodeStatus::RUNNING, action_2.status()); - - std::this_thread::sleep_for(milliseconds(150)); - root.executeTick(); - - ASSERT_EQ(NodeStatus::SUCCESS, root.status()); - ASSERT_EQ(NodeStatus::IDLE, seq_conditions.status()); - ASSERT_EQ(NodeStatus::IDLE, condition_1.status()); - ASSERT_EQ(NodeStatus::IDLE, condition_2.status()); - ASSERT_EQ(NodeStatus::IDLE, seq_actions.status()); - ASSERT_EQ(NodeStatus::IDLE, action_1.status()); - ASSERT_EQ(NodeStatus::IDLE, action_2.status()); -} - -TEST_F(ComplexSequenceWithMemoryTest, Action2HaltSeq) -{ - root.executeTick(); - std::this_thread::sleep_for(milliseconds(150)); - root.executeTick(); - - root.halt(); - - ASSERT_EQ(NodeStatus::IDLE, seq_conditions.status()); - ASSERT_EQ(NodeStatus::IDLE, condition_1.status()); - ASSERT_EQ(NodeStatus::IDLE, condition_2.status()); - ASSERT_EQ(NodeStatus::IDLE, seq_actions.status()); - ASSERT_EQ(NodeStatus::IDLE, action_1.status()); - ASSERT_EQ(NodeStatus::IDLE, action_2.status()); - - root.executeTick(); - - // tree retakes execution from action_2 - ASSERT_EQ(NodeStatus::IDLE, seq_conditions.status()); - ASSERT_EQ(NodeStatus::IDLE, condition_1.status()); - ASSERT_EQ(NodeStatus::IDLE, condition_2.status()); - ASSERT_EQ(NodeStatus::RUNNING, seq_actions.status()); - ASSERT_EQ(NodeStatus::IDLE, action_1.status()); - ASSERT_EQ(NodeStatus::RUNNING, action_2.status()); - - std::this_thread::sleep_for(milliseconds(150)); - root.executeTick(); - - ASSERT_EQ(NodeStatus::SUCCESS, root.status()); - ASSERT_EQ(NodeStatus::IDLE, seq_conditions.status()); - ASSERT_EQ(NodeStatus::IDLE, condition_1.status()); - ASSERT_EQ(NodeStatus::IDLE, condition_2.status()); - ASSERT_EQ(NodeStatus::IDLE, seq_actions.status()); - ASSERT_EQ(NodeStatus::IDLE, action_1.status()); - ASSERT_EQ(NodeStatus::IDLE, action_2.status()); -}