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