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