/*
 * Copyright (C) 2018 CESNET, https://photonics.cesnet.cz/
 * Copyright (C) 2018 FIT CVUT, https://fit.cvut.cz/
 *
 * Written by Václav Kubernát <kubervac@fit.cvut.cz>
 *
*/

#include "trompeloeil_catch.h"
#include "CParser.hpp"
#include "CTree.hpp"
#include "ast.hpp"

TEST_CASE("cd")
{
    CTree tree;
    tree.addContainer("", "a");
    tree.addContainer("", "b");
    tree.addContainer("a", "a2");
    tree.addContainer("b", "b2");
    tree.addContainer("a/a2", "a3");
    tree.addContainer("b/b2", "b3");

    CParser parser(tree);
    cd_ expected;

    std::string input;

    SECTION("basic cd parsing")
    {
        SECTION("a")
        {
            input = "cd a";
            expected.m_path.m_nodes.push_back(container_("a"));
        }

        SECTION("b")
        {
            input = "cd b";
            expected.m_path.m_nodes.push_back(container_("b"));
        }


        SECTION("a/a2")
        {
            input = "cd a/a2";
            expected.m_path.m_nodes.push_back(container_("a"));
            expected.m_path.m_nodes.push_back(container_("a2"));
        }

        SECTION("b/b2")
        {
            input = "cd b/b2";
            expected.m_path.m_nodes.push_back(container_("b"));
            expected.m_path.m_nodes.push_back(container_("b2"));
        }

        cd_ command = parser.parseCommand(input);
        REQUIRE(command == expected);
    }

    SECTION("InvalidNodeException")
    {
        SECTION("x")
        {
            input = "cd x";
        }

        SECTION("a/x")
        {
            input = "cd a/x";
        }
        REQUIRE_THROWS_AS(parser.parseCommand(input), InvalidNodeException);
    }
}
