|
3 | 3 | #include "behaviortree_cpp/bt_factory.h"
|
4 | 4 | #include "behaviortree_cpp/xml_parsing.h"
|
5 | 5 | #include "behaviortree_cpp/json_export.h"
|
| 6 | +#include "greeter_test.h" // upcasting tests |
6 | 7 |
|
7 | 8 | using namespace BT;
|
8 | 9 |
|
@@ -730,3 +731,60 @@ TEST(PortTest, DefaultWronglyOverriden)
|
730 | 731 | // This is correct
|
731 | 732 | ASSERT_NO_THROW(auto tree = factory.createTreeFromText(xml_txt_correct));
|
732 | 733 | }
|
| 734 | + |
| 735 | +TEST(PortTest, Upcasting_Issue943) |
| 736 | +{ |
| 737 | + using namespace BT; |
| 738 | + |
| 739 | + auto plant = PortInfo::Create<Plant::Ptr>(); // not registered |
| 740 | + auto animal = PortInfo::Create<Animal::Ptr>(); |
| 741 | + auto cat = PortInfo::Create<Cat::Ptr>(); |
| 742 | + auto dog = PortInfo::Create<Dog::Ptr>(); |
| 743 | + auto sphynx = PortInfo::Create<SphynxCat::Ptr>(); |
| 744 | + |
| 745 | + ASSERT_EQ(0, plant.baseChain().size()); |
| 746 | + ASSERT_EQ(1, animal.baseChain().size()); |
| 747 | + ASSERT_EQ(2, cat.baseChain().size()); |
| 748 | + ASSERT_EQ(2, dog.baseChain().size()); |
| 749 | + ASSERT_EQ(3, sphynx.baseChain().size()); |
| 750 | + |
| 751 | + ASSERT_EQ(std::type_index(typeid(Animal)), animal.baseChain()[0]); |
| 752 | + ASSERT_EQ(std::type_index(typeid(Cat)), cat.baseChain()[0]); |
| 753 | + ASSERT_EQ(std::type_index(typeid(Animal)), cat.baseChain()[1]); |
| 754 | + ASSERT_EQ(std::type_index(typeid(Dog)), dog.baseChain()[0]); |
| 755 | + ASSERT_EQ(std::type_index(typeid(Animal)), dog.baseChain()[1]); |
| 756 | + |
| 757 | + ASSERT_EQ(std::type_index(typeid(SphynxCat)), sphynx.baseChain()[0]); |
| 758 | + ASSERT_EQ(std::type_index(typeid(Cat)), sphynx.baseChain()[1]); |
| 759 | + ASSERT_EQ(std::type_index(typeid(Animal)), sphynx.baseChain()[2]); |
| 760 | + |
| 761 | + ASSERT_FALSE(plant.isConvertibleFrom(std::type_index(typeid(Plant)))); |
| 762 | + ASSERT_FALSE(plant.isConvertibleFrom(std::type_index(typeid(Animal)))); |
| 763 | + ASSERT_FALSE(plant.isConvertibleFrom(std::type_index(typeid(Cat)))); |
| 764 | + ASSERT_FALSE(plant.isConvertibleFrom(std::type_index(typeid(Dog)))); |
| 765 | + ASSERT_FALSE(plant.isConvertibleFrom(std::type_index(typeid(SphynxCat)))); |
| 766 | + |
| 767 | + ASSERT_FALSE(animal.isConvertibleFrom(std::type_index(typeid(Plant)))); |
| 768 | + ASSERT_TRUE(animal.isConvertibleFrom(std::type_index(typeid(Animal)))); |
| 769 | + ASSERT_FALSE(animal.isConvertibleFrom(std::type_index(typeid(Cat)))); |
| 770 | + ASSERT_FALSE(animal.isConvertibleFrom(std::type_index(typeid(Dog)))); |
| 771 | + ASSERT_FALSE(animal.isConvertibleFrom(std::type_index(typeid(SphynxCat)))); |
| 772 | + |
| 773 | + ASSERT_FALSE(cat.isConvertibleFrom(std::type_index(typeid(Plant)))); |
| 774 | + ASSERT_TRUE(cat.isConvertibleFrom(std::type_index(typeid(Animal)))); |
| 775 | + ASSERT_TRUE(cat.isConvertibleFrom(std::type_index(typeid(Cat)))); |
| 776 | + ASSERT_FALSE(cat.isConvertibleFrom(std::type_index(typeid(Dog)))); |
| 777 | + ASSERT_FALSE(cat.isConvertibleFrom(std::type_index(typeid(SphynxCat)))); |
| 778 | + |
| 779 | + ASSERT_FALSE(dog.isConvertibleFrom(std::type_index(typeid(Plant)))); |
| 780 | + ASSERT_TRUE(dog.isConvertibleFrom(std::type_index(typeid(Animal)))); |
| 781 | + ASSERT_FALSE(dog.isConvertibleFrom(std::type_index(typeid(Cat)))); |
| 782 | + ASSERT_TRUE(dog.isConvertibleFrom(std::type_index(typeid(Dog)))); |
| 783 | + ASSERT_FALSE(dog.isConvertibleFrom(std::type_index(typeid(SphynxCat)))); |
| 784 | + |
| 785 | + ASSERT_FALSE(sphynx.isConvertibleFrom(std::type_index(typeid(Plant)))); |
| 786 | + ASSERT_TRUE(sphynx.isConvertibleFrom(std::type_index(typeid(Animal)))); |
| 787 | + ASSERT_TRUE(sphynx.isConvertibleFrom(std::type_index(typeid(Cat)))); |
| 788 | + ASSERT_FALSE(sphynx.isConvertibleFrom(std::type_index(typeid(Dog)))); |
| 789 | + ASSERT_TRUE(sphynx.isConvertibleFrom(std::type_index(typeid(SphynxCat)))); |
| 790 | +} |
0 commit comments