// Copyright 2020 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 "src/developer/debug/zxdb/console/commands/verb_print.h"

#include <gtest/gtest.h>

#include "src/developer/debug/zxdb/client/mock_frame.h"
#include "src/developer/debug/zxdb/client/mock_remote_api.h"
#include "src/developer/debug/zxdb/console/console_test.h"
#include "src/developer/debug/zxdb/console/mock_console.h"
#include "src/developer/debug/zxdb/symbols/mock_symbol_data_provider.h"

namespace zxdb {

namespace {

class VerbPrint : public ConsoleTest {};

}  // namespace

TEST_F(VerbPrint, LanguagePreference) {
  console().ProcessInputLine("set language c++");
  console().GetOutputEvent();  // Eat output from the set.
  console().ProcessInputLine("print 3 as u64");
  auto event = console().GetOutputEvent();
  EXPECT_EQ("Unexpected input, did you forget an operator?\n  3 as u64\n    ^",
            event.output.AsString());

  console().ProcessInputLine("set language rust");
  console().GetOutputEvent();  // Eat output from the set.
  console().ProcessInputLine("print 3 as u64");
  event = console().GetOutputEvent();
  EXPECT_EQ("3", event.output.AsString());

  console().ProcessInputLine("set language auto");
  console().GetOutputEvent();  // Eat output from the set.
  console().ProcessInputLine("print 3 as u64");
  event = console().GetOutputEvent();
  EXPECT_EQ("Unexpected input, did you forget an operator?\n  3 as u64\n    ^",
            event.output.AsString());
}

TEST_F(VerbPrint, TypeOverrides) {
  // Decimal (the default).
  console().ProcessInputLine("print 100");
  auto event = console().GetOutputEvent();
  EXPECT_EQ("100", event.output.AsString());

  console().ProcessInputLine("print -d 100");
  event = console().GetOutputEvent();
  EXPECT_EQ("100", event.output.AsString());

  // Hex.
  console().ProcessInputLine("print -x 100");
  event = console().GetOutputEvent();
  EXPECT_EQ("0x64", event.output.AsString());

  // Bin.
  console().ProcessInputLine("print -b 1234");
  event = console().GetOutputEvent();
  EXPECT_EQ("0b100'11010010", event.output.AsString());

  // Unsigned (currently we treat "-1" as a 32-bit integer so the unsigned version is also 32 bits).
  // The "--" is required to mark the end of switches so the "-1" is treated as the expression
  // rather than another switch).
  console().ProcessInputLine("print -u -- -1");
  event = console().GetOutputEvent();
  EXPECT_EQ("4294967295", event.output.AsString());

  // Character.
  console().ProcessInputLine("print -c 100");
  event = console().GetOutputEvent();
  EXPECT_EQ("'d'", event.output.AsString());

  // More than one is an error.
  console().ProcessInputLine("print -d -c 100");
  event = console().GetOutputEvent();
  EXPECT_EQ("More than one type override (-b, -c, -d, -u, -x) specified.", event.output.AsString());
}

// A client end-to-end test for vector register formats.
TEST_F(VerbPrint, VectorRegisterFormat) {
  // Thread needs to be stopped. We can't use InjectExceptionWithStack because we want the real
  // frame implementation which provides the real EvalContext and SymbolDataSource.
  debug_ipc::NotifyException exception;
  exception.type = debug_ipc::ExceptionType::kSingleStep;
  exception.thread.id = {.process = kProcessKoid, .thread = kThreadKoid};
  exception.thread.state = debug_ipc::ThreadRecord::State::kBlocked;
  exception.thread.frames.emplace_back(0x10000, 0x20000, 0x3000);
  InjectException(exception);

  // Don't care about the stop notification.
  loop().RunUntilNoTasks();
  console().FlushOutputEvents();

  // Provide a frame with a value for register xmm0 (the default architecture of the test harness is
  // X64 so use it's vector registers).
  ASSERT_EQ(debug::Arch::kX64, session().arch());
  mock_remote_api()->SetRegisterCategory(
      debug::RegisterCategory::kVector,
      {debug::RegisterValue(
          debug::RegisterID::kX64_xmm0,
          std::vector<uint8_t>{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf})});

  console().ProcessInputLine("set vector-format i64");
  console().GetOutputEvent();  // Eat output from the set.

  // The default architecture of the test harness is ARM64 so use it's vector registers.
  console().ProcessInputLine("print -x xmm0");
  loop().RunUntilNoTasks();
  auto event = console().GetOutputEvent();
  EXPECT_EQ("{0x706050403020100, 0xf0e0d0c0b0a0908}", event.output.AsString());

  console().ProcessInputLine("set vector-format u16");
  console().GetOutputEvent();  // Eat output from the set.
  console().ProcessInputLine("print -x xmm0");
  loop().RunUntilNoTasks();
  event = console().GetOutputEvent();
  EXPECT_EQ(
      "{\n"
      "  [0] = 0x100\n"
      "  [1] = 0x302\n"
      "  [2] = 0x504\n"
      "  [3] = 0x706\n"
      "  [4] = 0x908\n"
      "  [5] = 0xb0a\n"
      "  [6] = 0xd0c\n"
      "  [7] = 0xf0e\n"
      "}",
      event.output.AsString());
}

}  // namespace zxdb
