1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/callback_helpers.h"
10 #include "base/bind.h"
11 #include "base/callback.h"
12 #include "testing/gtest/include/gtest/gtest.h"
16 TEST(CallbackHelpersTest, IsBaseCallback) {
17 // Check that base::{Once,Repeating}Closures and references to them are
18 // considered base::{Once,Repeating}Callbacks.
19 static_assert(base::IsBaseCallback<base::OnceClosure>::value, "");
20 static_assert(base::IsBaseCallback<base::RepeatingClosure>::value, "");
21 static_assert(base::IsBaseCallback<base::OnceClosure&&>::value, "");
22 static_assert(base::IsBaseCallback<const base::RepeatingClosure&>::value, "");
24 // Check that base::Callbacks with a given RunType and references to them are
25 // considered base::Callbacks.
26 static_assert(base::IsBaseCallback<base::OnceCallback<int(int)>>::value, "");
27 static_assert(base::IsBaseCallback<base::RepeatingCallback<int(int)>>::value,
29 static_assert(base::IsBaseCallback<base::OnceCallback<int(int)>&&>::value,
32 base::IsBaseCallback<const base::RepeatingCallback<int(int)>&>::value,
35 // Check that POD types are not considered base::Callbacks.
36 static_assert(!base::IsBaseCallback<bool>::value, "");
37 static_assert(!base::IsBaseCallback<int>::value, "");
38 static_assert(!base::IsBaseCallback<double>::value, "");
40 // Check that the closely related std::function is not considered a
42 static_assert(!base::IsBaseCallback<std::function<void()>>::value, "");
43 static_assert(!base::IsBaseCallback<const std::function<void()>&>::value, "");
44 static_assert(!base::IsBaseCallback<std::function<void()>&&>::value, "");
47 TEST(CallbackHelpersTest, IsOnceCallback) {
48 // Check that base::OnceClosures and references to them are considered
49 // base::OnceCallbacks, but base::RepeatingClosures are not.
50 static_assert(base::IsOnceCallback<base::OnceClosure>::value, "");
51 static_assert(!base::IsOnceCallback<base::RepeatingClosure>::value, "");
52 static_assert(base::IsOnceCallback<base::OnceClosure&&>::value, "");
53 static_assert(!base::IsOnceCallback<const base::RepeatingClosure&>::value,
56 // Check that base::OnceCallbacks with a given RunType and references to them
57 // are considered base::OnceCallbacks, but base::RepeatingCallbacks are not.
58 static_assert(base::IsOnceCallback<base::OnceCallback<int(int)>>::value, "");
59 static_assert(!base::IsOnceCallback<base::RepeatingCallback<int(int)>>::value,
61 static_assert(base::IsOnceCallback<base::OnceCallback<int(int)>&&>::value,
64 !base::IsOnceCallback<const base::RepeatingCallback<int(int)>&>::value,
67 // Check that POD types are not considered base::OnceCallbacks.
68 static_assert(!base::IsOnceCallback<bool>::value, "");
69 static_assert(!base::IsOnceCallback<int>::value, "");
70 static_assert(!base::IsOnceCallback<double>::value, "");
72 // Check that the closely related std::function is not considered a
73 // base::OnceCallback.
74 static_assert(!base::IsOnceCallback<std::function<void()>>::value, "");
75 static_assert(!base::IsOnceCallback<const std::function<void()>&>::value, "");
76 static_assert(!base::IsOnceCallback<std::function<void()>&&>::value, "");
78 // Check that the result of BindOnce is a OnceCallback, but not if it's
79 // wrapped in AdaptCallbackForRepeating.
80 auto cb = base::BindOnce([](int* count) { ++*count; });
81 static_assert(base::IsOnceCallback<decltype(cb)>::value, "");
82 auto wrapped = base::AdaptCallbackForRepeating(std::move(cb));
83 static_assert(!base::IsOnceCallback<decltype(wrapped)>::value, "");
86 void Increment(int* value) {
90 TEST(CallbackHelpersTest, TestScopedClosureRunnerExitScope) {
93 base::ScopedClosureRunner runner(base::BindOnce(&Increment, &run_count));
94 EXPECT_EQ(0, run_count);
96 EXPECT_EQ(1, run_count);
99 TEST(CallbackHelpersTest, TestScopedClosureRunnerRelease) {
103 base::ScopedClosureRunner runner(base::BindOnce(&Increment, &run_count));
104 c = runner.Release();
105 EXPECT_EQ(0, run_count);
107 EXPECT_EQ(0, run_count);
109 EXPECT_EQ(1, run_count);
112 TEST(CallbackHelpersTest, TestScopedClosureRunnerReplaceClosure) {
116 base::ScopedClosureRunner runner;
117 runner.ReplaceClosure(base::BindOnce(&Increment, &run_count_1));
118 runner.ReplaceClosure(base::BindOnce(&Increment, &run_count_2));
119 EXPECT_EQ(0, run_count_1);
120 EXPECT_EQ(0, run_count_2);
122 EXPECT_EQ(0, run_count_1);
123 EXPECT_EQ(1, run_count_2);
126 TEST(CallbackHelpersTest, TestScopedClosureRunnerRunAndReset) {
129 base::ScopedClosureRunner runner(base::BindOnce(&Increment, &run_count_3));
130 EXPECT_EQ(0, run_count_3);
131 runner.RunAndReset();
132 EXPECT_EQ(1, run_count_3);
134 EXPECT_EQ(1, run_count_3);
137 TEST(CallbackHelpersTest, TestScopedClosureRunnerMoveConstructor) {
140 std::unique_ptr<base::ScopedClosureRunner> runner(
141 new base::ScopedClosureRunner(base::BindOnce(&Increment, &run_count)));
142 base::ScopedClosureRunner runner2(std::move(*runner));
144 EXPECT_EQ(0, run_count);
146 EXPECT_EQ(1, run_count);
149 TEST(CallbackHelpersTest, TestScopedClosureRunnerMoveAssignment) {
153 base::ScopedClosureRunner runner(base::BindOnce(&Increment, &run_count_1));
155 base::ScopedClosureRunner runner2(
156 base::BindOnce(&Increment, &run_count_2));
157 runner = std::move(runner2);
158 EXPECT_EQ(0, run_count_1);
159 EXPECT_EQ(0, run_count_2);
161 EXPECT_EQ(0, run_count_1);
162 EXPECT_EQ(0, run_count_2);
164 EXPECT_EQ(0, run_count_1);
165 EXPECT_EQ(1, run_count_2);
168 TEST(CallbackHelpersTest, TestAdaptCallbackForRepeating) {
170 base::OnceCallback<void(int*)> cb =
171 base::BindOnce([](int* count) { ++*count; });
173 base::RepeatingCallback<void(int*)> wrapped =
174 base::AdaptCallbackForRepeating(std::move(cb));