// 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_ticks_get tests.

std::unique_ptr<SystemCallTest> ZxTicksGet(int64_t result, std::string_view result_name) {
  return std::make_unique<SystemCallTest>("zx_ticks_get", result, result_name);
}

#define TICKS_GET_DISPLAY_TEST_CONTENT(result, expected) \
  PerformDisplayTest("$plt(zx_ticks_get)", ZxTicksGet(result, #result), expected);

#define TICKS_GET_DISPLAY_TEST(name, errno, expected)                                            \
  TEST_F(InterceptionWorkflowTestX64, name) { TICKS_GET_DISPLAY_TEST_CONTENT(errno, expected); } \
  TEST_F(InterceptionWorkflowTestArm, name) { TICKS_GET_DISPLAY_TEST_CONTENT(errno, expected); }

TICKS_GET_DISPLAY_TEST(ZxTicksGet, 497475301988264,
                       "\n"
                       "\x1B[32m0.000000\x1B[0m "
                       "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m zx_ticks_get()\n"
                       "\x1B[32m0.000000\x1B[0m "
                       "  -> \x1B[32mticks\x1B[0m: \x1B[34m497475301988264\x1B[0m\n");

// zx_ticks_per_second tests.

std::unique_ptr<SystemCallTest> ZxTicksPerSecond(int64_t result, std::string_view result_name) {
  return std::make_unique<SystemCallTest>("zx_ticks_per_second", result, result_name);
}

#define TICKS_PER_SECOND_DISPLAY_TEST_CONTENT(result, expected) \
  PerformDisplayTest("$plt(zx_ticks_per_second)", ZxTicksPerSecond(result, #result), expected);

#define TICKS_PER_SECOND_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {                \
    TICKS_PER_SECOND_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                          \
  TEST_F(InterceptionWorkflowTestArm, name) {                \
    TICKS_PER_SECOND_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

TICKS_PER_SECOND_DISPLAY_TEST(
    ZxTicksPerSecond, 2992964000,
    "\n"
    "\x1B[32m0.000000\x1B[0m "
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m zx_ticks_per_second()\n"
    "\x1B[32m0.000000\x1B[0m "
    "  -> \x1B[32mticks\x1B[0m: \x1B[34m2992964000\x1B[0m\n");

}  // namespace fidlcat
