// Copyright 2019 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 <fidl/llcpp/types/test/llcpp/fidl.h>
#include <gtest/gtest.h>

template <typename T>
class Bits : public ::testing::Test {};

TYPED_TEST_SUITE_P(Bits);

TYPED_TEST_P(Bits, BitwiseOperators) {
  TypeParam b_or_d = TypeParam::B | TypeParam::D;
  EXPECT_EQ(static_cast<uint8_t>(b_or_d), 6u /* 2 | 4*/);

  TypeParam b_or_e = TypeParam::B | TypeParam::E;
  EXPECT_EQ(static_cast<uint8_t>(b_or_e), 10u /* 2 | 8*/);

  TypeParam not_b = ~TypeParam::B;
  EXPECT_EQ(static_cast<uint8_t>(not_b), 12u /* ~2 & (2 | 4 | 8)*/);

  TypeParam not_d = ~TypeParam::D;
  EXPECT_EQ(static_cast<uint8_t>(not_d), 10u /* ~4 & (2 | 4 | 8)*/);

  TypeParam not_e = ~TypeParam::E;
  EXPECT_EQ(static_cast<uint8_t>(not_e), 6u /* ~8 & (2 | 4 | 8)*/);

  TypeParam b_and_not_e = TypeParam::B & ~TypeParam::E;
  EXPECT_EQ(static_cast<uint8_t>(b_and_not_e), 2u /* 2 & 6*/);

  TypeParam b_or_d_and_b_or_e = (TypeParam::B | TypeParam::D) & (TypeParam::B | TypeParam::E);
  EXPECT_EQ(static_cast<uint8_t>(b_or_d_and_b_or_e), 2u /* 6 & 10*/);

  TypeParam b_xor_not_e = TypeParam::B ^ ~TypeParam::E;
  EXPECT_EQ(static_cast<uint8_t>(b_xor_not_e), 4u /* 4 ^ 6*/);

  TypeParam b_or_d_xor_b_or_e = (TypeParam::B | TypeParam::D) ^ (TypeParam::B | TypeParam::E);
  EXPECT_EQ(static_cast<uint8_t>(b_or_d_xor_b_or_e), 12u /* 6 ^ 10*/);
}

TYPED_TEST_P(Bits, BitwiseAssignOperators) {
  TypeParam b_or_d = TypeParam::B;
  b_or_d |= TypeParam::D;
  EXPECT_EQ(static_cast<uint8_t>(b_or_d), 6u /* 2 | 4*/);

  TypeParam b_and_not_e = TypeParam::B;
  b_and_not_e &= ~TypeParam::E;
  EXPECT_EQ(static_cast<uint8_t>(b_and_not_e), 2u /* 2 & 6*/);

  TypeParam b_xor_not_e = TypeParam::B;
  b_xor_not_e ^= ~TypeParam::E;
  EXPECT_EQ(static_cast<uint8_t>(b_xor_not_e), 4u /* 4 ^ 6*/);

  EXPECT_EQ(static_cast<uint8_t>(TypeParam::B), 2u);
  EXPECT_EQ(static_cast<uint8_t>(TypeParam::D), 4u);
  EXPECT_EQ(static_cast<uint8_t>(TypeParam::E), 8u);
}

TYPED_TEST_P(Bits, IsConstexpr) {
  static constexpr auto this_should_compile = TypeParam::B | TypeParam::D | TypeParam::E;
  EXPECT_EQ(this_should_compile, TypeParam::kMask);
}

TYPED_TEST_P(Bits, CanConvertToNumberButMustBeExplicit) {
  uint8_t r8 = static_cast<uint8_t>(TypeParam::B);
  EXPECT_EQ(r8, 2u);
  uint16_t r16 = static_cast<uint8_t>(TypeParam::B);
  EXPECT_EQ(r16, 2u);
}

TYPED_TEST_P(Bits, CanConvertToBool) {
  bool result = static_cast<bool>(TypeParam::B);
  EXPECT_TRUE(result);
}

TYPED_TEST_P(Bits, TruncatingUnknown) {
  // The bits type only has 2, 4, and 8 defined.
  auto bits = TypeParam::TruncatingUnknown(1);
  EXPECT_EQ(static_cast<uint8_t>(bits), 0);
}

TYPED_TEST_P(Bits, TryFrom) {
  // The bits type only has 2, 4, and 8 defined.
  auto result = TypeParam::TryFrom(1);
  EXPECT_EQ(result, fit::nullopt);

  auto result_ok = TypeParam::TryFrom(2);
  EXPECT_EQ(result_ok, fit::optional<TypeParam>(TypeParam::B));
}

TYPED_TEST_P(Bits, AllowingUnknownThroughStaticCast) {
  // The bits type only has 2, 4, and 8 defined.
  auto bits = static_cast<TypeParam>(1);
  EXPECT_EQ(static_cast<uint8_t>(bits), 1);
}

REGISTER_TYPED_TEST_SUITE_P(Bits, BitwiseOperators, BitwiseAssignOperators, IsConstexpr,
                            CanConvertToNumberButMustBeExplicit, CanConvertToBool,
                            TruncatingUnknown, TryFrom, AllowingUnknownThroughStaticCast);

using BitsTypesToTest = ::testing::Types<llcpp::fidl::llcpp::types::test::StrictBits,
                                         llcpp::fidl::llcpp::types::test::FlexibleBits>;
INSTANTIATE_TYPED_TEST_SUITE_P(BitsTests, Bits, BitsTypesToTest);

// The following APIs tested are only available on flexible bits.

TEST(Bits, QueryingUnknown) {
  using BitsType = llcpp::fidl::llcpp::types::test::FlexibleBits;
  // The bits type only has 2, 4, and 8 defined.
  auto bits = static_cast<BitsType>(2 | 1);
  EXPECT_TRUE(bits.has_unknown_bits());
  EXPECT_EQ(static_cast<uint8_t>(bits.unknown_bits()), 1);

  bits = BitsType::TruncatingUnknown(2 | 1);
  EXPECT_FALSE(bits.has_unknown_bits());
  EXPECT_EQ(static_cast<uint8_t>(bits.unknown_bits()), 0);
}
