| Index: base/bind_unittest.cc
|
| diff --git a/base/bind_unittest.cc b/base/bind_unittest.cc
|
| index 7850ea6b740d263c175df9adf8cc0701391c4983..fe72f281e75bce8f5d9a908e5cff9bd5a993a41e 100644
|
| --- a/base/bind_unittest.cc
|
| +++ b/base/bind_unittest.cc
|
| @@ -712,80 +712,57 @@ TEST_F(BindTest, Owned) {
|
| EXPECT_EQ(1, deletes);
|
| }
|
|
|
| -// Passed() wrapper support.
|
| +// Tests for Passed() wrapper support:
|
| // - Passed() can be constructed from a pointer to scoper.
|
| // - Passed() can be constructed from a scoper rvalue.
|
| // - Using Passed() gives Callback Ownership.
|
| // - Ownership is transferred from Callback to callee on the first Run().
|
| // - Callback supports unbound arguments.
|
| -TEST_F(BindTest, ScopedPtr) {
|
| - int deletes = 0;
|
| +template <typename T>
|
| +class BindMoveOnlyTypeTest : public ::testing::Test {
|
| +};
|
|
|
| - // Tests the Passed() function's support for pointers.
|
| - scoped_ptr<DeleteCounter> ptr(new DeleteCounter(&deletes));
|
| - Callback<scoped_ptr<DeleteCounter>()> unused_callback =
|
| - Bind(&PassThru<scoped_ptr<DeleteCounter> >, Passed(&ptr));
|
| - EXPECT_FALSE(ptr.get());
|
| - EXPECT_EQ(0, deletes);
|
| +struct CustomDeleter {
|
| + void operator()(DeleteCounter* c) { delete c; }
|
| +};
|
|
|
| - // If we never invoke the Callback, it retains ownership and deletes.
|
| - unused_callback.Reset();
|
| - EXPECT_EQ(1, deletes);
|
| +using MoveOnlyTypesToTest =
|
| + ::testing::Types<scoped_ptr<DeleteCounter>,
|
| + std::unique_ptr<DeleteCounter>,
|
| + std::unique_ptr<DeleteCounter, CustomDeleter>>;
|
| +TYPED_TEST_CASE(BindMoveOnlyTypeTest, MoveOnlyTypesToTest);
|
|
|
| - // Tests the Passed() function's support for rvalues.
|
| - deletes = 0;
|
| - DeleteCounter* counter = new DeleteCounter(&deletes);
|
| - Callback<scoped_ptr<DeleteCounter>()> callback =
|
| - Bind(&PassThru<scoped_ptr<DeleteCounter> >,
|
| - Passed(scoped_ptr<DeleteCounter>(counter)));
|
| - EXPECT_FALSE(ptr.get());
|
| - EXPECT_EQ(0, deletes);
|
| +TYPED_TEST(BindMoveOnlyTypeTest, PassedToBoundCallback) {
|
| + int deletes = 0;
|
|
|
| - // Check that ownership can be transferred back out.
|
| - scoped_ptr<DeleteCounter> result = callback.Run();
|
| - ASSERT_EQ(counter, result.get());
|
| + TypeParam ptr(new DeleteCounter(&deletes));
|
| + Callback<TypeParam()> callback = Bind(&PassThru<TypeParam>, Passed(&ptr));
|
| + EXPECT_FALSE(ptr.get());
|
| EXPECT_EQ(0, deletes);
|
|
|
| - // Resetting does not delete since ownership was transferred.
|
| + // If we never invoke the Callback, it retains ownership and deletes.
|
| callback.Reset();
|
| - EXPECT_EQ(0, deletes);
|
| -
|
| - // Ensure that we actually did get ownership.
|
| - result.reset();
|
| EXPECT_EQ(1, deletes);
|
| -
|
| - // Test unbound argument forwarding.
|
| - Callback<scoped_ptr<DeleteCounter>(scoped_ptr<DeleteCounter>)> cb_unbound =
|
| - Bind(&PassThru<scoped_ptr<DeleteCounter> >);
|
| - ptr.reset(new DeleteCounter(&deletes));
|
| - cb_unbound.Run(std::move(ptr));
|
| }
|
|
|
| -TEST_F(BindTest, UniquePtr) {
|
| +TYPED_TEST(BindMoveOnlyTypeTest, PassedWithRvalue) {
|
| int deletes = 0;
|
| -
|
| - // Tests the Passed() function's support for pointers.
|
| - std::unique_ptr<DeleteCounter> ptr(new DeleteCounter(&deletes));
|
| - Callback<std::unique_ptr<DeleteCounter>()> unused_callback =
|
| - Bind(&PassThru<std::unique_ptr<DeleteCounter>>, Passed(&ptr));
|
| - EXPECT_FALSE(ptr.get());
|
| + Callback<TypeParam()> callback = Bind(
|
| + &PassThru<TypeParam>, Passed(TypeParam(new DeleteCounter(&deletes))));
|
| EXPECT_EQ(0, deletes);
|
|
|
| // If we never invoke the Callback, it retains ownership and deletes.
|
| - unused_callback.Reset();
|
| + callback.Reset();
|
| EXPECT_EQ(1, deletes);
|
| +}
|
|
|
| - // Tests the Passed() function's support for rvalues.
|
| - deletes = 0;
|
| +// Check that ownership can be transferred back out.
|
| +TYPED_TEST(BindMoveOnlyTypeTest, ReturnMoveOnlyType) {
|
| + int deletes = 0;
|
| DeleteCounter* counter = new DeleteCounter(&deletes);
|
| - Callback<std::unique_ptr<DeleteCounter>()> callback =
|
| - Bind(&PassThru<std::unique_ptr<DeleteCounter>>,
|
| - Passed(std::unique_ptr<DeleteCounter>(counter)));
|
| - EXPECT_FALSE(ptr.get());
|
| - EXPECT_EQ(0, deletes);
|
| -
|
| - // Check that ownership can be transferred back out.
|
| - std::unique_ptr<DeleteCounter> result = callback.Run();
|
| + Callback<TypeParam()> callback =
|
| + Bind(&PassThru<TypeParam>, Passed(TypeParam(counter)));
|
| + TypeParam result = callback.Run();
|
| ASSERT_EQ(counter, result.get());
|
| EXPECT_EQ(0, deletes);
|
|
|
| @@ -796,12 +773,15 @@ TEST_F(BindTest, UniquePtr) {
|
| // Ensure that we actually did get ownership.
|
| result.reset();
|
| EXPECT_EQ(1, deletes);
|
| +}
|
|
|
| +TYPED_TEST(BindMoveOnlyTypeTest, UnboundForwarding) {
|
| + int deletes = 0;
|
| + TypeParam ptr(new DeleteCounter(&deletes));
|
| // Test unbound argument forwarding.
|
| - Callback<std::unique_ptr<DeleteCounter>(std::unique_ptr<DeleteCounter>)>
|
| - cb_unbound = Bind(&PassThru<std::unique_ptr<DeleteCounter>>);
|
| - ptr.reset(new DeleteCounter(&deletes));
|
| + Callback<TypeParam(TypeParam)> cb_unbound = Bind(&PassThru<TypeParam>);
|
| cb_unbound.Run(std::move(ptr));
|
| + EXPECT_EQ(1, deletes);
|
| }
|
|
|
| // Argument Copy-constructor usage for non-reference parameters.
|
|
|