blob: e47a9a1b067459e440f82db7effce13a260a6cc2 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <utility>
#include "base/functional/callback.h"
#include "base/run_loop.h"
#include "base/test/bind.h"
#include "base/test/task_environment.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "mojo/public/cpp/bindings/tests/enum_default_unittest.test-mojom.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace mojo {
namespace test {
namespace enum_default_unittest {
class EnumDefaultTest : public ::testing::Test {
base::test::SingleThreadTaskEnvironment task_environment_;
};
class TestInterfaceImpl : public mojom::TestInterface {
public:
explicit TestInterfaceImpl(PendingReceiver<TestInterface> receiver)
: receiver_(this, std::move(receiver)) {}
void EchoWithDefault(mojom::ExtensibleEnumWithDefault in,
EchoWithDefaultCallback callback) override {
EXPECT_EQ(mojom::ExtensibleEnumWithDefault::kFirst, in);
std::move(callback).Run(static_cast<mojom::ExtensibleEnumWithDefault>(100));
}
void EchoWithoutDefault(mojom::ExtensibleEnumWithoutDefault in,
EchoWithoutDefaultCallback callback) override {
EXPECT_EQ(static_cast<mojom::ExtensibleEnumWithoutDefault>(100), in);
std::move(callback).Run(in);
}
void EchoStructWithDefault(mojom::StructWithExtensibleEnumWithDefaultPtr in,
EchoStructWithDefaultCallback callback) override {
EXPECT_EQ(mojom::ExtensibleEnumWithDefault::kFirst, in->value);
std::move(callback).Run(std::move(in));
}
void EchoStructWithoutDefault(
mojom::StructWithExtensibleEnumWithoutDefaultPtr in,
EchoStructWithoutDefaultCallback callback) override {
EXPECT_EQ(static_cast<mojom::ExtensibleEnumWithoutDefault>(100), in->value);
in->value = static_cast<mojom::ExtensibleEnumWithoutDefault>(100);
std::move(callback).Run(std::move(in));
}
void EchoUnionWithDefault(mojom::UnionWithExtensibleEnumWithDefaultPtr in,
EchoUnionWithDefaultCallback callback) override {
EXPECT_EQ(mojom::ExtensibleEnumWithDefault::kFirst, in->get_value());
in->set_value(static_cast<mojom::ExtensibleEnumWithDefault>(100));
std::move(callback).Run(std::move(in));
}
void EchoUnionWithoutDefault(
mojom::UnionWithExtensibleEnumWithoutDefaultPtr in,
EchoUnionWithoutDefaultCallback callback) override {
EXPECT_EQ(static_cast<mojom::ExtensibleEnumWithoutDefault>(100),
in->get_value());
std::move(callback).Run(std::move(in));
}
private:
Receiver<TestInterface> receiver_;
};
TEST_F(EnumDefaultTest, MethodBareParamWithDefault) {
Remote<mojom::TestInterface> remote;
TestInterfaceImpl impl(remote.BindNewPipeAndPassReceiver());
base::RunLoop run_loop;
remote->EchoWithDefault(
static_cast<mojom::ExtensibleEnumWithDefault>(100),
base::BindLambdaForTesting([&](mojom::ExtensibleEnumWithDefault result) {
EXPECT_EQ(mojom::ExtensibleEnumWithDefault::kFirst, result);
run_loop.Quit();
}));
}
TEST_F(EnumDefaultTest, MethodBareParamWithoutDefault) {
Remote<mojom::TestInterface> remote;
TestInterfaceImpl impl(remote.BindNewPipeAndPassReceiver());
base::RunLoop run_loop;
remote->EchoWithoutDefault(
static_cast<mojom::ExtensibleEnumWithoutDefault>(100),
base::BindLambdaForTesting(
[&](mojom::ExtensibleEnumWithoutDefault result) {
EXPECT_EQ(static_cast<mojom::ExtensibleEnumWithoutDefault>(100),
result);
run_loop.Quit();
}));
}
TEST_F(EnumDefaultTest, MethodStructParamWithDefault) {
Remote<mojom::TestInterface> remote;
TestInterfaceImpl impl(remote.BindNewPipeAndPassReceiver());
base::RunLoop run_loop;
auto value = mojom::StructWithExtensibleEnumWithDefault::New(
static_cast<mojom::ExtensibleEnumWithDefault>(100));
remote->EchoStructWithDefault(
std::move(value),
base::BindLambdaForTesting(
[&](mojom::StructWithExtensibleEnumWithDefaultPtr result) {
EXPECT_EQ(mojom::ExtensibleEnumWithDefault::kFirst, result->value);
run_loop.Quit();
}));
}
TEST_F(EnumDefaultTest, MethodStructParamWithoutDefault) {
Remote<mojom::TestInterface> remote;
TestInterfaceImpl impl(remote.BindNewPipeAndPassReceiver());
base::RunLoop run_loop;
auto value = mojom::StructWithExtensibleEnumWithoutDefault::New(
static_cast<mojom::ExtensibleEnumWithoutDefault>(100));
remote->EchoStructWithoutDefault(
std::move(value),
base::BindLambdaForTesting(
[&](mojom::StructWithExtensibleEnumWithoutDefaultPtr result) {
EXPECT_EQ(static_cast<mojom::ExtensibleEnumWithoutDefault>(100),
result->value);
run_loop.Quit();
}));
}
TEST_F(EnumDefaultTest, MethodUnionParamWithDefault) {
Remote<mojom::TestInterface> remote;
TestInterfaceImpl impl(remote.BindNewPipeAndPassReceiver());
base::RunLoop run_loop;
auto value = mojom::UnionWithExtensibleEnumWithDefault::NewValue(
static_cast<mojom::ExtensibleEnumWithDefault>(100));
remote->EchoUnionWithDefault(
std::move(value),
base::BindLambdaForTesting(
[&](mojom::UnionWithExtensibleEnumWithDefaultPtr result) {
EXPECT_EQ(mojom::ExtensibleEnumWithDefault::kFirst,
result->get_value());
run_loop.Quit();
}));
}
TEST_F(EnumDefaultTest, MethodUnionParamWithoutDefault) {
Remote<mojom::TestInterface> remote;
TestInterfaceImpl impl(remote.BindNewPipeAndPassReceiver());
base::RunLoop run_loop;
auto value = mojom::UnionWithExtensibleEnumWithoutDefault::NewValue(
static_cast<mojom::ExtensibleEnumWithoutDefault>(100));
remote->EchoUnionWithoutDefault(
std::move(value),
base::BindLambdaForTesting(
[&](mojom::UnionWithExtensibleEnumWithoutDefaultPtr result) {
EXPECT_EQ(static_cast<mojom::ExtensibleEnumWithoutDefault>(100),
result->get_value());
run_loop.Quit();
}));
}
TEST_F(EnumDefaultTest, DefaultValueDoesNotAffectInitializer) {
{
// With no initializer specified, an enum field should be zero-initialized,
// even if zero is not a valid enumerator value. The default enumerator
// value specified in the enum should also not affect this.
auto s = mojom::StructWithoutInitializer::New();
EXPECT_EQ(static_cast<mojom::EnumWithoutZeroValue>(0), s->value);
}
{
// With an initializer specified, an enum field should match the initializer
// value. The default enumerator value specified in the enum should also not
// affect this.
auto s = mojom::StructWithInitializer::New();
EXPECT_EQ(mojom::EnumWithoutZeroValue::kSecond, s->value);
}
}
} // namespace enum_default_unittest
} // namespace test
} // namespace mojo