28class ReferenceCountedArrayTests final :
public UnitTest
31 ReferenceCountedArrayTests()
32 : UnitTest (
"ReferenceCountedArray", UnitTestCategories::containers)
36 void runTest()
override
38 beginTest (
"Add derived objects");
40 ReferenceCountedArray<TestDerivedObj> derivedArray;
41 derivedArray.add (
static_cast<TestDerivedObj*
> (
new TestBaseObj()));
42 expectEquals (derivedArray.size(), 1);
43 expectEquals (derivedArray.getObjectPointer (0)->getReferenceCount(), 1);
44 expectEquals (derivedArray[0]->getReferenceCount(), 2);
46 for (
auto o : derivedArray)
47 expectEquals (o->getReferenceCount(), 1);
49 ReferenceCountedArray<TestBaseObj> baseArray;
50 baseArray.addArray (derivedArray);
52 for (
auto o : baseArray)
53 expectEquals (o->getReferenceCount(), 2);
55 derivedArray.clearQuick();
56 baseArray.clearQuick();
58 auto* baseObject =
new TestBaseObj();
59 TestBaseObj::Ptr baseObjectPtr = baseObject;
60 expectEquals (baseObject->getReferenceCount(), 1);
62 auto* derivedObject =
new TestDerivedObj();
63 TestDerivedObj::Ptr derivedObjectPtr = derivedObject;
64 expectEquals (derivedObject->getReferenceCount(), 1);
66 baseArray.add (baseObject);
67 baseArray.add (derivedObject);
69 for (
auto o : baseArray)
70 expectEquals (o->getReferenceCount(), 2);
72 expectEquals (baseObject->getReferenceCount(), 2);
73 expectEquals (derivedObject->getReferenceCount(), 2);
75 derivedArray.add (derivedObject);
77 for (
auto o : derivedArray)
78 expectEquals (o->getReferenceCount(), 3);
80 derivedArray.clearQuick();
81 baseArray.clearQuick();
83 expectEquals (baseObject->getReferenceCount(), 1);
84 expectEquals (derivedObject->getReferenceCount(), 1);
86 baseArray.add (baseObjectPtr);
87 baseArray.add (derivedObjectPtr.get());
89 for (
auto o : baseArray)
90 expectEquals (o->getReferenceCount(), 2);
92 derivedArray.add (derivedObjectPtr);
94 for (
auto o : derivedArray)
95 expectEquals (o->getReferenceCount(), 3);
98 beginTest (
"Iterate in destructor");
101 ReferenceCountedArray<DestructorObj> arr;
103 for (
int i = 0; i < 2; ++i)
104 arr.add (
new DestructorObj (*
this, arr));
107 ReferenceCountedArray<DestructorObj> arr;
109 for (
int i = 0; i < 1025; ++i)
110 arr.add (
new DestructorObj (*
this, arr));
112 while (! arr.isEmpty())
115 for (
int i = 0; i < 1025; ++i)
116 arr.add (
new DestructorObj (*
this, arr));
118 arr.removeRange (1, arr.size() - 3);
120 for (
int i = 0; i < 1025; ++i)
121 arr.add (
new DestructorObj (*
this, arr));
123 arr.set (500,
new DestructorObj (*
this, arr));
128 struct TestBaseObj :
public ReferenceCountedObject
130 using Ptr = ReferenceCountedObjectPtr<TestBaseObj>;
132 TestBaseObj() =
default;
134 JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TestBaseObj)
137 struct TestDerivedObj final :
public TestBaseObj
139 using Ptr = ReferenceCountedObjectPtr<TestDerivedObj>;
141 TestDerivedObj() =
default;
143 JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TestDerivedObj)
146 struct DestructorObj final :
public ReferenceCountedObject
148 DestructorObj (ReferenceCountedArrayTests& p,
149 ReferenceCountedArray<DestructorObj>& arr)
150 : parent (p), objectArray (arr)
157 for (
auto* o : objectArray)
159 parent.expect (o !=
nullptr);
160 parent.expect (o !=
this);
163 parent.expectEquals (o->data, 374);
167 ReferenceCountedArrayTests& parent;
168 ReferenceCountedArray<DestructorObj>& objectArray;
171 JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DestructorObj)
175static ReferenceCountedArrayTests referenceCountedArrayTests;