xref: /freebsd-src/contrib/atf/atf-c++/detail/auto_array_test.cpp (revision a18eacbefdfa1085ca3db829e86ece78cd416493)
1*a18eacbeSJulio Merino //
2*a18eacbeSJulio Merino // Automated Testing Framework (atf)
3*a18eacbeSJulio Merino //
4*a18eacbeSJulio Merino // Copyright (c) 2007 The NetBSD Foundation, Inc.
5*a18eacbeSJulio Merino // All rights reserved.
6*a18eacbeSJulio Merino //
7*a18eacbeSJulio Merino // Redistribution and use in source and binary forms, with or without
8*a18eacbeSJulio Merino // modification, are permitted provided that the following conditions
9*a18eacbeSJulio Merino // are met:
10*a18eacbeSJulio Merino // 1. Redistributions of source code must retain the above copyright
11*a18eacbeSJulio Merino //    notice, this list of conditions and the following disclaimer.
12*a18eacbeSJulio Merino // 2. Redistributions in binary form must reproduce the above copyright
13*a18eacbeSJulio Merino //    notice, this list of conditions and the following disclaimer in the
14*a18eacbeSJulio Merino //    documentation and/or other materials provided with the distribution.
15*a18eacbeSJulio Merino //
16*a18eacbeSJulio Merino // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17*a18eacbeSJulio Merino // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18*a18eacbeSJulio Merino // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19*a18eacbeSJulio Merino // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20*a18eacbeSJulio Merino // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21*a18eacbeSJulio Merino // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22*a18eacbeSJulio Merino // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23*a18eacbeSJulio Merino // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24*a18eacbeSJulio Merino // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25*a18eacbeSJulio Merino // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26*a18eacbeSJulio Merino // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27*a18eacbeSJulio Merino // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*a18eacbeSJulio Merino //
29*a18eacbeSJulio Merino 
30*a18eacbeSJulio Merino extern "C" {
31*a18eacbeSJulio Merino #include <sys/types.h>
32*a18eacbeSJulio Merino }
33*a18eacbeSJulio Merino 
34*a18eacbeSJulio Merino #include <iostream>
35*a18eacbeSJulio Merino 
36*a18eacbeSJulio Merino #include "atf-c/defs.h"
37*a18eacbeSJulio Merino 
38*a18eacbeSJulio Merino #include "../macros.hpp"
39*a18eacbeSJulio Merino 
40*a18eacbeSJulio Merino #include "auto_array.hpp"
41*a18eacbeSJulio Merino 
42*a18eacbeSJulio Merino // ------------------------------------------------------------------------
43*a18eacbeSJulio Merino // Tests for the "auto_array" class.
44*a18eacbeSJulio Merino // ------------------------------------------------------------------------
45*a18eacbeSJulio Merino 
46*a18eacbeSJulio Merino class test_array {
47*a18eacbeSJulio Merino public:
48*a18eacbeSJulio Merino     int m_value;
49*a18eacbeSJulio Merino 
50*a18eacbeSJulio Merino     static ssize_t m_nblocks;
51*a18eacbeSJulio Merino 
52*a18eacbeSJulio Merino     static
53*a18eacbeSJulio Merino     atf::auto_array< test_array >
54*a18eacbeSJulio Merino     do_copy(atf::auto_array< test_array >& ta)
55*a18eacbeSJulio Merino     {
56*a18eacbeSJulio Merino         return atf::auto_array< test_array >(ta);
57*a18eacbeSJulio Merino     }
58*a18eacbeSJulio Merino 
59*a18eacbeSJulio Merino     void* operator new(size_t size ATF_DEFS_ATTRIBUTE_UNUSED)
60*a18eacbeSJulio Merino     {
61*a18eacbeSJulio Merino         ATF_FAIL("New called but should have been new[]");
62*a18eacbeSJulio Merino         return new int(5);
63*a18eacbeSJulio Merino     }
64*a18eacbeSJulio Merino 
65*a18eacbeSJulio Merino     void* operator new[](size_t size)
66*a18eacbeSJulio Merino     {
67*a18eacbeSJulio Merino         m_nblocks++;
68*a18eacbeSJulio Merino         void* mem = ::operator new(size);
69*a18eacbeSJulio Merino         std::cout << "Allocated 'test_array' object " << mem << "\n";
70*a18eacbeSJulio Merino         return mem;
71*a18eacbeSJulio Merino     }
72*a18eacbeSJulio Merino 
73*a18eacbeSJulio Merino     void operator delete(void* mem ATF_DEFS_ATTRIBUTE_UNUSED)
74*a18eacbeSJulio Merino     {
75*a18eacbeSJulio Merino         ATF_FAIL("Delete called but should have been delete[]");
76*a18eacbeSJulio Merino     }
77*a18eacbeSJulio Merino 
78*a18eacbeSJulio Merino     void operator delete[](void* mem)
79*a18eacbeSJulio Merino     {
80*a18eacbeSJulio Merino         std::cout << "Releasing 'test_array' object " << mem << "\n";
81*a18eacbeSJulio Merino         if (m_nblocks == 0)
82*a18eacbeSJulio Merino             ATF_FAIL("Unbalanced delete[]");
83*a18eacbeSJulio Merino         m_nblocks--;
84*a18eacbeSJulio Merino         ::operator delete(mem);
85*a18eacbeSJulio Merino     }
86*a18eacbeSJulio Merino };
87*a18eacbeSJulio Merino 
88*a18eacbeSJulio Merino ssize_t test_array::m_nblocks = 0;
89*a18eacbeSJulio Merino 
90*a18eacbeSJulio Merino ATF_TEST_CASE(auto_array_scope);
91*a18eacbeSJulio Merino ATF_TEST_CASE_HEAD(auto_array_scope)
92*a18eacbeSJulio Merino {
93*a18eacbeSJulio Merino     set_md_var("descr", "Tests the automatic scope handling in the "
94*a18eacbeSJulio Merino                "auto_array smart pointer class");
95*a18eacbeSJulio Merino }
96*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(auto_array_scope)
97*a18eacbeSJulio Merino {
98*a18eacbeSJulio Merino     using atf::auto_array;
99*a18eacbeSJulio Merino 
100*a18eacbeSJulio Merino     ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
101*a18eacbeSJulio Merino     {
102*a18eacbeSJulio Merino         auto_array< test_array > t(new test_array[10]);
103*a18eacbeSJulio Merino         ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
104*a18eacbeSJulio Merino     }
105*a18eacbeSJulio Merino     ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
106*a18eacbeSJulio Merino }
107*a18eacbeSJulio Merino 
108*a18eacbeSJulio Merino ATF_TEST_CASE(auto_array_copy);
109*a18eacbeSJulio Merino ATF_TEST_CASE_HEAD(auto_array_copy)
110*a18eacbeSJulio Merino {
111*a18eacbeSJulio Merino     set_md_var("descr", "Tests the auto_array smart pointer class' copy "
112*a18eacbeSJulio Merino                "constructor");
113*a18eacbeSJulio Merino }
114*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(auto_array_copy)
115*a18eacbeSJulio Merino {
116*a18eacbeSJulio Merino     using atf::auto_array;
117*a18eacbeSJulio Merino 
118*a18eacbeSJulio Merino     ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
119*a18eacbeSJulio Merino     {
120*a18eacbeSJulio Merino         auto_array< test_array > t1(new test_array[10]);
121*a18eacbeSJulio Merino         ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
122*a18eacbeSJulio Merino 
123*a18eacbeSJulio Merino         {
124*a18eacbeSJulio Merino             auto_array< test_array > t2(t1);
125*a18eacbeSJulio Merino             ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
126*a18eacbeSJulio Merino         }
127*a18eacbeSJulio Merino         ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
128*a18eacbeSJulio Merino     }
129*a18eacbeSJulio Merino     ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
130*a18eacbeSJulio Merino }
131*a18eacbeSJulio Merino 
132*a18eacbeSJulio Merino ATF_TEST_CASE(auto_array_copy_ref);
133*a18eacbeSJulio Merino ATF_TEST_CASE_HEAD(auto_array_copy_ref)
134*a18eacbeSJulio Merino {
135*a18eacbeSJulio Merino     set_md_var("descr", "Tests the auto_array smart pointer class' copy "
136*a18eacbeSJulio Merino                "constructor through the auxiliary auto_array_ref object");
137*a18eacbeSJulio Merino }
138*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(auto_array_copy_ref)
139*a18eacbeSJulio Merino {
140*a18eacbeSJulio Merino     using atf::auto_array;
141*a18eacbeSJulio Merino 
142*a18eacbeSJulio Merino     ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
143*a18eacbeSJulio Merino     {
144*a18eacbeSJulio Merino         auto_array< test_array > t1(new test_array[10]);
145*a18eacbeSJulio Merino         ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
146*a18eacbeSJulio Merino 
147*a18eacbeSJulio Merino         {
148*a18eacbeSJulio Merino             auto_array< test_array > t2 = test_array::do_copy(t1);
149*a18eacbeSJulio Merino             ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
150*a18eacbeSJulio Merino         }
151*a18eacbeSJulio Merino         ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
152*a18eacbeSJulio Merino     }
153*a18eacbeSJulio Merino     ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
154*a18eacbeSJulio Merino }
155*a18eacbeSJulio Merino 
156*a18eacbeSJulio Merino ATF_TEST_CASE(auto_array_get);
157*a18eacbeSJulio Merino ATF_TEST_CASE_HEAD(auto_array_get)
158*a18eacbeSJulio Merino {
159*a18eacbeSJulio Merino     set_md_var("descr", "Tests the auto_array smart pointer class' get "
160*a18eacbeSJulio Merino                "method");
161*a18eacbeSJulio Merino }
162*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(auto_array_get)
163*a18eacbeSJulio Merino {
164*a18eacbeSJulio Merino     using atf::auto_array;
165*a18eacbeSJulio Merino 
166*a18eacbeSJulio Merino     test_array* ta = new test_array[10];
167*a18eacbeSJulio Merino     auto_array< test_array > t(ta);
168*a18eacbeSJulio Merino     ATF_REQUIRE_EQ(t.get(), ta);
169*a18eacbeSJulio Merino }
170*a18eacbeSJulio Merino 
171*a18eacbeSJulio Merino ATF_TEST_CASE(auto_array_release);
172*a18eacbeSJulio Merino ATF_TEST_CASE_HEAD(auto_array_release)
173*a18eacbeSJulio Merino {
174*a18eacbeSJulio Merino     set_md_var("descr", "Tests the auto_array smart pointer class' release "
175*a18eacbeSJulio Merino                "method");
176*a18eacbeSJulio Merino }
177*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(auto_array_release)
178*a18eacbeSJulio Merino {
179*a18eacbeSJulio Merino     using atf::auto_array;
180*a18eacbeSJulio Merino 
181*a18eacbeSJulio Merino     test_array* ta1 = new test_array[10];
182*a18eacbeSJulio Merino     {
183*a18eacbeSJulio Merino         auto_array< test_array > t(ta1);
184*a18eacbeSJulio Merino         ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
185*a18eacbeSJulio Merino         test_array* ta2 = t.release();
186*a18eacbeSJulio Merino         ATF_REQUIRE_EQ(ta2, ta1);
187*a18eacbeSJulio Merino         ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
188*a18eacbeSJulio Merino     }
189*a18eacbeSJulio Merino     ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
190*a18eacbeSJulio Merino     delete [] ta1;
191*a18eacbeSJulio Merino }
192*a18eacbeSJulio Merino 
193*a18eacbeSJulio Merino ATF_TEST_CASE(auto_array_reset);
194*a18eacbeSJulio Merino ATF_TEST_CASE_HEAD(auto_array_reset)
195*a18eacbeSJulio Merino {
196*a18eacbeSJulio Merino     set_md_var("descr", "Tests the auto_array smart pointer class' reset "
197*a18eacbeSJulio Merino                "method");
198*a18eacbeSJulio Merino }
199*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(auto_array_reset)
200*a18eacbeSJulio Merino {
201*a18eacbeSJulio Merino     using atf::auto_array;
202*a18eacbeSJulio Merino 
203*a18eacbeSJulio Merino     test_array* ta1 = new test_array[10];
204*a18eacbeSJulio Merino     test_array* ta2 = new test_array[10];
205*a18eacbeSJulio Merino     ATF_REQUIRE_EQ(test_array::m_nblocks, 2);
206*a18eacbeSJulio Merino 
207*a18eacbeSJulio Merino     {
208*a18eacbeSJulio Merino         auto_array< test_array > t(ta1);
209*a18eacbeSJulio Merino         ATF_REQUIRE_EQ(test_array::m_nblocks, 2);
210*a18eacbeSJulio Merino         t.reset(ta2);
211*a18eacbeSJulio Merino         ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
212*a18eacbeSJulio Merino         t.reset();
213*a18eacbeSJulio Merino         ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
214*a18eacbeSJulio Merino     }
215*a18eacbeSJulio Merino     ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
216*a18eacbeSJulio Merino }
217*a18eacbeSJulio Merino 
218*a18eacbeSJulio Merino ATF_TEST_CASE(auto_array_assign);
219*a18eacbeSJulio Merino ATF_TEST_CASE_HEAD(auto_array_assign)
220*a18eacbeSJulio Merino {
221*a18eacbeSJulio Merino     set_md_var("descr", "Tests the auto_array smart pointer class' "
222*a18eacbeSJulio Merino                "assignment operator");
223*a18eacbeSJulio Merino }
224*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(auto_array_assign)
225*a18eacbeSJulio Merino {
226*a18eacbeSJulio Merino     using atf::auto_array;
227*a18eacbeSJulio Merino 
228*a18eacbeSJulio Merino     ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
229*a18eacbeSJulio Merino     {
230*a18eacbeSJulio Merino         auto_array< test_array > t1(new test_array[10]);
231*a18eacbeSJulio Merino         ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
232*a18eacbeSJulio Merino 
233*a18eacbeSJulio Merino         {
234*a18eacbeSJulio Merino             auto_array< test_array > t2;
235*a18eacbeSJulio Merino             t2 = t1;
236*a18eacbeSJulio Merino             ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
237*a18eacbeSJulio Merino         }
238*a18eacbeSJulio Merino         ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
239*a18eacbeSJulio Merino     }
240*a18eacbeSJulio Merino     ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
241*a18eacbeSJulio Merino }
242*a18eacbeSJulio Merino 
243*a18eacbeSJulio Merino ATF_TEST_CASE(auto_array_assign_ref);
244*a18eacbeSJulio Merino ATF_TEST_CASE_HEAD(auto_array_assign_ref)
245*a18eacbeSJulio Merino {
246*a18eacbeSJulio Merino     set_md_var("descr", "Tests the auto_array smart pointer class' "
247*a18eacbeSJulio Merino                "assignment operator through the auxiliary auto_array_ref "
248*a18eacbeSJulio Merino                "object");
249*a18eacbeSJulio Merino }
250*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(auto_array_assign_ref)
251*a18eacbeSJulio Merino {
252*a18eacbeSJulio Merino     using atf::auto_array;
253*a18eacbeSJulio Merino 
254*a18eacbeSJulio Merino     ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
255*a18eacbeSJulio Merino     {
256*a18eacbeSJulio Merino         auto_array< test_array > t1(new test_array[10]);
257*a18eacbeSJulio Merino         ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
258*a18eacbeSJulio Merino 
259*a18eacbeSJulio Merino         {
260*a18eacbeSJulio Merino             auto_array< test_array > t2;
261*a18eacbeSJulio Merino             t2 = test_array::do_copy(t1);
262*a18eacbeSJulio Merino             ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
263*a18eacbeSJulio Merino         }
264*a18eacbeSJulio Merino         ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
265*a18eacbeSJulio Merino     }
266*a18eacbeSJulio Merino     ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
267*a18eacbeSJulio Merino }
268*a18eacbeSJulio Merino 
269*a18eacbeSJulio Merino ATF_TEST_CASE(auto_array_access);
270*a18eacbeSJulio Merino ATF_TEST_CASE_HEAD(auto_array_access)
271*a18eacbeSJulio Merino {
272*a18eacbeSJulio Merino     set_md_var("descr", "Tests the auto_array smart pointer class' access "
273*a18eacbeSJulio Merino                "operator");
274*a18eacbeSJulio Merino }
275*a18eacbeSJulio Merino ATF_TEST_CASE_BODY(auto_array_access)
276*a18eacbeSJulio Merino {
277*a18eacbeSJulio Merino     using atf::auto_array;
278*a18eacbeSJulio Merino 
279*a18eacbeSJulio Merino     auto_array< test_array > t(new test_array[10]);
280*a18eacbeSJulio Merino 
281*a18eacbeSJulio Merino     for (int i = 0; i < 10; i++)
282*a18eacbeSJulio Merino         t[i].m_value = i * 2;
283*a18eacbeSJulio Merino 
284*a18eacbeSJulio Merino     for (int i = 0; i < 10; i++)
285*a18eacbeSJulio Merino         ATF_REQUIRE_EQ(t[i].m_value, i * 2);
286*a18eacbeSJulio Merino }
287*a18eacbeSJulio Merino 
288*a18eacbeSJulio Merino // ------------------------------------------------------------------------
289*a18eacbeSJulio Merino // Main.
290*a18eacbeSJulio Merino // ------------------------------------------------------------------------
291*a18eacbeSJulio Merino 
292*a18eacbeSJulio Merino ATF_INIT_TEST_CASES(tcs)
293*a18eacbeSJulio Merino {
294*a18eacbeSJulio Merino     // Add the test for the "auto_array" class.
295*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, auto_array_scope);
296*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, auto_array_copy);
297*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, auto_array_copy_ref);
298*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, auto_array_get);
299*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, auto_array_release);
300*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, auto_array_reset);
301*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, auto_array_assign);
302*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, auto_array_assign_ref);
303*a18eacbeSJulio Merino     ATF_ADD_TEST_CASE(tcs, auto_array_access);
304*a18eacbeSJulio Merino }
305