scoped_nsobject_unittest.mm 3.2 KB

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