// Copyright 2017 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/cpp/builder.h>
#include <lib/fidl/cpp/string_view.h>
#include <lib/fidl/cpp/vector_view.h>
#include <unittest/unittest.h>

namespace {

bool string_view_test() {
  BEGIN_TEST;

  char buffer[ZX_CHANNEL_MAX_MSG_BYTES];
  fidl::Builder builder(buffer, ZX_CHANNEL_MAX_MSG_BYTES);

  fidl::StringView* view = builder.New<fidl::StringView>();
  EXPECT_TRUE(view->empty());
  EXPECT_TRUE(view->is_null());

  char* data = builder.NewArray<char>(3);
  view->set_data(data);
  view->set_size(3);

  EXPECT_FALSE(view->empty());
  EXPECT_EQ(view->size(), 3);
  EXPECT_EQ(view->data(), data);

  EXPECT_EQ(view->at(1), 0);

  END_TEST;
}

bool vector_view_test() {
  BEGIN_TEST;

  char buffer[ZX_CHANNEL_MAX_MSG_BYTES];
  fidl::Builder builder(buffer, ZX_CHANNEL_MAX_MSG_BYTES);

  fidl::VectorView<int>* view = builder.New<fidl::VectorView<int>>();
  EXPECT_TRUE(view->empty());
  EXPECT_TRUE(view->is_null());

  int* data = builder.NewArray<int>(3);
  view->set_data(data);
  view->set_count(3);

  EXPECT_EQ(view->count(), 3);
  EXPECT_EQ(view->data(), data);

  EXPECT_EQ(view->at(1), 0);

  END_TEST;
}

}  // namespace

BEGIN_TEST_CASE(cpp_types_tests)
RUN_NAMED_TEST("StringView test", string_view_test)
RUN_NAMED_TEST("VectorView test", vector_view_test)
END_TEST_CASE(cpp_types_tests)
