// 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/buffer_then_heap_allocator.h>
#include <lib/fidl/llcpp/memory.h>

#include <fbl/string.h>
#include <gtest/gtest.h>

TEST(Memory, TrackingPointerUnowned) {
  uint32_t obj;
  fidl::unowned_ptr_t<uint32_t> ptr = fidl::unowned_ptr(&obj);
  EXPECT_EQ(ptr.get(), &obj);
}

TEST(Memory, VectorViewUnownedArray) {
  uint32_t obj[1] = {1};
  fidl::VectorView<uint32_t> vv = fidl::unowned_vec(obj);
  EXPECT_EQ(vv.count(), std::size(obj));
  EXPECT_EQ(vv.data(), std::data(obj));
}
TEST(Memory, VectorViewUnownedFidlArray) {
  fidl::Array<uint32_t, 1> obj = {1};
  fidl::VectorView<uint32_t> vv = fidl::unowned_vec(obj);
  EXPECT_EQ(vv.count(), std::size(obj));
  EXPECT_EQ(vv.data(), std::data(obj));
}
TEST(Memory, VectorViewUnownedStdVector) {
  std::vector<uint32_t> obj;
  obj.push_back(1);
  fidl::VectorView<uint32_t> vv = fidl::unowned_vec(obj);
  EXPECT_EQ(vv.count(), std::size(obj));
  EXPECT_EQ(vv.data(), std::data(obj));
}

TEST(Memory, VectorViewHeapCopyArray) {
  uint32_t obj[1] = {1};
  fidl::VectorView<uint32_t> vv = fidl::heap_copy_vec(obj);
  EXPECT_EQ(vv.count(), std::size(obj));
  EXPECT_NE(vv.data(), std::data(obj));
  EXPECT_EQ(vv.data()[0], std::data(obj)[0]);
}
TEST(Memory, VectorViewHeapCopyFidlArray) {
  fidl::Array<uint32_t, 1> obj = {1};
  fidl::VectorView<uint32_t> vv = fidl::heap_copy_vec(obj);
  EXPECT_EQ(vv.count(), std::size(obj));
  EXPECT_NE(vv.data(), std::data(obj));
  EXPECT_EQ(vv.data()[0], std::data(obj)[0]);
}
TEST(Memory, VectorViewHeapCopyStdVector) {
  std::vector<uint32_t> obj;
  obj.push_back(1);
  fidl::VectorView<uint32_t> vv = fidl::heap_copy_vec(obj);
  EXPECT_EQ(vv.count(), std::size(obj));
  EXPECT_NE(vv.data(), std::data(obj));
  EXPECT_EQ(vv.data()[0], std::data(obj)[0]);
}

TEST(Memory, VectorViewCopyArray) {
  fidl::BufferThenHeapAllocator<2048> allocator;
  uint32_t obj[1] = {1};
  fidl::VectorView<uint32_t> vv = fidl::copy_vec(allocator, obj);
  EXPECT_EQ(vv.count(), std::size(obj));
  EXPECT_NE(vv.data(), std::data(obj));
  EXPECT_EQ(vv.data()[0], std::data(obj)[0]);
}
TEST(Memory, VectorViewCopyFidlArray) {
  fidl::BufferThenHeapAllocator<2048> allocator;
  fidl::Array<uint32_t, 1> obj = {1};
  fidl::VectorView<uint32_t> vv = fidl::copy_vec(allocator, obj);
  EXPECT_EQ(vv.count(), std::size(obj));
  EXPECT_NE(vv.data(), std::data(obj));
  EXPECT_EQ(vv.data()[0], std::data(obj)[0]);
}
TEST(Memory, VectorViewCopyStdVector) {
  fidl::BufferThenHeapAllocator<2048> allocator;
  std::vector<uint32_t> obj;
  obj.push_back(1);
  fidl::VectorView<uint32_t> vv = fidl::copy_vec(allocator, obj);
  EXPECT_EQ(vv.count(), std::size(obj));
  EXPECT_NE(vv.data(), std::data(obj));
  EXPECT_EQ(vv.data()[0], std::data(obj)[0]);
}

TEST(Memory, StringViewUnownedStdString) {
  std::string str = "abcd";
  fidl::StringView sv = fidl::unowned_str(str);
  EXPECT_EQ(sv.size(), str.size());
  EXPECT_EQ(sv.data(), str.data());
}
TEST(Memory, StringViewUnownedFblString) {
  fbl::String str = "abcd";
  fidl::StringView sv = fidl::unowned_str(str);
  EXPECT_EQ(sv.size(), str.size());
  EXPECT_EQ(sv.data(), str.data());
}
TEST(Memory, StringViewUnownedStdStringView) {
  std::string_view str = "abcd";
  fidl::StringView sv = fidl::unowned_str(str);
  EXPECT_EQ(sv.size(), str.size());
  EXPECT_EQ(sv.data(), str.data());
}
TEST(Memory, StringViewUnownedCharPtrLength) {
  const char* str = "abcd";
  constexpr size_t len = 2;
  fidl::StringView sv = fidl::unowned_str(str, len);
  EXPECT_EQ(sv.size(), len);
  EXPECT_EQ(sv.data(), str);
}

TEST(Memory, StringViewHeapCopyStdString) {
  std::string str = "abcd";
  fidl::StringView sv = fidl::heap_copy_str(str);
  EXPECT_EQ(sv.size(), str.size());
  EXPECT_NE(sv.data(), str.data());
  for (size_t i = 0; i < str.size(); i++) {
    EXPECT_EQ(sv[i], str[i]);
  }
}
TEST(Memory, StringViewHeapCopyFblString) {
  fbl::String str = "abcd";
  fidl::StringView sv = fidl::heap_copy_str(str);
  EXPECT_EQ(sv.size(), str.size());
  EXPECT_NE(sv.data(), str.data());
  for (size_t i = 0; i < str.size(); i++) {
    EXPECT_EQ(sv[i], str[i]);
  }
}
TEST(Memory, StringViewHeapCopyStdStringView) {
  std::string_view str = "abcd";
  fidl::StringView sv = fidl::heap_copy_str(str);
  EXPECT_EQ(sv.size(), str.size());
  EXPECT_NE(sv.data(), str.data());
  for (size_t i = 0; i < str.size(); i++) {
    EXPECT_EQ(sv[i], str[i]);
  }
}
TEST(Memory, StringViewHeapCopyCharPtrLength) {
  const char* str = "abcd";
  constexpr size_t len = 2;
  fidl::StringView sv = fidl::heap_copy_str(str, len);
  EXPECT_EQ(sv.size(), len);
  EXPECT_NE(sv.data(), str);
  for (size_t i = 0; i < len; i++) {
    EXPECT_EQ(sv[i], str[i]);
  }
}

TEST(Memory, StringViewCopyStdString) {
  fidl::BufferThenHeapAllocator<2048> allocator;
  std::string str = "abcd";
  fidl::StringView sv = fidl::copy_str(allocator, str);
  EXPECT_EQ(sv.size(), str.size());
  EXPECT_NE(sv.data(), str.data());
  for (size_t i = 0; i < str.size(); i++) {
    EXPECT_EQ(sv[i], str[i]);
  }
}
TEST(Memory, StringViewCopyFblString) {
  fidl::BufferThenHeapAllocator<2048> allocator;
  fbl::String str = "abcd";
  fidl::StringView sv = fidl::copy_str(allocator, str);
  EXPECT_EQ(sv.size(), str.size());
  EXPECT_NE(sv.data(), str.data());
  for (size_t i = 0; i < str.size(); i++) {
    EXPECT_EQ(sv[i], str[i]);
  }
}
TEST(Memory, StringViewCopyStdStringView) {
  fidl::BufferThenHeapAllocator<2048> allocator;
  std::string_view str = "abcd";
  fidl::StringView sv = fidl::copy_str(allocator, str);
  EXPECT_EQ(sv.size(), str.size());
  EXPECT_NE(sv.data(), str.data());
  for (size_t i = 0; i < str.size(); i++) {
    EXPECT_EQ(sv[i], str[i]);
  }
}
TEST(Memory, StringViewCopyCharPtrLength) {
  fidl::BufferThenHeapAllocator<2048> allocator;
  const char* str = "abcd";
  constexpr size_t len = 2;
  fidl::StringView sv = fidl::copy_str(allocator, str, len);
  EXPECT_EQ(sv.size(), len);
  EXPECT_NE(sv.data(), str);
  for (size_t i = 0; i < len; i++) {
    EXPECT_EQ(sv[i], str[i]);
  }
}
