#include "aos/uuid.h"

#include "absl/log/check.h"
#include "absl/log/log.h"
#include "gtest/gtest.h"

namespace aos::testing {

// Tests that random UUIDs are actually random, and we can convert them to a
// string.  Not very exhaustive, but it is a good smoke test.
TEST(UUIDTest, GetOne) {
  LOG(INFO) << UUID::Random();

  UUID r = UUID::Random();

  std::stringstream ss;
  ss << r;

  UUID r2 = UUID::FromString(ss.str());
  EXPECT_EQ(r2, r);

  EXPECT_NE(UUID::Random(), UUID::Random());
  EXPECT_NE(UUID::Random(), UUID::Zero());
  EXPECT_EQ(UUID::Zero(), UUID::Zero());
}

// Tests that converting to and from various formats produces the same UUID.
TEST(UUIDTest, FromStringOrSpan) {
  std::string_view str = "4b88ab00-556a-455b-a395-17d1a0c6f906";
  std::array<uint8_t, UUID::kDataSize> data = {
      0x4b, 0x88, 0xab, 0x00, 0x55, 0x6a, 0x45, 0x5b,
      0xa3, 0x95, 0x17, 0xd1, 0xa0, 0xc6, 0xf9, 0x06};

  const UUID u_str = UUID::FromString(str);
  const UUID u_span = UUID::FromSpan({data.data(), data.size()});

  EXPECT_EQ(u_str.span(), absl::Span<uint8_t>(data.data(), data.size()));
  EXPECT_EQ(u_span.span(), absl::Span<uint8_t>(data.data(), data.size()));
  EXPECT_EQ(u_str.ToString(), str);
  EXPECT_EQ(u_span.ToString(), str);

  flatbuffers::FlatBufferBuilder fbb;
  flatbuffers::Offset<flatbuffers::Vector<uint8_t>> data_offset =
      fbb.CreateVector(data.data(), data.size());

  const flatbuffers::Vector<uint8_t> *data_vector =
      flatbuffers::GetTemporaryPointer(fbb, data_offset);

  const UUID u2 = UUID::FromVector(data_vector);

  EXPECT_EQ(u_str, u2);
  EXPECT_EQ(u_span, u2);
}

}  // namespace aos::testing
