// Copyright 2018 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 <zircon/syscalls.h>

#include "garnet/lib/ui/gfx/tests/vk_session_test.h"
#include "lib/ui/gfx/util/time.h"
#include "lib/ui/scenic/cpp/commands.h"
#include "public/lib/escher/test/gtest_vulkan.h"

#include "gtest/gtest.h"

namespace scenic_impl {
namespace gfx {
namespace test {

using PoseBufferTest = VkSessionTest;

VK_TEST_F(PoseBufferTest, Validation) {
  const ResourceId invalid_id = 0;
  const ResourceId scene_id = 1;
  const ResourceId camera_id = 2;
  const ResourceId memory_id = 3;
  const ResourceId buffer_id = 4;

  ASSERT_TRUE(Apply(scenic::NewCreateSceneCmd(scene_id)));
  ASSERT_TRUE(Apply(scenic::NewCreateCameraCmd(camera_id, scene_id)));

  uint64_t vmo_size = PAGE_SIZE;
  zx::vmo vmo;
  zx_status_t status = zx::vmo::create(vmo_size, 0u, &vmo);
  ASSERT_EQ(ZX_OK, status);

  zx_clock_t base_time = dispatcher_clock_now();
  uint64_t time_interval = 1024 * 1024;  // 1 ms
  uint32_t num_entries = 1;

  ASSERT_TRUE(Apply(scenic::NewCreateMemoryCmd(
      memory_id, std::move(vmo), vmo_size,
      fuchsia::images::MemoryType::VK_DEVICE_MEMORY)));
  ASSERT_TRUE(
      Apply(scenic::NewCreateBufferCmd(buffer_id, memory_id, 0, vmo_size)));

  // Actual Tests

  // Basic case: all arguments valid
  EXPECT_TRUE(Apply(scenic::NewSetCameraPoseBufferCmd(
      camera_id, buffer_id, num_entries, base_time, time_interval)));

  // Invalid base time 1 second in the future
  EXPECT_FALSE(Apply(scenic::NewSetCameraPoseBufferCmd(
      camera_id, buffer_id, num_entries, base_time + 1024 * 1024 * 1024,
      time_interval)));

  // Invalid buffer id
  EXPECT_FALSE(Apply(scenic::NewSetCameraPoseBufferCmd(
      camera_id, invalid_id, num_entries, base_time, time_interval)));

  // Invalid camera id
  EXPECT_FALSE(Apply(scenic::NewSetCameraPoseBufferCmd(
      invalid_id, buffer_id, num_entries, base_time, time_interval)));

  // num_entries too small
  EXPECT_FALSE(Apply(scenic::NewSetCameraPoseBufferCmd(
      camera_id, buffer_id, 0, base_time, time_interval)));

  // num_entries too large
  EXPECT_FALSE(Apply(scenic::NewSetCameraPoseBufferCmd(
      camera_id, buffer_id, UINT32_MAX, base_time, time_interval)));
}

}  // namespace test
}  // namespace gfx
}  // namespace scenic_impl
