1258191Sjmmv// Copyright (c) 2007 The NetBSD Foundation, Inc.
2258191Sjmmv// All rights reserved.
3258191Sjmmv//
4258191Sjmmv// Redistribution and use in source and binary forms, with or without
5258191Sjmmv// modification, are permitted provided that the following conditions
6258191Sjmmv// are met:
7258191Sjmmv// 1. Redistributions of source code must retain the above copyright
8258191Sjmmv//    notice, this list of conditions and the following disclaimer.
9258191Sjmmv// 2. Redistributions in binary form must reproduce the above copyright
10258191Sjmmv//    notice, this list of conditions and the following disclaimer in the
11258191Sjmmv//    documentation and/or other materials provided with the distribution.
12258191Sjmmv//
13258191Sjmmv// THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
14258191Sjmmv// CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
15258191Sjmmv// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
16258191Sjmmv// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17258191Sjmmv// IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
18258191Sjmmv// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19258191Sjmmv// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
20258191Sjmmv// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21258191Sjmmv// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
22258191Sjmmv// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23258191Sjmmv// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
24258191Sjmmv// IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25258191Sjmmv
26275988Sngie#include "atf-c++/detail/auto_array.hpp"
27275988Sngie
28258191Sjmmvextern "C" {
29258191Sjmmv#include <sys/types.h>
30258191Sjmmv}
31258191Sjmmv
32258191Sjmmv#include <iostream>
33258191Sjmmv
34275988Sngie#include <atf-c++.hpp>
35275988Sngie
36275988Sngieextern "C" {
37258191Sjmmv#include "atf-c/defs.h"
38275988Sngie}
39258191Sjmmv
40258191Sjmmv// ------------------------------------------------------------------------
41258191Sjmmv// Tests for the "auto_array" class.
42258191Sjmmv// ------------------------------------------------------------------------
43258191Sjmmv
44258191Sjmmvclass test_array {
45258191Sjmmvpublic:
46258191Sjmmv    int m_value;
47258191Sjmmv
48258191Sjmmv    static ssize_t m_nblocks;
49258191Sjmmv
50258191Sjmmv    static
51258191Sjmmv    atf::auto_array< test_array >
52258191Sjmmv    do_copy(atf::auto_array< test_array >& ta)
53258191Sjmmv    {
54258191Sjmmv        return atf::auto_array< test_array >(ta);
55258191Sjmmv    }
56258191Sjmmv
57258191Sjmmv    void* operator new(size_t size ATF_DEFS_ATTRIBUTE_UNUSED)
58258191Sjmmv    {
59258191Sjmmv        ATF_FAIL("New called but should have been new[]");
60258191Sjmmv        return new int(5);
61258191Sjmmv    }
62258191Sjmmv
63258191Sjmmv    void* operator new[](size_t size)
64258191Sjmmv    {
65258191Sjmmv        m_nblocks++;
66258191Sjmmv        void* mem = ::operator new(size);
67258191Sjmmv        std::cout << "Allocated 'test_array' object " << mem << "\n";
68258191Sjmmv        return mem;
69258191Sjmmv    }
70258191Sjmmv
71258191Sjmmv    void operator delete(void* mem ATF_DEFS_ATTRIBUTE_UNUSED)
72258191Sjmmv    {
73258191Sjmmv        ATF_FAIL("Delete called but should have been delete[]");
74258191Sjmmv    }
75258191Sjmmv
76258191Sjmmv    void operator delete[](void* mem)
77258191Sjmmv    {
78258191Sjmmv        std::cout << "Releasing 'test_array' object " << mem << "\n";
79258191Sjmmv        if (m_nblocks == 0)
80258191Sjmmv            ATF_FAIL("Unbalanced delete[]");
81258191Sjmmv        m_nblocks--;
82258191Sjmmv        ::operator delete(mem);
83258191Sjmmv    }
84258191Sjmmv};
85258191Sjmmv
86258191Sjmmvssize_t test_array::m_nblocks = 0;
87258191Sjmmv
88258191SjmmvATF_TEST_CASE(auto_array_scope);
89258191SjmmvATF_TEST_CASE_HEAD(auto_array_scope)
90258191Sjmmv{
91258191Sjmmv    set_md_var("descr", "Tests the automatic scope handling in the "
92258191Sjmmv               "auto_array smart pointer class");
93258191Sjmmv}
94258191SjmmvATF_TEST_CASE_BODY(auto_array_scope)
95258191Sjmmv{
96258191Sjmmv    using atf::auto_array;
97258191Sjmmv
98258191Sjmmv    ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
99258191Sjmmv    {
100258191Sjmmv        auto_array< test_array > t(new test_array[10]);
101258191Sjmmv        ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
102258191Sjmmv    }
103258191Sjmmv    ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
104258191Sjmmv}
105258191Sjmmv
106258191SjmmvATF_TEST_CASE(auto_array_copy);
107258191SjmmvATF_TEST_CASE_HEAD(auto_array_copy)
108258191Sjmmv{
109258191Sjmmv    set_md_var("descr", "Tests the auto_array smart pointer class' copy "
110258191Sjmmv               "constructor");
111258191Sjmmv}
112258191SjmmvATF_TEST_CASE_BODY(auto_array_copy)
113258191Sjmmv{
114258191Sjmmv    using atf::auto_array;
115258191Sjmmv
116258191Sjmmv    ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
117258191Sjmmv    {
118258191Sjmmv        auto_array< test_array > t1(new test_array[10]);
119258191Sjmmv        ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
120258191Sjmmv
121258191Sjmmv        {
122258191Sjmmv            auto_array< test_array > t2(t1);
123258191Sjmmv            ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
124258191Sjmmv        }
125258191Sjmmv        ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
126258191Sjmmv    }
127258191Sjmmv    ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
128258191Sjmmv}
129258191Sjmmv
130258191SjmmvATF_TEST_CASE(auto_array_copy_ref);
131258191SjmmvATF_TEST_CASE_HEAD(auto_array_copy_ref)
132258191Sjmmv{
133258191Sjmmv    set_md_var("descr", "Tests the auto_array smart pointer class' copy "
134258191Sjmmv               "constructor through the auxiliary auto_array_ref object");
135258191Sjmmv}
136258191SjmmvATF_TEST_CASE_BODY(auto_array_copy_ref)
137258191Sjmmv{
138258191Sjmmv    using atf::auto_array;
139258191Sjmmv
140258191Sjmmv    ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
141258191Sjmmv    {
142258191Sjmmv        auto_array< test_array > t1(new test_array[10]);
143258191Sjmmv        ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
144258191Sjmmv
145258191Sjmmv        {
146258191Sjmmv            auto_array< test_array > t2 = test_array::do_copy(t1);
147258191Sjmmv            ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
148258191Sjmmv        }
149258191Sjmmv        ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
150258191Sjmmv    }
151258191Sjmmv    ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
152258191Sjmmv}
153258191Sjmmv
154258191SjmmvATF_TEST_CASE(auto_array_get);
155258191SjmmvATF_TEST_CASE_HEAD(auto_array_get)
156258191Sjmmv{
157258191Sjmmv    set_md_var("descr", "Tests the auto_array smart pointer class' get "
158258191Sjmmv               "method");
159258191Sjmmv}
160258191SjmmvATF_TEST_CASE_BODY(auto_array_get)
161258191Sjmmv{
162258191Sjmmv    using atf::auto_array;
163258191Sjmmv
164258191Sjmmv    test_array* ta = new test_array[10];
165258191Sjmmv    auto_array< test_array > t(ta);
166258191Sjmmv    ATF_REQUIRE_EQ(t.get(), ta);
167258191Sjmmv}
168258191Sjmmv
169258191SjmmvATF_TEST_CASE(auto_array_release);
170258191SjmmvATF_TEST_CASE_HEAD(auto_array_release)
171258191Sjmmv{
172258191Sjmmv    set_md_var("descr", "Tests the auto_array smart pointer class' release "
173258191Sjmmv               "method");
174258191Sjmmv}
175258191SjmmvATF_TEST_CASE_BODY(auto_array_release)
176258191Sjmmv{
177258191Sjmmv    using atf::auto_array;
178258191Sjmmv
179258191Sjmmv    test_array* ta1 = new test_array[10];
180258191Sjmmv    {
181258191Sjmmv        auto_array< test_array > t(ta1);
182258191Sjmmv        ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
183258191Sjmmv        test_array* ta2 = t.release();
184258191Sjmmv        ATF_REQUIRE_EQ(ta2, ta1);
185258191Sjmmv        ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
186258191Sjmmv    }
187258191Sjmmv    ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
188258191Sjmmv    delete [] ta1;
189258191Sjmmv}
190258191Sjmmv
191258191SjmmvATF_TEST_CASE(auto_array_reset);
192258191SjmmvATF_TEST_CASE_HEAD(auto_array_reset)
193258191Sjmmv{
194258191Sjmmv    set_md_var("descr", "Tests the auto_array smart pointer class' reset "
195258191Sjmmv               "method");
196258191Sjmmv}
197258191SjmmvATF_TEST_CASE_BODY(auto_array_reset)
198258191Sjmmv{
199258191Sjmmv    using atf::auto_array;
200258191Sjmmv
201258191Sjmmv    test_array* ta1 = new test_array[10];
202258191Sjmmv    test_array* ta2 = new test_array[10];
203258191Sjmmv    ATF_REQUIRE_EQ(test_array::m_nblocks, 2);
204258191Sjmmv
205258191Sjmmv    {
206258191Sjmmv        auto_array< test_array > t(ta1);
207258191Sjmmv        ATF_REQUIRE_EQ(test_array::m_nblocks, 2);
208258191Sjmmv        t.reset(ta2);
209258191Sjmmv        ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
210258191Sjmmv        t.reset();
211258191Sjmmv        ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
212258191Sjmmv    }
213258191Sjmmv    ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
214258191Sjmmv}
215258191Sjmmv
216258191SjmmvATF_TEST_CASE(auto_array_assign);
217258191SjmmvATF_TEST_CASE_HEAD(auto_array_assign)
218258191Sjmmv{
219258191Sjmmv    set_md_var("descr", "Tests the auto_array smart pointer class' "
220258191Sjmmv               "assignment operator");
221258191Sjmmv}
222258191SjmmvATF_TEST_CASE_BODY(auto_array_assign)
223258191Sjmmv{
224258191Sjmmv    using atf::auto_array;
225258191Sjmmv
226258191Sjmmv    ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
227258191Sjmmv    {
228258191Sjmmv        auto_array< test_array > t1(new test_array[10]);
229258191Sjmmv        ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
230258191Sjmmv
231258191Sjmmv        {
232258191Sjmmv            auto_array< test_array > t2;
233258191Sjmmv            t2 = t1;
234258191Sjmmv            ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
235258191Sjmmv        }
236258191Sjmmv        ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
237258191Sjmmv    }
238258191Sjmmv    ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
239258191Sjmmv}
240258191Sjmmv
241258191SjmmvATF_TEST_CASE(auto_array_assign_ref);
242258191SjmmvATF_TEST_CASE_HEAD(auto_array_assign_ref)
243258191Sjmmv{
244258191Sjmmv    set_md_var("descr", "Tests the auto_array smart pointer class' "
245258191Sjmmv               "assignment operator through the auxiliary auto_array_ref "
246258191Sjmmv               "object");
247258191Sjmmv}
248258191SjmmvATF_TEST_CASE_BODY(auto_array_assign_ref)
249258191Sjmmv{
250258191Sjmmv    using atf::auto_array;
251258191Sjmmv
252258191Sjmmv    ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
253258191Sjmmv    {
254258191Sjmmv        auto_array< test_array > t1(new test_array[10]);
255258191Sjmmv        ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
256258191Sjmmv
257258191Sjmmv        {
258258191Sjmmv            auto_array< test_array > t2;
259258191Sjmmv            t2 = test_array::do_copy(t1);
260258191Sjmmv            ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
261258191Sjmmv        }
262258191Sjmmv        ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
263258191Sjmmv    }
264258191Sjmmv    ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
265258191Sjmmv}
266258191Sjmmv
267258191SjmmvATF_TEST_CASE(auto_array_access);
268258191SjmmvATF_TEST_CASE_HEAD(auto_array_access)
269258191Sjmmv{
270258191Sjmmv    set_md_var("descr", "Tests the auto_array smart pointer class' access "
271258191Sjmmv               "operator");
272258191Sjmmv}
273258191SjmmvATF_TEST_CASE_BODY(auto_array_access)
274258191Sjmmv{
275258191Sjmmv    using atf::auto_array;
276258191Sjmmv
277258191Sjmmv    auto_array< test_array > t(new test_array[10]);
278258191Sjmmv
279258191Sjmmv    for (int i = 0; i < 10; i++)
280258191Sjmmv        t[i].m_value = i * 2;
281258191Sjmmv
282258191Sjmmv    for (int i = 0; i < 10; i++)
283258191Sjmmv        ATF_REQUIRE_EQ(t[i].m_value, i * 2);
284258191Sjmmv}
285258191Sjmmv
286258191Sjmmv// ------------------------------------------------------------------------
287258191Sjmmv// Main.
288258191Sjmmv// ------------------------------------------------------------------------
289258191Sjmmv
290258191SjmmvATF_INIT_TEST_CASES(tcs)
291258191Sjmmv{
292258191Sjmmv    // Add the test for the "auto_array" class.
293258191Sjmmv    ATF_ADD_TEST_CASE(tcs, auto_array_scope);
294258191Sjmmv    ATF_ADD_TEST_CASE(tcs, auto_array_copy);
295258191Sjmmv    ATF_ADD_TEST_CASE(tcs, auto_array_copy_ref);
296258191Sjmmv    ATF_ADD_TEST_CASE(tcs, auto_array_get);
297258191Sjmmv    ATF_ADD_TEST_CASE(tcs, auto_array_release);
298258191Sjmmv    ATF_ADD_TEST_CASE(tcs, auto_array_reset);
299258191Sjmmv    ATF_ADD_TEST_CASE(tcs, auto_array_assign);
300258191Sjmmv    ATF_ADD_TEST_CASE(tcs, auto_array_assign_ref);
301258191Sjmmv    ATF_ADD_TEST_CASE(tcs, auto_array_access);
302258191Sjmmv}
303