Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(361)

Side by Side Diff: base/memory/scoped_ptr_unittest.cc

Issue 1440593004: Make operators on scoped_ptr match the ones defined for std::unique_ptr (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: scopedptrequals: operators-review Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698