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