Skip to content

Commit cad9a05

Browse files
committed
Refactor upcasting tests to use clearer Animal hierarchy example
1 parent eda2683 commit cad9a05

File tree

5 files changed

+353
-404
lines changed

5 files changed

+353
-404
lines changed

tests/gtest_any.cpp

Lines changed: 27 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
#include <gtest/gtest.h>
1818

1919
#include <behaviortree_cpp/utils/safe_any.hpp>
20-
#include "greeter_test.h"
20+
#include "animal_hierarchy_test.h"
2121

2222
using namespace BT;
2323

@@ -254,77 +254,31 @@ TEST(Any, Cast)
254254
/// Issue 943
255255
// Type casting: polymorphic class w/ registered base class
256256
{
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>());
329283
}
330284
}

0 commit comments

Comments
 (0)