blob: 4a71d11019a2dd9d5a36455d2bb99060d5e12dd9 [file] [log] [blame]
// Copyright 2020 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 "disk_inspector/type_utils.h"
#include <disk_inspector/disk_struct.h>
#include <disk_inspector/supported_types.h>
#include <gtest/gtest.h>
namespace disk_inspector {
namespace {
TEST(TypeUtilsTest, GetFieldTypeGivesCorrectType) {
void* void_type;
EXPECT_EQ(FieldType::kNotSupported, GetFieldType<decltype(void_type)>());
uint8_t uint8;
EXPECT_EQ(FieldType::kUint8, GetFieldType<decltype(uint8)>());
uint8_t uint8_array[5];
EXPECT_EQ(
FieldType::kUint8,
GetFieldType<typename std::remove_pointer<std::decay<decltype(uint8_array)>::type>::type>());
uint16_t uint16;
EXPECT_EQ(FieldType::kUint16, GetFieldType<decltype(uint16)>());
uint16_t uint16_array[5];
EXPECT_EQ(
FieldType::kUint16,
GetFieldType<typename std::remove_pointer<std::decay<decltype(uint16_array)>::type>::type>());
uint32_t uint32;
EXPECT_EQ(FieldType::kUint32, GetFieldType<decltype(uint32)>());
uint32_t uint32_array[5];
EXPECT_EQ(
FieldType::kUint32,
GetFieldType<typename std::remove_pointer<std::decay<decltype(uint32_array)>::type>::type>());
uint64_t uint64;
EXPECT_EQ(FieldType::kUint64, GetFieldType<decltype(uint64)>());
uint64_t uint64_array[5];
EXPECT_EQ(
FieldType::kUint64,
GetFieldType<typename std::remove_pointer<std::decay<decltype(uint64_array)>::type>::type>());
}
TEST(TypeUtilsTest, AddFieldMacroCompiles) {
struct TestStruct {
uint64_t test_field;
};
TestStruct test_struct = {
.test_field = 64,
};
std::unique_ptr<DiskStruct> disk_struct = DiskStruct::Create("test_struct", sizeof(test_struct));
}
TEST(TypeUtilsTest, AddArrayFieldMacroCompiles) {
constexpr uint64_t count = 5;
struct TestStruct {
uint64_t test_field[count];
};
TestStruct test_struct;
std::unique_ptr<DiskStruct> disk_struct = DiskStruct::Create("test_struct", sizeof(test_struct));
ADD_ARRAY_FIELD(disk_struct, TestStruct, test_field, count);
}
TEST(TypeUtilsTest, AddStructFieldMacroCompiles) {
struct TestStructChild {
uint64_t test_field;
};
struct TestStruct {
TestStructChild child;
};
TestStruct test_struct;
std::unique_ptr<DiskStruct> disk_struct = DiskStruct::Create("test_struct", sizeof(test_struct));
TestStructChild test_struct_child;
std::unique_ptr<DiskStruct> disk_struct_child =
DiskStruct::Create("test_struct_child", sizeof(test_struct_child));
ADD_STRUCT_FIELD(disk_struct, TestStruct, child, std::move(disk_struct_child));
}
TEST(TypeUtilsTest, AddStructArrayFieldMacroCompiles) {
constexpr uint64_t count = 5;
struct TestStructChild {
uint64_t test_field;
};
struct TestStruct {
TestStructChild child[count];
};
TestStruct test_struct;
std::unique_ptr<DiskStruct> disk_struct = DiskStruct::Create("test_struct", sizeof(test_struct));
TestStructChild test_struct_child;
std::unique_ptr<DiskStruct> disk_struct_child =
DiskStruct::Create("test_struct_child", sizeof(test_struct_child));
ADD_STRUCT_ARRAY_FIELD(disk_struct, TestStruct, child, count, std::move(disk_struct_child));
}
} // namespace
} // namespace disk_inspector