1f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Copyright 2003, Google Inc. 2f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// All rights reserved. 3f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// 4f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Redistribution and use in source and binary forms, with or without 5f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// modification, are permitted provided that the following conditions are 6f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// met: 7f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// 8f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// * Redistributions of source code must retain the above copyright 9f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// notice, this list of conditions and the following disclaimer. 10f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// * Redistributions in binary form must reproduce the above 11f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// copyright notice, this list of conditions and the following disclaimer 12f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// in the documentation and/or other materials provided with the 13f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// distribution. 14f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// * Neither the name of Google Inc. nor the names of its 15f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// contributors may be used to endorse or promote products derived from 16f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// this software without specific prior written permission. 17f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// 18f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// 30f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Authors: Dan Egnor (egnor@google.com) 31f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Ported to Windows: Vadim Berman (vadimb@google.com) 32f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 33f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "gtest/internal/gtest-linked_ptr.h" 34f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 35f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include <stdlib.h> 36f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "gtest/gtest.h" 37f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 38f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochnamespace { 39f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 40f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochusing testing::Message; 41f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochusing testing::internal::linked_ptr; 42f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 43f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochint num; 44f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochMessage* history = NULL; 45f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 46f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Class which tracks allocation/deallocation 47f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass A { 48f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 49f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch A(): mynum(num++) { *history << "A" << mynum << " ctor\n"; } 50f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch virtual ~A() { *history << "A" << mynum << " dtor\n"; } 51f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch virtual void Use() { *history << "A" << mynum << " use\n"; } 52f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch protected: 53f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int mynum; 54f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 55f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 56f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Subclass 57f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass B : public A { 58f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 59f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch B() { *history << "B" << mynum << " ctor\n"; } 60f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ~B() { *history << "B" << mynum << " dtor\n"; } 61f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch virtual void Use() { *history << "B" << mynum << " use\n"; } 62f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 63f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 64f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass LinkedPtrTest : public testing::Test { 65f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 66f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch LinkedPtrTest() { 67f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch num = 0; 68f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch history = new Message; 69f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 70f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 71f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch virtual ~LinkedPtrTest() { 72f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch delete history; 73f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch history = NULL; 74f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 75f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 76f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 77f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(LinkedPtrTest, GeneralTest) { 78f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch { 79f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch linked_ptr<A> a0, a1, a2; 80f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Use explicit function call notation here to suppress self-assign warning. 81f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch a0.operator=(a0); 82f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch a1 = a2; 83f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ASSERT_EQ(a0.get(), static_cast<A*>(NULL)); 84f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ASSERT_EQ(a1.get(), static_cast<A*>(NULL)); 85f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ASSERT_EQ(a2.get(), static_cast<A*>(NULL)); 86f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ASSERT_TRUE(a0 == NULL); 87f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ASSERT_TRUE(a1 == NULL); 88f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ASSERT_TRUE(a2 == NULL); 89f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 90f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch { 91f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch linked_ptr<A> a3(new A); 92f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch a0 = a3; 93f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ASSERT_TRUE(a0 == a3); 94f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ASSERT_TRUE(a0 != NULL); 95f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ASSERT_TRUE(a0.get() == a3); 96f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ASSERT_TRUE(a0 == a3.get()); 97f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch linked_ptr<A> a4(a0); 98f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch a1 = a4; 99f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch linked_ptr<A> a5(new A); 100f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ASSERT_TRUE(a5.get() != a3); 101f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ASSERT_TRUE(a5 != a3.get()); 102f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch a2 = a5; 103f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch linked_ptr<B> b0(new B); 104f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch linked_ptr<A> a6(b0); 105f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ASSERT_TRUE(b0 == a6); 106f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ASSERT_TRUE(a6 == b0); 107f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ASSERT_TRUE(b0 != NULL); 108f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch a5 = b0; 109f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch a5 = b0; 110f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch a3->Use(); 111f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch a4->Use(); 112f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch a5->Use(); 113f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch a6->Use(); 114f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch b0->Use(); 115f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch (*b0).Use(); 116f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch b0.get()->Use(); 117f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 118f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 119f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch a0->Use(); 120f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch a1->Use(); 121f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch a2->Use(); 122f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 123f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch a1 = a2; 124f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch a2.reset(new A); 125f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch a0.reset(); 126f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 127f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch linked_ptr<A> a7; 128f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 129f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 130f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ASSERT_STREQ( 131f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "A0 ctor\n" 132f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "A1 ctor\n" 133f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "A2 ctor\n" 134f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "B2 ctor\n" 135f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "A0 use\n" 136f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "A0 use\n" 137f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "B2 use\n" 138f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "B2 use\n" 139f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "B2 use\n" 140f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "B2 use\n" 141f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "B2 use\n" 142f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "B2 dtor\n" 143f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "A2 dtor\n" 144f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "A0 use\n" 145f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "A0 use\n" 146f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "A1 use\n" 147f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "A3 ctor\n" 148f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "A0 dtor\n" 149f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "A3 dtor\n" 150f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "A1 dtor\n", 151f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch history->GetString().c_str()); 152f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 153f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 154f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} // Unnamed namespace 155