|
17 | 17 | #include <gtest/gtest.h>
|
18 | 18 |
|
19 | 19 | #include <behaviortree_cpp/utils/safe_any.hpp>
|
20 |
| -#include "greeter_test.h" |
| 20 | +#include "animal_hierarchy_test.h" |
21 | 21 |
|
22 | 22 | using namespace BT;
|
23 | 23 |
|
@@ -254,77 +254,31 @@ TEST(Any, Cast)
|
254 | 254 | /// Issue 943
|
255 | 255 | // Type casting: polymorphic class w/ registered base class
|
256 | 256 | {
|
257 |
| - auto g = std::make_shared<Greeter>(); |
258 |
| - Any any_g(g); |
259 |
| - EXPECT_NO_THROW(auto res = any_g.cast<Greeter::Ptr>()); |
260 |
| - EXPECT_ANY_THROW(auto res = any_g.cast<HelloGreeter::Ptr>()); |
261 |
| - EXPECT_ANY_THROW(auto res = any_g.cast<FancyHelloGreeter::Ptr>()); |
262 |
| - EXPECT_TRUE(any_g.castPtr<Greeter::Ptr>()); |
263 |
| - EXPECT_FALSE(any_g.castPtr<HelloGreeter::Ptr>()); |
264 |
| - EXPECT_FALSE(any_g.castPtr<FancyHelloGreeter::Ptr>()); |
265 |
| - |
266 |
| - auto hg = std::make_shared<HelloGreeter>(); |
267 |
| - Any any_hg(hg); |
268 |
| - EXPECT_NO_THROW(auto res = any_hg.cast<Greeter::Ptr>()); |
269 |
| - EXPECT_NO_THROW(auto res = any_hg.cast<HelloGreeter::Ptr>()); |
270 |
| - EXPECT_ANY_THROW(auto res = any_hg.cast<FancyHelloGreeter::Ptr>()); |
271 |
| - EXPECT_TRUE(any_hg.castPtr<Greeter::Ptr>()); |
272 |
| - EXPECT_TRUE(any_hg.castPtr<HelloGreeter::Ptr>()); |
273 |
| - EXPECT_FALSE(any_hg.castPtr<FancyHelloGreeter::Ptr>()); |
274 |
| - |
275 |
| - auto fhg = std::make_shared<FancyHelloGreeter>(); |
276 |
| - Any any_fhg(fhg); |
277 |
| - EXPECT_NO_THROW(auto res = any_fhg.cast<Greeter::Ptr>()); |
278 |
| - EXPECT_NO_THROW(auto res = any_fhg.cast<HelloGreeter::Ptr>()); |
279 |
| - EXPECT_NO_THROW(auto res = any_fhg.cast<FancyHelloGreeter::Ptr>()); |
280 |
| - EXPECT_TRUE(any_fhg.castPtr<Greeter::Ptr>()); |
281 |
| - EXPECT_TRUE(any_fhg.castPtr<HelloGreeter::Ptr>()); |
282 |
| - EXPECT_TRUE(any_fhg.castPtr<FancyHelloGreeter::Ptr>()); |
283 |
| - |
284 |
| - // Try to upcast to an incorrectly registered base |
285 |
| - auto u = std::make_shared<Unwelcomer>(); |
286 |
| - |
287 |
| - // OK, fails to compile -> invalid static cast |
288 |
| - // Any any_u(u); |
289 |
| - // EXPECT_ANY_THROW(auto res = any_g.cast<Unwelcomer::Ptr>()); |
290 |
| - } |
291 |
| - |
292 |
| - // Type casting: polymorphic class w/o registered base class |
293 |
| - { |
294 |
| - auto g = std::make_shared<GreeterNoReg>(); |
295 |
| - Any any_g(g); |
296 |
| - EXPECT_NO_THROW(auto res = any_g.cast<GreeterNoReg::Ptr>()); |
297 |
| - EXPECT_ANY_THROW(auto res = any_g.cast<HelloGreeterNoReg::Ptr>()); |
298 |
| - EXPECT_TRUE(any_g.castPtr<GreeterNoReg::Ptr>()); |
299 |
| - EXPECT_FALSE(any_g.castPtr<HelloGreeterNoReg::Ptr>()); |
300 |
| - |
301 |
| - auto hg = std::make_shared<HelloGreeterNoReg>(); |
302 |
| - Any any_hg(hg); |
303 |
| - EXPECT_ANY_THROW(auto res = any_hg.cast<GreeterNoReg::Ptr>()); |
304 |
| - EXPECT_NO_THROW(auto res = any_hg.cast<HelloGreeterNoReg::Ptr>()); |
305 |
| - EXPECT_FALSE(any_hg.castPtr<GreeterNoReg::Ptr>()); |
306 |
| - EXPECT_TRUE(any_hg.castPtr<HelloGreeterNoReg::Ptr>()); |
307 |
| - } |
308 |
| - |
309 |
| - // Type casting: non polymorphic class w/ registered base class |
310 |
| - { |
311 |
| - // OK: static_assert(std::is_polymorphic_v<Base>, "Base must be polymorphic") |
312 |
| - } |
313 |
| - |
314 |
| - // Type casting: non polymorphic class w/o registered base class |
315 |
| - { |
316 |
| - auto g = std::make_shared<GreeterNoPolyReg>(); |
317 |
| - Any any_g(g); |
318 |
| - EXPECT_NO_THROW(auto res = any_g.cast<GreeterNoPolyReg::Ptr>()); |
319 |
| - EXPECT_ANY_THROW(auto res = any_g.cast<HelloGreeterNoPolyReg::Ptr>()); |
320 |
| - EXPECT_TRUE(any_g.castPtr<GreeterNoPolyReg::Ptr>()); |
321 |
| - EXPECT_FALSE(any_g.castPtr<HelloGreeterNoPolyReg::Ptr>()); |
322 |
| - |
323 |
| - auto hg = std::make_shared<HelloGreeterNoPolyReg>(); |
324 |
| - Any any_hg(hg); |
325 |
| - EXPECT_ANY_THROW(auto res = any_hg.cast<GreeterNoPolyReg::Ptr>()); |
326 |
| - EXPECT_NO_THROW(auto res = any_hg.cast<HelloGreeterNoPolyReg::Ptr>()); |
327 |
| - EXPECT_FALSE(any_hg.castPtr<GreeterNoPolyReg::Ptr>()); |
328 |
| - EXPECT_TRUE(any_hg.castPtr<HelloGreeterNoPolyReg::Ptr>()); |
| 257 | + auto animal = std::make_shared<Animal>(); |
| 258 | + Any any_animal(animal); |
| 259 | + EXPECT_NO_THROW(auto res = any_animal.cast<Animal::Ptr>()); |
| 260 | + EXPECT_ANY_THROW(auto res = any_animal.cast<Cat::Ptr>()); |
| 261 | + EXPECT_ANY_THROW(auto res = any_animal.cast<Sphynx::Ptr>()); |
| 262 | + EXPECT_TRUE(any_animal.castPtr<Animal::Ptr>()); |
| 263 | + EXPECT_FALSE(any_animal.castPtr<Cat::Ptr>()); |
| 264 | + EXPECT_FALSE(any_animal.castPtr<Sphynx::Ptr>()); |
| 265 | + |
| 266 | + auto cat = std::make_shared<Cat>(); |
| 267 | + Any any_cat(cat); |
| 268 | + EXPECT_NO_THROW(auto res = any_cat.cast<Animal::Ptr>()); |
| 269 | + EXPECT_NO_THROW(auto res = any_cat.cast<Cat::Ptr>()); |
| 270 | + EXPECT_ANY_THROW(auto res = any_cat.cast<Sphynx::Ptr>()); |
| 271 | + EXPECT_TRUE(any_cat.castPtr<Animal::Ptr>()); |
| 272 | + EXPECT_TRUE(any_cat.castPtr<Cat::Ptr>()); |
| 273 | + EXPECT_FALSE(any_cat.castPtr<Sphynx::Ptr>()); |
| 274 | + |
| 275 | + auto sphynx = std::make_shared<Sphynx>(); |
| 276 | + Any any_sphynx(sphynx); |
| 277 | + EXPECT_NO_THROW(auto res = any_sphynx.cast<Animal::Ptr>()); |
| 278 | + EXPECT_NO_THROW(auto res = any_sphynx.cast<Cat::Ptr>()); |
| 279 | + EXPECT_NO_THROW(auto res = any_sphynx.cast<Sphynx::Ptr>()); |
| 280 | + EXPECT_TRUE(any_sphynx.castPtr<Animal::Ptr>()); |
| 281 | + EXPECT_TRUE(any_sphynx.castPtr<Cat::Ptr>()); |
| 282 | + EXPECT_TRUE(any_sphynx.castPtr<Sphynx::Ptr>()); |
329 | 283 | }
|
330 | 284 | }
|
0 commit comments