//===-- LineEditor.cpp ----------------------------------------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "llvm/LineEditor/LineEditor.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
#include "gtest/gtest.h"

using namespace llvm;

class LineEditorTest : public testing::Test {
public:
  SmallString<64> HistPath;
  LineEditor *LE;

  LineEditorTest() {
    init();
  }

  void init() {
    sys::fs::createTemporaryFile("temp", "history", HistPath);
    ASSERT_FALSE(HistPath.empty());
    LE = new LineEditor("test", HistPath);
  }

  ~LineEditorTest() override {
    delete LE;
    sys::fs::remove(HistPath.str());
  }
};

TEST_F(LineEditorTest, HistorySaveLoad) {
  LE->saveHistory();
  LE->loadHistory();
}

struct TestListCompleter {
  std::vector<LineEditor::Completion> Completions;

  TestListCompleter(const std::vector<LineEditor::Completion> &Completions)
      : Completions(Completions) {}

  std::vector<LineEditor::Completion> operator()(StringRef Buffer,
                                                 size_t Pos) const {
    EXPECT_TRUE(Buffer.empty());
    EXPECT_EQ(0u, Pos);
    return Completions;
  }
};

TEST_F(LineEditorTest, ListCompleters) {
  std::vector<LineEditor::Completion> Comps;

  Comps.push_back(LineEditor::Completion("foo", "int foo()"));
  LE->setListCompleter(TestListCompleter(Comps));
  LineEditor::CompletionAction CA = LE->getCompletionAction("", 0);
  EXPECT_EQ(LineEditor::CompletionAction::AK_Insert, CA.Kind);
  EXPECT_EQ("foo", CA.Text);

  Comps.push_back(LineEditor::Completion("bar", "int bar()"));
  LE->setListCompleter(TestListCompleter(Comps));
  CA = LE->getCompletionAction("", 0);
  EXPECT_EQ(LineEditor::CompletionAction::AK_ShowCompletions, CA.Kind);
  ASSERT_EQ(2u, CA.Completions.size());
  ASSERT_EQ("int foo()", CA.Completions[0]);
  ASSERT_EQ("int bar()", CA.Completions[1]);

  Comps.clear();
  Comps.push_back(LineEditor::Completion("fee", "int fee()"));
  Comps.push_back(LineEditor::Completion("fi", "int fi()"));
  Comps.push_back(LineEditor::Completion("foe", "int foe()"));
  Comps.push_back(LineEditor::Completion("fum", "int fum()"));
  LE->setListCompleter(TestListCompleter(Comps));
  CA = LE->getCompletionAction("", 0);
  EXPECT_EQ(LineEditor::CompletionAction::AK_Insert, CA.Kind);
  EXPECT_EQ("f", CA.Text);
}
