Skip to content

Commit d871a0c

Browse files
authored
Don't restart SequenceStar on halt (#329)
* Add more SequenceStar tests * Fix typo in test name * Don't reset SequenceStar on halt
1 parent 0705a49 commit d871a0c

File tree

2 files changed

+88
-2
lines changed

2 files changed

+88
-2
lines changed

src/controls/sequence_star_node.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ NodeStatus SequenceStarNode::tick()
7474

7575
void SequenceStarNode::halt()
7676
{
77-
current_child_idx_ = 0;
77+
// DO NOT reset current_child_idx_ on halt
7878
ControlNode::halt();
7979
}
8080

tests/gtest_sequence.cpp

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ TEST_F(ComplexSequenceWithMemoryTest, ConditionsTrue)
387387
ASSERT_EQ(NodeStatus::IDLE, action_2.status());
388388
}
389389

390-
TEST_F(ComplexSequenceWithMemoryTest, Conditions1ToFase)
390+
TEST_F(ComplexSequenceWithMemoryTest, Conditions1ToFalse)
391391
{
392392
BT::NodeStatus state = root.executeTick();
393393

@@ -458,3 +458,89 @@ TEST_F(ComplexSequenceWithMemoryTest, Action1DoneSeq)
458458
ASSERT_EQ(NodeStatus::IDLE, action_1.status());
459459
ASSERT_EQ(NodeStatus::IDLE, action_2.status());
460460
}
461+
462+
TEST_F(ComplexSequenceWithMemoryTest, Action2FailureSeq)
463+
{
464+
root.executeTick();
465+
std::this_thread::sleep_for(milliseconds(150));
466+
root.executeTick();
467+
468+
ASSERT_EQ(NodeStatus::SUCCESS, seq_conditions.status());
469+
ASSERT_EQ(NodeStatus::IDLE, condition_1.status());
470+
ASSERT_EQ(NodeStatus::IDLE, condition_2.status());
471+
ASSERT_EQ(NodeStatus::RUNNING, seq_actions.status());
472+
ASSERT_EQ(NodeStatus::SUCCESS, action_1.status());
473+
ASSERT_EQ(NodeStatus::RUNNING, action_2.status());
474+
475+
action_2.setExpectedResult(NodeStatus::FAILURE);
476+
std::this_thread::sleep_for(milliseconds(150));
477+
root.executeTick();
478+
479+
// failure in action_2 does not affect the state of already
480+
// executed nodes (seq_conditions and action_1)
481+
ASSERT_EQ(NodeStatus::FAILURE, root.status());
482+
ASSERT_EQ(NodeStatus::SUCCESS, seq_conditions.status());
483+
ASSERT_EQ(NodeStatus::IDLE, condition_1.status());
484+
ASSERT_EQ(NodeStatus::IDLE, condition_2.status());
485+
ASSERT_EQ(NodeStatus::IDLE, seq_actions.status());
486+
ASSERT_EQ(NodeStatus::SUCCESS, action_1.status());
487+
ASSERT_EQ(NodeStatus::IDLE, action_2.status());
488+
489+
action_2.setExpectedResult(NodeStatus::SUCCESS);
490+
root.executeTick();
491+
492+
ASSERT_EQ(NodeStatus::SUCCESS, seq_conditions.status());
493+
ASSERT_EQ(NodeStatus::IDLE, condition_1.status());
494+
ASSERT_EQ(NodeStatus::IDLE, condition_2.status());
495+
ASSERT_EQ(NodeStatus::RUNNING, seq_actions.status());
496+
ASSERT_EQ(NodeStatus::SUCCESS, action_1.status());
497+
ASSERT_EQ(NodeStatus::RUNNING, action_2.status());
498+
499+
std::this_thread::sleep_for(milliseconds(150));
500+
root.executeTick();
501+
502+
ASSERT_EQ(NodeStatus::SUCCESS, root.status());
503+
ASSERT_EQ(NodeStatus::IDLE, seq_conditions.status());
504+
ASSERT_EQ(NodeStatus::IDLE, condition_1.status());
505+
ASSERT_EQ(NodeStatus::IDLE, condition_2.status());
506+
ASSERT_EQ(NodeStatus::IDLE, seq_actions.status());
507+
ASSERT_EQ(NodeStatus::IDLE, action_1.status());
508+
ASSERT_EQ(NodeStatus::IDLE, action_2.status());
509+
}
510+
511+
TEST_F(ComplexSequenceWithMemoryTest, Action2HaltSeq)
512+
{
513+
root.executeTick();
514+
std::this_thread::sleep_for(milliseconds(150));
515+
root.executeTick();
516+
517+
root.halt();
518+
519+
ASSERT_EQ(NodeStatus::IDLE, seq_conditions.status());
520+
ASSERT_EQ(NodeStatus::IDLE, condition_1.status());
521+
ASSERT_EQ(NodeStatus::IDLE, condition_2.status());
522+
ASSERT_EQ(NodeStatus::IDLE, seq_actions.status());
523+
ASSERT_EQ(NodeStatus::IDLE, action_1.status());
524+
ASSERT_EQ(NodeStatus::IDLE, action_2.status());
525+
526+
root.executeTick();
527+
528+
// tree retakes execution from action_2
529+
ASSERT_EQ(NodeStatus::IDLE, seq_conditions.status());
530+
ASSERT_EQ(NodeStatus::IDLE, condition_1.status());
531+
ASSERT_EQ(NodeStatus::IDLE, condition_2.status());
532+
ASSERT_EQ(NodeStatus::RUNNING, seq_actions.status());
533+
ASSERT_EQ(NodeStatus::IDLE, action_1.status());
534+
ASSERT_EQ(NodeStatus::RUNNING, action_2.status());
535+
536+
std::this_thread::sleep_for(milliseconds(150));
537+
root.executeTick();
538+
539+
ASSERT_EQ(NodeStatus::SUCCESS, root.status());
540+
ASSERT_EQ(NodeStatus::IDLE, seq_conditions.status());
541+
ASSERT_EQ(NodeStatus::IDLE, condition_1.status());
542+
ASSERT_EQ(NodeStatus::IDLE, condition_2.status());
543+
ASSERT_EQ(NodeStatus::IDLE, seq_actions.status());
544+
ASSERT_EQ(NodeStatus::IDLE, action_1.status());
545+
ASSERT_EQ(NodeStatus::IDLE, action_2.status());
546+
}

0 commit comments

Comments
 (0)