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

Side by Side Diff: base/bind_unittest.cc

Issue 8931008: Revert of "Redo r113722 - Add Pass(), which implements move semantics, to scoped_ptr, scoped_ar..." (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebased Created 9 years 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 | Annotate | Revision Log
« no previous file with comments | « base/bind_internal.h.pump ('k') | base/callback.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/bind.h" 5 #include "base/bind.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "base/memory/ref_counted.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/memory/weak_ptr.h"
11 #include "testing/gmock/include/gmock/gmock.h" 8 #include "testing/gmock/include/gmock/gmock.h"
12 #include "testing/gtest/include/gtest/gtest.h" 9 #include "testing/gtest/include/gtest/gtest.h"
13 10
14 using ::testing::Mock; 11 using ::testing::Mock;
15 using ::testing::Return; 12 using ::testing::Return;
16 using ::testing::StrictMock; 13 using ::testing::StrictMock;
17 14
18 namespace base { 15 namespace base {
19 namespace { 16 namespace {
20 17
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 CopyCounter(int* copies, int* assigns) 95 CopyCounter(int* copies, int* assigns)
99 : copies_(copies), assigns_(assigns) { 96 : copies_(copies), assigns_(assigns) {
100 } 97 }
101 98
102 CopyCounter(const CopyCounter& other) 99 CopyCounter(const CopyCounter& other)
103 : copies_(other.copies_), 100 : copies_(other.copies_),
104 assigns_(other.assigns_) { 101 assigns_(other.assigns_) {
105 (*copies_)++; 102 (*copies_)++;
106 } 103 }
107 104
108 // Probing for copies from coercion. 105 // Probing for copies from coerscion.
109 CopyCounter(const DerivedCopyCounter& other) 106 CopyCounter(const DerivedCopyCounter& other)
110 : copies_(other.copies_), 107 : copies_(other.copies_),
111 assigns_(other.assigns_) { 108 assigns_(other.assigns_) {
112 (*copies_)++; 109 (*copies_)++;
113 } 110 }
114 111
115 const CopyCounter& operator=(const CopyCounter& rhs) { 112 const CopyCounter& operator=(const CopyCounter& rhs) {
116 copies_ = rhs.copies_; 113 copies_ = rhs.copies_;
117 assigns_ = rhs.assigns_; 114 assigns_ = rhs.assigns_;
118 115
(...skipping 26 matching lines...) Expand all
145 ~DeleteCounter() { 142 ~DeleteCounter() {
146 (*deletes_)++; 143 (*deletes_)++;
147 } 144 }
148 145
149 void VoidMethod0() {} 146 void VoidMethod0() {}
150 147
151 private: 148 private:
152 int* deletes_; 149 int* deletes_;
153 }; 150 };
154 151
155 template <typename T>
156 T PassThru(T scoper) {
157 return scoper.Pass();
158 }
159
160 // Some test functions that we can Bind to. 152 // Some test functions that we can Bind to.
161 template <typename T> 153 template <typename T>
162 T PolymorphicIdentity(T t) { 154 T PolymorphicIdentity(T t) {
163 return t; 155 return t;
164 } 156 }
165 157
166 template <typename T> 158 template <typename T>
167 void VoidPolymorphic1(T t) { 159 void VoidPolymorphic1(T t) {
168 } 160 }
169 161
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after
642 634
643 // Test Owned() support. 635 // Test Owned() support.
644 TEST_F(BindTest, Owned) { 636 TEST_F(BindTest, Owned) {
645 int deletes = 0; 637 int deletes = 0;
646 DeleteCounter* counter = new DeleteCounter(&deletes); 638 DeleteCounter* counter = new DeleteCounter(&deletes);
647 639
648 // If we don't capture, delete happens on Callback destruction/reset. 640 // If we don't capture, delete happens on Callback destruction/reset.
649 // return the same value. 641 // return the same value.
650 Callback<DeleteCounter*(void)> no_capture_cb = 642 Callback<DeleteCounter*(void)> no_capture_cb =
651 Bind(&PolymorphicIdentity<DeleteCounter*>, Owned(counter)); 643 Bind(&PolymorphicIdentity<DeleteCounter*>, Owned(counter));
652 ASSERT_EQ(counter, no_capture_cb.Run()); 644 EXPECT_EQ(counter, no_capture_cb.Run());
653 ASSERT_EQ(counter, no_capture_cb.Run()); 645 EXPECT_EQ(counter, no_capture_cb.Run());
654 EXPECT_EQ(0, deletes); 646 EXPECT_EQ(0, deletes);
655 no_capture_cb.Reset(); // This should trigger a delete. 647 no_capture_cb.Reset(); // This should trigger a delete.
656 EXPECT_EQ(1, deletes); 648 EXPECT_EQ(1, deletes);
657 649
658 deletes = 0; 650 deletes = 0;
659 counter = new DeleteCounter(&deletes); 651 counter = new DeleteCounter(&deletes);
660 base::Closure own_object_cb = 652 base::Closure own_object_cb =
661 Bind(&DeleteCounter::VoidMethod0, Owned(counter)); 653 Bind(&DeleteCounter::VoidMethod0, Owned(counter));
662 own_object_cb.Run(); 654 own_object_cb.Run();
663 EXPECT_EQ(0, deletes); 655 EXPECT_EQ(0, deletes);
664 own_object_cb.Reset(); 656 own_object_cb.Reset();
665 EXPECT_EQ(1, deletes); 657 EXPECT_EQ(1, deletes);
666 } 658 }
667 659
668 // Passed() wrapper support.
669 // - Passed() can be constructed from a pointer to scoper.
670 // - Passed() can be constructed from a scoper rvalue.
671 // - Using Passed() gives Callback Ownership.
672 // - Ownership is transferred from Callback to callee on the first Run().
673 // - Callback supports unbound arguments.
674 TEST_F(BindTest, ScopedPtr) {
675 int deletes = 0;
676
677 // Tests the Passed() function's support for pointers.
678 scoped_ptr<DeleteCounter> ptr(new DeleteCounter(&deletes));
679 Callback<scoped_ptr<DeleteCounter>(void)> unused_callback =
680 Bind(&PassThru<scoped_ptr<DeleteCounter> >, Passed(&ptr));
681 EXPECT_FALSE(ptr.get());
682 EXPECT_EQ(0, deletes);
683
684 // If we never invoke the Callback, it retains ownership and deletes.
685 unused_callback.Reset();
686 EXPECT_EQ(1, deletes);
687
688 // Tests the Passed() function's support for rvalues.
689 deletes = 0;
690 DeleteCounter* counter = new DeleteCounter(&deletes);
691 Callback<scoped_ptr<DeleteCounter>(void)> callback =
692 Bind(&PassThru<scoped_ptr<DeleteCounter> >,
693 Passed(scoped_ptr<DeleteCounter>(counter)));
694 EXPECT_FALSE(ptr.get());
695 EXPECT_EQ(0, deletes);
696
697 // Check that ownership can be transferred back out.
698 scoped_ptr<DeleteCounter> result = callback.Run();
699 ASSERT_EQ(counter, result.get());
700 EXPECT_EQ(0, deletes);
701
702 // Resetting does not delete since ownership was transferred.
703 callback.Reset();
704 EXPECT_EQ(0, deletes);
705
706 // Ensure that we actually did get ownership.
707 result.reset();
708 EXPECT_EQ(1, deletes);
709
710 // Test unbound argument forwarding.
711 Callback<scoped_ptr<DeleteCounter>(scoped_ptr<DeleteCounter>)> cb_unbound =
712 Bind(&PassThru<scoped_ptr<DeleteCounter> >);
713 ptr.reset(new DeleteCounter(&deletes));
714 cb_unbound.Run(ptr.Pass());
715 }
716
717 // Argument Copy-constructor usage for non-reference parameters. 660 // Argument Copy-constructor usage for non-reference parameters.
718 // - Bound arguments are only copied once. 661 // - Bound arguments are only copied once.
719 // - Forwarded arguments are only copied once. 662 // - Forwarded arguments are only copied once.
720 // - Forwarded arguments with coercions are only copied twice (once for the 663 // - Forwarded arguments with coerscions are only copied twice (once for the
721 // coercion, and one for the final dispatch). 664 // coerscion, and one for the final dispatch).
722 TEST_F(BindTest, ArgumentCopies) { 665 TEST_F(BindTest, ArgumentCopies) {
723 int copies = 0; 666 int copies = 0;
724 int assigns = 0; 667 int assigns = 0;
725 668
726 CopyCounter counter(&copies, &assigns); 669 CopyCounter counter(&copies, &assigns);
727 670
728 Callback<void(void)> copy_cb = 671 Callback<void(void)> copy_cb =
729 Bind(&VoidPolymorphic1<CopyCounter>, counter); 672 Bind(&VoidPolymorphic1<CopyCounter>, counter);
730 EXPECT_GE(1, copies); 673 EXPECT_GE(1, copies);
731 EXPECT_EQ(0, assigns); 674 EXPECT_EQ(0, assigns);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
770 Callback<int(void)> fastcall_cb = Bind(&FastCallFunc, 1); 713 Callback<int(void)> fastcall_cb = Bind(&FastCallFunc, 1);
771 EXPECT_EQ(1, fastcall_cb.Run()); 714 EXPECT_EQ(1, fastcall_cb.Run());
772 715
773 Callback<int(void)> stdcall_cb = Bind(&StdCallFunc, 2); 716 Callback<int(void)> stdcall_cb = Bind(&StdCallFunc, 2);
774 EXPECT_EQ(2, stdcall_cb.Run()); 717 EXPECT_EQ(2, stdcall_cb.Run());
775 } 718 }
776 #endif 719 #endif
777 720
778 } // namespace 721 } // namespace
779 } // namespace base 722 } // namespace base
OLDNEW
« no previous file with comments | « base/bind_internal.h.pump ('k') | base/callback.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698