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