|
15 | 15 | #include "behaviortree_cpp/blackboard.h"
|
16 | 16 |
|
17 | 17 | #include "../sample_nodes/dummy_nodes.h"
|
| 18 | +#include "greeter_test.h" |
18 | 19 |
|
19 | 20 | using namespace BT;
|
20 | 21 |
|
@@ -854,3 +855,114 @@ TEST(BlackboardTest, SetBlackboard_WithPortRemapping)
|
854 | 855 | // Tick till the end with no crashes
|
855 | 856 | ASSERT_NO_THROW(tree.tickWhileRunning(););
|
856 | 857 | }
|
| 858 | + |
| 859 | + |
| 860 | +class CreateHelloGreeter : public SyncActionNode |
| 861 | +{ |
| 862 | +public: |
| 863 | + CreateHelloGreeter(const std::string& name, const NodeConfig& config) |
| 864 | + : SyncActionNode(name, config) |
| 865 | + {} |
| 866 | + |
| 867 | + NodeStatus tick() override |
| 868 | + { |
| 869 | + auto hello_greeter = std::make_shared<HelloGreeter>(); |
| 870 | + |
| 871 | + setOutput("out_derived", hello_greeter); |
| 872 | + |
| 873 | + return NodeStatus::SUCCESS; |
| 874 | + } |
| 875 | + |
| 876 | + static PortsList providedPorts() |
| 877 | + { |
| 878 | + return { BT::OutputPort<HelloGreeter::Ptr>("out_derived") }; |
| 879 | + } |
| 880 | +}; |
| 881 | + |
| 882 | +class SetDerivedParameter : public SyncActionNode |
| 883 | +{ |
| 884 | +public: |
| 885 | + SetDerivedParameter(const std::string& name, const NodeConfig& config) |
| 886 | + : SyncActionNode(name, config) |
| 887 | + {} |
| 888 | + |
| 889 | + NodeStatus tick() override |
| 890 | + { |
| 891 | + int n; |
| 892 | + HelloGreeter::Ptr hello_greeter{}; |
| 893 | + |
| 894 | + getInput("n", n); |
| 895 | + getInput("in_derived", hello_greeter); |
| 896 | + |
| 897 | + hello_greeter->setDerivedParameter(n); |
| 898 | + hello_greeter->show_msg(); |
| 899 | + |
| 900 | + return NodeStatus::SUCCESS; |
| 901 | + } |
| 902 | + |
| 903 | + static PortsList providedPorts() |
| 904 | + { |
| 905 | + return { BT::InputPort<int>("n"), BT::InputPort<HelloGreeter::Ptr>("in_derived") }; |
| 906 | + } |
| 907 | +}; |
| 908 | + |
| 909 | +class ShowGreetMessage : public SyncActionNode |
| 910 | +{ |
| 911 | +public: |
| 912 | + ShowGreetMessage(const std::string& name, const NodeConfig& config) |
| 913 | + : SyncActionNode(name, config) |
| 914 | + {} |
| 915 | + |
| 916 | + NodeStatus tick() override |
| 917 | + { |
| 918 | + Greeter::Ptr greeter{}; |
| 919 | + |
| 920 | + getInput("in_base", greeter); |
| 921 | + greeter->show_msg(); |
| 922 | + |
| 923 | + return NodeStatus::SUCCESS; |
| 924 | + } |
| 925 | + |
| 926 | + static PortsList providedPorts() |
| 927 | + { |
| 928 | + return { BT::InputPort<Greeter::Ptr>("in_base") }; |
| 929 | + } |
| 930 | +}; |
| 931 | + |
| 932 | +TEST(BlackboardTest, Upcasting_Issue943) |
| 933 | +{ |
| 934 | + auto bb = BT::Blackboard::create(); |
| 935 | + |
| 936 | + auto hello_greeter = std::make_shared<HelloGreeter>(); |
| 937 | + bb->set("hello_greeter", hello_greeter); |
| 938 | + |
| 939 | + std::shared_ptr<Greeter> g{}; |
| 940 | + ASSERT_TRUE(bb->get("hello_greeter", g)); |
| 941 | + ASSERT_STREQ("hello", g->show_msg().c_str()); |
| 942 | + |
| 943 | + std::shared_ptr<HelloGreeter> hg{}; |
| 944 | + ASSERT_TRUE(bb->get("hello_greeter", hg)); |
| 945 | + ASSERT_STREQ("hello", hg->show_msg().c_str()); |
| 946 | + |
| 947 | + std::string xml_txt = R"( |
| 948 | + <root BTCPP_format="4" > |
| 949 | + <BehaviorTree ID="Main"> |
| 950 | + <Sequence> |
| 951 | + <CreateHelloGreeter out_derived="{hello_greeter}" /> |
| 952 | + <SetDerivedParameter in_derived="{hello_greeter}" n="2" /> |
| 953 | + <ShowGreetMessage in_base="{hello_greeter}" /> |
| 954 | + </Sequence> |
| 955 | + </BehaviorTree> |
| 956 | + </root>)"; |
| 957 | + |
| 958 | + BehaviorTreeFactory factory; |
| 959 | + factory.registerNodeType<CreateHelloGreeter>("CreateHelloGreeter"); |
| 960 | + factory.registerNodeType<SetDerivedParameter>("SetDerivedParameter"); |
| 961 | + factory.registerNodeType<ShowGreetMessage>("ShowGreetMessage"); |
| 962 | + |
| 963 | + auto tree = factory.createTreeFromText(xml_txt); |
| 964 | + |
| 965 | + NodeStatus status = tree.tickWhileRunning(); |
| 966 | + |
| 967 | + ASSERT_EQ(status, NodeStatus::SUCCESS); |
| 968 | +} |
0 commit comments