Index: base/bind_unittest.cc |
diff --git a/base/bind_unittest.cc b/base/bind_unittest.cc |
index ba0358e5699cba33fdb202551e4f1204d95042c5..3b9afa1a42f49439f1c6e55fa94e45d72e9194f9 100644 |
--- a/base/bind_unittest.cc |
+++ b/base/bind_unittest.cc |
@@ -1034,6 +1034,96 @@ TEST_F(BindTest, CapturelessLambda) { |
EXPECT_EQ(42, x); |
} |
+TEST_F(BindTest, OnceCallback) { |
+ using internal::RepeatingClosure; |
+ using internal::OnceClosure; |
+ using internal::BindOnce; |
+ using internal::BindRepeating; |
+ using internal::OnceCallback; |
+ |
+ // Check if Callback variants have declarations of conversions as expected. |
+ // Copy constructor and assignment of RepeatingCallback. |
+ static_assert(std::is_constructible< |
+ RepeatingClosure, const RepeatingClosure&>::value, |
+ "RepeatingClosure should be copyable."); |
+ static_assert(is_assignable< |
+ RepeatingClosure, const RepeatingClosure&>::value, |
+ "RepeatingClosure should be copy-assignable."); |
+ |
+ // Move constructor and assignment of RepeatingCallback. |
+ static_assert(std::is_constructible< |
+ RepeatingClosure, RepeatingClosure&&>::value, |
+ "RepeatingClosure should be movable."); |
+ static_assert(is_assignable< |
+ RepeatingClosure, RepeatingClosure&&>::value, |
+ "RepeatingClosure should be move-assignable"); |
+ |
+ // Conversions from OnceCallback to RepeatingCallback. |
+ static_assert(!std::is_constructible< |
+ RepeatingClosure, const OnceClosure&>::value, |
+ "OnceClosure should not be convertible to RepeatingClosure."); |
+ static_assert(!is_assignable< |
+ RepeatingClosure, const OnceClosure&>::value, |
+ "OnceClosure should not be convertible to RepeatingClosure."); |
+ |
+ // Destructive conversions from OnceCallback to RepeatingCallback. |
+ static_assert(!std::is_constructible< |
+ RepeatingClosure, OnceClosure&&>::value, |
+ "OnceClosure should not be convertible to RepeatingClosure."); |
+ static_assert(!is_assignable< |
+ RepeatingClosure, OnceClosure&&>::value, |
+ "OnceClosure should not be convertible to RepeatingClosure."); |
+ |
+ // Copy constructor and assignment of OnceCallback. |
+ static_assert(!std::is_constructible< |
+ OnceClosure, const OnceClosure&>::value, |
+ "OnceClosure should not be copyable."); |
+ static_assert(!is_assignable< |
+ OnceClosure, const OnceClosure&>::value, |
+ "OnceClosure should not be copy-assignable"); |
+ |
+ // Move constructor and assignment of OnceCallback. |
+ static_assert(std::is_constructible< |
+ OnceClosure, OnceClosure&&>::value, |
+ "OnceClosure should be movable."); |
+ static_assert(is_assignable< |
+ OnceClosure, OnceClosure&&>::value, |
+ "OnceClosure should be move-assignable."); |
+ |
+ // Conversions from RepeatingCallback to OnceCallback. |
+ static_assert(std::is_constructible< |
+ OnceClosure, const RepeatingClosure&>::value, |
+ "RepeatingClosure should be convertible to OnceClosure."); |
+ static_assert(is_assignable< |
+ OnceClosure, const RepeatingClosure&>::value, |
+ "RepeatingClosure should be convertible to OnceClosure."); |
+ |
+ // Destructive conversions from RepeatingCallback to OnceCallback. |
+ static_assert(std::is_constructible< |
+ OnceClosure, RepeatingClosure&&>::value, |
+ "RepeatingClosure should be convertible to OnceClosure."); |
+ static_assert(is_assignable< |
+ OnceClosure, RepeatingClosure&&>::value, |
+ "RepeatingClosure should be covretible to OnceClosure."); |
+ |
+ OnceClosure cb = BindOnce(&VoidPolymorphic<>::Run); |
+ std::move(cb).Run(); |
+ |
+ // RepeatingCallback should be convertible to OnceCallback. |
+ OnceClosure cb2 = BindRepeating(&VoidPolymorphic<>::Run); |
+ std::move(cb2).Run(); |
+ |
+ RepeatingClosure cb3 = BindRepeating(&VoidPolymorphic<>::Run); |
+ cb = cb3; |
+ std::move(cb).Run(); |
+ |
+ cb = std::move(cb2); |
+ |
+ OnceCallback<void(int)> cb4 = BindOnce( |
+ &VoidPolymorphic<std::unique_ptr<int>, int>::Run, MakeUnique<int>(0)); |
+ BindOnce(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 |