|  | // 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 |