blob: 72e32985e2436519bfded0287438bb867bcccf81 [file] [log] [blame]
// 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 <stdint.h>
#include <string>
#include <type_traits>
#include "gtest/gtest.h"
#include "cc_bindings_from_rs/test/primitive_types/primitive_types_cc_api.h"
namespace crubit {
namespace {
TEST(PrimitiveTypesTest, CVoidPtr) {
std::string string;
auto s =
primitive_types::test_c_void_ptr::new_struct_with_c_void_pointer_member(
&string, &string);
EXPECT_EQ(s.ptr_mut, &string);
EXPECT_EQ(s.ptr_const, &string);
// We need an extra set of parentheses to avoid "too many arguments provided
// to function-like macro invocation" when `EXPECT_TRUE` is used together with
// `std::is_same_v<T, U>`.
EXPECT_TRUE((std::is_same_v<void*, decltype(s.ptr_mut)>));
EXPECT_TRUE((std::is_same_v<const void*, decltype(s.ptr_const)>));
const void* string_const_ptr =
primitive_types::test_c_void_ptr::identity_const_c_void_ptr(&string);
EXPECT_EQ(string_const_ptr, &string);
EXPECT_TRUE((std::is_same_v<const void*, decltype(string_const_ptr)>));
EXPECT_TRUE((std::is_same_v<const void*(const void*),
decltype(primitive_types::test_c_void_ptr::
identity_const_c_void_ptr)>));
void* string_mut_ptr =
primitive_types::test_c_void_ptr::identity_mut_c_void_ptr(&string);
EXPECT_EQ(string_mut_ptr, &string);
EXPECT_TRUE((std::is_same_v<void*, decltype(string_mut_ptr)>));
EXPECT_TRUE(
(std::is_same_v<void*(void*), decltype(primitive_types::test_c_void_ptr::
identity_mut_c_void_ptr)>));
}
TEST(PrimitiveTypesTest, ReturnTypes) {
namespace types = primitive_types::return_types;
static_assert(std::is_same_v<decltype(types::c_void()), void>);
static_assert(std::is_same_v<decltype(types::c_void_mut_ptr()), void*>);
EXPECT_EQ(types::c_void_mut_ptr(), nullptr);
static_assert(
std::is_same_v<decltype(types::c_void_const_ptr()), const void*>);
EXPECT_EQ(types::c_void_const_ptr(), nullptr);
static_assert(std::is_same_v<decltype(types::c_char()), char>);
EXPECT_EQ(types::c_char(), 0);
static_assert(std::is_same_v<decltype(types::c_schar()), signed char>);
EXPECT_EQ(types::c_schar(), 0);
static_assert(std::is_same_v<decltype(types::c_uchar()), unsigned char>);
EXPECT_EQ(types::c_uchar(), 0);
static_assert(std::is_same_v<decltype(types::c_short()), short>);
EXPECT_EQ(types::c_short(), 0);
static_assert(std::is_same_v<decltype(types::c_ushort()), unsigned short>);
EXPECT_EQ(types::c_ushort(), 0);
static_assert(std::is_same_v<decltype(types::c_int()), int>);
EXPECT_EQ(types::c_int(), 0);
static_assert(std::is_same_v<decltype(types::c_uint()), unsigned int>);
EXPECT_EQ(types::c_uint(), 0);
static_assert(std::is_same_v<decltype(types::c_long()), long>);
EXPECT_EQ(types::c_long(), 0);
static_assert(std::is_same_v<decltype(types::c_ulong()), unsigned long>);
EXPECT_EQ(types::c_ulong(), 0);
static_assert(std::is_same_v<decltype(types::c_longlong()), long long>);
EXPECT_EQ(types::c_longlong(), 0);
static_assert(
std::is_same_v<decltype(types::c_ulonglong()), unsigned long long>);
EXPECT_EQ(types::c_ulonglong(), 0);
static_assert(std::is_same_v<decltype(types::c_float()), float>);
EXPECT_EQ(types::c_float(), 0);
static_assert(std::is_same_v<decltype(types::c_double()), double>);
EXPECT_EQ(types::c_double(), 0);
static_assert(std::is_same_v<decltype(types::i8()), int8_t>);
EXPECT_EQ(types::i8(), 0);
static_assert(std::is_same_v<decltype(types::u8()), uint8_t>);
EXPECT_EQ(types::u8(), 0);
static_assert(std::is_same_v<decltype(types::i16()), int16_t>);
EXPECT_EQ(types::i16(), 0);
static_assert(std::is_same_v<decltype(types::u16()), uint16_t>);
EXPECT_EQ(types::u16(), 0);
static_assert(std::is_same_v<decltype(types::i32()), int32_t>);
EXPECT_EQ(types::i32(), 0);
static_assert(std::is_same_v<decltype(types::u32()), uint32_t>);
EXPECT_EQ(types::u32(), 0);
static_assert(std::is_same_v<decltype(types::i64()), int64_t>);
EXPECT_EQ(types::i64(), 0);
static_assert(std::is_same_v<decltype(types::u64()), uint64_t>);
EXPECT_EQ(types::u64(), 0);
static_assert(std::is_same_v<decltype(types::isize()), int64_t>);
EXPECT_EQ(types::isize(), 0);
static_assert(std::is_same_v<decltype(types::usize()), uint64_t>);
EXPECT_EQ(types::usize(), 0);
static_assert(std::is_same_v<decltype(types::f32()), float>);
EXPECT_EQ(types::f32(), 0);
static_assert(std::is_same_v<decltype(types::f64()), double>);
EXPECT_EQ(types::f64(), 0);
static_assert(std::is_same_v<decltype(types::i8_func()),
std::type_identity_t<void(int8_t)>&>);
static_assert(std::is_same_v<decltype(types::c_char_func()),
std::type_identity_t<void(char)>&>);
}
TEST(PrimitiveTypesTest, FieldTypes) {
using primitive_types::field_types::Types;
static_assert(std::is_same_v<decltype(Types::c_void_mut_ptr), void*>);
static_assert(std::is_same_v<decltype(Types::c_void_const_ptr), const void*>);
static_assert(std::is_same_v<decltype(Types::c_char), char>);
static_assert(std::is_same_v<decltype(Types::c_schar), signed char>);
static_assert(std::is_same_v<decltype(Types::c_uchar), unsigned char>);
static_assert(std::is_same_v<decltype(Types::c_short), short>);
static_assert(std::is_same_v<decltype(Types::c_ushort), unsigned short>);
static_assert(std::is_same_v<decltype(Types::c_int), int>);
static_assert(std::is_same_v<decltype(Types::c_uint), unsigned int>);
static_assert(std::is_same_v<decltype(Types::c_long), long>);
static_assert(std::is_same_v<decltype(Types::c_ulong), unsigned long>);
static_assert(std::is_same_v<decltype(Types::c_longlong), long long>);
static_assert(
std::is_same_v<decltype(Types::c_ulonglong), unsigned long long>);
static_assert(std::is_same_v<decltype(Types::c_float), float>);
static_assert(std::is_same_v<decltype(Types::c_double), double>);
static_assert(std::is_same_v<decltype(Types::i8), int8_t>);
static_assert(std::is_same_v<decltype(Types::u8), uint8_t>);
static_assert(std::is_same_v<decltype(Types::i16), int16_t>);
static_assert(std::is_same_v<decltype(Types::u16), uint16_t>);
static_assert(std::is_same_v<decltype(Types::i32), int32_t>);
static_assert(std::is_same_v<decltype(Types::u32), uint32_t>);
static_assert(std::is_same_v<decltype(Types::i64), int64_t>);
static_assert(std::is_same_v<decltype(Types::u64), uint64_t>);
static_assert(std::is_same_v<decltype(Types::isize), int64_t>);
static_assert(std::is_same_v<decltype(Types::usize), uint64_t>);
static_assert(std::is_same_v<decltype(Types::f32), float>);
static_assert(std::is_same_v<decltype(Types::f64), double>);
static_assert(std::is_same_v<decltype(Types::i8_func),
std::type_identity_t<void(int8_t)>*>);
static_assert(std::is_same_v<decltype(Types::c_char_func),
std::type_identity_t<void(char)>*>);
}
} // namespace
} // namespace crubit