]> git.mxchange.org Git - simgear.git/blob - simgear/structure/shared_ptr_test.cpp
Fix PagedLOD for random objects.
[simgear.git] / simgear / structure / shared_ptr_test.cpp
1 /// Unit tests for reference counting and smart pointer classes
2 #define BOOST_TEST_MODULE structure
3 #include <BoostTestTargetConfig.h>
4
5 #include "SGSharedPtr.hxx"
6 #include "SGWeakPtr.hxx"
7
8 static int instance_count = 0;
9 struct ReferenceCounted:
10   public SGReferenced
11 {
12   ReferenceCounted()
13   {
14     ++instance_count;
15   }
16
17   ~ReferenceCounted()
18   {
19     --instance_count;
20   }
21 };
22 typedef SGSharedPtr<ReferenceCounted> RefPtr;
23
24 BOOST_AUTO_TEST_CASE( shared_ptr )
25 {
26   BOOST_REQUIRE_EQUAL( ReferenceCounted::count(0), 0 );
27
28   RefPtr ptr( new ReferenceCounted() );
29   BOOST_REQUIRE_EQUAL( instance_count, 1 );
30   BOOST_REQUIRE_EQUAL( ReferenceCounted::count(ptr.get()), 1 );
31   BOOST_REQUIRE_EQUAL( ptr.getNumRefs(), 1 );
32
33   RefPtr ptr2 = ptr;
34   BOOST_REQUIRE_EQUAL( ptr.getNumRefs(), 2 );
35   BOOST_REQUIRE_EQUAL( ptr2.getNumRefs(), 2 );
36
37   BOOST_REQUIRE_EQUAL( ptr, ptr2 );
38   BOOST_REQUIRE_EQUAL( ptr.get(), ptr2.get() );
39
40   ptr.reset();
41   BOOST_REQUIRE( !ptr.get() );
42   BOOST_REQUIRE_EQUAL( ptr.getNumRefs(), 0 );
43   BOOST_REQUIRE_EQUAL( ReferenceCounted::count(ptr2.get()), 1 );
44   BOOST_REQUIRE_EQUAL( ptr2.getNumRefs(), 1 );
45
46   ptr2.reset();
47   BOOST_REQUIRE( !ptr2.get() );
48   BOOST_REQUIRE_EQUAL( ptr.getNumRefs(), 0 );
49   BOOST_REQUIRE_EQUAL( ptr2.getNumRefs(), 0 );
50   BOOST_REQUIRE_EQUAL( instance_count, 0) ;
51 }
52
53 class Base1:
54   public virtual SGVirtualWeakReferenced
55 {};
56
57 class Base2:
58   public virtual SGVirtualWeakReferenced
59 {};
60
61 class VirtualDerived:
62   public Base1,
63   public Base2
64 {};
65
66 BOOST_AUTO_TEST_CASE( virtual_weak_ptr )
67 {
68   SGSharedPtr<VirtualDerived> ptr( new VirtualDerived() );
69   SGWeakPtr<VirtualDerived> weak_ptr( ptr );
70   BOOST_REQUIRE_EQUAL( ptr.getNumRefs(), 1 );
71
72   SGSharedPtr<Base1> ptr1( weak_ptr.lock() );
73   BOOST_REQUIRE_EQUAL( ptr.getNumRefs(), 2 );
74
75   // converting constructor
76   BOOST_REQUIRE_EQUAL( SGSharedPtr<Base1>(weak_ptr), ptr1 );
77
78   SGSharedPtr<Base2> ptr2( weak_ptr.lock() );
79   BOOST_REQUIRE_EQUAL( ptr.getNumRefs(), 3 );
80
81   BOOST_REQUIRE( ptr != NULL );
82   BOOST_REQUIRE_EQUAL( ptr.get(), ptr1.get() );
83   BOOST_REQUIRE_EQUAL( ptr.get(), ptr2.get() );
84
85   SGWeakPtr<Base1> weak_base1( ptr );
86   SGWeakPtr<Base2> weak_base2( ptr );
87   ptr1 = dynamic_cast<VirtualDerived*>(weak_base1.lock().get());
88   ptr2 = dynamic_cast<VirtualDerived*>(weak_base2.lock().get());
89
90   BOOST_REQUIRE_EQUAL( ptr.get(), ptr1.get() );
91   BOOST_REQUIRE_EQUAL( ptr.get(), ptr2.get() );
92   BOOST_REQUIRE_EQUAL( ptr.getNumRefs(), 3 );
93 }