Index: third_party/mojo/src/mojo/public/cpp/bindings/tests/callback_unittest.cc |
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/tests/callback_unittest.cc b/third_party/mojo/src/mojo/public/cpp/bindings/tests/callback_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6b788fcf86a0fc23dc3adbfa4571c07a5503784f |
--- /dev/null |
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/tests/callback_unittest.cc |
@@ -0,0 +1,128 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "mojo/public/cpp/bindings/callback.h" |
+#include "mojo/public/cpp/bindings/map.h" |
+#include "mojo/public/cpp/bindings/string.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace mojo { |
+namespace test { |
+namespace { |
+ |
+struct RunnableNoArgs { |
+ explicit RunnableNoArgs(int* calls) : calls(calls) {} |
+ |
+ void Run() const { (*calls)++; } |
+ int* calls; |
+}; |
+ |
+struct RunnableOneArg { |
+ explicit RunnableOneArg(int* calls) : calls(calls) {} |
+ |
+ void Run(int increment) const { (*calls) += increment; } |
+ |
+ int* calls; |
+}; |
+ |
+struct RunnableStringArgByConstRef { |
+ explicit RunnableStringArgByConstRef(int* calls) : calls(calls) {} |
+ |
+ void Run(const String& s) const { (*calls)++; } |
+ |
+ int* calls; |
+}; |
+ |
+using ExampleMoveOnlyType = Map<int, int>; |
+ |
+struct RunnableMoveOnlyParam { |
+ explicit RunnableMoveOnlyParam(int* calls) : calls(calls) {} |
+ |
+ void Run(ExampleMoveOnlyType m) const { (*calls)++; } |
+ |
+ int* calls; |
+}; |
+ |
+static_assert(!internal::HasCompatibleCallOperator<RunnableNoArgs>::value, |
+ "HasCompatibleCallOperator<Runnable>"); |
+static_assert(!internal::HasCompatibleCallOperator<RunnableOneArg, int>::value, |
+ "HasCompatibleCallOperator<RunnableOneArg, int>"); |
+static_assert(!internal::HasCompatibleCallOperator<RunnableStringArgByConstRef, |
+ String>::value, |
+ "HasCompatibleCallOperator<RunnableStringArgByConstRef, String>"); |
+static_assert(!internal::HasCompatibleCallOperator<RunnableMoveOnlyParam, |
+ ExampleMoveOnlyType>::value, |
+ "HasCompatibleCallOperator<RunnableMoveOnlyParam, String>"); |
+ |
+auto lambda_one = []() {}; |
+static_assert(internal::HasCompatibleCallOperator<decltype(lambda_one)>::value, |
+ "HasCompatibleCallOperator<lambda []() {}>"); |
+ |
+auto lambda_two = [](int x) {}; |
+static_assert( |
+ internal::HasCompatibleCallOperator<decltype(lambda_two), int>::value, |
+ "HasCompatibleCallOperator<lambda [](int x) {}, int>"); |
+ |
+auto lambda_three = [](const String& s) {}; |
+static_assert( |
+ internal::HasCompatibleCallOperator<decltype(lambda_three), String>::value, |
+ "HasCompatibleCallOperator<lambda [](const String& s) {}, String>"); |
+ |
+auto lambda_four = [](ExampleMoveOnlyType m) {}; |
+static_assert(internal::HasCompatibleCallOperator<decltype(lambda_four), |
+ ExampleMoveOnlyType>::value, |
+ "HasCompatibleCallOperator<lambda [](ExampleMoveOnlyType) {}, " |
+ "ExampleMoveOnlyType>"); |
+ |
+// Tests constructing and invoking a mojo::Callback from objects with a |
+// compatible Run() method (called 'runnables') and from lambdas. |
+TEST(CallbackFromLambda, Create) { |
+ int calls = 0; |
+ |
+ RunnableNoArgs f(&calls); |
+ // Construct from a runnable object. |
+ mojo::Callback<void()> cb = f; |
+ cb.Run(); |
+ EXPECT_EQ(1, calls); |
+ |
+ // Construct from a parameterless lambda that captures one variable. |
+ cb = [&calls]() { calls++; }; |
+ cb.Run(); |
+ EXPECT_EQ(2, calls); |
+ |
+ // Construct from a runnable object with one primitive parameter. |
+ mojo::Callback<void(int)> cb_with_param = RunnableOneArg(&calls); |
+ cb_with_param.Run(1); |
+ EXPECT_EQ(3, calls); |
+ |
+ // Construct from a lambda that takes one parameter and captures one variable. |
+ cb_with_param = [&calls](int increment) { calls += increment; }; |
+ cb_with_param.Run(1); |
+ EXPECT_EQ(4, calls); |
+ |
+ // Construct from a runnable object with one string parameter. |
+ mojo::Callback<void(String)> cb_with_string_param = |
+ RunnableStringArgByConstRef(&calls); |
+ cb_with_string_param.Run(String("hello world")); |
+ EXPECT_EQ(5, calls); |
+ |
+ // Construct from a lambda that takes one string parameter. |
+ cb_with_string_param = [&calls](const String& s) { calls++; }; |
+ cb_with_string_param.Run(String("world")); |
+ EXPECT_EQ(6, calls); |
+ |
+ ExampleMoveOnlyType m; |
+ mojo::Callback<void(ExampleMoveOnlyType)> cb_with_move_only_param = |
+ RunnableMoveOnlyParam(&calls); |
+ cb_with_move_only_param.Run(m.Clone()); |
+ EXPECT_EQ(7, calls); |
+ |
+ cb_with_move_only_param = [&calls](ExampleMoveOnlyType m) { calls++; }; |
+ cb_with_move_only_param.Run(m.Clone()); |
+ EXPECT_EQ(8, calls); |
+} |
+ |
+} // namespace |
+} // namespace test |
+} // namespace mojo |