diff --git a/tests.cpp b/tests.cpp index 2e023b5..ff0a1b9 100644 --- a/tests.cpp +++ b/tests.cpp @@ -289,6 +289,44 @@ void test_dynamic_cast_failure() assert(!derived); } +/* Simulate a external class that cannot be modified */ +namespace external +{ + class Counter + { + public: + int start; + int count; + Counter(int start) : start(start), count(start) {} + virtual ~Counter() {} + }; +} + +static int external_destruct; + +/* Create a managed wrapper for the external class. */ +class Counter : public external::Counter +{ + rcp_managed_root(Counter); +protected: + Counter(int start) : external::Counter(start) {} + ~Counter() { external_destruct++; } +}; + +void test_external_class() +{ + int before = external_destruct; + { + auto a = Counter::create(10); + auto b = Counter::create(20); + assert(a->count == 10); + assert(b->count == 20); + a->count++; + assert(a->count == 11); + } + assert(external_destruct == before + 2); +} + int main(int argc, char * argv[]) { test_class_hierarchy(); @@ -309,5 +347,6 @@ int main(int argc, char * argv[]) test_dynamic_cast_failure(); test_dynamic_cast_move_success(); test_dynamic_cast_move_failure(); + test_external_class(); return 0; }