// 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_up.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 VerbUp : public ConsoleTest {};

}  // namespace

TEST_F(VerbUp, Up) {
  std::vector<std::unique_ptr<Frame>> frames;
  constexpr uint64_t kAddress0 = 0x12471253;
  constexpr uint64_t kSP0 = 0x2000;
  frames.push_back(std::make_unique<MockFrame>(
      &session(), thread(), Location(Location::State::kSymbolized, kAddress0), kSP0));

  // Inject a partial stack for an exception the "up" command will have to request more frames.
  InjectExceptionWithStack(kProcessKoid, kThreadKoid, debug_ipc::ExceptionType::kSingleStep,
                           std::move(frames), false);

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

  // This is the reply with the full stack it will get asynchronously. We add three stack
  // frames.
  debug_ipc::ThreadStatusReply thread_status;
  thread_status.record.id = {.process = kProcessKoid, .thread = kThreadKoid};
  thread_status.record.state = debug_ipc::ThreadRecord::State::kBlocked;
  thread_status.record.blocked_reason = debug_ipc::ThreadRecord::BlockedReason::kException;
  thread_status.record.stack_amount = debug_ipc::ThreadRecord::StackAmount::kFull;
  thread_status.record.frames.emplace_back(kAddress0, kSP0, kSP0);
  thread_status.record.frames.emplace_back(kAddress0 + 16, kSP0 + 16, kSP0 + 16);
  thread_status.record.frames.emplace_back(kAddress0 + 32, kSP0 + 32, kSP0 + 32);

  mock_remote_api()->set_thread_status_reply(thread_status);

  // This will be at frame "0" initially. Going up should take us to from 2, but it will have to
  // request the frames before these can complete which we respond to asynchronously after.
  console().ProcessInputLine("up");
  console().ProcessInputLine("up");

  loop().RunUntilNoTasks();

  auto event = console().GetOutputEvent();
  EXPECT_EQ("Frame 1 0x12471263", event.output.AsString());
  event = console().GetOutputEvent();
  EXPECT_EQ("Frame 2 0x12471273", event.output.AsString());
}

}  // namespace zxdb
