#include <cli.hpp>

#include "gtest/gtest.h"

using namespace attn;

TEST(TestCli, TestCliOptAll)
{

    // Test --all on options
    Config* config = new Config();
    char* argv[2];
    int i     = 0;
    argv[i++] = (char*)"--all";
    argv[i++] = (char*)"on";
    parseConfig(argv, argv + i, config);
    EXPECT_EQ(true, config->getFlag(AttentionFlag::enVital));
    EXPECT_EQ(true, config->getFlag(AttentionFlag::enCheckstop));
    EXPECT_EQ(true, config->getFlag(AttentionFlag::enTerminate));
    EXPECT_EQ(true, config->getFlag(AttentionFlag::enBreakpoints));
    // The dfltTi flag is cleared by default and is not updated in the function.
    EXPECT_EQ(false, config->getFlag(AttentionFlag::dfltTi));
    EXPECT_EQ(true, config->getFlag(AttentionFlag::enClrAttnIntr));

    // Test --all off options
    // Set the dfltTi flag to default value.
    config->clearFlag(dfltTi);
    i         = 0;
    argv[i++] = (char*)"--all";
    argv[i++] = (char*)"off";
    parseConfig(argv, argv + i, config);
    EXPECT_EQ(false, config->getFlag(AttentionFlag::enVital));
    EXPECT_EQ(false, config->getFlag(AttentionFlag::enCheckstop));
    EXPECT_EQ(false, config->getFlag(AttentionFlag::enTerminate));
    EXPECT_EQ(false, config->getFlag(AttentionFlag::enBreakpoints));
    // The same, the dfltTi flag is not updated in the function.
    EXPECT_EQ(false, config->getFlag(AttentionFlag::dfltTi));
    EXPECT_EQ(false, config->getFlag(AttentionFlag::enClrAttnIntr));
    delete config;
}

TEST(TestCli, TestCliNonAll)
{
    // Test options with on switch.
    Config* config = new Config();
    char* argv[11];
    int i     = 0;
    argv[i++] = (char*)"--vital";
    argv[i++] = (char*)"on";
    argv[i++] = (char*)"--checkstop";
    argv[i++] = (char*)"on";
    argv[i++] = (char*)"--terminate";
    argv[i++] = (char*)"on";
    argv[i++] = (char*)"--breakpoints";
    argv[i++] = (char*)"on";
    argv[i++] = (char*)"--clrattnintr";
    argv[i++] = (char*)"on";
    // The --defaultti option does not have on/off switch.
    // If this option is specified, it is enabled.
    argv[i++] = (char*)"--defaultti";

    parseConfig(argv, argv + i, config);
    EXPECT_EQ(true, config->getFlag(AttentionFlag::enVital));
    EXPECT_EQ(true, config->getFlag(AttentionFlag::enCheckstop));
    EXPECT_EQ(true, config->getFlag(AttentionFlag::enTerminate));
    EXPECT_EQ(true, config->getFlag(AttentionFlag::enBreakpoints));
    EXPECT_EQ(true, config->getFlag(AttentionFlag::enClrAttnIntr));
    EXPECT_EQ(true, config->getFlag(AttentionFlag::dfltTi));

    // Test options with off switch.
    // Set the dfltTi flag to default value.
    config->clearFlag(dfltTi);
    i         = 0;
    argv[i++] = (char*)"--vital";
    argv[i++] = (char*)"off";
    argv[i++] = (char*)"--checkstop";
    argv[i++] = (char*)"off";
    argv[i++] = (char*)"--terminate";
    argv[i++] = (char*)"off";
    argv[i++] = (char*)"--breakpoints";
    argv[i++] = (char*)"off";
    argv[i++] = (char*)"--clrattnintr";
    argv[i++] = (char*)"off";

    parseConfig(argv, argv + i, config);
    EXPECT_EQ(false, config->getFlag(AttentionFlag::enVital));
    EXPECT_EQ(false, config->getFlag(AttentionFlag::enCheckstop));
    EXPECT_EQ(false, config->getFlag(AttentionFlag::enTerminate));
    EXPECT_EQ(false, config->getFlag(AttentionFlag::enBreakpoints));
    EXPECT_EQ(false, config->getFlag(AttentionFlag::enClrAttnIntr));
    // If the --defaultti option is not specified, it is disabled by default.
    EXPECT_EQ(false, config->getFlag(AttentionFlag::dfltTi));
    delete config;
}