// 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/executor.h"

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

#include "src/lib/testing/loop_fixture/test_loop_fixture.h"

namespace {

using Executor = gtest::TestLoopFixture;

cmd::Command MakeCommand(std::string line) {
  cmd::Command command;
  command.Parse(std::move(line));
  return command;
}

TEST_F(Executor, ExecuteNothing) {
  cmd::Executor exec(dispatcher());
  EXPECT_EQ(ZX_ERR_NEXT, exec.Execute(cmd::Command(), nullptr));
}

TEST_F(Executor, Quit) {
  cmd::Executor exec(dispatcher());
  EXPECT_EQ(ZX_ERR_STOP, exec.Execute(MakeCommand("exit"), nullptr));
  EXPECT_EQ(ZX_ERR_STOP, exec.Execute(MakeCommand("quit"), nullptr));
}

TEST_F(Executor, FailToExecute) {
  cmd::Executor exec(dispatcher());
  EXPECT_EQ(ZX_ERR_NOT_FOUND, exec.Execute(MakeCommand("/does/not/exist"), nullptr));
}

TEST_F(Executor, CompleteBuiltin) {
  cmd::Executor exec(dispatcher());
  cmd::Autocomplete autocomplete("seten");
  exec.Complete(&autocomplete);
  ASSERT_THAT(autocomplete.TakeCompletions(), testing::ElementsAre("setenv"));
}

TEST_F(Executor, CompletePath) {
  cmd::Executor exec(dispatcher());
  cmd::Autocomplete autocomplete("/pkg/met");
  exec.Complete(&autocomplete);
  ASSERT_THAT(autocomplete.TakeCompletions(), testing::ElementsAre("/pkg/meta"));
}

TEST_F(Executor, CompleteDelegateToTask) {
  cmd::Executor exec(dispatcher());
  cmd::Autocomplete autocomplete("getenv ANOTHER_TEST_ENVIRON_VAR_FOR_TES");

  setenv("ANOTHER_TEST_ENVIRON_VAR_FOR_TEST", "BANANA", 1);
  exec.Complete(&autocomplete);
  ASSERT_THAT(autocomplete.TakeCompletions(),
              testing::ElementsAre("getenv ANOTHER_TEST_ENVIRON_VAR_FOR_TEST"));
}

}  // namespace
