Index: base/bind_unittest.cc |
diff --git a/base/bind_unittest.cc b/base/bind_unittest.cc |
index 1e3540bf7e7019623af97f931a8cc870891f725d..68a18996c00959ff80ac235523cfe1d6e4872351 100644 |
--- a/base/bind_unittest.cc |
+++ b/base/bind_unittest.cc |
@@ -1069,6 +1069,80 @@ TEST_F(BindTest, CapturelessLambda) { |
EXPECT_EQ(42, x); |
} |
+TEST_F(BindTest, OneShotCallback) { |
+ using internal::RepeatingClosure; |
+ using internal::OneShotClosure; |
+ using internal::BindOneShot; |
+ using internal::BindRepeating; |
+ using internal::OneShotCallback; |
+ |
+ // Check if Callback variants have declarations of conversions as expected. |
+ // Copy constructor and assignment of RepeatingCallback. |
+ EXPECT_TRUE((std::is_constructible< |
dcheng
2016/08/26 07:37:56
Maybe these should be static_assert? Not sure if w
tzik
2016/08/30 11:31:40
Done.
|
+ RepeatingClosure, const RepeatingClosure&>::value)); |
+ EXPECT_TRUE((is_assignable< |
+ RepeatingClosure, const RepeatingClosure&>::value)); |
+ |
+ // Move constructor and assignment of RepeatingCallback. |
+ EXPECT_TRUE((std::is_constructible< |
+ RepeatingClosure, RepeatingClosure&&>::value)); |
+ EXPECT_TRUE((is_assignable< |
+ RepeatingClosure, RepeatingClosure&&>::value)); |
+ |
+ // Conversions from OneShotCallback to RepeatingCallback. |
+ EXPECT_FALSE((std::is_constructible< |
+ RepeatingClosure, const OneShotClosure&>::value)); |
+ EXPECT_FALSE((is_assignable< |
+ RepeatingClosure, const OneShotClosure&>::value)); |
+ |
+ // Destructive conversions from OneShotCallback to RepeatingCallback. |
+ EXPECT_FALSE((std::is_constructible< |
+ RepeatingClosure, OneShotClosure&&>::value)); |
+ EXPECT_FALSE((is_assignable< |
+ RepeatingClosure, OneShotClosure&&>::value)); |
+ |
+ // Copy constructor and assignment of OneShotCallback. |
+ EXPECT_FALSE((std::is_constructible< |
+ OneShotClosure, const OneShotClosure&>::value)); |
+ EXPECT_FALSE((is_assignable< |
+ OneShotClosure, const OneShotClosure&>::value)); |
+ |
+ // Move constructor and assignment of OneShotCallback. |
+ EXPECT_TRUE((std::is_constructible< |
+ OneShotClosure, OneShotClosure&&>::value)); |
+ EXPECT_TRUE((is_assignable< |
+ OneShotClosure, OneShotClosure&&>::value)); |
+ |
+ // Conversions from RepeatingCallback to OneShotCallback. |
+ EXPECT_TRUE((std::is_constructible< |
+ OneShotClosure, const RepeatingClosure&>::value)); |
+ EXPECT_TRUE((is_assignable< |
+ OneShotClosure, const RepeatingClosure&>::value)); |
+ |
+ // Destructive conversions from RepeatingCallback to OneShotCallback. |
+ EXPECT_TRUE((std::is_constructible< |
+ OneShotClosure, RepeatingClosure&&>::value)); |
+ EXPECT_TRUE((is_assignable< |
+ OneShotClosure, RepeatingClosure&&>::value)); |
+ |
+ OneShotClosure cb = BindOneShot(&VoidPolymorphic<>::Run); |
+ std::move(cb).Run(); |
+ |
+ // RepeatingCallback should be convertible to OneShotCallback. |
+ OneShotClosure cb2 = BindRepeating(&VoidPolymorphic<>::Run); |
+ std::move(cb2).Run(); |
+ |
+ RepeatingClosure cb3 = BindRepeating(&VoidPolymorphic<>::Run); |
+ cb = cb3; |
+ std::move(cb).Run(); |
+ |
+ cb = std::move(cb2); |
+ |
+ OneShotCallback<void(int)> cb4 = BindOneShot( |
+ &VoidPolymorphic<std::unique_ptr<int>, int>::Run, MakeUnique<int>(0)); |
+ BindOneShot(std::move(cb4), 1).Run(); |
+} |
+ |
// Callback construction and assignment tests. |
// - Construction from an InvokerStorageHolder should not cause ref/deref. |
// - Assignment from other callback should only cause one ref |