blob: aa59856dcc27a285377072dfb9ad8869a9a06266 [file] [log] [blame]
// 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