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