diff --git a/src/tests/Jamfile b/src/tests/Jamfile index 6d6c937750..ab42bf514b 100644 --- a/src/tests/Jamfile +++ b/src/tests/Jamfile @@ -29,4 +29,5 @@ SubInclude HAIKU_TOP src tests apps ; SubInclude HAIKU_TOP src tests bin ; SubInclude HAIKU_TOP src tests kernel ; SubInclude HAIKU_TOP src tests kits ; +SubInclude HAIKU_TOP src tests misc ; SubInclude HAIKU_TOP src tests servers ; diff --git a/src/tests/misc/Jamfile b/src/tests/misc/Jamfile new file mode 100644 index 0000000000..ae02e548b3 --- /dev/null +++ b/src/tests/misc/Jamfile @@ -0,0 +1,5 @@ +SubDir HAIKU_TOP src tests misc ; + +SetSubDirSupportedPlatformsBeOSCompatible ; + +SimpleTest rtti-test : rtti-test.cpp : be ; diff --git a/src/tests/misc/rtti-test.cpp b/src/tests/misc/rtti-test.cpp new file mode 100644 index 0000000000..5e049bf68f --- /dev/null +++ b/src/tests/misc/rtti-test.cpp @@ -0,0 +1,85 @@ +#include + +#include +#include + +#include +#include + +using std::string; + +struct A { + A() {} + virtual ~A() {} + + int a; +}; + +struct B : A { + B() {} + virtual ~B() {} + + int b; +}; + +struct C : A { + C() {} + virtual ~C() {} + + int c; +}; + +template +static void +rtti_test(A *a, const char *inputClass, const char *classNameA, + const char *classNameB, const char *classNameC) +{ + printf("class %s\n", inputClass); + printf(" dynamic_cast<%s*>(a): %p\n", classNameA, dynamic_cast(a)); + printf(" dynamic_cast<%s*>(a): %p\n", classNameB, dynamic_cast(a)); + printf(" dynamic_cast<%s*>(a): %p\n", classNameC, dynamic_cast(a)); + const std::type_info *info = &typeid(*a); + printf(" typeinfo: %p, name: %s\n", info, (info ? info->name() : NULL)); +} + +int +main() +{ + // test with artificial classes defined in this file + + #define RTTI_TEST(obj, className) rtti_test(obj, className, \ + "A", "B", "C") + + A a; + B b; + C c; + + printf("A: %p\n", &a); + printf("B: %p\n", &b); + printf("C: %p\n", &c); + + RTTI_TEST(&a, "A"); + RTTI_TEST(&b, "B"); + RTTI_TEST(&c, "C"); + + + // test with real classes defined in a library + + #undef RTTI_TEST + #define RTTI_TEST(obj, className) rtti_test(obj, \ + className, "BNode", "BFile", "BDirectory") + + BNode node; + BFile file; + BDirectory dir; + + printf("BNode: %p\n", &node); + printf("BFile: %p\n", &file); + printf("BDirectory: %p\n", &dir); + + RTTI_TEST(&node, "BNode"); + RTTI_TEST(&file, "BFile"); + RTTI_TEST(&dir, "BDirectory"); + + return 0; +}