blob: cd70996470c363a4bf71ab6a95af9c835695da92 [file]
/*
* Copyright 2010-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the LICENSE file.
*/
#include "Alignment.hpp"
#include <cstddef>
#include <tuple>
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "Types.h"
using namespace kotlin;
namespace {
template <typename... Args>
class NamedTestWithParam : public testing::TestWithParam<std::tuple<const char*, Args...>> {
public:
using Param = std::tuple<const char*, Args...>;
static std::string Print(const testing::TestParamInfo<Param>& info) { return std::string(std::get<0>(info.param)); }
template <size_t I>
static const typename std::tuple_element<I + 1, Param>::type& Get() {
const auto& param = testing::TestWithParam<Param>::GetParam();
return std::get<I + 1>(param);
}
};
#define INSTANTIATE_NAMED_TEST(testName, ...) INSTANTIATE_TEST_SUITE_P(, testName, testing::Values(__VA_ARGS__), &testName::Print)
} // namespace
using IsValidAlignmentTest = NamedTestWithParam<size_t, bool>;
TEST_P(IsValidAlignmentTest, Test) {
const auto& alignment = Get<0>();
const auto& expected = Get<1>();
EXPECT_THAT(IsValidAlignment(alignment), expected);
}
INSTANTIATE_NAMED_TEST(
IsValidAlignmentTest,
std::make_tuple("0", 0, false),
std::make_tuple("1", 1, true),
std::make_tuple("2", 2, true),
std::make_tuple("3", 3, false),
std::make_tuple("4", 4, true),
std::make_tuple("5", 5, false),
std::make_tuple("6", 6, false),
std::make_tuple("7", 7, false),
std::make_tuple("8", 8, true),
std::make_tuple("9", 9, false),
std::make_tuple("10", 10, false),
std::make_tuple("11", 11, false),
std::make_tuple("12", 12, false),
std::make_tuple("13", 13, false),
std::make_tuple("14", 14, false),
std::make_tuple("15", 15, false),
std::make_tuple("16", 16, true),
std::make_tuple("int", alignof(int), true),
std::make_tuple("ptr", alignof(void*), true),
std::make_tuple("max", alignof(std::max_align_t), true));
using IsAlignedSizeTest = NamedTestWithParam<size_t, size_t, bool>;
TEST_P(IsAlignedSizeTest, Test) {
const auto& size = Get<0>();
const auto& alignment = Get<1>();
const auto& expected = Get<2>();
EXPECT_THAT(IsAligned(size, alignment), expected);
}
INSTANTIATE_NAMED_TEST(
IsAlignedSizeTest,
std::make_tuple("1_1", 1, 1, true),
std::make_tuple("2_1", 2, 1, true),
std::make_tuple("3_1", 3, 1, true),
std::make_tuple("4_1", 4, 1, true),
std::make_tuple("1_2", 1, 2, false),
std::make_tuple("2_2", 2, 2, true),
std::make_tuple("3_2", 3, 2, false),
std::make_tuple("4_2", 4, 2, true));
using IsAlignedPointerTest = NamedTestWithParam<uintptr_t, size_t, bool>;
TEST_P(IsAlignedPointerTest, Test) {
const auto& ptr = Get<0>();
const auto& alignment = Get<1>();
const auto& expected = Get<2>();
EXPECT_THAT(IsAligned(reinterpret_cast<void*>(ptr), alignment), expected);
}
INSTANTIATE_NAMED_TEST(
IsAlignedPointerTest,
std::make_tuple("0_1", 0, 1, true),
std::make_tuple("1_1", 1, 1, true),
std::make_tuple("2_1", 2, 1, true),
std::make_tuple("3_1", 3, 1, true),
std::make_tuple("4_1", 4, 1, true),
std::make_tuple("0_2", 0, 2, true),
std::make_tuple("1_2", 1, 2, false),
std::make_tuple("2_2", 2, 2, true),
std::make_tuple("3_2", 3, 2, false),
std::make_tuple("4_2", 4, 2, true));
using AlignUpSizeTest = NamedTestWithParam<size_t, size_t, size_t>;
TEST_P(AlignUpSizeTest, Test) {
const auto& size = Get<0>();
const auto& alignment = Get<1>();
const auto& expected = Get<2>();
EXPECT_THAT(AlignUp(size, alignment), expected);
}
INSTANTIATE_NAMED_TEST(
AlignUpSizeTest,
std::make_tuple("1_1", 1, 1, 1),
std::make_tuple("2_1", 2, 1, 2),
std::make_tuple("3_1", 3, 1, 3),
std::make_tuple("4_1", 4, 1, 4),
std::make_tuple("1_2", 1, 2, 2),
std::make_tuple("2_2", 2, 2, 2),
std::make_tuple("3_2", 3, 2, 4),
std::make_tuple("4_2", 4, 2, 4));
using AlignUpPointerTest = NamedTestWithParam<uintptr_t, size_t, uintptr_t>;
TEST_P(AlignUpPointerTest, Test) {
const auto& ptr = Get<0>();
const auto& alignment = Get<1>();
const auto& expected = Get<2>();
EXPECT_THAT(AlignUp(reinterpret_cast<void*>(ptr), alignment), reinterpret_cast<void*>(expected));
}
INSTANTIATE_NAMED_TEST(
AlignUpPointerTest,
std::make_tuple("0_1", 0, 1, 0),
std::make_tuple("1_1", 1, 1, 1),
std::make_tuple("2_1", 2, 1, 2),
std::make_tuple("3_1", 3, 1, 3),
std::make_tuple("4_1", 4, 1, 4),
std::make_tuple("0_2", 0, 2, 0),
std::make_tuple("1_2", 1, 2, 2),
std::make_tuple("2_2", 2, 2, 2),
std::make_tuple("3_2", 3, 2, 4),
std::make_tuple("4_2", 4, 2, 4));
TEST(AlignmentTest, ObjectAlignment) {
static_assert(IsValidAlignment(kObjectAlignment), "kObjectAlignment must be a valid alignment");
static_assert(kObjectAlignment % alignof(KLong) == 0, "");
static_assert(kObjectAlignment % alignof(KDouble) == 0, "");
}