// 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 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 mojo_callback; int calls = 0; RunnableOnePrimitiveArg r(&calls); mojo_callback = r; mojo_callback.Run(0); EXPECT_EQ(1, calls); base::Callback 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 mojo_callback; int calls = 0; RunnableOneMojoStringParam r(&calls); mojo_callback = r; mojo_callback.Run(0); EXPECT_EQ(1, calls); base::Callback 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; struct RunnableOneMoveOnlyParam { explicit RunnableOneMoveOnlyParam(int* calls) : calls(calls) {} void Run(ExampleMoveOnlyType m) const { (*calls)++; } int* calls; }; TEST(CallbackBindingTest, BaseBindToMoveOnlyParam) { mojo::Callback mojo_callback; int calls = 0; RunnableOneMoveOnlyParam r(&calls); mojo_callback = r; ExampleMoveOnlyType m; mojo_callback.Run(m.Clone()); EXPECT_EQ(1, calls); base::Callback base_callback = base::Bind(&RunnableOneMoveOnlyParam::Run, base::Unretained(&r)); mojo_callback = base_callback; mojo_callback.Run(m.Clone()); EXPECT_EQ(2, calls); } } // namespace