00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include <gtest/gtest.h>
00015 #include <behavior_tree.h>
00016
00017
00018
00019 struct SimpleSequenceTest : testing::Test
00020 {
00021 BT:: SequenceNode* root;
00022 BT::ActionTestNode* action;
00023 BT::ConditionTestNode* condition;
00024 SimpleSequenceTest()
00025 {
00026 action = new BT::ActionTestNode("action");
00027 condition = new BT::ConditionTestNode("condition");
00028
00029 root = new BT::SequenceNode("seq1");
00030
00031 root->AddChild(condition);
00032 root->AddChild(action);
00033 }
00034 };
00035
00036
00037 struct ComplexSequenceTest : testing::Test
00038 {
00039 BT:: SequenceNode* root;
00040 BT::ActionTestNode* action_1;
00041 BT::ConditionTestNode* condition_1;
00042 BT::ConditionTestNode* condition_2;
00043
00044 BT:: SequenceNode* seq_conditions;
00045
00046 ComplexSequenceTest()
00047 {
00048 action_1 = new BT::ActionTestNode("action 1");
00049
00050 condition_1 = new BT::ConditionTestNode("condition 1");
00051 condition_2 = new BT::ConditionTestNode("condition 2");
00052 seq_conditions = new BT::SequenceNode("sequence_conditions");
00053
00054 seq_conditions->AddChild(condition_1);
00055 seq_conditions->AddChild(condition_2);
00056
00057 root = new BT::SequenceNode("root");
00058 root->AddChild(seq_conditions);
00059 root->AddChild(action_1);
00060 }
00061 };
00062
00063
00064 struct ComplexSequence2ActionsTest : testing::Test
00065 {
00066 BT:: SequenceNode* root;
00067 BT::ActionTestNode* action_1;
00068 BT::ActionTestNode* action_2;
00069
00070 BT::ConditionTestNode* condition_1;
00071 BT::ConditionTestNode* condition_2;
00072
00073 BT:: SequenceNode* seq_1;
00074 BT:: SequenceNode* seq_2;
00075
00076 ComplexSequence2ActionsTest()
00077 {
00078 action_1 = new BT::ActionTestNode("action 1");
00079 action_2 = new BT::ActionTestNode("action 2");
00080 seq_1 = new BT::SequenceNode("sequence_1");
00081 seq_2 = new BT::SequenceNode("sequence_c2");
00082
00083 condition_1 = new BT::ConditionTestNode("condition 1");
00084 condition_2 = new BT::ConditionTestNode("condition 2");
00085
00086 seq_1->AddChild(condition_1);
00087 seq_1->AddChild(action_1);
00088
00089 seq_2->AddChild(condition_2);
00090 seq_2->AddChild(action_2);
00091
00092
00093 root = new BT::SequenceNode("root");
00094 root->AddChild(seq_1);
00095 root->AddChild(seq_2);
00096 }
00097 };
00098
00099
00100 struct SimpleFallbackTest : testing::Test
00101 {
00102 BT:: FallbackNode* root;
00103 BT::ActionTestNode* action;
00104 BT::ConditionTestNode* condition;
00105 SimpleFallbackTest()
00106 {
00107 action = new BT::ActionTestNode("action");
00108 condition = new BT::ConditionTestNode("condition");
00109
00110 root = new BT::FallbackNode("seq1");
00111
00112 root->AddChild(condition);
00113 root->AddChild(action);
00114 }
00115 };
00116
00117
00118 struct ComplexFallbackTest : testing::Test
00119 {
00120 BT:: FallbackNode* root;
00121 BT::ActionTestNode* action_1;
00122 BT::ConditionTestNode* condition_1;
00123 BT::ConditionTestNode* condition_2;
00124
00125 BT:: FallbackNode* sel_conditions;
00126
00127 ComplexFallbackTest()
00128 {
00129 action_1 = new BT::ActionTestNode("action 1");
00130 condition_1 = new BT::ConditionTestNode("condition 1");
00131 condition_2 = new BT::ConditionTestNode("condition 2");
00132 sel_conditions = new BT::FallbackNode("fallback_conditions");
00133
00134 sel_conditions->AddChild(condition_1);
00135 sel_conditions->AddChild(condition_2);
00136
00137 root = new BT::FallbackNode("root");
00138 root->AddChild(sel_conditions);
00139 root->AddChild(action_1);
00140 }
00141 };
00142
00143
00144
00145
00146 struct BehaviorTreeTest : testing::Test
00147 {
00148 BT:: SequenceNode* root;
00149 BT::ActionTestNode* action_1;
00150 BT::ConditionTestNode* condition_1;
00151 BT::ConditionTestNode* condition_2;
00152
00153 BT:: FallbackNode* sel_conditions;
00154
00155 BehaviorTreeTest()
00156 {
00157 action_1 = new BT::ActionTestNode("action 1");
00158 condition_1 = new BT::ConditionTestNode("condition 1");
00159 condition_2 = new BT::ConditionTestNode("condition 2");
00160 sel_conditions = new BT::FallbackNode("fallback_conditions");
00161
00162 sel_conditions->AddChild(condition_1);
00163 sel_conditions->AddChild(condition_2);
00164
00165 root = new BT::SequenceNode("root");
00166 root->AddChild(sel_conditions);
00167 root->AddChild(action_1);
00168 }
00169 };
00170
00171
00172
00173
00174 struct SimpleSequenceWithMemoryTest : testing::Test
00175 {
00176 BT:: SequenceNodeWithMemory* root;
00177 BT::ActionTestNode* action;
00178 BT::ConditionTestNode* condition;
00179 SimpleSequenceWithMemoryTest()
00180 {
00181 action = new BT::ActionTestNode("action");
00182 condition = new BT::ConditionTestNode("condition");
00183
00184 root = new BT::SequenceNodeWithMemory("seq1");
00185
00186 root->AddChild(condition);
00187 root->AddChild(action);
00188 }
00189 };
00190
00191 struct ComplexSequenceWithMemoryTest : testing::Test
00192 {
00193 BT:: SequenceNodeWithMemory* root;
00194
00195 BT::ActionTestNode* action_1;
00196 BT::ActionTestNode* action_2;
00197
00198 BT::ConditionTestNode* condition_1;
00199 BT::ConditionTestNode* condition_2;
00200
00201 BT:: SequenceNodeWithMemory* seq_conditions;
00202 BT:: SequenceNodeWithMemory* seq_actions;
00203
00204 ComplexSequenceWithMemoryTest()
00205 {
00206 action_1 = new BT::ActionTestNode("action 1");
00207 action_2 = new BT::ActionTestNode("action 2");
00208
00209
00210 condition_1 = new BT::ConditionTestNode("condition 1");
00211 condition_2 = new BT::ConditionTestNode("condition 2");
00212
00213 seq_conditions = new BT::SequenceNodeWithMemory("sequence_conditions");
00214 seq_actions = new BT::SequenceNodeWithMemory("sequence_actions");
00215
00216 seq_actions->AddChild(action_1);
00217 seq_actions->AddChild(action_2);
00218
00219 seq_conditions->AddChild(condition_1);
00220 seq_conditions->AddChild(condition_2);
00221
00222 root = new BT::SequenceNodeWithMemory("root");
00223 root->AddChild(seq_conditions);
00224 root->AddChild(seq_actions);
00225 }
00226 };
00227
00228 struct SimpleFallbackWithMemoryTest : testing::Test
00229 {
00230 BT::FallbackNodeWithMemory* root;
00231 BT::ActionTestNode* action;
00232 BT::ConditionTestNode* condition;
00233 SimpleFallbackWithMemoryTest()
00234 {
00235 action = new BT::ActionTestNode("action");
00236 condition = new BT::ConditionTestNode("condition");
00237
00238 root = new BT::FallbackNodeWithMemory("seq1");
00239
00240 root->AddChild(condition);
00241 root->AddChild(action);
00242 }
00243 };
00244
00245 struct ComplexFallbackWithMemoryTest : testing::Test
00246 {
00247 BT:: FallbackNodeWithMemory* root;
00248
00249 BT::ActionTestNode* action_1;
00250 BT::ActionTestNode* action_2;
00251
00252 BT::ConditionTestNode* condition_1;
00253 BT::ConditionTestNode* condition_2;
00254
00255 BT:: FallbackNodeWithMemory* fal_conditions;
00256 BT:: FallbackNodeWithMemory* fal_actions;
00257
00258 ComplexFallbackWithMemoryTest()
00259 {
00260 action_1 = new BT::ActionTestNode("action 1");
00261 action_2 = new BT::ActionTestNode("action 2");
00262 condition_1 = new BT::ConditionTestNode("condition 1");
00263 condition_2 = new BT::ConditionTestNode("condition 2");
00264
00265 fal_conditions = new BT::FallbackNodeWithMemory("fallback_conditions");
00266 fal_actions = new BT::FallbackNodeWithMemory("fallback_actions");
00267
00268 fal_actions->AddChild(action_1);
00269 fal_actions->AddChild(action_2);
00270
00271 fal_conditions->AddChild(condition_1);
00272 fal_conditions->AddChild(condition_2);
00273
00274 root = new BT::FallbackNodeWithMemory("root");
00275 root->AddChild(fal_conditions);
00276 root->AddChild(fal_actions);
00277 }
00278 };
00279
00280
00281 struct SimpleParallelTest : testing::Test
00282 {
00283 BT::ParallelNode* root;
00284 BT::ActionTestNode* action_1;
00285 BT::ConditionTestNode* condition_1;
00286
00287 BT::ActionTestNode* action_2;
00288 BT::ConditionTestNode* condition_2;
00289
00290 SimpleParallelTest()
00291 {
00292 action_1 = new BT::ActionTestNode("action 1");
00293 condition_1 = new BT::ConditionTestNode("condition 1");
00294
00295
00296 action_2 = new BT::ActionTestNode("action 2");
00297 condition_2 = new BT::ConditionTestNode("condition 2");
00298
00299 root = new BT::ParallelNode("par", 4);
00300
00301 root->AddChild(condition_1);
00302 root->AddChild(action_1);
00303 root->AddChild(condition_2);
00304 root->AddChild(action_2);
00305 }
00306 };
00307
00308
00309 struct ComplexParallelTest : testing::Test
00310 {
00311 BT::ParallelNode* root;
00312 BT::ParallelNode* parallel_1;
00313 BT::ParallelNode* parallel_2;
00314
00315 BT::ActionTestNode* action_1;
00316 BT::ConditionTestNode* condition_1;
00317
00318 BT::ActionTestNode* action_2;
00319 BT::ConditionTestNode* condition_2;
00320
00321 BT::ActionTestNode* action_3;
00322 BT::ConditionTestNode* condition_3;
00323
00324 ComplexParallelTest()
00325 {
00326 action_1 = new BT::ActionTestNode("action 1");
00327 condition_1 = new BT::ConditionTestNode("condition 1");
00328
00329
00330 action_2 = new BT::ActionTestNode("action 2");
00331 condition_2 = new BT::ConditionTestNode("condition 2");
00332
00333
00334 action_3 = new BT::ActionTestNode("action 3");
00335 condition_3 = new BT::ConditionTestNode("condition 3");
00336
00337 root = new BT::ParallelNode("root", 2);
00338 parallel_1 = new BT::ParallelNode("par1", 3);
00339 parallel_2 = new BT::ParallelNode("par2", 1);
00340
00341 parallel_1->AddChild(condition_1);
00342 parallel_1->AddChild(action_1);
00343 parallel_1->AddChild(condition_2);
00344 parallel_1->AddChild(action_2);
00345
00346 parallel_2->AddChild(condition_3);
00347 parallel_2->AddChild(action_3);
00348
00349 root->AddChild(parallel_1);
00350 root->AddChild(parallel_2);
00351 }
00352 };
00353
00354
00355
00356
00357
00358
00359
00360 TEST_F(SimpleSequenceTest, ConditionTrue)
00361 {
00362 std::cout << "Ticking the root node !" << std::endl << std::endl;
00363
00364 BT::ReturnStatus state = root->Tick();
00365
00366 ASSERT_EQ(BT::RUNNING, action->get_status());
00367 ASSERT_EQ(BT::RUNNING, state);
00368 root->Halt();
00369 }
00370
00371
00372 TEST_F(SimpleSequenceTest, ConditionTurnToFalse)
00373 {
00374 BT::ReturnStatus state = root->Tick();
00375 condition->set_boolean_value(false);
00376
00377 state = root->Tick();
00378 ASSERT_EQ(BT::FAILURE, state);
00379 ASSERT_EQ(BT::HALTED, action->get_status());
00380 root->Halt();
00381 }
00382
00383
00384 TEST_F(ComplexSequenceTest, ComplexSequenceConditionsTrue)
00385 {
00386 BT::ReturnStatus state = root->Tick();
00387
00388 ASSERT_EQ(BT::RUNNING, action_1->get_status());
00389 ASSERT_EQ(BT::RUNNING, state);
00390 root->Halt();
00391 }
00392
00393
00394 TEST_F(ComplexSequence2ActionsTest, ConditionsTrue)
00395 {
00396 BT::ReturnStatus state = root->Tick();
00397
00398 state = root->Tick();
00399
00400 std::this_thread::sleep_for(std::chrono::seconds(5));
00401 state = root->Tick();
00402 state = root->Tick();
00403
00404
00405 ASSERT_EQ(BT::RUNNING, state);
00406 ASSERT_EQ(BT::RUNNING, action_1->get_status());
00407 ASSERT_EQ(BT::RUNNING, seq_1->get_status());
00408 ASSERT_EQ(BT::HALTED, seq_2->get_status());
00409 ASSERT_EQ(BT::HALTED, action_2->get_status());
00410
00411 root->Halt();
00412 }
00413
00414 TEST_F(ComplexSequenceTest, ComplexSequenceConditions1ToFalse)
00415 {
00416 BT::ReturnStatus state = root->Tick();
00417
00418 condition_1->set_boolean_value(false);
00419
00420 state = root->Tick();
00421
00422 ASSERT_EQ(BT::FAILURE, state);
00423 ASSERT_EQ(BT::HALTED, action_1->get_status());
00424 root->Halt();
00425 }
00426
00427 TEST_F(ComplexSequenceTest, ComplexSequenceConditions2ToFalse)
00428 {
00429 BT::ReturnStatus state = root->Tick();
00430
00431 condition_2->set_boolean_value(false);
00432
00433 state = root->Tick();
00434
00435 ASSERT_EQ(BT::FAILURE, state);
00436 ASSERT_EQ(BT::HALTED, action_1->get_status());
00437 root->Halt();
00438 }
00439
00440
00441
00442 TEST_F(SimpleFallbackTest, ConditionTrue)
00443 {
00444 std::cout << "Ticking the root node !" << std::endl << std::endl;
00445
00446 condition->set_boolean_value(true);
00447 BT::ReturnStatus state = root->Tick();
00448
00449 ASSERT_EQ(BT::IDLE, action->get_status());
00450 ASSERT_EQ(BT::SUCCESS, state);
00451 root->Halt();
00452 }
00453
00454
00455 TEST_F(SimpleFallbackTest, ConditionToFalse)
00456 {
00457 condition->set_boolean_value(false);
00458
00459 BT::ReturnStatus state = root->Tick();
00460 condition->set_boolean_value(true);
00461
00462
00463 state = root->Tick();
00464
00465 ASSERT_EQ(BT::SUCCESS, state);
00466 ASSERT_EQ(BT::HALTED, action->get_status());
00467 root->Halt();
00468 }
00469
00470
00471 TEST_F(ComplexFallbackTest, Condition1ToTrue)
00472 {
00473 condition_1->set_boolean_value(false);
00474 condition_2->set_boolean_value(false);
00475
00476 BT::ReturnStatus state = root->Tick();
00477
00478 condition_1->set_boolean_value(true);
00479
00480 state = root->Tick();
00481
00482 ASSERT_EQ(BT::SUCCESS, state);
00483
00484 ASSERT_EQ(BT::HALTED, action_1->get_status());
00485 root->Halt();
00486 }
00487
00488 TEST_F(ComplexFallbackTest, Condition2ToTrue)
00489 {
00490 condition_1->set_boolean_value(false);
00491 condition_2->set_boolean_value(false);
00492
00493 BT::ReturnStatus state = root->Tick();
00494
00495 condition_2->set_boolean_value(true);
00496
00497 state = root->Tick();
00498
00499 ASSERT_EQ(BT::SUCCESS, state);
00500 ASSERT_EQ(BT::HALTED, action_1->get_status());
00501 root->Halt();
00502 }
00503
00504
00505
00506 TEST_F(BehaviorTreeTest, Condition1ToFalseCondition2True)
00507 {
00508 condition_1->set_boolean_value(false);
00509 condition_2->set_boolean_value(true);
00510
00511 BT::ReturnStatus state = root->Tick();
00512
00513 ASSERT_EQ(BT::RUNNING, state);
00514 ASSERT_EQ(BT::RUNNING, action_1->get_status());
00515
00516 root->Halt();
00517 }
00518
00519 TEST_F(BehaviorTreeTest, Condition2ToFalseCondition1True)
00520 {
00521 condition_2->set_boolean_value(false);
00522 condition_1->set_boolean_value(true);
00523
00524 BT::ReturnStatus state = root->Tick();
00525
00526 ASSERT_EQ(BT::RUNNING, state);
00527 ASSERT_EQ(BT::RUNNING, action_1->get_status());
00528
00529 root->Halt();
00530 }
00531
00532
00533 TEST_F(SimpleSequenceWithMemoryTest, ConditionTrue)
00534 {
00535 std::cout << "Ticking the root node !" << std::endl << std::endl;
00536
00537 BT::ReturnStatus state = root->Tick();
00538 std::this_thread::sleep_for(std::chrono::seconds(1));
00539
00540 ASSERT_EQ(BT::RUNNING, action->get_status());
00541 ASSERT_EQ(BT::RUNNING, state);
00542 root->Halt();
00543 }
00544
00545
00546 TEST_F(SimpleSequenceWithMemoryTest, ConditionTurnToFalse)
00547 {
00548 BT::ReturnStatus state = root->Tick();
00549
00550 condition->set_boolean_value(false);
00551
00552 state = root->Tick();
00553
00554 ASSERT_EQ(BT::RUNNING, state);
00555 ASSERT_EQ(BT::RUNNING, action->get_status());
00556
00557 root->Halt();
00558 }
00559
00560
00561 TEST_F(ComplexSequenceWithMemoryTest, ConditionsTrue)
00562 {
00563 BT::ReturnStatus state = root->Tick();
00564
00565 ASSERT_EQ(BT::RUNNING, action_1->get_status());
00566 ASSERT_EQ(BT::IDLE, action_2->get_status());
00567 ASSERT_EQ(BT::RUNNING, state);
00568
00569 root->Halt();
00570 }
00571
00572
00573 TEST_F(ComplexSequenceWithMemoryTest, Conditions1ToFalse)
00574 {
00575 BT::ReturnStatus state = root->Tick();
00576
00577 condition_1->set_boolean_value(false);
00578
00579 state = root->Tick();
00580
00581 ASSERT_EQ(BT::RUNNING, action_1->get_status());
00582 ASSERT_EQ(BT::IDLE, action_2->get_status());
00583 ASSERT_EQ(BT::RUNNING, state);
00584 root->Halt();
00585 }
00586
00587 TEST_F(ComplexSequenceWithMemoryTest, Conditions2ToFalse)
00588 {
00589 BT::ReturnStatus state = root->Tick();
00590
00591 condition_2->set_boolean_value(false);
00592
00593 state = root->Tick();
00594
00595 ASSERT_EQ(BT::RUNNING, action_1->get_status());
00596 ASSERT_EQ(BT::IDLE, action_2->get_status());
00597 ASSERT_EQ(BT::RUNNING, state);
00598
00599 root->Halt();
00600 }
00601
00602 TEST_F(ComplexSequenceWithMemoryTest, Action1Done)
00603 {
00604 root->Tick();
00605
00606 condition_2->set_boolean_value(false);
00607
00608 root->Tick();
00609 std::this_thread::sleep_for(std::chrono::seconds(10));
00610 root->Tick();
00611
00612 ASSERT_EQ(BT::RUNNING, action_2->get_status());
00613
00614 root->Halt();
00615 }
00616
00617 TEST_F(SimpleFallbackWithMemoryTest, ConditionFalse)
00618 {
00619 std::cout << "Ticking the root node !" << std::endl << std::endl;
00620
00621 condition->set_boolean_value(false);
00622 BT::ReturnStatus state = root->Tick();
00623 std::this_thread::sleep_for(std::chrono::seconds(1));
00624
00625 ASSERT_EQ(BT::RUNNING, action->get_status());
00626 ASSERT_EQ(BT::RUNNING, state);
00627
00628 root->Halt();
00629 }
00630
00631
00632 TEST_F(SimpleFallbackWithMemoryTest, ConditionTurnToTrue)
00633 {
00634 condition->set_boolean_value(false);
00635
00636 BT::ReturnStatus state = root->Tick();
00637 condition->set_boolean_value(true);
00638
00639 state = root->Tick();
00640
00641 ASSERT_EQ(BT::RUNNING, state);
00642 ASSERT_EQ(BT::RUNNING, action->get_status());
00643
00644 root->Halt();
00645 }
00646
00647
00648
00649 TEST_F(ComplexFallbackWithMemoryTest, ConditionsTrue)
00650 {
00651 BT::ReturnStatus state = root->Tick();
00652
00653 ASSERT_EQ(BT::IDLE, action_1->get_status());
00654 ASSERT_EQ(BT::IDLE, action_2->get_status());
00655 ASSERT_EQ(BT::SUCCESS, state);
00656
00657 root->Halt();
00658 }
00659
00660 TEST_F(ComplexFallbackWithMemoryTest, Condition1False)
00661 {
00662 condition_1->set_boolean_value(false);
00663 BT::ReturnStatus state = root->Tick();
00664
00665 ASSERT_EQ(BT::IDLE, action_1->get_status());
00666 ASSERT_EQ(BT::IDLE, action_2->get_status());
00667 ASSERT_EQ(BT::SUCCESS, state);
00668
00669 root->Halt();
00670 }
00671
00672
00673 TEST_F(ComplexFallbackWithMemoryTest, ConditionsFalse)
00674 {
00675 condition_1->set_boolean_value(false);
00676 condition_2->set_boolean_value(false);
00677 BT::ReturnStatus state = root->Tick();
00678
00679 ASSERT_EQ(BT::RUNNING, action_1->get_status());
00680 ASSERT_EQ(BT::IDLE, action_2->get_status());
00681 ASSERT_EQ(BT::RUNNING, state);
00682
00683 root->Halt();
00684 }
00685
00686
00687
00688
00689 TEST_F(ComplexFallbackWithMemoryTest, Conditions1ToTrue)
00690 {
00691 condition_1->set_boolean_value(false);
00692 condition_2->set_boolean_value(false);
00693 BT::ReturnStatus state = root->Tick();
00694 condition_1->set_boolean_value(true);
00695
00696 state = root->Tick();
00697
00698 ASSERT_EQ(BT::RUNNING, action_1->get_status());
00699 ASSERT_EQ(BT::IDLE, action_2->get_status());
00700 ASSERT_EQ(BT::RUNNING, state);
00701
00702 root->Halt();
00703 }
00704
00705 TEST_F(ComplexFallbackWithMemoryTest, Conditions2ToTrue)
00706 {
00707 condition_1->set_boolean_value(false);
00708
00709 condition_2->set_boolean_value(false);
00710
00711 BT::ReturnStatus state = root->Tick();
00712
00713 condition_2->set_boolean_value(true);
00714
00715 state = root->Tick();
00716
00717 ASSERT_EQ(BT::RUNNING, action_1->get_status());
00718 ASSERT_EQ(BT::IDLE, action_2->get_status());
00719 ASSERT_EQ(BT::RUNNING, state);
00720
00721 root->Halt();
00722 }
00723
00724 TEST_F(ComplexFallbackWithMemoryTest, Action1Failed)
00725 {
00726 action_1->set_boolean_value(false);
00727 condition_1->set_boolean_value(false);
00728 condition_2->set_boolean_value(false);
00729
00730 BT::ReturnStatus state = root->Tick();
00731
00732 state = root->Tick();
00733 std::this_thread::sleep_for(std::chrono::seconds(5));
00734 state = root->Tick();
00735
00736 ASSERT_EQ(BT::IDLE, action_1->get_status());
00737 ASSERT_EQ(BT::RUNNING, action_2->get_status());
00738 ASSERT_EQ(BT::RUNNING, state);
00739
00740 root->Halt();
00741 }
00742
00743
00744 TEST_F(SimpleParallelTest, ConditionsTrue)
00745 {
00746 BT::ReturnStatus state = root->Tick();
00747
00748 ASSERT_EQ(BT::IDLE, condition_1->get_status());
00749 ASSERT_EQ(BT::IDLE, condition_2->get_status());
00750 ASSERT_EQ(BT::RUNNING, action_1->get_status());
00751 ASSERT_EQ(BT::RUNNING, action_2->get_status());
00752 ASSERT_EQ(BT::RUNNING, state);
00753
00754 root->Halt();
00755 }
00756
00757
00758 TEST_F(SimpleParallelTest, Threshold_3)
00759 {
00760 root->set_threshold_M(3);
00761 action_2->set_time(200);
00762 root->Tick();
00763 std::this_thread::sleep_for(std::chrono::seconds(5));
00764 BT::ReturnStatus state = root->Tick();
00765
00766 ASSERT_EQ(BT::IDLE, condition_1->get_status());
00767 ASSERT_EQ(BT::IDLE, condition_2->get_status());
00768 ASSERT_EQ(BT::IDLE, action_1->get_status());
00769 ASSERT_EQ(BT::HALTED, action_2->get_status());
00770 ASSERT_EQ(BT::SUCCESS, state);
00771
00772 root->Halt();
00773 }
00774
00775
00776 TEST_F(SimpleParallelTest, Threshold_1)
00777 {
00778 root->set_threshold_M(1);
00779 BT::ReturnStatus state = root->Tick();
00780
00781 ASSERT_EQ(BT::IDLE, condition_1->get_status());
00782 ASSERT_EQ(BT::IDLE, condition_2->get_status());
00783 ASSERT_EQ(BT::IDLE, action_1->get_status());
00784 ASSERT_EQ(BT::IDLE, action_2->get_status());
00785 ASSERT_EQ(BT::SUCCESS, state);
00786
00787 root->Halt();
00788 }
00789 TEST_F(ComplexParallelTest, ConditionsTrue)
00790 {
00791 BT::ReturnStatus state = root->Tick();
00792
00793 ASSERT_EQ(BT::IDLE, condition_1->get_status());
00794 ASSERT_EQ(BT::IDLE, condition_2->get_status());
00795 ASSERT_EQ(BT::IDLE, condition_3->get_status());
00796 ASSERT_EQ(BT::RUNNING, action_1->get_status());
00797 ASSERT_EQ(BT::RUNNING, action_2->get_status());
00798 ASSERT_EQ(BT::IDLE, action_3->get_status());
00799 ASSERT_EQ(BT::RUNNING, parallel_1->get_status());
00800 ASSERT_EQ(BT::IDLE, parallel_2->get_status());
00801 ASSERT_EQ(BT::RUNNING, state);
00802
00803 root->Halt();
00804 }
00805
00806
00807
00808 TEST_F(ComplexParallelTest, Condition3False)
00809 {
00810 condition_3->set_boolean_value(false);
00811 BT::ReturnStatus state = root->Tick();
00812
00813 ASSERT_EQ(BT::IDLE, condition_1->get_status());
00814 ASSERT_EQ(BT::IDLE, condition_2->get_status());
00815 ASSERT_EQ(BT::IDLE, condition_3->get_status());
00816 ASSERT_EQ(BT::RUNNING, action_1->get_status());
00817 ASSERT_EQ(BT::RUNNING, action_2->get_status());
00818 ASSERT_EQ(BT::RUNNING, action_3->get_status());
00819 ASSERT_EQ(BT::RUNNING, parallel_1->get_status());
00820 ASSERT_EQ(BT::RUNNING, parallel_2->get_status());
00821 ASSERT_EQ(BT::RUNNING, state);
00822
00823 root->Halt();
00824 }
00825
00826
00827 TEST_F(ComplexParallelTest, Condition3FalseAction1Done)
00828 {
00829 action_2->set_time(10);
00830 action_3->set_time(10);
00831
00832 condition_3->set_boolean_value(false);
00833 BT::ReturnStatus state = root->Tick();
00834 std::this_thread::sleep_for(std::chrono::seconds(5));
00835
00836
00837 ASSERT_EQ(BT::IDLE, condition_1->get_status());
00838 ASSERT_EQ(BT::IDLE, condition_2->get_status());
00839 ASSERT_EQ(BT::IDLE, condition_3->get_status());
00840 ASSERT_EQ(BT::SUCCESS, action_1->get_status());
00841 ASSERT_EQ(BT::RUNNING, parallel_1->get_status());
00842
00843 state = root->Tick();
00844
00845 ASSERT_EQ(BT::IDLE, action_1->get_status());
00846 ASSERT_EQ(BT::IDLE, parallel_1->get_status());
00847 ASSERT_EQ(BT::HALTED, action_2->get_status());
00848 ASSERT_EQ(BT::RUNNING, action_3->get_status());
00849 ASSERT_EQ(BT::RUNNING, parallel_2->get_status());
00850 ASSERT_EQ(BT::RUNNING, state);
00851
00852
00853 state = root->Tick();
00854 std::this_thread::sleep_for(std::chrono::seconds(15));
00855 state = root->Tick();
00856
00857 ASSERT_EQ(BT::IDLE, parallel_2->get_status());
00858 ASSERT_EQ(BT::IDLE, action_1->get_status());
00859 ASSERT_EQ(BT::IDLE, parallel_1->get_status());
00860 ASSERT_EQ(BT::IDLE, action_3->get_status());
00861 ASSERT_EQ(BT::IDLE, parallel_2->get_status());
00862 ASSERT_EQ(BT::SUCCESS, state);
00863
00864 root->Halt();
00865 }
00866
00867 int main(int argc, char **argv)
00868 {
00869 ros::init(argc, argv, "BehaviorTree");
00870
00871
00872 testing::InitGoogleTest(&argc, argv);
00873 return RUN_ALL_TESTS();
00874 }
00875
00876