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