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