#include "argument_test.hpp"

#include "argument.hpp"

#include <string>
#include <vector>

static const std::string expected_path1 = "/arg1-test-path";
static const std::string expected_target1 = "t1.target";
static const std::string expected_target2 = "t2.target";

// Allow for a single unrecognized option then the Usage printout
static const std::string invalid_arg_regex =
    "^[^\n]*unrecognized option[^\n]*\nUsage: ";

static const std::string clean_usage_regex = "^Usage: ";

namespace phosphor
{
namespace watchdog
{

void ArgumentTest::SetUp()
{
    arg0 = "argument_test";
}

/** @brief ArgumentParser should return no values if given no options */
TEST_F(ArgumentTest, NoOptions)
{
    char* const args[] = {&arg0[0], nullptr};
    ArgumentParser ap(sizeof(args) / sizeof(char*) - 1, args);
    EXPECT_EQ(std::vector<std::string>({}), ap["path"]);
    EXPECT_EQ(std::vector<std::string>({}), ap["continue"]);
    EXPECT_EQ(std::vector<std::string>({}), ap["arbitrary_unknown"]);
}

/** @brief ArgumentParser should return true for an existing no-arg option
 *         Make sure we don't parse arguments if an option takes none
 *         Also make sure we don't populate options not used.
 */
TEST_F(ArgumentTest, LongOptionNoArg)
{
    std::string arg_continue = "--continue";
    std::string arg_extra = "not-a-bool";
    char* const args[] = {&arg0[0], &arg_continue[0], &arg_extra[0], nullptr};
    ArgumentParser ap(sizeof(args) / sizeof(char*) - 1, args);
    EXPECT_EQ(std::vector<std::string>({}), ap["path"]);
    EXPECT_EQ(std::vector<std::string>({ArgumentParser::trueString}),
              ap["continue"]);
}

/** @brief ArgumentParser should return a string for long options that
 *         take an arg
 */
TEST_F(ArgumentTest, LongOptionRequiredArg)
{
    std::string arg_path = "--path";
    std::string arg_path_val = expected_path1;
    std::string arg_extra = "/unused-path";
    char* const args[] = {&arg0[0], &arg_path[0], &arg_path_val[0],
                          &arg_extra[0], nullptr};
    ArgumentParser ap(sizeof(args) / sizeof(char*) - 1, args);
    EXPECT_EQ(std::vector<std::string>({expected_path1}), ap["path"]);
}

/** @brief ArgumentParser should return a string for long options that
 *         accept an argument when passed an argument inline
 */
TEST_F(ArgumentTest, LongOptionInlineArg)
{
    std::string arg_path = "--path=" + expected_path1;
    std::string arg_extra = "/unused-path";
    char* const args[] = {&arg0[0], &arg_path[0], &arg_extra[0], nullptr};
    ArgumentParser ap(sizeof(args) / sizeof(char*) - 1, args);
    EXPECT_EQ(std::vector<std::string>({expected_path1}), ap["path"]);
}

/** @brief ArgumentParser should return a string for short options that
 *         accept an argument.
 */
TEST_F(ArgumentTest, ShortOptionRequiredArg)
{
    std::string arg_path = "-p";
    std::string arg_path_val = expected_path1;
    std::string arg_extra = "/unused-path";
    char* const args[] = {&arg0[0], &arg_path[0], &arg_path_val[0],
                          &arg_extra[0], nullptr};
    ArgumentParser ap(sizeof(args) / sizeof(char*) - 1, args);
    EXPECT_EQ(std::vector<std::string>({expected_path1}), ap["path"]);
}

/** @brief ArgumentParser should be able to handle parsing multiple options
 *         Make sure this works for no-arg and required-arg type options
 *         Make sure this works between short and long options
 */
TEST_F(ArgumentTest, MultiOptionOverride)
{
    std::string arg_continue_short = "-c";
    std::string arg_path = "--path=" + expected_path1;
    std::string arg_continue_long = "--continue";
    std::string arg_target = "--target=" + expected_target2;
    std::string arg_target_short = "-t";
    std::string arg_target_val = expected_target1;
    char* const args[] = {&arg0[0],           &arg_continue_short[0],
                          &arg_path[0],       &arg_continue_long[0],
                          &arg_target[0],     &arg_target_short[0],
                          &arg_target_val[0], nullptr};
    ArgumentParser ap(sizeof(args) / sizeof(char*) - 1, args);
    EXPECT_EQ(std::vector<std::string>({expected_path1}), ap["path"]);
    EXPECT_EQ(std::vector<std::string>(
                  {ArgumentParser::trueString, ArgumentParser::trueString}),
              ap["continue"]);
    EXPECT_EQ(std::vector<std::string>({expected_target2, expected_target1}),
              ap["target"]);
}

/** @brief ArgumentParser should print usage information when given a help
 *         argument anywhere in the arguments array
 */
TEST_F(ArgumentTest, ShortOptionHelp)
{
    std::string arg_extra = "extra";
    std::string arg_help = "-h";
    char* const args[] = {&arg0[0], &arg_extra[0], &arg_help[0], nullptr};
    EXPECT_EXIT(ArgumentParser(sizeof(args) / sizeof(char*) - 1, args),
                ::testing::ExitedWithCode(255), clean_usage_regex);
}

/** @brief ArgumentParser should print usage information when given a help
 *         argument anywhere in the arguments array
 */
TEST_F(ArgumentTest, LongOptionHelp)
{
    std::string arg_help = "--help";
    std::string arg_extra = "extra";
    char* const args[] = {&arg0[0], &arg_help[0], &arg_extra[0], nullptr};
    EXPECT_EXIT(ArgumentParser(sizeof(args) / sizeof(char*) - 1, args),
                ::testing::ExitedWithCode(255), clean_usage_regex);
}

/** @brief ArgumentParser should print an invalid argument error and
 *         usage information when given an invalid argument anywhere
 *         in the arguments array
 */
TEST_F(ArgumentTest, InvalidOptionHelp)
{
    std::string arg_continue = "--continue";
    std::string arg_bad = "--bad_arg";
    std::string arg_target = "--target=/unused-path";
    char* const args[] = {&arg0[0], &arg_continue[0], &arg_bad[0],
                          &arg_target[0], nullptr};
    EXPECT_EXIT(ArgumentParser(sizeof(args) / sizeof(char*) - 1, args),
                ::testing::ExitedWithCode(255), invalid_arg_regex);
}

} // namespace watchdog
} // namespace phosphor
