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