#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;
}
