Index: mojo/common/callback_binding_unittest.cc |
diff --git a/mojo/common/callback_binding_unittest.cc b/mojo/common/callback_binding_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..aa59856dcc27a285377072dfb9ad8869a9a06266 |
--- /dev/null |
+++ b/mojo/common/callback_binding_unittest.cc |
@@ -0,0 +1,104 @@ |
+// Copyright 2013 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 "base/bind.h" |
+#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 { |
+ |
+struct RunnableNoArgs { |
+ RunnableNoArgs(int* calls) : calls(calls) {} |
+ void Run() const { (*calls)++; } |
+ |
+ int* calls; |
+}; |
+ |
+TEST(CallbackBindingTest, BaseBindToMojoCallbackNoParams) { |
+ mojo::Callback<void()> cb; |
+ int calls = 0; |
+ RunnableNoArgs r(&calls); |
+ cb = r; |
+ cb.Run(); |
+ EXPECT_EQ(1, calls); |
+ |
+ cb = base::Bind(&RunnableNoArgs::Run, base::Unretained(&r)); |
+ cb.Run(); |
+ EXPECT_EQ(2, calls); |
+} |
+ |
+struct RunnableOnePrimitiveArg { |
+ explicit RunnableOnePrimitiveArg(int* calls) : calls(calls) {} |
+ void Run(int a) const { (*calls)++; } |
+ |
+ int* calls; |
+}; |
+ |
+TEST(CallbackBindingTest, BaseBindToMojoCallbackPrimitiveParam) { |
+ mojo::Callback<void(int)> mojo_callback; |
+ int calls = 0; |
+ RunnableOnePrimitiveArg r(&calls); |
+ mojo_callback = r; |
+ mojo_callback.Run(0); |
+ EXPECT_EQ(1, calls); |
+ |
+ base::Callback<void(int)> base_callback = |
+ base::Bind(&RunnableOnePrimitiveArg::Run, base::Unretained(&r)); |
+ mojo_callback = base_callback; |
+ mojo_callback.Run(0); |
+ EXPECT_EQ(2, calls); |
+} |
+ |
+struct RunnableOneMojoStringParam { |
+ explicit RunnableOneMojoStringParam(int* calls) : calls(calls) {} |
+ void Run(const mojo::String& s) const { (*calls)++; } |
+ |
+ int* calls; |
+}; |
+ |
+TEST(CallbackBindingTest, BaseBindToMojoCallbackMojoStringParam) { |
+ // The mojo type is a callback on mojo::String, but it'll expect to invoke |
+ // callbacks with a parameter of type 'const Mojo::String&'. |
+ mojo::Callback<void(mojo::String)> mojo_callback; |
+ int calls = 0; |
+ RunnableOneMojoStringParam r(&calls); |
+ mojo_callback = r; |
+ mojo_callback.Run(0); |
+ EXPECT_EQ(1, calls); |
+ |
+ base::Callback<void(const mojo::String&)> base_callback = |
+ base::Bind(&RunnableOneMojoStringParam::Run, base::Unretained(&r)); |
+ mojo_callback = base_callback; |
+ mojo_callback.Run(0); |
+ EXPECT_EQ(2, calls); |
+} |
+ |
+using ExampleMoveOnlyType = mojo::Map<int, int>; |
+ |
+struct RunnableOneMoveOnlyParam { |
+ explicit RunnableOneMoveOnlyParam(int* calls) : calls(calls) {} |
+ |
+ void Run(ExampleMoveOnlyType m) const { (*calls)++; } |
+ int* calls; |
+}; |
+ |
+TEST(CallbackBindingTest, BaseBindToMoveOnlyParam) { |
+ mojo::Callback<void(ExampleMoveOnlyType)> mojo_callback; |
+ int calls = 0; |
+ RunnableOneMoveOnlyParam r(&calls); |
+ mojo_callback = r; |
+ ExampleMoveOnlyType m; |
+ mojo_callback.Run(m.Clone()); |
+ EXPECT_EQ(1, calls); |
+ |
+ base::Callback<void(ExampleMoveOnlyType)> base_callback = |
+ base::Bind(&RunnableOneMoveOnlyParam::Run, base::Unretained(&r)); |
+ mojo_callback = base_callback; |
+ mojo_callback.Run(m.Clone()); |
+ EXPECT_EQ(2, calls); |
+} |
+ |
+} // namespace |