OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/memory/scoped_ptr.h" | 5 #include "base/memory/scoped_ptr.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 EXPECT_FALSE(scoper.get()); | 139 EXPECT_FALSE(scoper.get()); |
140 delete take; | 140 delete take; |
141 EXPECT_EQ(0, constructed); | 141 EXPECT_EQ(0, constructed); |
142 | 142 |
143 scoper.reset(new ConDecLogger(&constructed)); | 143 scoper.reset(new ConDecLogger(&constructed)); |
144 EXPECT_EQ(1, constructed); | 144 EXPECT_EQ(1, constructed); |
145 EXPECT_TRUE(scoper.get()); | 145 EXPECT_TRUE(scoper.get()); |
146 } | 146 } |
147 EXPECT_EQ(0, constructed); | 147 EXPECT_EQ(0, constructed); |
148 | 148 |
149 // Test swap(), == and != | 149 // Test swap(). |
150 { | 150 { |
151 scoped_ptr<ConDecLogger> scoper1; | 151 scoped_ptr<ConDecLogger> scoper1; |
152 scoped_ptr<ConDecLogger> scoper2; | 152 scoped_ptr<ConDecLogger> scoper2; |
153 EXPECT_TRUE(scoper1 == scoper2.get()); | 153 EXPECT_TRUE(scoper1.get() == scoper2.get()); |
154 EXPECT_FALSE(scoper1 != scoper2.get()); | 154 EXPECT_FALSE(scoper1.get() != scoper2.get()); |
155 | 155 |
156 ConDecLogger* logger = new ConDecLogger(&constructed); | 156 ConDecLogger* logger = new ConDecLogger(&constructed); |
157 scoper1.reset(logger); | 157 scoper1.reset(logger); |
158 EXPECT_EQ(logger, scoper1.get()); | 158 EXPECT_EQ(logger, scoper1.get()); |
159 EXPECT_FALSE(scoper2.get()); | 159 EXPECT_FALSE(scoper2.get()); |
160 EXPECT_FALSE(scoper1 == scoper2.get()); | 160 EXPECT_FALSE(scoper1.get() == scoper2.get()); |
161 EXPECT_TRUE(scoper1 != scoper2.get()); | 161 EXPECT_TRUE(scoper1.get() != scoper2.get()); |
162 | 162 |
163 scoper2.swap(scoper1); | 163 scoper2.swap(scoper1); |
164 EXPECT_EQ(logger, scoper2.get()); | 164 EXPECT_EQ(logger, scoper2.get()); |
165 EXPECT_FALSE(scoper1.get()); | 165 EXPECT_FALSE(scoper1.get()); |
166 EXPECT_FALSE(scoper1 == scoper2.get()); | 166 EXPECT_FALSE(scoper1.get() == scoper2.get()); |
167 EXPECT_TRUE(scoper1 != scoper2.get()); | 167 EXPECT_TRUE(scoper1.get() != scoper2.get()); |
168 } | 168 } |
169 EXPECT_EQ(0, constructed); | 169 EXPECT_EQ(0, constructed); |
170 } | 170 } |
171 | 171 |
172 TEST(ScopedPtrTest, ScopedPtrDepthSubtyping) { | 172 TEST(ScopedPtrTest, ScopedPtrDepthSubtyping) { |
173 int constructed = 0; | 173 int constructed = 0; |
174 | 174 |
175 // Test construction from a scoped_ptr to a derived class. | 175 // Test construction from a scoped_ptr to a derived class. |
176 { | 176 { |
177 scoped_ptr<ConDecLogger> scoper(new ConDecLogger(&constructed)); | 177 scoped_ptr<ConDecLogger> scoper(new ConDecLogger(&constructed)); |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
320 scoper[i].SetPtr(&constructed); | 320 scoper[i].SetPtr(&constructed); |
321 } | 321 } |
322 EXPECT_EQ(12, constructed); | 322 EXPECT_EQ(12, constructed); |
323 ConDecLogger* ptr = scoper.release(); | 323 ConDecLogger* ptr = scoper.release(); |
324 EXPECT_EQ(12, constructed); | 324 EXPECT_EQ(12, constructed); |
325 delete[] ptr; | 325 delete[] ptr; |
326 EXPECT_EQ(0, constructed); | 326 EXPECT_EQ(0, constructed); |
327 } | 327 } |
328 EXPECT_EQ(0, constructed); | 328 EXPECT_EQ(0, constructed); |
329 | 329 |
330 // Test swap(), ==, !=, and type-safe Boolean. | 330 // Test swap() and type-safe Boolean. |
331 { | 331 { |
332 scoped_ptr<ConDecLogger[]> scoper1; | 332 scoped_ptr<ConDecLogger[]> scoper1; |
333 scoped_ptr<ConDecLogger[]> scoper2; | 333 scoped_ptr<ConDecLogger[]> scoper2; |
334 EXPECT_TRUE(scoper1 == scoper2.get()); | 334 EXPECT_TRUE(scoper1.get() == scoper2.get()); |
335 EXPECT_FALSE(scoper1 != scoper2.get()); | 335 EXPECT_FALSE(scoper1.get() != scoper2.get()); |
336 | 336 |
337 ConDecLogger* loggers = new ConDecLogger[kNumLoggers]; | 337 ConDecLogger* loggers = new ConDecLogger[kNumLoggers]; |
338 for (int i = 0; i < kNumLoggers; ++i) { | 338 for (int i = 0; i < kNumLoggers; ++i) { |
339 loggers[i].SetPtr(&constructed); | 339 loggers[i].SetPtr(&constructed); |
340 } | 340 } |
341 scoper1.reset(loggers); | 341 scoper1.reset(loggers); |
342 EXPECT_TRUE(scoper1); | 342 EXPECT_TRUE(scoper1); |
343 EXPECT_EQ(loggers, scoper1.get()); | 343 EXPECT_EQ(loggers, scoper1.get()); |
344 EXPECT_FALSE(scoper2); | 344 EXPECT_FALSE(scoper2); |
345 EXPECT_FALSE(scoper2.get()); | 345 EXPECT_FALSE(scoper2.get()); |
346 EXPECT_FALSE(scoper1 == scoper2.get()); | 346 EXPECT_FALSE(scoper1.get() == scoper2.get()); |
347 EXPECT_TRUE(scoper1 != scoper2.get()); | 347 EXPECT_TRUE(scoper1.get() != scoper2.get()); |
348 | 348 |
349 scoper2.swap(scoper1); | 349 scoper2.swap(scoper1); |
350 EXPECT_EQ(loggers, scoper2.get()); | 350 EXPECT_EQ(loggers, scoper2.get()); |
351 EXPECT_FALSE(scoper1.get()); | 351 EXPECT_FALSE(scoper1.get()); |
352 EXPECT_FALSE(scoper1 == scoper2.get()); | 352 EXPECT_FALSE(scoper1.get() == scoper2.get()); |
353 EXPECT_TRUE(scoper1 != scoper2.get()); | 353 EXPECT_TRUE(scoper1.get() != scoper2.get()); |
354 } | 354 } |
355 EXPECT_EQ(0, constructed); | 355 EXPECT_EQ(0, constructed); |
356 | 356 |
357 { | 357 { |
358 ConDecLogger* loggers = new ConDecLogger[kNumLoggers]; | 358 ConDecLogger* loggers = new ConDecLogger[kNumLoggers]; |
359 scoped_ptr<ConDecLogger[]> scoper(loggers); | 359 scoped_ptr<ConDecLogger[]> scoper(loggers); |
360 EXPECT_TRUE(scoper); | 360 EXPECT_TRUE(scoper); |
361 for (int i = 0; i < kNumLoggers; ++i) { | 361 for (int i = 0; i < kNumLoggers; ++i) { |
362 scoper[i].SetPtr(&constructed); | 362 scoper[i].SetPtr(&constructed); |
363 } | 363 } |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
542 EXPECT_EQ(1, deletes); | 542 EXPECT_EQ(1, deletes); |
543 | 543 |
544 scoper2.reset(&dummy_value2); | 544 scoper2.reset(&dummy_value2); |
545 scoper3.reset(&dummy_value2); | 545 scoper3.reset(&dummy_value2); |
546 EXPECT_EQ(0, alternate_deletes); | 546 EXPECT_EQ(0, alternate_deletes); |
547 | 547 |
548 } | 548 } |
549 EXPECT_EQ(1, deletes); | 549 EXPECT_EQ(1, deletes); |
550 EXPECT_EQ(3, alternate_deletes); | 550 EXPECT_EQ(3, alternate_deletes); |
551 | 551 |
552 // Test swap(), ==, !=, and type-safe Boolean. | 552 // Test swap(), and type-safe Boolean. |
553 { | 553 { |
554 scoped_ptr<double, CountingDeleter> scoper1(NULL, | 554 scoped_ptr<double, CountingDeleter> scoper1(NULL, |
555 CountingDeleter(&deletes)); | 555 CountingDeleter(&deletes)); |
556 scoped_ptr<double, CountingDeleter> scoper2(NULL, | 556 scoped_ptr<double, CountingDeleter> scoper2(NULL, |
557 CountingDeleter(&deletes)); | 557 CountingDeleter(&deletes)); |
558 EXPECT_TRUE(scoper1 == scoper2.get()); | 558 EXPECT_TRUE(scoper1.get() == scoper2.get()); |
559 EXPECT_FALSE(scoper1 != scoper2.get()); | 559 EXPECT_FALSE(scoper1.get() != scoper2.get()); |
560 | 560 |
561 scoper1.reset(&dummy_value); | 561 scoper1.reset(&dummy_value); |
562 EXPECT_TRUE(scoper1); | 562 EXPECT_TRUE(scoper1); |
563 EXPECT_EQ(&dummy_value, scoper1.get()); | 563 EXPECT_EQ(&dummy_value, scoper1.get()); |
564 EXPECT_FALSE(scoper2); | 564 EXPECT_FALSE(scoper2); |
565 EXPECT_FALSE(scoper2.get()); | 565 EXPECT_FALSE(scoper2.get()); |
566 EXPECT_FALSE(scoper1 == scoper2.get()); | 566 EXPECT_FALSE(scoper1.get() == scoper2.get()); |
567 EXPECT_TRUE(scoper1 != scoper2.get()); | 567 EXPECT_TRUE(scoper1.get() != scoper2.get()); |
568 | 568 |
569 scoper2.swap(scoper1); | 569 scoper2.swap(scoper1); |
570 EXPECT_EQ(&dummy_value, scoper2.get()); | 570 EXPECT_EQ(&dummy_value, scoper2.get()); |
571 EXPECT_FALSE(scoper1.get()); | 571 EXPECT_FALSE(scoper1.get()); |
572 EXPECT_FALSE(scoper1 == scoper2.get()); | 572 EXPECT_FALSE(scoper1.get() == scoper2.get()); |
573 EXPECT_TRUE(scoper1 != scoper2.get()); | 573 EXPECT_TRUE(scoper1.get() != scoper2.get()); |
574 } | 574 } |
575 } | 575 } |
576 | 576 |
577 // Sanity check test for overloaded new and delete operators. Does not do full | 577 // Sanity check test for overloaded new and delete operators. Does not do full |
578 // coverage of reset/release/Pass() operations as that is redundant with the | 578 // coverage of reset/release/Pass() operations as that is redundant with the |
579 // above. | 579 // above. |
580 TEST(ScopedPtrTest, OverloadedNewAndDelete) { | 580 TEST(ScopedPtrTest, OverloadedNewAndDelete) { |
581 { | 581 { |
582 OverloadedNewAndDelete::ResetCounters(); | 582 OverloadedNewAndDelete::ResetCounters(); |
583 scoped_ptr<OverloadedNewAndDelete> scoper(new OverloadedNewAndDelete()); | 583 scoped_ptr<OverloadedNewAndDelete> scoper(new OverloadedNewAndDelete()); |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
719 // Go again, but this time, break the cycle by invoking |a|'s destructor. This | 719 // Go again, but this time, break the cycle by invoking |a|'s destructor. This |
720 // tests that the implementation of ~scoped_ptr doesn't infinitely recurse | 720 // tests that the implementation of ~scoped_ptr doesn't infinitely recurse |
721 // into the destructors of |a| and |a->b|. Note, deleting |a| instead will | 721 // into the destructors of |a| and |a->b|. Note, deleting |a| instead will |
722 // cause |a| to be double-free'd because |a->b| owns |a| and deletes it via | 722 // cause |a| to be double-free'd because |a->b| owns |a| and deletes it via |
723 // its destructor. | 723 // its destructor. |
724 a = new StructA; | 724 a = new StructA; |
725 a->b.reset(new StructB); | 725 a->b.reset(new StructB); |
726 a->b->a.reset(a); | 726 a->b->a.reset(a); |
727 a->~StructA(); | 727 a->~StructA(); |
728 } | 728 } |
| 729 |
| 730 TEST(ScopedPtrTest, Operators) { |
| 731 struct Parent {}; |
| 732 struct Child : public Parent {}; |
| 733 |
| 734 scoped_ptr<Parent> p(new Parent); |
| 735 scoped_ptr<Parent> p2(new Parent); |
| 736 scoped_ptr<Child> c(new Child); |
| 737 scoped_ptr<Parent> pnull; |
| 738 |
| 739 // Operator==. |
| 740 EXPECT_TRUE(p == p); |
| 741 EXPECT_FALSE(p == c); |
| 742 EXPECT_FALSE(p == p2); |
| 743 EXPECT_FALSE(p == pnull); |
| 744 |
| 745 EXPECT_FALSE(p == nullptr); |
| 746 EXPECT_FALSE(nullptr == p); |
| 747 EXPECT_TRUE(pnull == nullptr); |
| 748 EXPECT_TRUE(nullptr == pnull); |
| 749 |
| 750 // Operator!=. |
| 751 EXPECT_FALSE(p != p); |
| 752 EXPECT_TRUE(p != c); |
| 753 EXPECT_TRUE(p != p2); |
| 754 EXPECT_TRUE(p != pnull); |
| 755 |
| 756 EXPECT_TRUE(p != nullptr); |
| 757 EXPECT_TRUE(nullptr != p); |
| 758 EXPECT_FALSE(pnull != nullptr); |
| 759 EXPECT_FALSE(nullptr != pnull); |
| 760 |
| 761 // Compare two scoped_ptr<T>. |
| 762 EXPECT_EQ(p.get() < p2.get(), p < p2); |
| 763 EXPECT_EQ(p.get() <= p2.get(), p <= p2); |
| 764 EXPECT_EQ(p.get() > p2.get(), p > p2); |
| 765 EXPECT_EQ(p.get() >= p2.get(), p >= p2); |
| 766 EXPECT_EQ(p2.get() < p.get(), p2 < p); |
| 767 EXPECT_EQ(p2.get() <= p.get(), p2 <= p); |
| 768 EXPECT_EQ(p2.get() > p.get(), p2 > p); |
| 769 EXPECT_EQ(p2.get() >= p.get(), p2 >= p); |
| 770 |
| 771 // And convertible scoped_ptr<T> and scoped_ptr<U>. |
| 772 EXPECT_EQ(p.get() < c.get(), p < c); |
| 773 EXPECT_EQ(p.get() <= c.get(), p <= c); |
| 774 EXPECT_EQ(p.get() > c.get(), p > c); |
| 775 EXPECT_EQ(p.get() >= c.get(), p >= c); |
| 776 EXPECT_EQ(c.get() < p.get(), c < p); |
| 777 EXPECT_EQ(c.get() <= p.get(), c <= p); |
| 778 EXPECT_EQ(c.get() > p.get(), c > p); |
| 779 EXPECT_EQ(c.get() >= p.get(), c >= p); |
| 780 |
| 781 // Compare to nullptr. |
| 782 EXPECT_TRUE(p > nullptr); |
| 783 EXPECT_FALSE(nullptr > p); |
| 784 EXPECT_FALSE(pnull > nullptr); |
| 785 EXPECT_FALSE(nullptr > pnull); |
| 786 |
| 787 EXPECT_TRUE(p >= nullptr); |
| 788 EXPECT_FALSE(nullptr >= p); |
| 789 EXPECT_TRUE(pnull >= nullptr); |
| 790 EXPECT_TRUE(nullptr >= pnull); |
| 791 |
| 792 EXPECT_FALSE(p < nullptr); |
| 793 EXPECT_TRUE(nullptr < p); |
| 794 EXPECT_FALSE(pnull < nullptr); |
| 795 EXPECT_FALSE(nullptr < pnull); |
| 796 |
| 797 EXPECT_FALSE(p <= nullptr); |
| 798 EXPECT_TRUE(nullptr <= p); |
| 799 EXPECT_TRUE(pnull <= nullptr); |
| 800 EXPECT_TRUE(nullptr <= pnull); |
| 801 }; |
| 802 |
| 803 TEST(ScopedPtrTest, ArrayOperators) { |
| 804 struct Parent {}; |
| 805 struct Child : public Parent {}; |
| 806 |
| 807 scoped_ptr<Parent[]> p(new Parent[1]); |
| 808 scoped_ptr<Parent[]> p2(new Parent[1]); |
| 809 scoped_ptr<Child[]> c(new Child[1]); |
| 810 scoped_ptr<Parent[]> pnull; |
| 811 |
| 812 // Operator==. |
| 813 EXPECT_TRUE(p == p); |
| 814 EXPECT_FALSE(p == c); |
| 815 EXPECT_FALSE(p == p2); |
| 816 EXPECT_FALSE(p == pnull); |
| 817 |
| 818 EXPECT_FALSE(p == nullptr); |
| 819 EXPECT_FALSE(nullptr == p); |
| 820 EXPECT_TRUE(pnull == nullptr); |
| 821 EXPECT_TRUE(nullptr == pnull); |
| 822 |
| 823 // Operator!=. |
| 824 EXPECT_FALSE(p != p); |
| 825 EXPECT_TRUE(p != c); |
| 826 EXPECT_TRUE(p != p2); |
| 827 EXPECT_TRUE(p != pnull); |
| 828 |
| 829 EXPECT_TRUE(p != nullptr); |
| 830 EXPECT_TRUE(nullptr != p); |
| 831 EXPECT_FALSE(pnull != nullptr); |
| 832 EXPECT_FALSE(nullptr != pnull); |
| 833 |
| 834 // Compare two scoped_ptr<T>. |
| 835 EXPECT_EQ(p.get() < p2.get(), p < p2); |
| 836 EXPECT_EQ(p.get() <= p2.get(), p <= p2); |
| 837 EXPECT_EQ(p.get() > p2.get(), p > p2); |
| 838 EXPECT_EQ(p.get() >= p2.get(), p >= p2); |
| 839 EXPECT_EQ(p2.get() < p.get(), p2 < p); |
| 840 EXPECT_EQ(p2.get() <= p.get(), p2 <= p); |
| 841 EXPECT_EQ(p2.get() > p.get(), p2 > p); |
| 842 EXPECT_EQ(p2.get() >= p.get(), p2 >= p); |
| 843 |
| 844 // And convertible scoped_ptr<T> and scoped_ptr<U>. |
| 845 EXPECT_EQ(p.get() < c.get(), p < c); |
| 846 EXPECT_EQ(p.get() <= c.get(), p <= c); |
| 847 EXPECT_EQ(p.get() > c.get(), p > c); |
| 848 EXPECT_EQ(p.get() >= c.get(), p >= c); |
| 849 EXPECT_EQ(c.get() < p.get(), c < p); |
| 850 EXPECT_EQ(c.get() <= p.get(), c <= p); |
| 851 EXPECT_EQ(c.get() > p.get(), c > p); |
| 852 EXPECT_EQ(c.get() >= p.get(), c >= p); |
| 853 |
| 854 // Compare to nullptr. |
| 855 EXPECT_TRUE(p > nullptr); |
| 856 EXPECT_FALSE(nullptr > p); |
| 857 EXPECT_FALSE(pnull > nullptr); |
| 858 EXPECT_FALSE(nullptr > pnull); |
| 859 |
| 860 EXPECT_TRUE(p >= nullptr); |
| 861 EXPECT_FALSE(nullptr >= p); |
| 862 EXPECT_TRUE(pnull >= nullptr); |
| 863 EXPECT_TRUE(nullptr >= pnull); |
| 864 |
| 865 EXPECT_FALSE(p < nullptr); |
| 866 EXPECT_TRUE(nullptr < p); |
| 867 EXPECT_FALSE(pnull < nullptr); |
| 868 EXPECT_FALSE(nullptr < pnull); |
| 869 |
| 870 EXPECT_FALSE(p <= nullptr); |
| 871 EXPECT_TRUE(nullptr <= p); |
| 872 EXPECT_TRUE(pnull <= nullptr); |
| 873 EXPECT_TRUE(nullptr <= pnull); |
| 874 } |
OLD | NEW |