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