// Copyright 2021 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/fuchsia.examples/cpp/fidl.h>

#include <type_traits>

#include <gtest/gtest.h>

namespace {

// [START wire-external-object]
TEST(WireTypes, BorrowExternalObject) {
  fidl::StringView str("hello");
  // |object_view| is a view that borrows the string view.
  // Destroying |str| will invalidate |object_view|.
  fidl::ObjectView object_view = fidl::ObjectView<fidl::StringView>::FromExternal(&str);
  // |object_view| may be dereferenced to access the pointee.
  ASSERT_EQ(object_view->begin(), str.begin());
}
// [END wire-external-object]

// [START wire-external-vector]
TEST(WireTypes, BorrowExternalVector) {
  std::vector<uint32_t> vec = {1, 2, 3, 4};
  // |vv| is a view that borrows the vector contents of |vec|.
  // Destroying the contents in |vec| will invalidate |vv|.
  fidl::VectorView<uint32_t> vv = fidl::VectorView<uint32_t>::FromExternal(vec);
  ASSERT_EQ(vv.size(), 4UL);
}
// [END wire-external-vector]

// [START wire-external-string]
TEST(WireTypes, BorrowExternalString) {
  std::string string = "hello";
  // |sv| is a view that borrows the string contents of |string|.
  // Destroying the contents in |string| will invalidate |sv|.
  fidl::StringView sv = fidl::StringView::FromExternal(string);
  ASSERT_EQ(sv.size(), 5UL);
}
// [END wire-external-string]

// [START wire-external-string-literal]
TEST(WireTypes, BorrowExternalStringLiteral) {
  fidl::StringView sv1 = "hello world";
  fidl::StringView sv2("Hello");
  ASSERT_EQ(sv1.size(), 11UL);
  ASSERT_EQ(sv2.size(), 5UL);
}
// [END wire-external-string-literal]

// [START wire-union-external-member]
TEST(WireUnion, BorrowExternalMember) {
  fidl::StringView sv = "hello world";
  fuchsia_examples::wire::JsonValue val = fuchsia_examples::wire::JsonValue::WithStringValue(
      fidl::ObjectView<fidl::StringView>::FromExternal(&sv));
  ASSERT_TRUE(val.is_string_value());
}
// [END wire-union-external-member]

// [START wire-table-external-frame-inline]
TEST(WireTables, BorrowExternalFrameInline) {
  fidl::WireTableFrame<fuchsia_examples::wire::User> frame;
  // Construct a table creating a builder borrowing the |frame|.
  auto builder = fuchsia_examples::wire::User::ExternalBuilder(
      fidl::ObjectView<fidl::WireTableFrame<fuchsia_examples::wire::User>>::FromExternal(&frame));
  // Small values <= 4 bytes are inlined inside the frame of the table.
  builder.age(30);
  // The builder is turned into an actual instance by calling |Build|.
  auto user = builder.Build();
  ASSERT_FALSE(user.IsEmpty());
  ASSERT_EQ(user.age(), 30);
}
// [END wire-table-external-frame-inline]

// [START wire-table-external-frame-out-of-line]
TEST(WireTables, BorrowExternalFrameOutOfLine) {
  fidl::WireTableFrame<fuchsia_examples::wire::User> frame;
  // Construct a table creating a builder borrowing the |frame|.
  auto builder = fuchsia_examples::wire::User::ExternalBuilder(
      fidl::ObjectView<fidl::WireTableFrame<fuchsia_examples::wire::User>>::FromExternal(&frame));
  // Larger values > 4 bytes are still stored out of line, i.e. outside the
  // frame of the table. One needs to make an |ObjectView| pointing to larger
  // fields separately, using an arena or with unsafe borrowing here.
  fidl::StringView str("hello");
  fidl::ObjectView object_view = fidl::ObjectView<fidl::StringView>::FromExternal(&str);
  builder.name(object_view);
  // The builder is turned into an actual instance by calling |Build|.
  auto user = builder.Build();
  ASSERT_FALSE(user.IsEmpty());
  ASSERT_TRUE(user.has_name());
  ASSERT_EQ(user.name().get(), "hello");
}
// [END wire-table-external-frame-out-of-line]

}  // namespace
