blob: a88f842fe087d7805904b8b5cbc3a95ccb666088 [file] [log] [blame]
// Copyright 2022 The Fuchsia 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 <fidl/test.types/cpp/hlcpp_conversion.h>
#include <lib/fidl/cpp/features.h>
#include <gtest/gtest.h>
#if __FIDL_SUPPORT_HANDLES
#include <lib/zx/event.h>
#endif
TEST(StructConversion, CopyableToNatural) {
test::types::CopyableStruct hlcpp;
hlcpp.x = 42;
auto natural = fidl::HLCPPToNatural(hlcpp);
static_assert(std::is_same_v<decltype(natural), test_types::CopyableStruct>);
EXPECT_EQ(natural.x(), 42);
}
TEST(StructConversion, CopyableToHLCPP) {
test_types::CopyableStruct natural{{.x = 42}};
auto hlcpp = fidl::NaturalToHLCPP(natural);
static_assert(std::is_same_v<decltype(hlcpp), test::types::CopyableStruct>);
EXPECT_EQ(hlcpp.x, 42);
}
#if __FIDL_SUPPORT_HANDLES
TEST(StructConversion, MoveOnlyToNatural) {
zx::event event;
ASSERT_EQ(zx::event::create(0, &event), ZX_OK);
zx_handle_t handle = event.get();
ASSERT_NE(handle, ZX_HANDLE_INVALID);
test::types::MoveOnlyStruct hlcpp;
hlcpp.h = std::move(event);
auto natural = fidl::HLCPPToNatural(hlcpp);
static_assert(std::is_same_v<decltype(natural), test_types::MoveOnlyStruct>);
EXPECT_EQ(natural.h().get(), handle);
EXPECT_EQ(hlcpp.h.get(), ZX_HANDLE_INVALID);
}
TEST(StructConversion, MoveOnlyToHLCPP) {
zx::event event;
ASSERT_EQ(zx::event::create(0, &event), ZX_OK);
zx_handle_t handle = event.get();
ASSERT_NE(handle, ZX_HANDLE_INVALID);
test_types::MoveOnlyStruct natural{{.h = std::move(event)}};
auto hlcpp = fidl::NaturalToHLCPP(std::move(natural));
static_assert(std::is_same_v<decltype(hlcpp), test::types::MoveOnlyStruct>);
EXPECT_EQ(hlcpp.h.get(), handle);
EXPECT_EQ(natural.h().get(), ZX_HANDLE_INVALID);
}
#endif
TEST(StructConversion, VectorToNatural) {
test::types::VectorStruct hlcpp;
hlcpp.v = std::vector<uint32_t>{{1, 2, 3, 4, 5, 7, 7}};
auto natural = fidl::HLCPPToNatural(hlcpp);
static_assert(std::is_same_v<decltype(natural), test_types::VectorStruct>);
std::vector<uint32_t> v{{1, 2, 3, 4, 5, 7, 7}};
EXPECT_EQ(natural.v(), v);
}
TEST(StructConversion, VectorToHLCPP) {
std::vector<uint32_t> v{{1, 2, 3, 4, 5, 7, 7}};
test_types::VectorStruct natural;
natural.v() = v;
auto hlcpp = fidl::NaturalToHLCPP(natural);
static_assert(std::is_same_v<decltype(hlcpp), test::types::VectorStruct>);
EXPECT_EQ(hlcpp.v, v);
}
TEST(StructConversion, EmptyToNatural) {
test::types::EmptyStruct hlcpp;
auto natural = fidl::HLCPPToNatural(hlcpp);
static_assert(std::is_same_v<decltype(natural), test_types::EmptyStruct>);
}
TEST(StructConversion, EmptyToHLCPP) {
test_types::EmptyStruct natural;
auto hlcpp = fidl::NaturalToHLCPP(natural);
static_assert(std::is_same_v<decltype(hlcpp), test::types::EmptyStruct>);
}
TEST(StructConversion, StrictUnionInArrayToNatural) {
::test::types::CopyableStruct cs;
cs.x = 23;
std::array<test::types::TestStrictXUnion, 10> arr{
test::types::TestStrictXUnion::WithCopyable(std::move(cs)),
test::types::TestStrictXUnion::WithPrimitive(1),
test::types::TestStrictXUnion::WithPrimitive(2),
test::types::TestStrictXUnion::WithPrimitive(3),
test::types::TestStrictXUnion::WithPrimitive(4),
test::types::TestStrictXUnion::WithPrimitive(5),
test::types::TestStrictXUnion::WithPrimitive(6),
test::types::TestStrictXUnion::WithPrimitive(7),
test::types::TestStrictXUnion::WithPrimitive(8),
test::types::TestStrictXUnion::WithPrimitive(9),
};
test::types::TestStrictXUnionInArrayInStruct hlcpp;
hlcpp.arr = std::move(arr);
auto natural = fidl::HLCPPToNatural(hlcpp);
static_assert(std::is_same_v<decltype(natural), test_types::TestStrictXUnionInArrayInStruct>);
ASSERT_EQ(natural.arr()[0].Which(), test_types::TestStrictXUnion::Tag::kCopyable);
EXPECT_EQ(natural.arr()[0].copyable().value().x(), 23);
for (size_t i = 1; i < natural.arr().size(); i++) {
ASSERT_EQ(natural.arr()[i].Which(), test_types::TestStrictXUnion::Tag::kPrimitive);
EXPECT_EQ(natural.arr()[i].primitive().value(), (int)i);
}
}
TEST(StructConversion, StrictUnionInArrayToHLCPP) {
::test_types::CopyableStruct cs{{.x = 23}};
std::array<test_types::TestStrictXUnion, 10> arr{
test_types::TestStrictXUnion::WithCopyable(std::move(cs)),
test_types::TestStrictXUnion::WithPrimitive(1),
test_types::TestStrictXUnion::WithPrimitive(2),
test_types::TestStrictXUnion::WithPrimitive(3),
test_types::TestStrictXUnion::WithPrimitive(4),
test_types::TestStrictXUnion::WithPrimitive(5),
test_types::TestStrictXUnion::WithPrimitive(6),
test_types::TestStrictXUnion::WithPrimitive(7),
test_types::TestStrictXUnion::WithPrimitive(8),
test_types::TestStrictXUnion::WithPrimitive(9),
};
test_types::TestStrictXUnionInArrayInStruct natural{{.arr = arr}};
auto hlcpp = fidl::NaturalToHLCPP(natural);
static_assert(std::is_same_v<decltype(hlcpp), test::types::TestStrictXUnionInArrayInStruct>);
ASSERT_EQ(hlcpp.arr[0].Which(), test::types::TestStrictXUnion::Tag::kCopyable);
EXPECT_EQ(hlcpp.arr[0].copyable().x, 23);
for (size_t i = 1; i < hlcpp.arr.size(); i++) {
ASSERT_EQ(hlcpp.arr[i].Which(), test::types::TestStrictXUnion::Tag::kPrimitive);
EXPECT_EQ(hlcpp.arr[i].primitive(), (int)i);
}
}
TEST(StructConversion, OptionalMembersToNatural) {
{
test::types::StructOfOptionals hlcpp;
auto natural = fidl::HLCPPToNatural(std::move(hlcpp));
static_assert(std::is_same_v<decltype(natural), test_types::StructOfOptionals>);
EXPECT_FALSE(natural.s().has_value());
EXPECT_FALSE(natural.v().has_value());
EXPECT_FALSE(natural.t());
}
{
test::types::StructOfOptionals hlcpp;
hlcpp.s = "Hello, world";
auto natural = fidl::HLCPPToNatural(std::move(hlcpp));
static_assert(std::is_same_v<decltype(natural), test_types::StructOfOptionals>);
EXPECT_EQ(natural.s(), std::make_optional<std::string>("Hello, world"));
EXPECT_FALSE(natural.v().has_value());
EXPECT_FALSE(natural.t());
}
{
test::types::StructOfOptionals hlcpp;
hlcpp.s = "Hello, world";
hlcpp.v = {2, 3, 4, 5};
hlcpp.t = std::make_unique<test::types::CopyableStruct>();
hlcpp.t->x = 42;
auto natural = fidl::HLCPPToNatural(std::move(hlcpp));
static_assert(std::is_same_v<decltype(natural), test_types::StructOfOptionals>);
EXPECT_EQ(natural.s(), std::make_optional<std::string>("Hello, world"));
std::vector<std::uint32_t> v{2, 3, 4, 5};
EXPECT_EQ(natural.v(), std::make_optional<std::vector<std::uint32_t>>(v));
ASSERT_TRUE(natural.t());
EXPECT_EQ(natural.t()->x(), 42);
}
}
TEST(StructConversion, OptionalMembersToHLCPP) {
{
test_types::StructOfOptionals natural;
auto hlcpp = fidl::NaturalToHLCPP(std::move(natural));
static_assert(std::is_same_v<decltype(hlcpp), test::types::StructOfOptionals>);
EXPECT_FALSE(hlcpp.s.has_value());
EXPECT_FALSE(hlcpp.v.has_value());
EXPECT_FALSE(hlcpp.t);
}
{
test_types::StructOfOptionals natural({.s = "Hello, world"});
auto hlcpp = fidl::NaturalToHLCPP(std::move(natural));
static_assert(std::is_same_v<decltype(hlcpp), test::types::StructOfOptionals>);
EXPECT_EQ(hlcpp.s, std::make_optional<std::string>("Hello, world"));
EXPECT_FALSE(hlcpp.v.has_value());
EXPECT_FALSE(hlcpp.t);
}
{
test_types::StructOfOptionals natural;
natural.s() = "Hello, world";
natural.v() = {2, 3, 4, 5};
natural.t() = std::make_unique<test_types::CopyableStruct>();
natural.t()->x() = 42;
auto hlcpp = fidl::NaturalToHLCPP(std::move(natural));
static_assert(std::is_same_v<decltype(hlcpp), test::types::StructOfOptionals>);
EXPECT_EQ(hlcpp.s, std::make_optional<std::string>("Hello, world"));
std::vector<std::uint32_t> v{2, 3, 4, 5};
EXPECT_EQ(hlcpp.v, std::make_optional<std::vector<std::uint32_t>>(v));
ASSERT_TRUE(hlcpp.t);
EXPECT_EQ(hlcpp.t->x, 42);
}
}