// 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 "src/developer/cmd/autocomplete.h"

#include <gmock/gmock.h>
#include <gtest/gtest.h>

namespace {

TEST(Command, Parse) {
  {
    cmd::Autocomplete autocomplete("");
    EXPECT_TRUE(autocomplete.tokens().empty());
    EXPECT_EQ("", autocomplete.fragment());
  }

  {
    cmd::Autocomplete autocomplete("  \t  ");
    EXPECT_TRUE(autocomplete.tokens().empty());
    EXPECT_EQ("", autocomplete.fragment());
  }

  {
    cmd::Autocomplete autocomplete("# This is a comment");
    ASSERT_THAT(autocomplete.tokens(), testing::ElementsAre("#", "This", "is", "a"));
    EXPECT_EQ("comment", autocomplete.fragment());
  }

  {
    cmd::Autocomplete autocomplete(" #Also a comment ");
    ASSERT_THAT(autocomplete.tokens(), testing::ElementsAre("#Also", "a", "comment"));
    EXPECT_EQ("", autocomplete.fragment());
  }

  {
    cmd::Autocomplete autocomplete("ls");
    EXPECT_TRUE(autocomplete.tokens().empty());
    EXPECT_EQ("ls", autocomplete.fragment());
  }

  {
    cmd::Autocomplete autocomplete("ls -lart");
    ASSERT_THAT(autocomplete.tokens(), testing::ElementsAre("ls"));
    EXPECT_EQ("-lart", autocomplete.fragment());
  }

  {
    cmd::Autocomplete autocomplete("ls#not-a-comment");
    ASSERT_THAT(autocomplete.tokens(), testing::ElementsAre());
    EXPECT_EQ("ls#not-a-comment", autocomplete.fragment());
  }

  {
    cmd::Autocomplete autocomplete("ls #a-comment");
    ASSERT_THAT(autocomplete.tokens(), testing::ElementsAre("ls"));
    EXPECT_EQ("#a-comment", autocomplete.fragment());
  }

  {
    cmd::Autocomplete autocomplete(" ls \t -lart \n banana\r");
    ASSERT_THAT(autocomplete.tokens(), testing::ElementsAre("ls", "-lart", "banana"));
    EXPECT_EQ("", autocomplete.fragment());
  }

  {
    cmd::Autocomplete autocomplete(" \"\" ");
    ASSERT_THAT(autocomplete.tokens(), testing::ElementsAre("\"\""));
    EXPECT_EQ("", autocomplete.fragment());
  }

  {
    cmd::Autocomplete autocomplete("ls \" \" -lart");
    ASSERT_THAT(autocomplete.tokens(), testing::ElementsAre("ls", "\"", "\""));
    EXPECT_EQ("-lart", autocomplete.fragment());
  }

  {
    cmd::Autocomplete autocomplete("really ls\"not\" a-quote");
    ASSERT_THAT(autocomplete.tokens(), testing::ElementsAre("really", "ls\"not\""));
    EXPECT_EQ("a-quote", autocomplete.fragment());
  }

  {
    cmd::Autocomplete autocomplete("ls \"parse-error");
    ASSERT_THAT(autocomplete.tokens(), testing::ElementsAre("ls"));
    EXPECT_EQ("\"parse-error", autocomplete.fragment());
  }

  {
    cmd::Autocomplete autocomplete("ls \"also-parse-error  ");
    ASSERT_THAT(autocomplete.tokens(), testing::ElementsAre("ls", "\"also-parse-error"));
    EXPECT_EQ("", autocomplete.fragment());
  }
}

TEST(Command, AddCompletion) {
  cmd::Autocomplete autocomplete("ls /bin/l");
  autocomplete.AddCompletion("/bin/ls");
  autocomplete.AddCompletion("/bin/ln");
  ASSERT_THAT(autocomplete.TakeCompletions(), testing::ElementsAre("ls /bin/ls", "ls /bin/ln"));
}

TEST(Command, CompleteAsPathAbsolute) {
  cmd::Autocomplete autocomplete("ls /pk");
  autocomplete.CompleteAsPath();
  ASSERT_THAT(autocomplete.TakeCompletions(), testing::ElementsAre("ls /pkg"));
}

TEST(Command, CompleteAsPathRelative) {
  cmd::Autocomplete autocomplete("ls pk");
  autocomplete.CompleteAsPath();
  ASSERT_THAT(autocomplete.TakeCompletions(), testing::ElementsAre("ls pkg"));
}

TEST(Command, CompleteEmptyAsPathRelative) {
  cmd::Autocomplete autocomplete("");
  autocomplete.CompleteAsPath();
  ASSERT_THAT(autocomplete.TakeCompletions(), testing::Contains("pkg"));
}

TEST(Command, CompleteAsDirectoryEntry) {
  cmd::Autocomplete autocomplete("ls met");
  autocomplete.CompleteAsDirectoryEntry("/pkg");
  ASSERT_THAT(autocomplete.TakeCompletions(), testing::ElementsAre("ls meta"));
}

TEST(Command, CompleteAsEnvironmentVariable) {
  setenv("MY_TEST_ENVIRON_VAR", "BANANA", 1);
  cmd::Autocomplete autocomplete("getenv MY_TEST_ENVIRON_VA");
  autocomplete.CompleteAsEnvironmentVariable();
  ASSERT_THAT(autocomplete.TakeCompletions(), testing::ElementsAre("getenv MY_TEST_ENVIRON_VAR"));
  unsetenv("MY_TEST_ENVIRON_VAR");
}

TEST(Command, CompleteEmptyStringAsEnvironmentVariable) {
  setenv("AAAAA_MY_TEST_ENV", "BANANA", 1);
  cmd::Autocomplete autocomplete("");
  autocomplete.CompleteAsEnvironmentVariable();
  ASSERT_THAT(autocomplete.TakeCompletions(), testing::Contains("AAAAA_MY_TEST_ENV"));
  unsetenv("AAAAA_MY_TEST_ENV");
}

}  // namespace
