// 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/test/misc/cpp/fidl.h>
#include <gtest/gtest.h>

#include "lib/fidl/cpp/builder.h"

namespace fidl {
namespace test {
namespace misc {
namespace {

TEST(Bits, BitwiseOperators) {
  auto b_or_d = SampleBits::B | SampleBits::D;
  EXPECT_EQ(static_cast<uint32_t>(b_or_d), 6u /* 2 | 4*/);

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

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

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

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

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

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

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

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

TEST(Bits, BitwiseAssignOperators) {
  auto b_or_d = SampleBits::B;
  b_or_d |= SampleBits::D;
  EXPECT_EQ(static_cast<uint32_t>(b_or_d), 6u /* 2 | 4*/);

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

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

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

TEST(Bits, IsConstexpr) {
  static constexpr auto this_should_compile = SampleBits::B | SampleBits::D | SampleBits::E;
  EXPECT_EQ(this_should_compile, SampleBitsMask);
}

}  // namespace
}  // namespace misc
}  // namespace test
}  // namespace fidl
