Skip to content

Commit 472a564

Browse files
authored
Added BlackboardCheckBool decorator node (#326)
* Added tests for BlackboardCheck decorator node * Added BlackboardCheckBool decorator node
1 parent c25380c commit 472a564

File tree

4 files changed

+202
-0
lines changed

4 files changed

+202
-0
lines changed

include/behaviortree_cpp_v3/decorators/blackboard_precondition.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ class BlackboardPreconditionNode : public DecoratorNode
4242
setRegistrationID("BlackboardCheckDouble");
4343
else if( std::is_same<T,std::string>::value)
4444
setRegistrationID("BlackboardCheckString");
45+
else if( std::is_same<T,bool>::value)
46+
setRegistrationID("BlackboardCheckBool");
4547
}
4648

4749
virtual ~BlackboardPreconditionNode() override = default;

src/bt_factory.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ BehaviorTreeFactory::BehaviorTreeFactory()
5353
registerNodeType<BlackboardPreconditionNode<int>>("BlackboardCheckInt");
5454
registerNodeType<BlackboardPreconditionNode<double>>("BlackboardCheckDouble");
5555
registerNodeType<BlackboardPreconditionNode<std::string>>("BlackboardCheckString");
56+
registerNodeType<BlackboardPreconditionNode<bool>>("BlackboardCheckBool");
5657

5758
registerNodeType<SwitchNode<2>>("Switch2");
5859
registerNodeType<SwitchNode<3>>("Switch3");

tests/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ set(BT_TESTS
1313
gtest_factory.cpp
1414
gtest_decorator.cpp
1515
gtest_blackboard.cpp
16+
gtest_blackboard_precondition.cpp
1617
gtest_ports.cpp
1718
navigation_test.cpp
1819
gtest_subtree.cpp
Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
#include <gtest/gtest.h>
2+
#include <string>
3+
#include "behaviortree_cpp_v3/basic_types.h"
4+
#include "behaviortree_cpp_v3/bt_factory.h"
5+
6+
using namespace BT;
7+
8+
TEST(BlackboardPreconditionTest, IntEquals)
9+
{
10+
BehaviorTreeFactory factory;
11+
12+
const std::string xml_text = R"(
13+
14+
<root main_tree_to_execute = "MainTree" >
15+
<BehaviorTree ID="MainTree">
16+
<Sequence>
17+
<SetBlackboard output_key="a" value="1" />
18+
<SetBlackboard output_key="b" value="1" />
19+
20+
<BlackboardCheckInt value_A="{a}" value_B="{b}" return_on_mismatch="SUCCESS">
21+
<AlwaysFailure />
22+
</BlackboardCheckInt>
23+
</Sequence>
24+
</BehaviorTree>
25+
</root>)";
26+
27+
auto tree = factory.createTreeFromText(xml_text);
28+
const auto status = tree.tickRoot();
29+
ASSERT_EQ(status, NodeStatus::FAILURE);
30+
}
31+
32+
TEST(BlackboardPreconditionTest, IntDoesNotEqual)
33+
{
34+
BehaviorTreeFactory factory;
35+
36+
const std::string xml_text = R"(
37+
38+
<root main_tree_to_execute = "MainTree" >
39+
<BehaviorTree ID="MainTree">
40+
<Sequence>
41+
<SetBlackboard output_key="a" value="1" />
42+
<SetBlackboard output_key="b" value="2" />
43+
44+
<BlackboardCheckInt value_A="{a}" value_B="{b}" return_on_mismatch="SUCCESS">
45+
<AlwaysFailure />
46+
</BlackboardCheckInt>
47+
</Sequence>
48+
</BehaviorTree>
49+
</root>)";
50+
51+
auto tree = factory.createTreeFromText(xml_text);
52+
const auto status = tree.tickRoot();
53+
ASSERT_EQ(status, NodeStatus::SUCCESS);
54+
}
55+
56+
TEST(BlackboardPreconditionTest, DoubleEquals)
57+
{
58+
BehaviorTreeFactory factory;
59+
60+
const std::string xml_text = R"(
61+
62+
<root main_tree_to_execute = "MainTree" >
63+
<BehaviorTree ID="MainTree">
64+
<Sequence>
65+
<SetBlackboard output_key="a" value="1.1" />
66+
<SetBlackboard output_key="b" value="1.1" />
67+
68+
<BlackboardCheckDouble value_A="{a}" value_B="{b}" return_on_mismatch="SUCCESS">
69+
<AlwaysFailure />
70+
</BlackboardCheckDouble>
71+
</Sequence>
72+
</BehaviorTree>
73+
</root>)";
74+
75+
auto tree = factory.createTreeFromText(xml_text);
76+
const auto status = tree.tickRoot();
77+
ASSERT_EQ(status, NodeStatus::FAILURE);
78+
}
79+
80+
TEST(BlackboardPreconditionTest, DoubleDoesNotEqual)
81+
{
82+
BehaviorTreeFactory factory;
83+
84+
const std::string xml_text = R"(
85+
86+
<root main_tree_to_execute = "MainTree" >
87+
<BehaviorTree ID="MainTree">
88+
<Sequence>
89+
<SetBlackboard output_key="a" value="1.1" />
90+
<SetBlackboard output_key="b" value="2.1" />
91+
92+
<BlackboardCheckDouble value_A="{a}" value_B="{b}" return_on_mismatch="SUCCESS">
93+
<AlwaysFailure />
94+
</BlackboardCheckDouble>
95+
</Sequence>
96+
</BehaviorTree>
97+
</root>)";
98+
99+
auto tree = factory.createTreeFromText(xml_text);
100+
const auto status = tree.tickRoot();
101+
ASSERT_EQ(status, NodeStatus::SUCCESS);
102+
}
103+
104+
TEST(BlackboardPreconditionTest, StringEquals)
105+
{
106+
BehaviorTreeFactory factory;
107+
108+
const std::string xml_text = R"(
109+
110+
<root main_tree_to_execute = "MainTree" >
111+
<BehaviorTree ID="MainTree">
112+
<Sequence>
113+
<SetBlackboard output_key="a" value="foo" />
114+
<SetBlackboard output_key="b" value="foo" />
115+
116+
<BlackboardCheckString value_A="{a}" value_B="{b}" return_on_mismatch="SUCCESS">
117+
<AlwaysFailure />
118+
</BlackboardCheckString>
119+
</Sequence>
120+
</BehaviorTree>
121+
</root>)";
122+
123+
auto tree = factory.createTreeFromText(xml_text);
124+
const auto status = tree.tickRoot();
125+
ASSERT_EQ(status, NodeStatus::FAILURE);
126+
}
127+
128+
TEST(BlackboardPreconditionTest, StringDoesNotEqual)
129+
{
130+
BehaviorTreeFactory factory;
131+
132+
const std::string xml_text = R"(
133+
134+
<root main_tree_to_execute = "MainTree" >
135+
<BehaviorTree ID="MainTree">
136+
<Sequence>
137+
<SetBlackboard output_key="a" value="foo" />
138+
<SetBlackboard output_key="b" value="bar" />
139+
140+
<BlackboardCheckString value_A="{a}" value_B="{b}" return_on_mismatch="SUCCESS">
141+
<AlwaysFailure />
142+
</BlackboardCheckString>
143+
</Sequence>
144+
</BehaviorTree>
145+
</root>)";
146+
147+
auto tree = factory.createTreeFromText(xml_text);
148+
const auto status = tree.tickRoot();
149+
ASSERT_EQ(status, NodeStatus::SUCCESS);
150+
}
151+
152+
TEST(BlackboardPreconditionTest, BoolEquals)
153+
{
154+
BehaviorTreeFactory factory;
155+
156+
const std::string xml_text = R"(
157+
158+
<root main_tree_to_execute = "MainTree" >
159+
<BehaviorTree ID="MainTree">
160+
<Sequence>
161+
<SetBlackboard output_key="a" value="true" />
162+
<SetBlackboard output_key="b" value="true" />
163+
164+
<BlackboardCheckBool value_A="{a}" value_B="{b}" return_on_mismatch="SUCCESS">
165+
<AlwaysFailure />
166+
</BlackboardCheckBool>
167+
</Sequence>
168+
</BehaviorTree>
169+
</root>)";
170+
171+
auto tree = factory.createTreeFromText(xml_text);
172+
const auto status = tree.tickRoot();
173+
ASSERT_EQ(status, NodeStatus::FAILURE);
174+
}
175+
176+
TEST(BlackboardPreconditionTest, BoolDoesNotEqual)
177+
{
178+
BehaviorTreeFactory factory;
179+
180+
const std::string xml_text = R"(
181+
182+
<root main_tree_to_execute = "MainTree" >
183+
<BehaviorTree ID="MainTree">
184+
<Sequence>
185+
<SetBlackboard output_key="a" value="true" />
186+
<SetBlackboard output_key="b" value="false" />
187+
188+
<BlackboardCheckBool value_A="{a}" value_B="{b}" return_on_mismatch="SUCCESS">
189+
<AlwaysFailure />
190+
</BlackboardCheckBool>
191+
</Sequence>
192+
</BehaviorTree>
193+
</root>)";
194+
195+
auto tree = factory.createTreeFromText(xml_text);
196+
const auto status = tree.tickRoot();
197+
ASSERT_EQ(status, NodeStatus::SUCCESS);
198+
}

0 commit comments

Comments
 (0)