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