1 /*=========================================================================
2
3 Program: Visualization Toolkit
4 Module: TestWeakPointer.cxx
5
6 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7 All rights reserved.
8 See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9
10 This software is distributed WITHOUT ANY WARRANTY; without even
11 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12 PURPOSE. See the above copyright notice for more information.
13
14 =========================================================================*/
15 // .NAME Test of vtkWeakPointer.
16 // .SECTION Description
17 // Tests instantiations of the vtkWeakPointer class template.
18
19 #include "vtkDebugLeaks.h"
20 #include "vtkIntArray.h"
21 #include "vtkWeakPointer.h"
22
TestWeakPointer(int,char * [])23 int TestWeakPointer(int, char*[])
24 {
25 int rval = 0;
26 vtkIntArray* ia = vtkIntArray::New();
27
28 // Coverage:
29 unsigned int testbits = 0;
30 unsigned int correctbits = 0x00000953;
31 const char* tests[] = { "da2 == ia", "da2 != ia", "da2 < ia", "da2 <= ia", "da2 > ia",
32 "da2 <= ia", "da2 > ia", "da2 >= ia", "da1 == 0", "da1 != 0", "da1 < 0", "da1 <= 0", "da1 > 0",
33 "da1 >= 0", nullptr };
34
35 auto da2 = vtk::TakeWeakPointer(ia); // da2 is vtkWeakPointer<vtkIntArray>
36 vtkWeakPointer<vtkDataArray> da1(da2);
37 da1 = ia;
38 da1 = da2;
39 testbits = (testbits << 1) | ((da2 == ia) ? 1 : 0);
40 testbits = (testbits << 1) | ((da2 != ia) ? 1 : 0);
41 testbits = (testbits << 1) | ((da2 < ia) ? 1 : 0);
42 testbits = (testbits << 1) | ((da2 <= ia) ? 1 : 0);
43 testbits = (testbits << 1) | ((da2 > ia) ? 1 : 0);
44 testbits = (testbits << 1) | ((da2 >= ia) ? 1 : 0);
45 testbits = (testbits << 1) | ((da1 == nullptr) ? 1 : 0);
46 testbits = (testbits << 1) | ((da1 != nullptr) ? 1 : 0);
47 testbits = (testbits << 1) | ((da1 < nullptr) ? 1 : 0);
48 testbits = (testbits << 1) | ((da1 <= nullptr) ? 1 : 0);
49 testbits = (testbits << 1) | ((da1 > nullptr) ? 1 : 0);
50 testbits = (testbits << 1) | ((da1 >= nullptr) ? 1 : 0);
51 if (testbits != correctbits)
52 {
53 unsigned int diffbits = (testbits ^ correctbits);
54 int bitcount = 0;
55 while (tests[bitcount] != nullptr)
56 {
57 bitcount++;
58 }
59 for (int ib = 0; ib < bitcount; ++ib)
60 {
61 if (((diffbits >> (bitcount - ib - 1)) & 1) != 0)
62 {
63 cerr << "comparison (" << tests[ib] << ") failed!\n";
64 }
65 }
66 rval = 1;
67 }
68
69 (*da1).SetNumberOfComponents(1);
70 if (da2)
71 {
72 da2->SetNumberOfComponents(1);
73 }
74 if (!da2)
75 {
76 cerr << "da2 is nullptr!"
77 << "\n";
78 rval = 1;
79 }
80 cout << "IntArray: " << da2 << "\n";
81
82 if (da1 == nullptr)
83 {
84 cerr << "da1 is nullptr\n";
85 rval = 1;
86 }
87 if (da2 == nullptr)
88 {
89 cerr << "da2 is nullptr\n";
90 rval = 1;
91 }
92
93 da2 = nullptr;
94 ia->Delete();
95
96 if (da1 != nullptr)
97 {
98 cerr << "da1 is not nullptr\n";
99 rval = 1;
100 }
101
102 {
103 vtkNew<vtkIntArray> array;
104 vtkWeakPointer<vtkIntArray> intArray(array);
105 if (array != intArray || array->GetReferenceCount() != 1)
106 {
107 std::cerr << "Constructing vtkWeakPointer from vtkNew failed.\n";
108 rval = 1;
109 }
110 array.Reset();
111 if (intArray)
112 {
113 std::cerr << "Weak pointer not nullptr\n";
114 rval = 1;
115 }
116 }
117
118 {
119 vtkNew<vtkIntArray> array;
120 vtkWeakPointer<vtkDataArray> dataArray(array);
121 if (array != dataArray || array->GetReferenceCount() != 1)
122 {
123 std::cerr << "Constructing vtkWeakPointer from vtkNew failed.\n";
124 rval = 1;
125 }
126 array.Reset();
127 if (dataArray)
128 {
129 std::cerr << "Weak pointer not nullptr\n";
130 rval = 1;
131 }
132 }
133
134 {
135 vtkNew<vtkIntArray> array;
136 vtkWeakPointer<vtkIntArray> intArray(array);
137 // NOLINTNEXTLINE(performance-unnecessary-copy-initialization)
138 vtkWeakPointer<vtkIntArray> intArray2(intArray);
139 if (array != intArray || array != intArray2 || array->GetReferenceCount() != 1)
140 {
141 std::cerr << "Copy failed.\n";
142 rval = 1;
143 }
144 array.Reset();
145 if (intArray || intArray2)
146 {
147 std::cerr << "Weak pointer not nullptr\n";
148 rval = 1;
149 }
150 }
151
152 {
153 vtkNew<vtkIntArray> array;
154 vtkWeakPointer<vtkIntArray> intArray(array);
155 vtkWeakPointer<vtkIntArray> intArray2(std::move(intArray));
156 // NOLINTNEXTLINE(bugprone-use-after-move)
157 if (intArray || array != intArray2 || array->GetReferenceCount() != 1)
158 {
159 std::cerr << "Move failed.\n";
160 rval = 1;
161 }
162 array.Reset();
163 if (intArray || intArray2)
164 {
165 std::cerr << "Weak pointer not nullptr\n";
166 rval = 1;
167 }
168 }
169
170 {
171 vtkNew<vtkIntArray> array;
172 vtkWeakPointer<vtkIntArray> intArray(array);
173 vtkWeakPointer<vtkDataArray> dataArray(intArray);
174 if (array != intArray || array != dataArray || array->GetReferenceCount() != 1)
175 {
176 std::cerr << "Copy failed.\n";
177 rval = 1;
178 }
179 array.Reset();
180 if (dataArray || intArray)
181 {
182 std::cerr << "Weak pointer not nullptr\n";
183 rval = 1;
184 }
185 }
186
187 {
188 vtkNew<vtkIntArray> array;
189 vtkWeakPointer<vtkIntArray> intArray(array);
190 vtkWeakPointer<vtkDataArray> dataArray(std::move(intArray));
191 // NOLINTNEXTLINE(bugprone-use-after-move)
192 if (intArray || array != dataArray || array->GetReferenceCount() != 1)
193 {
194 std::cerr << "Move failed.\n";
195 rval = 1;
196 }
197 array.Reset();
198 if (dataArray)
199 {
200 std::cerr << "Weak pointer not nullptr\n";
201 rval = 1;
202 }
203 }
204
205 return rval;
206 }
207