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"
8 #include "base/callback.h"
9 #include "testing/gtest/include/gtest/gtest.h"
13 void Increment(int* value) {
17 TEST(CallbackHelpersTest, TestResetAndReturn) {
20 base::Closure cb = base::Bind(&Increment, &run_count);
21 EXPECT_EQ(0, run_count);
22 base::ResetAndReturn(&cb).Run();
23 EXPECT_EQ(1, run_count);
28 base::OnceClosure cb2 = base::BindOnce(&Increment, &run_count);
29 EXPECT_EQ(0, run_count);
30 base::ResetAndReturn(&cb2).Run();
31 EXPECT_EQ(1, run_count);
35 TEST(CallbackHelpersTest, TestScopedClosureRunnerExitScope) {
38 base::ScopedClosureRunner runner(base::Bind(&Increment, &run_count));
39 EXPECT_EQ(0, run_count);
41 EXPECT_EQ(1, run_count);
44 TEST(CallbackHelpersTest, TestScopedClosureRunnerRelease) {
48 base::ScopedClosureRunner runner(base::Bind(&Increment, &run_count));
50 EXPECT_EQ(0, run_count);
52 EXPECT_EQ(0, run_count);
54 EXPECT_EQ(1, run_count);
57 TEST(CallbackHelpersTest, TestScopedClosureRunnerReplaceClosure) {
61 base::ScopedClosureRunner runner;
62 runner.ReplaceClosure(base::Bind(&Increment, &run_count_1));
63 runner.ReplaceClosure(base::Bind(&Increment, &run_count_2));
64 EXPECT_EQ(0, run_count_1);
65 EXPECT_EQ(0, run_count_2);
67 EXPECT_EQ(0, run_count_1);
68 EXPECT_EQ(1, run_count_2);
71 TEST(CallbackHelpersTest, TestScopedClosureRunnerRunAndReset) {
74 base::ScopedClosureRunner runner(base::Bind(&Increment, &run_count_3));
75 EXPECT_EQ(0, run_count_3);
77 EXPECT_EQ(1, run_count_3);
79 EXPECT_EQ(1, run_count_3);
82 TEST(CallbackHelpersTest, TestScopedClosureRunnerMoveConstructor) {
85 std::unique_ptr<base::ScopedClosureRunner> runner(
86 new base::ScopedClosureRunner(base::Bind(&Increment, &run_count)));
87 base::ScopedClosureRunner runner2(std::move(*runner));
89 EXPECT_EQ(0, run_count);
91 EXPECT_EQ(1, run_count);
94 TEST(CallbackHelpersTest, TestScopedClosureRunnerMoveAssignment) {
98 base::ScopedClosureRunner runner(base::Bind(&Increment, &run_count_1));
100 base::ScopedClosureRunner runner2(base::Bind(&Increment, &run_count_2));
101 runner = std::move(runner2);
102 EXPECT_EQ(0, run_count_1);
103 EXPECT_EQ(0, run_count_2);
105 EXPECT_EQ(0, run_count_1);
106 EXPECT_EQ(0, run_count_2);
108 EXPECT_EQ(0, run_count_1);
109 EXPECT_EQ(1, run_count_2);
112 TEST(CallbackHelpersTest, TestAdaptCallbackForRepeating) {
114 base::OnceCallback<void(int*)> cb =
115 base::BindOnce([](int* count) { ++*count; });
117 base::RepeatingCallback<void(int*)> wrapped =
118 base::AdaptCallbackForRepeating(std::move(cb));