blob: 73497fe01bb45b075f2c5095d0370b377f7bfc89 [file] [edit]
// Part of the Crubit project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#include "support/bridge.h"
#include <tuple>
#include <type_traits>
#include "gtest/gtest.h"
namespace crubit::bridge {
namespace {
TEST(BridgeTest, RoundtripI32) {
using Abi = TransmuteAbi<int>;
static_assert(std::is_default_constructible_v<Abi>);
int original = 123;
unsigned char buf[Abi::kSize];
internal::Encode<Abi>(Abi(), buf, original);
int value = internal::Decode<Abi>(Abi(), buf);
EXPECT_EQ(value, original);
}
TEST(BridgeTest, RoundtripOptionalI32) {
using Abi = OptionAbi<TransmuteAbi<int>>;
static_assert(std::is_default_constructible_v<Abi>);
typename Abi::Value original = 123;
unsigned char buf[Abi::kSize];
internal::Encode<Abi>(Abi(), buf, original);
typename Abi::Value value = internal::Decode<Abi>(Abi(), buf);
EXPECT_EQ(value, original);
}
TEST(BridgeTest, RoundtripTupleI32I32) {
using Abi = TupleAbi<TransmuteAbi<int>, TransmuteAbi<int>>;
static_assert(std::is_default_constructible_v<Abi>);
typename Abi::Value original = std::make_tuple(123, 456);
unsigned char buf[Abi::kSize];
internal::Encode<Abi>(Abi(), buf, original);
typename Abi::Value value = internal::Decode<Abi>(Abi(), buf);
EXPECT_EQ(value, original);
}
TEST(BridgeTest, RoundtripStuff) {
using Abi =
TupleAbi<TransmuteAbi<int>, TransmuteAbi<float>,
OptionAbi<TupleAbi<TransmuteAbi<int>, TransmuteAbi<bool>>>>;
static_assert(std::is_default_constructible_v<Abi>);
typename Abi::Value original =
std::make_tuple(123, 3.14f, std::make_tuple(456, true));
unsigned char buf[Abi::kSize];
internal::Encode<Abi>(Abi(), buf, original);
typename Abi::Value value = internal::Decode<Abi>(Abi(), buf);
EXPECT_EQ(value, original);
}
struct [[clang::trivial_abi]] DynamicTrivialAbi {
explicit DynamicTrivialAbi(int v) : value(v) {}
DynamicTrivialAbi(DynamicTrivialAbi&&) = default;
virtual ~DynamicTrivialAbi() = default;
int value = 0;
};
TEST(BridgeTest, RoundtripDynamicTrivialAbi) {
using Abi = TransmuteAbi<DynamicTrivialAbi>;
static_assert(std::is_default_constructible_v<Abi>);
unsigned char buf[Abi::kSize];
internal::Encode<Abi>(Abi(), buf, DynamicTrivialAbi(123));
DynamicTrivialAbi value = internal::Decode<Abi>(Abi(), buf);
EXPECT_EQ(value.value, 123);
}
} // namespace
} // namespace crubit::bridge