gtest_sequence.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2015-2017 Michele Colledanchise - All Rights Reserved
2 *
3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
4 * to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
5 * 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:
6 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
9 * 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,
10 * 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.
11 */
12 
13 #include <gtest/gtest.h>
14 #include "action_test_node.h"
15 #include "condition_test_node.h"
17 
18 using BT::NodeStatus;
19 using std::chrono::milliseconds;
20 
21 struct SimpleSequenceTest : testing::Test
22 {
26 
28  root("root_sequence"), action("action", milliseconds(100)), condition("condition")
29  {
32  }
34  {}
35 };
36 
37 struct ComplexSequenceTest : testing::Test
38 {
43 
45 
47  root("root"),
48  action_1("action_1", milliseconds(100)),
49  condition_1("condition_1"),
50  condition_2("condition_2"),
51  seq_conditions("sequence_conditions")
52  {
54  {
57  }
59  }
61  {}
62 };
63 
64 struct SequenceTripleActionTest : testing::Test
65 {
71 
73  root("root_sequence"),
74  condition("condition"),
75  action_1("action_1", milliseconds(100)),
76  action_2("action_2"),
77  action_3("action_3", milliseconds(100))
78  {
83  }
85  {}
86 };
87 
88 struct ComplexSequence2ActionsTest : testing::Test
89 {
95 
98 
100  root("root_sequence"),
101  action_1("action_1", milliseconds(100)),
102  action_2("action_2", milliseconds(100)),
103  seq_1("sequence_1"),
104  seq_2("sequence_2"),
105  condition_1("condition_1"),
106  condition_2("condition_2")
107  {
108  root.addChild(&seq_1);
109  {
112  }
113  root.addChild(&seq_2);
114  {
117  }
118  }
120  {}
121 };
122 
123 struct SimpleSequenceWithMemoryTest : testing::Test
124 {
128 
130  root("root_sequence"), action("action", milliseconds(100)), condition("condition")
131  {
133  root.addChild(&action);
134  }
136  {}
137 };
138 
139 struct ComplexSequenceWithMemoryTest : testing::Test
140 {
142 
145 
148 
151 
153  root("root_sequence"),
154  action_1("action_1", milliseconds(100)),
155  action_2("action_2", milliseconds(100)),
156  condition_1("condition_1"),
157  condition_2("condition_2"),
158  seq_conditions("sequence_conditions"),
159  seq_actions("sequence_actions")
160  {
162  {
165  }
167  {
170  }
171  }
173  {}
174 };
175 
176 struct SimpleParallelTest : testing::Test
177 {
181 
184 
186  root("root_parallel", 4),
187  action_1("action_1", milliseconds(100)),
188  condition_1("condition_1"),
189  action_2("action_2", milliseconds(100)),
190  condition_2("condition_2")
191  {
196  }
198  {}
199 };
200 
201 /****************TESTS START HERE***************************/
202 
203 TEST_F(SimpleSequenceTest, ConditionTrue)
204 {
205  std::cout << "Ticking the root node !" << std::endl << std::endl;
206  // Ticking the root node
207  BT::NodeStatus state = root.executeTick();
208 
209  ASSERT_EQ(NodeStatus::RUNNING, action.status());
210  ASSERT_EQ(NodeStatus::RUNNING, state);
211 }
212 
213 TEST_F(SimpleSequenceTest, ConditionTurnToFalse)
214 {
215  condition.setExpectedResult(NodeStatus::FAILURE);
216  BT::NodeStatus state = root.executeTick();
217 
218  state = root.executeTick();
219  ASSERT_EQ(NodeStatus::FAILURE, state);
220  ASSERT_EQ(NodeStatus::IDLE, condition.status());
221  ASSERT_EQ(NodeStatus::IDLE, action.status());
222 }
223 
224 TEST_F(ComplexSequenceTest, ComplexSequenceConditionsTrue)
225 {
226  BT::NodeStatus state = root.executeTick();
227 
228  ASSERT_EQ(NodeStatus::RUNNING, state);
229  ASSERT_EQ(NodeStatus::IDLE, seq_conditions.status());
230  ASSERT_EQ(NodeStatus::IDLE, condition_1.status());
231  ASSERT_EQ(NodeStatus::IDLE, condition_1.status());
232  ASSERT_EQ(NodeStatus::RUNNING, action_1.status());
233 }
234 
236 {
237  using namespace BT;
238  using namespace std::chrono;
239  const auto timeout = system_clock::now() + milliseconds(650);
240 
241  action_1.setTime(milliseconds(300));
242  action_3.setTime(milliseconds(300));
243  // the sequence is supposed to finish in (300 ms * 2) = 600 ms
244 
245  // first tick
246  NodeStatus state = root.executeTick();
247 
248  ASSERT_EQ(NodeStatus::RUNNING, state);
249  ASSERT_EQ(NodeStatus::RUNNING, action_1.status());
250  ASSERT_EQ(NodeStatus::IDLE, action_2.status());
251  ASSERT_EQ(NodeStatus::IDLE, action_3.status());
252 
253  // continue until succesful
254  while (state != NodeStatus::SUCCESS && system_clock::now() < timeout)
255  {
256  std::this_thread::sleep_for(milliseconds(10));
257  state = root.executeTick();
258  }
259 
260  ASSERT_EQ(NodeStatus::SUCCESS, state);
261 
262  // Condition is called only once
263  ASSERT_EQ(condition.tickCount(), 1);
264  // all the actions are called only once
265  ASSERT_EQ(action_1.tickCount(), 1);
266  ASSERT_EQ(action_2.tickCount(), 1);
267  ASSERT_EQ(action_3.tickCount(), 1);
268 
269  ASSERT_EQ(NodeStatus::IDLE, action_1.status());
270  ASSERT_EQ(NodeStatus::IDLE, action_2.status());
271  ASSERT_EQ(NodeStatus::IDLE, action_3.status());
272  ASSERT_TRUE(system_clock::now() < timeout); // no timeout should occur
273 }
274 
276 {
277  BT::NodeStatus state = root.executeTick();
278 
279  state = root.executeTick();
280 
281  ASSERT_EQ(NodeStatus::RUNNING, state);
282  ASSERT_EQ(NodeStatus::RUNNING, seq_1.status());
283  ASSERT_EQ(NodeStatus::SUCCESS, condition_1.status());
284  ASSERT_EQ(NodeStatus::RUNNING, action_1.status());
285  ASSERT_EQ(NodeStatus::IDLE, seq_2.status());
286  ASSERT_EQ(NodeStatus::IDLE, condition_2.status());
287  ASSERT_EQ(NodeStatus::IDLE, action_2.status());
288 
289  std::this_thread::sleep_for(milliseconds(300));
290  state = root.executeTick();
291 
292  ASSERT_EQ(NodeStatus::RUNNING, state);
293  ASSERT_EQ(NodeStatus::SUCCESS, seq_1.status());
294  ASSERT_EQ(NodeStatus::IDLE, condition_1.status());
295  ASSERT_EQ(NodeStatus::IDLE, action_1.status());
296  ASSERT_EQ(NodeStatus::RUNNING, seq_2.status());
297  ASSERT_EQ(NodeStatus::SUCCESS, condition_2.status());
298  ASSERT_EQ(NodeStatus::RUNNING, action_2.status());
299 
300  state = root.executeTick();
301 }
302 
303 TEST_F(ComplexSequenceTest, ComplexSequenceConditions1ToFalse)
304 {
305  BT::NodeStatus state = root.executeTick();
306 
307  condition_1.setExpectedResult(NodeStatus::FAILURE);
308 
309  state = root.executeTick();
310 
311  ASSERT_EQ(NodeStatus::FAILURE, state);
312  ASSERT_EQ(NodeStatus::IDLE, seq_conditions.status());
313  ASSERT_EQ(NodeStatus::IDLE, condition_1.status());
314  ASSERT_EQ(NodeStatus::IDLE, condition_2.status());
315  ASSERT_EQ(NodeStatus::IDLE, action_1.status());
316 }
317 
318 TEST_F(ComplexSequenceTest, ComplexSequenceConditions2ToFalse)
319 {
320  BT::NodeStatus state = root.executeTick();
321 
322  condition_2.setExpectedResult(NodeStatus::FAILURE);
323 
324  state = root.executeTick();
325 
326  ASSERT_EQ(NodeStatus::FAILURE, state);
327  ASSERT_EQ(NodeStatus::IDLE, seq_conditions.status());
328  ASSERT_EQ(NodeStatus::IDLE, condition_1.status());
329  ASSERT_EQ(NodeStatus::IDLE, condition_2.status());
330  ASSERT_EQ(NodeStatus::IDLE, action_1.status());
331 }
332 
334 {
335  BT::NodeStatus state = root.executeTick();
336  std::this_thread::sleep_for(milliseconds(50));
337 
338  ASSERT_EQ(NodeStatus::RUNNING, state);
339  ASSERT_EQ(NodeStatus::SUCCESS, condition.status());
340  ASSERT_EQ(NodeStatus::RUNNING, action.status());
341 }
342 
343 TEST_F(SimpleSequenceWithMemoryTest, ConditionTurnToFalse)
344 {
345  BT::NodeStatus state = root.executeTick();
346 
347  ASSERT_EQ(NodeStatus::RUNNING, state);
348  ASSERT_EQ(NodeStatus::SUCCESS, condition.status());
349  ASSERT_EQ(NodeStatus::RUNNING, action.status());
350 
351  condition.setExpectedResult(NodeStatus::FAILURE);
352  state = root.executeTick();
353 
354  ASSERT_EQ(NodeStatus::RUNNING, state);
355  ASSERT_EQ(NodeStatus::SUCCESS, condition.status());
356  ASSERT_EQ(NodeStatus::RUNNING, action.status());
357 }
358 
360 {
361  BT::NodeStatus state = root.executeTick();
362 
363  ASSERT_EQ(NodeStatus::RUNNING, state);
364  ASSERT_EQ(NodeStatus::SUCCESS, seq_conditions.status());
365  ASSERT_EQ(NodeStatus::IDLE, condition_1.status());
366  ASSERT_EQ(NodeStatus::IDLE, condition_2.status());
367  ASSERT_EQ(NodeStatus::RUNNING, seq_actions.status());
368  ASSERT_EQ(NodeStatus::RUNNING, action_1.status());
369  ASSERT_EQ(NodeStatus::IDLE, action_2.status());
370 }
371 
373 {
374  BT::NodeStatus state = root.executeTick();
375 
376  condition_1.setExpectedResult(NodeStatus::FAILURE);
377  state = root.executeTick();
378  // change in condition_1 does not affect the state of the tree,
379  // since the seq_conditions was executed already
380  ASSERT_EQ(NodeStatus::RUNNING, state);
381  ASSERT_EQ(NodeStatus::SUCCESS, seq_conditions.status());
382  ASSERT_EQ(NodeStatus::IDLE, condition_1.status());
383  ASSERT_EQ(NodeStatus::IDLE, condition_2.status());
384  ASSERT_EQ(NodeStatus::RUNNING, seq_actions.status());
385  ASSERT_EQ(NodeStatus::RUNNING, action_1.status());
386  ASSERT_EQ(NodeStatus::IDLE, action_2.status());
387 }
388 
BT
Definition: ex01_wrap_legacy.cpp:29
SimpleSequenceTest::SimpleSequenceTest
SimpleSequenceTest()
Definition: gtest_sequence.cpp:27
ComplexSequenceTest::seq_conditions
BT::SequenceNode seq_conditions
Definition: gtest_sequence.cpp:44
ComplexSequence2ActionsTest::seq_2
BT::SequenceNode seq_2
Definition: gtest_sequence.cpp:94
ComplexSequenceWithMemoryTest::condition_2
BT::ConditionTestNode condition_2
Definition: gtest_sequence.cpp:147
SimpleParallelTest::SimpleParallelTest
SimpleParallelTest()
Definition: gtest_sequence.cpp:185
ComplexSequence2ActionsTest
Definition: gtest_sequence.cpp:88
SimpleParallelTest::condition_1
BT::ConditionTestNode condition_1
Definition: gtest_parallel.cpp:25
SimpleParallelTest::action_2
BT::AsyncActionTest action_2
Definition: gtest_parallel.cpp:27
TEST_F
TEST_F(SimpleSequenceTest, ConditionTrue)
Definition: gtest_sequence.cpp:203
SequenceTripleActionTest::action_3
BT::AsyncActionTest action_3
Definition: gtest_sequence.cpp:70
BT::ParallelNode
The ParallelNode execute all its children concurrently, but not in separate threads!
Definition: parallel_node.h:40
ComplexSequenceWithMemoryTest::condition_1
BT::ConditionTestNode condition_1
Definition: gtest_sequence.cpp:146
ComplexSequenceTest::~ComplexSequenceTest
~ComplexSequenceTest()
Definition: gtest_sequence.cpp:60
ComplexSequence2ActionsTest::action_1
BT::AsyncActionTest action_1
Definition: gtest_sequence.cpp:91
SimpleSequenceWithMemoryTest::SimpleSequenceWithMemoryTest
SimpleSequenceWithMemoryTest()
Definition: gtest_sequence.cpp:129
SimpleSequenceWithMemoryTest
Definition: gtest_sequence.cpp:123
BT::AsyncActionTest
Definition: action_test_node.h:32
SimpleSequenceTest::action
BT::AsyncActionTest action
Definition: gtest_sequence.cpp:24
ComplexSequenceWithMemoryTest::ComplexSequenceWithMemoryTest
ComplexSequenceWithMemoryTest()
Definition: gtest_sequence.cpp:152
SimpleSequenceTest::condition
BT::ConditionTestNode condition
Definition: gtest_sequence.cpp:25
ComplexSequence2ActionsTest::condition_1
BT::ConditionTestNode condition_1
Definition: gtest_sequence.cpp:96
ComplexSequenceTest
Definition: gtest_sequence.cpp:37
BT::SequenceStarNode
The SequenceStarNode is used to tick children in an ordered sequence. If any child returns RUNNING,...
Definition: sequence_star_node.h:34
SimpleSequenceTest::~SimpleSequenceTest
~SimpleSequenceTest()
Definition: gtest_sequence.cpp:33
BT::SyncActionTest
Definition: action_test_node.h:8
ComplexSequence2ActionsTest::root
BT::SequenceNode root
Definition: gtest_sequence.cpp:90
ComplexSequenceWithMemoryTest
Definition: gtest_sequence.cpp:139
ComplexSequenceTest::root
BT::ReactiveSequence root
Definition: gtest_sequence.cpp:39
condition_test_node.h
ComplexSequence2ActionsTest::action_2
BT::AsyncActionTest action_2
Definition: gtest_sequence.cpp:92
BT::NodeStatus::FAILURE
@ FAILURE
SimpleSequenceTest
Definition: gtest_sequence.cpp:21
ComplexSequenceWithMemoryTest::action_1
BT::AsyncActionTest action_1
Definition: gtest_sequence.cpp:143
SimpleSequenceWithMemoryTest::action
BT::AsyncActionTest action
Definition: gtest_sequence.cpp:126
ComplexSequence2ActionsTest::~ComplexSequence2ActionsTest
~ComplexSequence2ActionsTest()
Definition: gtest_sequence.cpp:119
SimpleParallelTest
Definition: gtest_parallel.cpp:21
SequenceTripleActionTest::~SequenceTripleActionTest
~SequenceTripleActionTest()
Definition: gtest_sequence.cpp:84
SimpleParallelTest::condition_2
BT::ConditionTestNode condition_2
Definition: gtest_parallel.cpp:28
SequenceTripleActionTest::action_2
BT::SyncActionTest action_2
Definition: gtest_sequence.cpp:69
SequenceTripleActionTest::action_1
BT::AsyncActionTest action_1
Definition: gtest_sequence.cpp:68
SimpleSequenceTest::root
BT::SequenceNode root
Definition: gtest_sequence.cpp:23
behavior_tree.h
ComplexSequenceWithMemoryTest::root
BT::SequenceStarNode root
Definition: gtest_sequence.cpp:141
BT::NodeStatus::SUCCESS
@ SUCCESS
ComplexSequenceWithMemoryTest::seq_conditions
BT::SequenceStarNode seq_conditions
Definition: gtest_sequence.cpp:149
ComplexSequenceTest::condition_2
BT::ConditionTestNode condition_2
Definition: gtest_sequence.cpp:42
BT::NodeStatus::RUNNING
@ RUNNING
ComplexSequence2ActionsTest::seq_1
BT::SequenceNode seq_1
Definition: gtest_sequence.cpp:93
SequenceTripleActionTest::SequenceTripleActionTest
SequenceTripleActionTest()
Definition: gtest_sequence.cpp:72
SimpleParallelTest::~SimpleParallelTest
~SimpleParallelTest()
Definition: gtest_sequence.cpp:197
SimpleSequenceWithMemoryTest::condition
BT::ConditionTestNode condition
Definition: gtest_sequence.cpp:127
ComplexSequence2ActionsTest::condition_2
BT::ConditionTestNode condition_2
Definition: gtest_sequence.cpp:97
ComplexSequenceTest::ComplexSequenceTest
ComplexSequenceTest()
Definition: gtest_sequence.cpp:46
ComplexSequenceWithMemoryTest::seq_actions
BT::SequenceStarNode seq_actions
Definition: gtest_sequence.cpp:150
BT::ReactiveSequence
The ReactiveSequence is similar to a ParallelNode. All the children are ticked from first to last:
Definition: reactive_sequence.h:33
SequenceTripleActionTest::root
BT::SequenceNode root
Definition: gtest_sequence.cpp:66
action_test_node.h
BT::NodeStatus::IDLE
@ IDLE
SequenceTripleActionTest
Definition: gtest_sequence.cpp:64
BT::SequenceNode
The SequenceNode is used to tick children in an ordered sequence. If any child returns RUNNING,...
Definition: sequence_node.h:33
ComplexSequenceWithMemoryTest::~ComplexSequenceWithMemoryTest
~ComplexSequenceWithMemoryTest()
Definition: gtest_sequence.cpp:172
SimpleParallelTest::root
BT::ParallelNode root
Definition: gtest_parallel.cpp:23
BT::ConditionTestNode
Definition: condition_test_node.h:8
SimpleSequenceWithMemoryTest::root
BT::SequenceStarNode root
Definition: gtest_sequence.cpp:125
SimpleSequenceWithMemoryTest::~SimpleSequenceWithMemoryTest
~SimpleSequenceWithMemoryTest()
Definition: gtest_sequence.cpp:135
SequenceTripleActionTest::condition
BT::ConditionTestNode condition
Definition: gtest_sequence.cpp:67
BT::ControlNode::addChild
void addChild(TreeNode *child)
The method used to add nodes to the children vector.
Definition: control_node.cpp:22
ComplexSequence2ActionsTest::ComplexSequence2ActionsTest
ComplexSequence2ActionsTest()
Definition: gtest_sequence.cpp:99
ComplexSequenceTest::action_1
BT::AsyncActionTest action_1
Definition: gtest_sequence.cpp:40
BT::NodeStatus
NodeStatus
Definition: basic_types.h:35
ComplexSequenceWithMemoryTest::action_2
BT::AsyncActionTest action_2
Definition: gtest_sequence.cpp:144
ComplexSequenceTest::condition_1
BT::ConditionTestNode condition_1
Definition: gtest_sequence.cpp:41
SimpleParallelTest::action_1
BT::AsyncActionTest action_1
Definition: gtest_parallel.cpp:24


behaviortree_cpp_v3
Author(s): Michele Colledanchise, Davide Faconti
autogenerated on Wed Jun 26 2024 02:51:19