gtest_tree.cpp
Go to the documentation of this file.
00001 /* Copyright (C) 2015-2017 Michele Colledanchise - All Rights Reserved
00002 *
00003 *   Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
00004 *   to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
00005 *   and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
00006 *   The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
00007 *
00008 *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00009 *   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
00010 *   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
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 /****************TESTS START HERE***************************/
00357 
00358 
00359 
00360 TEST_F(SimpleSequenceTest, ConditionTrue)
00361 {
00362     std::cout << "Ticking the root node !" << std::endl << std::endl;
00363     // Ticking the root node
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     // Ticking the root node
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     // Ticking the root node
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     // Ticking the root node
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());  // success not read yet by the node parallel_1
00841     ASSERT_EQ(BT::RUNNING, parallel_1->get_status());  // parallel_1 hasn't realize (yet) that action_1 has succeeded
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     // testing::GTEST_FLAG(filter) = "ComplexSequence2ActionsTest.ConditionsTrue";
00872     testing::InitGoogleTest(&argc, argv);
00873     return RUN_ALL_TESTS();
00874 }
00875 
00876 


behavior_tree_core
Author(s): Michele Colledanchise
autogenerated on Thu Jun 6 2019 18:19:08