// 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 <lib/fidl/llcpp/aligned.h>

#include <gtest/gtest.h>

TEST(Aligned, Initialization) {
  fidl::aligned<int> x(1);
  EXPECT_EQ(x, 1);

  fidl::aligned<int> y(x);
  EXPECT_EQ(y, 1);
}

TEST(Aligned, Reassignment) {
  fidl::aligned<int> x(1);
  x = 2;
  EXPECT_EQ(x, 2);

  fidl::aligned<int> y(3);
  x = y;
  EXPECT_EQ(x, 3);
}

TEST(Aligned, DefaultConstructor) {
  fidl::aligned<int> x;
  x = 1;
  EXPECT_EQ(x, 1);
}

TEST(Aligned, ImplicitConversion) {
  fidl::aligned<uint64_t> x = int32_t(1);
  int32_t converted_back = x;
  EXPECT_EQ(converted_back, 1);
}

TEST(Aligned, Reference) {
  fidl::aligned<uint32_t> x = int32_t(1);
  EXPECT_EQ(reinterpret_cast<uint32_t*>(&x), &x.value);
}
