1*6777b538SAndroid Build Coastguard Worker// Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker// found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker#include <vector> 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker#include "base/apple/scoped_nsobject.h" 8*6777b538SAndroid Build Coastguard Worker#include "base/compiler_specific.h" 9*6777b538SAndroid Build Coastguard Worker#include "testing/gtest/include/gtest/gtest.h" 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker#if HAS_FEATURE(objc_arc) 12*6777b538SAndroid Build Coastguard Worker#error "This file must not be compiled with ARC." 13*6777b538SAndroid Build Coastguard Worker#endif 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Workernamespace { 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard WorkerTEST(ScopedNSObjectTest, ScopedNSObject) { 18*6777b538SAndroid Build Coastguard Worker base::apple::scoped_nsobject<NSObject> p1([[NSObject alloc] init]); 19*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(p1.get()); 20*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(1u, [p1.get() retainCount]); 21*6777b538SAndroid Build Coastguard Worker base::apple::scoped_nsobject<NSObject> p2(p1); 22*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(p1.get(), p2.get()); 23*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(2u, [p1.get() retainCount]); 24*6777b538SAndroid Build Coastguard Worker p2.reset(); 25*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(nil, p2.get()); 26*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(1u, [p1.get() retainCount]); 27*6777b538SAndroid Build Coastguard Worker { 28*6777b538SAndroid Build Coastguard Worker base::apple::scoped_nsobject<NSObject> p3 = p1; 29*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(p1.get(), p3.get()); 30*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(2u, [p1.get() retainCount]); 31*6777b538SAndroid Build Coastguard Worker @autoreleasepool { 32*6777b538SAndroid Build Coastguard Worker p3 = p1; 33*6777b538SAndroid Build Coastguard Worker } 34*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(p1.get(), p3.get()); 35*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(2u, [p1.get() retainCount]); 36*6777b538SAndroid Build Coastguard Worker } 37*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(1u, [p1.get() retainCount]); 38*6777b538SAndroid Build Coastguard Worker base::apple::scoped_nsobject<NSObject> p4([p1.get() retain]); 39*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(2u, [p1.get() retainCount]); 40*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(p1 == p1); 41*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(p1 != p1); 42*6777b538SAndroid Build Coastguard Worker base::apple::scoped_nsobject<NSObject> p5([[NSObject alloc] init]); 43*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(p1 != p5); 44*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(p1 == p5); 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Worker base::apple::scoped_nsobject<NSObject> p6 = p1; 47*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(3u, [p6.get() retainCount]); 48*6777b538SAndroid Build Coastguard Worker @autoreleasepool { 49*6777b538SAndroid Build Coastguard Worker p6.autorelease(); 50*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(nil, p6.get()); 51*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(3u, [p1.get() retainCount]); 52*6777b538SAndroid Build Coastguard Worker } 53*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(2u, [p1.get() retainCount]); 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker base::apple::scoped_nsobject<NSObject> p7([[NSObject alloc] init]); 56*6777b538SAndroid Build Coastguard Worker base::apple::scoped_nsobject<NSObject> p8(std::move(p7)); 57*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(p8); 58*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(1u, [p8.get() retainCount]); 59*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(p7.get()); 60*6777b538SAndroid Build Coastguard Worker} 61*6777b538SAndroid Build Coastguard Worker 62*6777b538SAndroid Build Coastguard Worker// Instantiating scoped_nsobject<> with T=NSAutoreleasePool should trip a 63*6777b538SAndroid Build Coastguard Worker// static_assert. 64*6777b538SAndroid Build Coastguard Worker#if 0 65*6777b538SAndroid Build Coastguard WorkerTEST(ScopedNSObjectTest, FailToCreateScopedNSObjectAutoreleasePool) { 66*6777b538SAndroid Build Coastguard Worker base::apple::scoped_nsobject<NSAutoreleasePool> pool; 67*6777b538SAndroid Build Coastguard Worker} 68*6777b538SAndroid Build Coastguard Worker#endif 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard WorkerTEST(ScopedNSObjectTest, ScopedNSObjectInContainer) { 71*6777b538SAndroid Build Coastguard Worker base::apple::scoped_nsobject<id> p([[NSObject alloc] init]); 72*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(p.get()); 73*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(1u, [p.get() retainCount]); 74*6777b538SAndroid Build Coastguard Worker { 75*6777b538SAndroid Build Coastguard Worker std::vector<base::apple::scoped_nsobject<id>> objects; 76*6777b538SAndroid Build Coastguard Worker objects.push_back(p); 77*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(2u, [p.get() retainCount]); 78*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(p.get(), objects[0].get()); 79*6777b538SAndroid Build Coastguard Worker objects.push_back( 80*6777b538SAndroid Build Coastguard Worker base::apple::scoped_nsobject<id>([[NSObject alloc] init])); 81*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(objects[1].get()); 82*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(1u, [objects[1].get() retainCount]); 83*6777b538SAndroid Build Coastguard Worker } 84*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(1u, [p.get() retainCount]); 85*6777b538SAndroid Build Coastguard Worker} 86*6777b538SAndroid Build Coastguard Worker 87*6777b538SAndroid Build Coastguard WorkerTEST(ScopedNSObjectTest, ScopedNSObjectFreeFunctions) { 88*6777b538SAndroid Build Coastguard Worker base::apple::scoped_nsobject<id> p1([[NSObject alloc] init]); 89*6777b538SAndroid Build Coastguard Worker id o1 = p1.get(); 90*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(o1 == p1); 91*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(o1 != p1); 92*6777b538SAndroid Build Coastguard Worker base::apple::scoped_nsobject<id> p2([[NSObject alloc] init]); 93*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(o1 != p2); 94*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(o1 == p2); 95*6777b538SAndroid Build Coastguard Worker id o2 = p2.get(); 96*6777b538SAndroid Build Coastguard Worker swap(p1, p2); 97*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(o2, p1.get()); 98*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(o1, p2.get()); 99*6777b538SAndroid Build Coastguard Worker} 100*6777b538SAndroid Build Coastguard Worker 101*6777b538SAndroid Build Coastguard WorkerTEST(ScopedNSObjectTest, ResetWithAnotherScopedNSObject) { 102*6777b538SAndroid Build Coastguard Worker base::apple::scoped_nsobject<id> p1([[NSObject alloc] init]); 103*6777b538SAndroid Build Coastguard Worker id o1 = p1.get(); 104*6777b538SAndroid Build Coastguard Worker 105*6777b538SAndroid Build Coastguard Worker id o2 = nil; 106*6777b538SAndroid Build Coastguard Worker { 107*6777b538SAndroid Build Coastguard Worker base::apple::scoped_nsobject<id> p2([[NSObject alloc] init]); 108*6777b538SAndroid Build Coastguard Worker o2 = p2.get(); 109*6777b538SAndroid Build Coastguard Worker p1.reset(p2); 110*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2u, [p1.get() retainCount]); 111*6777b538SAndroid Build Coastguard Worker } 112*6777b538SAndroid Build Coastguard Worker 113*6777b538SAndroid Build Coastguard Worker EXPECT_NE(o1, p1.get()); 114*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(o2, p1.get()); 115*6777b538SAndroid Build Coastguard Worker EXPECT_NE(p1.get(), nil); 116*6777b538SAndroid Build Coastguard Worker 117*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1u, [p1.get() retainCount]); 118*6777b538SAndroid Build Coastguard Worker} 119*6777b538SAndroid Build Coastguard Worker 120*6777b538SAndroid Build Coastguard Worker} // namespace 121