|
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 |
|
@@ -654,3 +655,113 @@ TEST(BlackboardTest, TimestampedInterface)
|
654 | 655 | ASSERT_EQ(stamp_opt->seq, 2);
|
655 | 656 | ASSERT_GE(stamp_opt->time.count(), nsec_before);
|
656 | 657 | }
|
| 658 | + |
| 659 | +class CreateHelloGreeter : public SyncActionNode |
| 660 | +{ |
| 661 | +public: |
| 662 | + CreateHelloGreeter(const std::string& name, const NodeConfig& config) |
| 663 | + : SyncActionNode(name, config) |
| 664 | + {} |
| 665 | + |
| 666 | + NodeStatus tick() override |
| 667 | + { |
| 668 | + auto hello_greeter = std::make_shared<HelloGreeter>(); |
| 669 | + |
| 670 | + setOutput("out_derived", hello_greeter); |
| 671 | + |
| 672 | + return NodeStatus::SUCCESS; |
| 673 | + } |
| 674 | + |
| 675 | + static PortsList providedPorts() |
| 676 | + { |
| 677 | + return { BT::OutputPort<HelloGreeter::Ptr>("out_derived") }; |
| 678 | + } |
| 679 | +}; |
| 680 | + |
| 681 | +class SetDerivedParameter : public SyncActionNode |
| 682 | +{ |
| 683 | +public: |
| 684 | + SetDerivedParameter(const std::string& name, const NodeConfig& config) |
| 685 | + : SyncActionNode(name, config) |
| 686 | + {} |
| 687 | + |
| 688 | + NodeStatus tick() override |
| 689 | + { |
| 690 | + int n; |
| 691 | + HelloGreeter::Ptr hello_greeter{}; |
| 692 | + |
| 693 | + getInput("n", n); |
| 694 | + getInput("in_derived", hello_greeter); |
| 695 | + |
| 696 | + hello_greeter->setDerivedParameter(n); |
| 697 | + hello_greeter->show_msg(); |
| 698 | + |
| 699 | + return NodeStatus::SUCCESS; |
| 700 | + } |
| 701 | + |
| 702 | + static PortsList providedPorts() |
| 703 | + { |
| 704 | + return { BT::InputPort<int>("n"), BT::InputPort<HelloGreeter::Ptr>("in_derived") }; |
| 705 | + } |
| 706 | +}; |
| 707 | + |
| 708 | +class ShowGreetMessage : public SyncActionNode |
| 709 | +{ |
| 710 | +public: |
| 711 | + ShowGreetMessage(const std::string& name, const NodeConfig& config) |
| 712 | + : SyncActionNode(name, config) |
| 713 | + {} |
| 714 | + |
| 715 | + NodeStatus tick() override |
| 716 | + { |
| 717 | + Greeter::Ptr greeter{}; |
| 718 | + |
| 719 | + getInput("in_base", greeter); |
| 720 | + greeter->show_msg(); |
| 721 | + |
| 722 | + return NodeStatus::SUCCESS; |
| 723 | + } |
| 724 | + |
| 725 | + static PortsList providedPorts() |
| 726 | + { |
| 727 | + return { BT::InputPort<Greeter::Ptr>("in_base") }; |
| 728 | + } |
| 729 | +}; |
| 730 | + |
| 731 | +TEST(BlackboardTest, Upcasting_Issue943) |
| 732 | +{ |
| 733 | + auto bb = BT::Blackboard::create(); |
| 734 | + |
| 735 | + auto hello_greeter = std::make_shared<HelloGreeter>(); |
| 736 | + bb->set("hello_greeter", hello_greeter); |
| 737 | + |
| 738 | + std::shared_ptr<Greeter> g{}; |
| 739 | + ASSERT_TRUE(bb->get("hello_greeter", g)); |
| 740 | + ASSERT_STREQ("hello", g->show_msg().c_str()); |
| 741 | + |
| 742 | + std::shared_ptr<HelloGreeter> hg{}; |
| 743 | + ASSERT_TRUE(bb->get("hello_greeter", hg)); |
| 744 | + ASSERT_STREQ("hello", hg->show_msg().c_str()); |
| 745 | + |
| 746 | + std::string xml_txt = R"( |
| 747 | + <root BTCPP_format="4" > |
| 748 | + <BehaviorTree ID="Main"> |
| 749 | + <Sequence> |
| 750 | + <CreateHelloGreeter out_derived="{hello_greeter}" /> |
| 751 | + <SetDerivedParameter in_derived="{hello_greeter}" n="2" /> |
| 752 | + <ShowGreetMessage in_base="{hello_greeter}" /> |
| 753 | + </Sequence> |
| 754 | + </BehaviorTree> |
| 755 | + </root>)"; |
| 756 | + |
| 757 | + BehaviorTreeFactory factory; |
| 758 | + factory.registerNodeType<CreateHelloGreeter>("CreateHelloGreeter"); |
| 759 | + factory.registerNodeType<SetDerivedParameter>("SetDerivedParameter"); |
| 760 | + factory.registerNodeType<ShowGreetMessage>("ShowGreetMessage"); |
| 761 | + |
| 762 | + auto tree = factory.createTreeFromText(xml_txt); |
| 763 | + |
| 764 | + NodeStatus status = tree.tickWhileRunning(); |
| 765 | + |
| 766 | + ASSERT_EQ(status, NodeStatus::SUCCESS); |
| 767 | +} |
0 commit comments