Skip to content

Commit b5cba99

Browse files
committed
Add test fixture for Greeter type hierarchy and type trait registration
1 parent f9c2ab4 commit b5cba99

File tree

1 file changed

+195
-0
lines changed

1 file changed

+195
-0
lines changed

Diff for: tests/include/greeter_test.h

+195
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
#ifndef GREETER_TEST_H_
2+
#define GREETER_TEST_H_
3+
4+
#include <behaviortree_cpp/utils/safe_any.hpp>
5+
6+
/**
7+
* +-------------------+------------+-------------+-----------------------------+
8+
* | Class | Base Class | Polymorphic | Type Trait Registered |
9+
* +-------------------+------------+-------------+-----------------------------+
10+
* | Greeter | - | Yes | Greeter |
11+
* | HelloGreeter | Greeter | Yes | Greeter |
12+
* | FancyHelloGreeter | Greeter | Yes | Greeter |
13+
* | Unwelcomer | - | Yes | Greeter (Purposely invalid) |
14+
* +-------------------+------------+-------------+-----------------------------+
15+
*/
16+
17+
class Greeter
18+
{
19+
public:
20+
using Ptr = std::shared_ptr<Greeter>;
21+
virtual ~Greeter() = default;
22+
virtual std::string show_msg() const
23+
{
24+
return "";
25+
};
26+
};
27+
28+
class HelloGreeter : public Greeter
29+
{
30+
public:
31+
using Ptr = std::shared_ptr<HelloGreeter>;
32+
std::string show_msg() const override
33+
{
34+
return "hello";
35+
}
36+
void setDerivedParameter(int n){};
37+
};
38+
39+
class FancyHelloGreeter : public HelloGreeter
40+
{
41+
public:
42+
using Ptr = std::shared_ptr<FancyHelloGreeter>;
43+
std::string show_msg() const override
44+
{
45+
return "salutations";
46+
}
47+
};
48+
49+
class Unwelcomer
50+
{
51+
public:
52+
using Ptr = std::shared_ptr<Unwelcomer>;
53+
virtual ~Unwelcomer() = default;
54+
virtual std::string show_msg() const
55+
{
56+
return "You’re not welcome here";
57+
};
58+
};
59+
60+
// Register cast base type for self to allow direct cast
61+
template <>
62+
struct BT::any_cast_base<Greeter>
63+
{
64+
using type = Greeter;
65+
};
66+
67+
// Register cast base type for HelloGreeter
68+
template <>
69+
struct BT::any_cast_base<HelloGreeter>
70+
{
71+
using type = Greeter;
72+
};
73+
74+
// Register cast base type for FancyHelloGreeter
75+
template <>
76+
struct BT::any_cast_base<FancyHelloGreeter>
77+
{
78+
using type = Greeter;
79+
};
80+
81+
// Register cast base type for Unwelcomer
82+
// WARNING: intentionally incorrect
83+
template <>
84+
struct BT::any_cast_base<Unwelcomer>
85+
{
86+
using type = Greeter;
87+
};
88+
89+
/**
90+
* +-------------------+--------------+-------------+-----------------------+
91+
* | Class | Base Class | Polymorphic | Type Trait Registered |
92+
* +-------------------+--------------+-------------+-----------------------+
93+
* | GreeterNoReg | - | Yes | - |
94+
* | HelloGreeterNoReg | GreeterNoReg | Yes | - |
95+
* +-------------------+--------------+-------------+-----------------------+
96+
*/
97+
98+
class GreeterNoReg
99+
{
100+
public:
101+
using Ptr = std::shared_ptr<GreeterNoReg>;
102+
virtual ~GreeterNoReg() = default;
103+
virtual std::string show_msg() const
104+
{
105+
return "";
106+
};
107+
};
108+
109+
class HelloGreeterNoReg : public GreeterNoReg
110+
{
111+
public:
112+
using Ptr = std::shared_ptr<HelloGreeterNoReg>;
113+
std::string show_msg() const override
114+
{
115+
return "hello";
116+
}
117+
void setDerivedParameter(int n){};
118+
};
119+
120+
/**
121+
* +--------------------+---------------+-------------+-----------------------+
122+
* | Class | Base Class | Polymorphic | Type Trait Registered |
123+
* +--------------------+---------------+-------------+-----------------------+
124+
* | GreeterNoPoly | - | No | GreeterNoPoly |
125+
* | HelloGreeterNoPoly | GreeterNoPoly | No | GreeterNoPoly |
126+
* +-----------------------+------------+-------------+-----------------------+
127+
*/
128+
129+
// Correctly fails to compile:
130+
// static_assert(std::is_polymorphic_v<Base>, "Base must be polymorphic");
131+
132+
// class GreeterNoPoly
133+
// {
134+
// public:
135+
// using Ptr = std::shared_ptr<GreeterNoPoly>;
136+
// std::string greet() const
137+
// {
138+
// return "";
139+
// };
140+
// };
141+
//
142+
// class HelloGreeterNoPoly : public GreeterNoPoly
143+
// {
144+
// public:
145+
// using Ptr = std::shared_ptr<HelloGreeterNoPoly>;
146+
// std::string hello_greet()
147+
// {
148+
// return "hello" + greet();
149+
// }
150+
// };
151+
//
152+
// // Register cast base type for self to allow direct cast
153+
// template <>
154+
// struct BT::any_cast_base<GreeterNoPoly>
155+
// {
156+
// using type = GreeterNoPoly;
157+
// };
158+
//
159+
// // Register cast base type for HelloGreeter
160+
// template <>
161+
// struct BT::any_cast_base<HelloGreeterNoPoly>
162+
// {
163+
// using type = GreeterNoPoly;
164+
// };
165+
166+
/**
167+
* +-----------------------+------------+-------------+-----------------------+
168+
* | Class | Base Class | Polymorphic | Type Trait Registered |
169+
* +-----------------------+------------+-------------+-----------------------+
170+
* | GreeterNoPolyReg | - | No | - |
171+
* | HelloGreeterNoPolyReg | NoGreeter | No | - |
172+
* +-----------------------+------------+-------------+-----------------------+
173+
*/
174+
175+
class GreeterNoPolyReg
176+
{
177+
public:
178+
using Ptr = std::shared_ptr<GreeterNoPolyReg>;
179+
std::string greet() const
180+
{
181+
return "";
182+
};
183+
};
184+
185+
class HelloGreeterNoPolyReg : public GreeterNoPolyReg
186+
{
187+
public:
188+
using Ptr = std::shared_ptr<HelloGreeterNoPolyReg>;
189+
std::string hello_greet()
190+
{
191+
return "hello" + greet();
192+
}
193+
};
194+
195+
#endif // GREETER_TEST_H_

0 commit comments

Comments
 (0)