Path: blob/main/contrib/atf/atf-c++/detail/auto_array_test.cpp
39563 views
// Copyright (c) 2007 The NetBSD Foundation, Inc.1// All rights reserved.2//3// Redistribution and use in source and binary forms, with or without4// modification, are permitted provided that the following conditions5// are met:6// 1. Redistributions of source code must retain the above copyright7// notice, this list of conditions and the following disclaimer.8// 2. Redistributions in binary form must reproduce the above copyright9// notice, this list of conditions and the following disclaimer in the10// documentation and/or other materials provided with the distribution.11//12// THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND13// CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,14// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF15// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.16// IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY17// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL18// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE19// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS20// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER21// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR22// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN23// IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.2425#include "atf-c++/detail/auto_array.hpp"2627extern "C" {28#include <sys/types.h>29}3031#include <iostream>3233#include <atf-c++.hpp>3435extern "C" {36#include "atf-c/defs.h"37}3839// ------------------------------------------------------------------------40// Tests for the "auto_array" class.41// ------------------------------------------------------------------------4243class test_array {44public:45int m_value;4647static ssize_t m_nblocks;4849static50atf::auto_array< test_array >51do_copy(atf::auto_array< test_array >& ta)52{53return atf::auto_array< test_array >(ta);54}5556void* operator new(size_t size ATF_DEFS_ATTRIBUTE_UNUSED)57{58ATF_FAIL("New called but should have been new[]");59return new int(5);60}6162void* operator new[](size_t size)63{64m_nblocks++;65void* mem = ::operator new(size);66std::cout << "Allocated 'test_array' object " << mem << "\n";67return mem;68}6970void operator delete(void* mem ATF_DEFS_ATTRIBUTE_UNUSED)71{72ATF_FAIL("Delete called but should have been delete[]");73}7475void operator delete[](void* mem)76{77std::cout << "Releasing 'test_array' object " << mem << "\n";78if (m_nblocks == 0)79ATF_FAIL("Unbalanced delete[]");80m_nblocks--;81::operator delete(mem);82}83};8485ssize_t test_array::m_nblocks = 0;8687ATF_TEST_CASE(auto_array_scope);88ATF_TEST_CASE_HEAD(auto_array_scope)89{90set_md_var("descr", "Tests the automatic scope handling in the "91"auto_array smart pointer class");92}93ATF_TEST_CASE_BODY(auto_array_scope)94{95using atf::auto_array;9697ATF_REQUIRE_EQ(test_array::m_nblocks, 0);98{99auto_array< test_array > t(new test_array[10]);100ATF_REQUIRE_EQ(test_array::m_nblocks, 1);101}102ATF_REQUIRE_EQ(test_array::m_nblocks, 0);103}104105ATF_TEST_CASE(auto_array_copy);106ATF_TEST_CASE_HEAD(auto_array_copy)107{108set_md_var("descr", "Tests the auto_array smart pointer class' copy "109"constructor");110}111ATF_TEST_CASE_BODY(auto_array_copy)112{113using atf::auto_array;114115ATF_REQUIRE_EQ(test_array::m_nblocks, 0);116{117auto_array< test_array > t1(new test_array[10]);118ATF_REQUIRE_EQ(test_array::m_nblocks, 1);119120{121auto_array< test_array > t2(t1);122ATF_REQUIRE_EQ(test_array::m_nblocks, 1);123}124ATF_REQUIRE_EQ(test_array::m_nblocks, 0);125}126ATF_REQUIRE_EQ(test_array::m_nblocks, 0);127}128129ATF_TEST_CASE(auto_array_copy_ref);130ATF_TEST_CASE_HEAD(auto_array_copy_ref)131{132set_md_var("descr", "Tests the auto_array smart pointer class' copy "133"constructor through the auxiliary auto_array_ref object");134}135ATF_TEST_CASE_BODY(auto_array_copy_ref)136{137using atf::auto_array;138139ATF_REQUIRE_EQ(test_array::m_nblocks, 0);140{141auto_array< test_array > t1(new test_array[10]);142ATF_REQUIRE_EQ(test_array::m_nblocks, 1);143144{145auto_array< test_array > t2 = test_array::do_copy(t1);146ATF_REQUIRE_EQ(test_array::m_nblocks, 1);147}148ATF_REQUIRE_EQ(test_array::m_nblocks, 0);149}150ATF_REQUIRE_EQ(test_array::m_nblocks, 0);151}152153ATF_TEST_CASE(auto_array_get);154ATF_TEST_CASE_HEAD(auto_array_get)155{156set_md_var("descr", "Tests the auto_array smart pointer class' get "157"method");158}159ATF_TEST_CASE_BODY(auto_array_get)160{161using atf::auto_array;162163test_array* ta = new test_array[10];164auto_array< test_array > t(ta);165ATF_REQUIRE_EQ(t.get(), ta);166}167168ATF_TEST_CASE(auto_array_release);169ATF_TEST_CASE_HEAD(auto_array_release)170{171set_md_var("descr", "Tests the auto_array smart pointer class' release "172"method");173}174ATF_TEST_CASE_BODY(auto_array_release)175{176using atf::auto_array;177178test_array* ta1 = new test_array[10];179{180auto_array< test_array > t(ta1);181ATF_REQUIRE_EQ(test_array::m_nblocks, 1);182test_array* ta2 = t.release();183ATF_REQUIRE_EQ(ta2, ta1);184ATF_REQUIRE_EQ(test_array::m_nblocks, 1);185}186ATF_REQUIRE_EQ(test_array::m_nblocks, 1);187delete [] ta1;188}189190ATF_TEST_CASE(auto_array_reset);191ATF_TEST_CASE_HEAD(auto_array_reset)192{193set_md_var("descr", "Tests the auto_array smart pointer class' reset "194"method");195}196ATF_TEST_CASE_BODY(auto_array_reset)197{198using atf::auto_array;199200test_array* ta1 = new test_array[10];201test_array* ta2 = new test_array[10];202ATF_REQUIRE_EQ(test_array::m_nblocks, 2);203204{205auto_array< test_array > t(ta1);206ATF_REQUIRE_EQ(test_array::m_nblocks, 2);207t.reset(ta2);208ATF_REQUIRE_EQ(test_array::m_nblocks, 1);209t.reset();210ATF_REQUIRE_EQ(test_array::m_nblocks, 0);211}212ATF_REQUIRE_EQ(test_array::m_nblocks, 0);213}214215ATF_TEST_CASE(auto_array_assign);216ATF_TEST_CASE_HEAD(auto_array_assign)217{218set_md_var("descr", "Tests the auto_array smart pointer class' "219"assignment operator");220}221ATF_TEST_CASE_BODY(auto_array_assign)222{223using atf::auto_array;224225ATF_REQUIRE_EQ(test_array::m_nblocks, 0);226{227auto_array< test_array > t1(new test_array[10]);228ATF_REQUIRE_EQ(test_array::m_nblocks, 1);229230{231auto_array< test_array > t2;232t2 = t1;233ATF_REQUIRE_EQ(test_array::m_nblocks, 1);234}235ATF_REQUIRE_EQ(test_array::m_nblocks, 0);236}237ATF_REQUIRE_EQ(test_array::m_nblocks, 0);238}239240ATF_TEST_CASE(auto_array_assign_ref);241ATF_TEST_CASE_HEAD(auto_array_assign_ref)242{243set_md_var("descr", "Tests the auto_array smart pointer class' "244"assignment operator through the auxiliary auto_array_ref "245"object");246}247ATF_TEST_CASE_BODY(auto_array_assign_ref)248{249using atf::auto_array;250251ATF_REQUIRE_EQ(test_array::m_nblocks, 0);252{253auto_array< test_array > t1(new test_array[10]);254ATF_REQUIRE_EQ(test_array::m_nblocks, 1);255256{257auto_array< test_array > t2;258t2 = test_array::do_copy(t1);259ATF_REQUIRE_EQ(test_array::m_nblocks, 1);260}261ATF_REQUIRE_EQ(test_array::m_nblocks, 0);262}263ATF_REQUIRE_EQ(test_array::m_nblocks, 0);264}265266ATF_TEST_CASE(auto_array_access);267ATF_TEST_CASE_HEAD(auto_array_access)268{269set_md_var("descr", "Tests the auto_array smart pointer class' access "270"operator");271}272ATF_TEST_CASE_BODY(auto_array_access)273{274using atf::auto_array;275276auto_array< test_array > t(new test_array[10]);277278for (int i = 0; i < 10; i++)279t[i].m_value = i * 2;280281for (int i = 0; i < 10; i++)282ATF_REQUIRE_EQ(t[i].m_value, i * 2);283}284285// ------------------------------------------------------------------------286// Main.287// ------------------------------------------------------------------------288289ATF_INIT_TEST_CASES(tcs)290{291// Add the test for the "auto_array" class.292ATF_ADD_TEST_CASE(tcs, auto_array_scope);293ATF_ADD_TEST_CASE(tcs, auto_array_copy);294ATF_ADD_TEST_CASE(tcs, auto_array_copy_ref);295ATF_ADD_TEST_CASE(tcs, auto_array_get);296ATF_ADD_TEST_CASE(tcs, auto_array_release);297ATF_ADD_TEST_CASE(tcs, auto_array_reset);298ATF_ADD_TEST_CASE(tcs, auto_array_assign);299ATF_ADD_TEST_CASE(tcs, auto_array_assign_ref);300ATF_ADD_TEST_CASE(tcs, auto_array_access);301}302303304