// 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 "src/lib/line_input/line_input.h"

#include <optional>

#include <gtest/gtest.h>

#include "src/lib/line_input/test_line_input.h"

namespace line_input {

namespace {

// Some common terminal codes.
#define TERM_UP "\x1b[A"
#define TERM_DOWN "\x1b[B"
#define TERM_LEFT "\x1b[D"
#define TERM_RIGHT "\x1b[C"

// Dummy completion functions that return two completions.
std::vector<std::string> AutocompleteCallback(const std::string& line) {
  std::vector<std::string> result;
  result.push_back("one");
  result.push_back("two");
  return result;
}

}  // namespace

TEST(LineInput, CursorCommands) {
  std::string prompt("Prompt ");
  TestLineInput input(prompt);

  // Basic prompt. "7C" at the end means cursor is @ 7th character.
  input.Show();
  EXPECT_EQ("\rPrompt \x1b[0K\r\x1B[7C", input.GetAndClearOutput());

  // Basic input with enter.
  input.OnInput('a');
  input.OnInput('b');
  EXPECT_FALSE(input.accept());
  input.OnInput('\r');
  ASSERT_TRUE(input.accept());
  EXPECT_EQ("ab", *input.accept());

  EXPECT_FALSE(input.OnInputStr("abcd"));
  EXPECT_EQ(4u, input.pos());

  // Basic cursor movement.
  input.OnInput(2);  // Control-B = left.
  EXPECT_EQ(3u, input.pos());
  input.OnInput(6);  // Control-F = right.
  EXPECT_EQ(4u, input.pos());
  input.OnInput(1);  // Control-A = home.
  EXPECT_EQ(0u, input.pos());
  input.OnInput(5);  // Control-E = end.
  EXPECT_EQ(4u, input.pos());

  // Longer escaped sequences.
  input.OnInputStr("\x1b[D");  // Left.
  EXPECT_EQ(3u, input.pos());
  input.OnInputStr("\x1b[C");  // Right.
  EXPECT_EQ(4u, input.pos());
  input.OnInputStr("\x1b[H");  // Home.
  EXPECT_EQ(0u, input.pos());
  input.OnInputStr("\x1b[F");  // End.
  EXPECT_EQ(4u, input.pos());
  input.OnInputStr("\x1b[1~");  // Home. Alternate.
  EXPECT_EQ(0u, input.pos());
  input.OnInputStr("\x1b[4~");  // End. Alternate.
  EXPECT_EQ(4u, input.pos());

  // Backspace.
  input.OnInput(127);  // Backspace.
  EXPECT_EQ(3u, input.pos());
  EXPECT_EQ("abc", input.GetLine());

  // Delete. This one also tests the line refresh commands.
  input.OnInput(1);  // Home.
  input.ClearOutput();
  input.OnInputStr("\x1b[3~");
  EXPECT_EQ("bc", input.GetLine());
  // "7C" at the end means cursor is at the 7th character (the "b").
  EXPECT_EQ("\rPrompt bc\x1b[0K\r\x1B[7C", input.GetAndClearOutput());
  EXPECT_EQ(0u, input.pos());
}

TEST(LineInput, CtrlD) {
  std::string prompt("Prompt ");
  TestLineInput input(prompt);
  input.Show();

  EXPECT_FALSE(input.OnInputStr("abcd"));
  // "abcd|"
  EXPECT_EQ(4u, input.pos());

  EXPECT_FALSE(input.OnInputStr("\x1b[D\x1b[D"));  // 2 x Left.
  // "ab|cd"
  EXPECT_EQ(2u, input.pos());

  input.OnInput(4);  // Ctrl+D
  // "ab|d"
  EXPECT_EQ("abd", input.GetLine());
  EXPECT_EQ(2u, input.pos());

  input.OnInputStr("\x1b[C");  // Right.
  // "abd|"
  EXPECT_EQ(3u, input.pos());
  EXPECT_EQ("abd", input.GetLine());

  input.OnInput(4);  // Ctrl+D
  // No change when hit Ctrl+D at the end of the line.
  EXPECT_EQ("abd", input.GetLine());
  EXPECT_EQ(3u, input.pos());

  // Erase everything and then exit.

  EXPECT_FALSE(input.OnInputStr("\x1b[D\x1b[D\x1b[D"));  // 3 x Left.
  // "|abd"
  EXPECT_EQ(0u, input.pos());

  input.OnInput(4);  // Ctrl+D
  // "|bd"
  EXPECT_EQ("bd", input.GetLine());
  EXPECT_EQ(0u, input.pos());

  input.OnInput(4);  // Ctrl+D
  // "|d"
  EXPECT_EQ("d", input.GetLine());
  EXPECT_EQ(0u, input.pos());

  input.OnInput(4);  // Ctrl+D
  // "|"
  EXPECT_EQ("", input.GetLine());
  EXPECT_EQ(0u, input.pos());

  // Ctrl+D on an empty line is exit.

  bool got_eof = false;
  input.SetEofCallback([&got_eof]() { got_eof = true; });
  input.OnInput(4);  // Ctrl+D
  EXPECT_TRUE(got_eof);
}

TEST(LineInput, History) {
  TestLineInput input("");
  input.set_accept_goes_to_history(true);
  input.Show();

  // Make some history.
  input.OnInputStr("one\r");
  input.OnInputStr("two\r");

  // Go up twice.
  EXPECT_FALSE(input.OnInputStr(TERM_UP TERM_UP));

  // Should have selected the first line and the cursor should be at the end.
  EXPECT_EQ("one", input.GetLine());
  EXPECT_EQ(3u, input.pos());

  // Append a letter and accept it.
  input.OnInputStr("s\r");

  // Start editing a new line with some input.
  input.OnInputStr("three");

  // Check history. Should be:
  //  ones
  //  two
  //  ones
  //  three
  EXPECT_EQ("three", input.GetLine());
  EXPECT_FALSE(input.OnInputStr(TERM_UP));
  EXPECT_EQ("ones", input.GetLine());
  EXPECT_FALSE(input.OnInputStr(TERM_UP));
  EXPECT_EQ("two", input.GetLine());
  EXPECT_FALSE(input.OnInputStr(TERM_UP));
  EXPECT_FALSE(input.OnInputStr(TERM_UP));  // From here, these are extra to
  EXPECT_FALSE(input.OnInputStr(TERM_UP));  // test that going beyond the top
  EXPECT_FALSE(input.OnInputStr(TERM_UP));  // stays stopped.
  EXPECT_EQ("ones", input.GetLine());

  // Going back to the bottom (also doing one extra one to test the boundary).
  EXPECT_FALSE(input.OnInputStr(TERM_DOWN TERM_DOWN TERM_DOWN TERM_DOWN));

  // Should have gotten the original non-accepted input back.
  EXPECT_EQ("three", input.GetLine());
}

TEST(LineInput, HistoryEdgeCases) {
  TestLineInput input("");

  input.AddToHistory("one");
  ASSERT_EQ(input.GetHistory().size(), 2u);

  // If input is empty, it should not add to history.
  input.AddToHistory("");
  ASSERT_EQ(input.GetHistory().size(), 2u);

  // Same input should not work.
  input.AddToHistory("one");
  ASSERT_EQ(input.GetHistory().size(), 2u);

  // A past input should work.
  input.AddToHistory("two");
  ASSERT_EQ(input.GetHistory().size(), 3u);
  input.AddToHistory("one");
  ASSERT_EQ(input.GetHistory().size(), 4u);
}

TEST(LineInput, Completions) {
  TestLineInput input("");
  input.SetAutocompleteCallback(&AutocompleteCallback);

  input.Show();
  input.OnInput('z');

  // Send one tab, should get the first suggestion.
  input.OnInput(9);
  EXPECT_EQ("one", input.GetLine());
  EXPECT_EQ(3u, input.pos());

  // Second suggestion.
  input.OnInput(9);
  EXPECT_EQ("two", input.GetLine());
  EXPECT_EQ(3u, input.pos());

  // Again should go back to original text.
  input.OnInput(9);
  EXPECT_EQ("z", input.GetLine());
  EXPECT_EQ(1u, input.pos());

  // Should wrap around to the first suggestion.
  input.OnInput(9);
  EXPECT_EQ("one", input.GetLine());
  EXPECT_EQ(3u, input.pos());

  // Typing should append.
  input.OnInput('s');
  EXPECT_EQ("ones", input.GetLine());
  EXPECT_EQ(4u, input.pos());

  // Tab again should give the same suggestions.
  input.OnInput(9);
  EXPECT_EQ("one", input.GetLine());
  EXPECT_EQ(3u, input.pos());

  // Send an escape sequence "left" which should accept the suggestion and
  // execute the sequence.
  input.OnInputStr("\x1b[D");
  EXPECT_EQ("one", input.GetLine());
  EXPECT_EQ(2u, input.pos());
}

TEST(LineInput, Scroll) {
  TestLineInput input("ABCDE");
  input.SetMaxCols(10);

  input.Show();
  input.ClearOutput();

  // Write up to the 9th character, which should be the last character printed
  // until scrolling starts. It should have used the optimized "just write the
  // characters" code path for everything after the prompt.
  EXPECT_FALSE(input.OnInputStr("FGHI"));
  EXPECT_EQ("FGHI", input.GetAndClearOutput());

  // Add a 10th character. The whole line should scroll one to the left,
  // leaving the cursor at the last column (column offset 9 = "9C" at the end).
  input.OnInput('J');
  EXPECT_EQ("\rBCDEFGHIJ\x1b[0K\r\x1B[9C", input.GetAndClearOutput());

  // Move left, the line should scroll back.
  input.OnInput(2);  // 2 = Control-B.
  EXPECT_EQ("\rABCDEFGHIJ\x1b[0K\r\x1B[9C", input.GetAndClearOutput());
}

TEST(LineInput, NegAck) {
  TestLineInput input("ABCDE");
  input.Show();

  // Empty should remain with them prompt.
  input.OnInput(SpecialCharacters::kKeyControlU);
  EXPECT_EQ(input.GetLine(), "");

  // Adding characters and then Control-U should clear.
  input.OnInputStr("12345");
  input.OnInput(SpecialCharacters::kKeyControlU);
  EXPECT_EQ(input.GetLine(), "");

  // In the middle of the line should clear until the cursor.
  input.OnInputStr("0123456789");
  EXPECT_FALSE(input.OnInputStr(TERM_LEFT));
  EXPECT_FALSE(input.OnInputStr(TERM_LEFT));
  EXPECT_FALSE(input.OnInputStr(TERM_LEFT));
  EXPECT_FALSE(input.OnInputStr(TERM_LEFT));
  input.OnInput(SpecialCharacters::kKeyControlU);
  EXPECT_EQ(input.GetLine(), "6789");
  EXPECT_EQ(input.pos(), 0u);
}

TEST(LineInput, EndOfTransimission) {
  TestLineInput input("[prompt] ");
  input.Show();

  //             v
  input.SetLine("First Second Third");
  input.SetPos(0);
  input.OnInput(SpecialCharacters::kKeyControlW);
  EXPECT_EQ(input.GetLine(), "First Second Third");

  //               v
  input.SetLine("First Second Third");
  input.SetPos(2);
  input.OnInput(SpecialCharacters::kKeyControlW);
  EXPECT_EQ(input.GetLine(), "rst Second Third");

  //                  v
  input.SetLine("First Second Third");
  input.SetPos(5);
  input.OnInput(SpecialCharacters::kKeyControlW);
  EXPECT_EQ(input.GetLine(), " Second Third");

  //                     v
  input.SetLine("First Second Third");
  input.SetPos(8);
  input.OnInput(SpecialCharacters::kKeyControlW);
  EXPECT_EQ(input.GetLine(), "First cond Third");

  //                         v
  input.SetLine("First Second Third");
  input.SetPos(12);
  input.OnInput(SpecialCharacters::kKeyControlW);
  EXPECT_EQ(input.GetLine(), "First  Third");

  //                            v
  input.SetLine("First Second Third");
  input.SetPos(15);
  input.OnInput(SpecialCharacters::kKeyControlW);
  EXPECT_EQ(input.GetLine(), "First Second ird");

  //                               v
  input.SetLine("First Second Third");
  input.OnInput(SpecialCharacters::kKeyControlW);
  EXPECT_EQ(input.GetLine(), "First Second ");
}

TEST(LineInput, Transpose) {
  TestLineInput input("[prompt] ");
  input.Show();

  //             v
  input.SetLine("First Second Third");
  input.SetPos(0);
  input.OnInput(SpecialCharacters::kKeyControlT);
  EXPECT_EQ(input.GetLine(), "First Second Third");

  //              v
  input.SetLine("First Second Third");
  input.SetPos(1);
  input.OnInput(SpecialCharacters::kKeyControlT);
  EXPECT_EQ(input.GetLine(), "First Second Third");

  //               v
  input.SetLine("First Second Third");
  input.SetPos(2);
  input.OnInput(SpecialCharacters::kKeyControlT);
  EXPECT_EQ(input.GetLine(), "iFrst Second Third");

  //                               v
  input.SetLine("First Second Third");
  input.SetPos(18);
  input.OnInput(SpecialCharacters::kKeyControlT);
  EXPECT_EQ(input.GetLine(), "First Second Thidr");
}

TEST(LineInput, DeleteEnd) {
  TestLineInput input("[prompt] ");
  input.Show();

  //             v
  input.SetLine("First Second Third");
  input.SetPos(0);
  input.OnInput(SpecialCharacters::kKeyControlK);
  EXPECT_EQ(input.GetLine(), "");

  //               v
  input.SetLine("First Second Third");
  input.SetPos(2);
  input.OnInput(SpecialCharacters::kKeyControlK);
  EXPECT_EQ(input.GetLine(), "Fi");

  //                  v
  input.SetLine("First Second Third");
  input.SetPos(5);
  input.OnInput(SpecialCharacters::kKeyControlK);
  EXPECT_EQ(input.GetLine(), "First");

  //                     v
  input.SetLine("First Second Third");
  input.SetPos(8);
  input.OnInput(SpecialCharacters::kKeyControlK);
  EXPECT_EQ(input.GetLine(), "First Se");

  //                         v
  input.SetLine("First Second Third");
  input.SetPos(12);
  input.OnInput(SpecialCharacters::kKeyControlK);
  EXPECT_EQ(input.GetLine(), "First Second");

  //                               v
  input.SetLine("First Second Third");
  input.OnInput(SpecialCharacters::kKeyControlK);
  EXPECT_EQ(input.GetLine(), "First Second Third");
}

TEST(LineInput, CancelCommand) {
  TestLineInput input("[prompt] ");
  input.Show();

  // When no cancel callback is supplied, the line will be cleared.

  //             v
  input.SetLine("First Second Third");
  input.SetPos(0);
  input.OnInput(SpecialCharacters::kKeyControlC);
  EXPECT_EQ(input.GetLine(), "");

  //               v
  input.SetLine("First Second Third");
  input.SetPos(2);
  input.OnInput(SpecialCharacters::kKeyControlC);
  EXPECT_EQ(input.GetLine(), "");

  //                               v
  input.SetLine("First Second Third");
  input.SetPos(18);
  input.OnInput(SpecialCharacters::kKeyControlC);
  EXPECT_EQ(input.GetLine(), "");

  // When a callback is supplied, it will be called and there will be no change.
  bool got_cb = false;
  input.SetCancelCallback([&got_cb]() { got_cb = true; });
  input.SetLine("line contents");
  input.OnInput(SpecialCharacters::kKeyControlC);
  EXPECT_TRUE(got_cb);
  EXPECT_EQ(input.GetLine(), "line contents");
}

TEST(LineInput, ReverseHistory_Select) {
  TestLineInput input("> ");

  // Add some history.
  input.AddToHistory("prefix postfix1");  // Index 5.
  input.AddToHistory("prefix postfix2");  // Index 4.
  input.AddToHistory("prefix postfix3");  // Index 3.
  input.AddToHistory("other prefix");     // Index 2.
  input.AddToHistory("different");        // Index 1.

  input.Show();
  input.OnInput(SpecialCharacters::kKeyControlR);
  ASSERT_TRUE(input.in_reverse_history_mode());

  EXPECT_FALSE(input.OnInputStr("post"));
  ASSERT_TRUE(input.in_reverse_history_mode());
  EXPECT_EQ(input.GetReverseHistoryPrompt(), "(reverse-i-search)`post': ");
  EXPECT_EQ(input.reverse_history_index(), 3u);
  // Pos:                                        |       v
  EXPECT_EQ(input.GetReverseHistorySuggestion(), "prefix postfix3");
  EXPECT_EQ(input.pos(), 7u);

  // Selecting should get this suggestion out.
  input.OnInput(SpecialCharacters::kKeyEnter);
  ASSERT_FALSE(input.in_reverse_history_mode());
  // Pos:                 |               v
  EXPECT_EQ(input.GetLine(), "prefix postfix3");
  EXPECT_EQ(input.pos(), 15u);
}

TEST(LineInput, ReverseHistory_SpecificSearch) {
  TestLineInput input("> ");

  // Add some history.
  input.AddToHistory("prefix postfix1");  // Index 5.
  input.AddToHistory("prefix postfix2");  // Index 4.
  input.AddToHistory("prefix postfix3");  // Index 3.
  input.AddToHistory("other prefix");     // Index 2.
  input.AddToHistory("different");        // Index 1.

  input.Show();

  input.OnInput(SpecialCharacters::kKeyControlR);
  ASSERT_TRUE(input.in_reverse_history_mode());

  input.OnInput('f');
  ASSERT_TRUE(input.in_reverse_history_mode());
  EXPECT_EQ(input.GetReverseHistoryPrompt(), "(reverse-i-search)`f': ");
  EXPECT_EQ(input.reverse_history_index(), 1u);
  // Pos:                                        |  v
  EXPECT_EQ(input.GetReverseHistorySuggestion(), "different");
  EXPECT_EQ(input.pos(), 2u);

  input.OnInput('i');
  ASSERT_TRUE(input.in_reverse_history_mode());
  EXPECT_EQ(input.GetReverseHistoryPrompt(), "(reverse-i-search)`fi': ");
  EXPECT_EQ(input.reverse_history_index(), 2u);
  // Pos:                                        |         v
  EXPECT_EQ(input.GetReverseHistorySuggestion(), "other prefix");
  EXPECT_EQ(input.pos(), 9u);

  input.OnInput('x');
  ASSERT_TRUE(input.in_reverse_history_mode());
  EXPECT_EQ(input.GetReverseHistoryPrompt(), "(reverse-i-search)`fix': ");
  EXPECT_EQ(input.reverse_history_index(), 2u);
  // Pos:                                        |         v
  EXPECT_EQ(input.GetReverseHistorySuggestion(), "other prefix");
  EXPECT_EQ(input.pos(), 9u);

  input.OnInput('3');
  ASSERT_TRUE(input.in_reverse_history_mode());
  EXPECT_EQ(input.GetReverseHistoryPrompt(), "(reverse-i-search)`fix3': ");
  EXPECT_EQ(input.reverse_history_index(), 3u);
  // Pos:                                        |           v
  EXPECT_EQ(input.GetReverseHistorySuggestion(), "prefix postfix3");
  EXPECT_EQ(input.pos(), 11u);

  input.OnInput('3');
  ASSERT_TRUE(input.in_reverse_history_mode());
  EXPECT_EQ(input.GetReverseHistoryPrompt(), "(reverse-i-search)`fix33': ");
  EXPECT_EQ(input.reverse_history_index(), 0u);
  EXPECT_EQ(input.GetReverseHistorySuggestion(), "");
  EXPECT_EQ(input.pos(), 0u);

  // Deleting should return to the suggestion.
  input.OnInput(SpecialCharacters::kKeyBackspace);
  ASSERT_TRUE(input.in_reverse_history_mode());
  EXPECT_EQ(input.GetReverseHistoryPrompt(), "(reverse-i-search)`fix3': ");
  EXPECT_EQ(input.reverse_history_index(), 3u);
  // Pos:                                        |           v
  EXPECT_EQ(input.GetReverseHistorySuggestion(), "prefix postfix3");
  EXPECT_EQ(input.pos(), 11u);
}

TEST(LineInput, ReverseHistory_RepeatedSearch) {
  TestLineInput input("> ");

  // Add some history.
  input.AddToHistory("prefix postfix1");  // Index 5.
  input.AddToHistory("prefix postfix2");  // Index 4.
  input.AddToHistory("prefix postfix3");  // Index 3.
  input.AddToHistory("other prefix");     // Index 2.
  input.AddToHistory("different");        // Index 1.

  input.Show();
  ASSERT_FALSE(input.in_reverse_history_mode());

  input.OnInput(SpecialCharacters::kKeyControlR);

  // We should be in reverse history mode, but no suggestion should be made.
  ASSERT_TRUE(input.in_reverse_history_mode());
  EXPECT_EQ(input.GetReverseHistoryPrompt(), "(reverse-i-search)`': ");
  EXPECT_EQ(input.reverse_history_index(), 0u);
  EXPECT_EQ(input.GetReverseHistorySuggestion(), "");
  EXPECT_EQ(input.pos(), 0u);

  // Start writing should match.
  input.OnInput('f');
  ASSERT_TRUE(input.in_reverse_history_mode());
  EXPECT_EQ(input.GetReverseHistoryPrompt(), "(reverse-i-search)`f': ");
  EXPECT_EQ(input.reverse_history_index(), 1u);
  // Pos:                                        |  v
  EXPECT_EQ(input.GetReverseHistorySuggestion(), "different");
  EXPECT_EQ(input.pos(), 2u);

  // Ctrl-R should move to the next suggestion.
  input.OnInput(SpecialCharacters::kKeyControlR);
  ASSERT_TRUE(input.in_reverse_history_mode());
  EXPECT_EQ(input.GetReverseHistoryPrompt(), "(reverse-i-search)`f': ");
  EXPECT_EQ(input.reverse_history_index(), 2u);
  // Pos:                                        |         v
  EXPECT_EQ(input.GetReverseHistorySuggestion(), "other prefix");
  EXPECT_EQ(input.pos(), 9u);

  input.OnInput(SpecialCharacters::kKeyControlR);
  input.OnInput(SpecialCharacters::kKeyControlR);
  ASSERT_TRUE(input.in_reverse_history_mode());
  EXPECT_EQ(input.GetReverseHistoryPrompt(), "(reverse-i-search)`f': ");
  EXPECT_EQ(input.reverse_history_index(), 4u);
  // Pos:                                        |   v
  EXPECT_EQ(input.GetReverseHistorySuggestion(), "prefix postfix2");
  EXPECT_EQ(input.pos(), 3u);

  // More Ctrl-R should roll-over.
  input.OnInput(SpecialCharacters::kKeyControlR);
  input.OnInput(SpecialCharacters::kKeyControlR);
  ASSERT_TRUE(input.in_reverse_history_mode());
  EXPECT_EQ(input.GetReverseHistoryPrompt(), "(reverse-i-search)`f': ");
  EXPECT_EQ(input.reverse_history_index(), 0u);
  EXPECT_EQ(input.GetReverseHistorySuggestion(), "");
  EXPECT_EQ(input.pos(), 0u);

  // One more should start again.
  input.OnInput(SpecialCharacters::kKeyControlR);
  input.OnInput(SpecialCharacters::kKeyControlR);
  ASSERT_TRUE(input.in_reverse_history_mode());
  EXPECT_EQ(input.GetReverseHistoryPrompt(), "(reverse-i-search)`f': ");
  EXPECT_EQ(input.reverse_history_index(), 2u);
  // Pos:                                        |         v
  EXPECT_EQ(input.GetReverseHistorySuggestion(), "other prefix");
  EXPECT_EQ(input.pos(), 9u);

  // Deleting should show no suggestion.
  input.OnInput(SpecialCharacters::kKeyBackspace);
  ASSERT_TRUE(input.in_reverse_history_mode());
  EXPECT_EQ(input.GetReverseHistoryPrompt(), "(reverse-i-search)`': ");
  EXPECT_EQ(input.reverse_history_index(), 0u);
  EXPECT_EQ(input.GetReverseHistorySuggestion(), "");
  EXPECT_EQ(input.pos(), 0u);
}

}  // namespace line_input
