// Copyright 2019 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 <gtest/gtest.h>

#include "tools/fidlcat/interception_tests/interception_workflow_test.h"

namespace fidlcat {

// zx_framebuffer_get_info tests.

std::unique_ptr<SystemCallTest> ZxFramebufferGetInfo(int64_t result, std::string_view result_name,
                                                     zx_handle_t resource, uint32_t* format,
                                                     uint32_t* width, uint32_t* height,
                                                     uint32_t* stride) {
  auto value = std::make_unique<SystemCallTest>("zx_framebuffer_get_info", result, result_name);
  value->AddInput(resource);
  value->AddInput(reinterpret_cast<uint64_t>(format));
  value->AddInput(reinterpret_cast<uint64_t>(width));
  value->AddInput(reinterpret_cast<uint64_t>(height));
  value->AddInput(reinterpret_cast<uint64_t>(stride));
  return value;
}

#define FRAMEBUFFER_GET_INFO_DISPLAY_TEST_CONTENT(result, expected)                      \
  uint32_t format = 1;                                                                   \
  uint32_t width = 1080;                                                                 \
  uint32_t height = 64;                                                                  \
  uint32_t stride = 0;                                                                   \
  PerformDisplayTest(                                                                    \
      "$plt(zx_framebuffer_get_info)",                                                   \
      ZxFramebufferGetInfo(result, #result, kHandle, &format, &width, &height, &stride), \
      expected)

#define FRAMEBUFFER_GET_INFO_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {                    \
    FRAMEBUFFER_GET_INFO_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                              \
  TEST_F(InterceptionWorkflowTestArm, name) {                    \
    FRAMEBUFFER_GET_INFO_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

FRAMEBUFFER_GET_INFO_DISPLAY_TEST(
    ZxFramebufferGetInfo, ZX_OK,
    "\n"
    "\x1B[32m0.000000\x1B[0m "
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_framebuffer_get_info(resource: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m)\n"
    "\x1B[32m0.000000\x1B[0m "
    "  -> \x1B[32mZX_OK\x1B[0m ("
    "format: \x1B[32muint32\x1B[0m = \x1B[34m1\x1B[0m, "
    "width: \x1B[32muint32\x1B[0m = \x1B[34m1080\x1B[0m, "
    "height: \x1B[32muint32\x1B[0m = \x1B[34m64\x1B[0m, "
    "stride: \x1B[32muint32\x1B[0m = \x1B[34m0\x1B[0m)\n")

// zx_framebuffer_set_range tests.

std::unique_ptr<SystemCallTest> ZxFramebufferSetRange(int64_t result, std::string_view result_name,
                                                      zx_handle_t resource, zx_handle_t vmo,
                                                      uint32_t len, uint32_t format, uint32_t width,
                                                      uint32_t height, uint32_t stride) {
  auto value = std::make_unique<SystemCallTest>("zx_framebuffer_set_range", result, result_name);
  value->AddInput(resource);
  value->AddInput(vmo);
  value->AddInput(len);
  value->AddInput(format);
  value->AddInput(width);
  value->AddInput(height);
  value->AddInput(stride);
  return value;
}

#define FRAMEBUFFER_SET_RANGE_DISPLAY_TEST_CONTENT(result, expected) \
  PerformDisplayTest(                                                \
      "$plt(zx_framebuffer_set_range)",                              \
      ZxFramebufferSetRange(result, #result, kHandle, kHandle2, 2000, 1, 1080, 64, 0), expected)

#define FRAMEBUFFER_SET_RANGE_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {                     \
    FRAMEBUFFER_SET_RANGE_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                               \
  TEST_F(InterceptionWorkflowTestArm, name) {                     \
    FRAMEBUFFER_SET_RANGE_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

FRAMEBUFFER_SET_RANGE_DISPLAY_TEST(ZxFramebufferSetRange, ZX_OK,
                                   "\n"
                                   "\x1B[32m0.000000\x1B[0m "
                                   "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
                                   "zx_framebuffer_set_range("
                                   "resource: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m, "
                                   "vmo: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1222\x1B[0m, "
                                   "len: \x1B[32muint32\x1B[0m = \x1B[34m2000\x1B[0m, "
                                   "format: \x1B[32muint32\x1B[0m = \x1B[34m1\x1B[0m, "
                                   "width: \x1B[32muint32\x1B[0m = \x1B[34m1080\x1B[0m, "
                                   "height: \x1B[32muint32\x1B[0m = \x1B[34m64\x1B[0m, "
                                   "stride: \x1B[32muint32\x1B[0m = \x1B[34m0\x1B[0m)\n"
                                   "\x1B[32m0.000000\x1B[0m "
                                   "  -> \x1B[32mZX_OK\x1B[0m\n")

}  // namespace fidlcat
