
/*
 * 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 "ast_commands.hpp"
#include "parser.hpp"
#include "static_schema.hpp"

TEST_CASE("presence containers")
{
    auto schema = std::make_shared<StaticSchema>();
    schema->addModule("mod");
    schema->addContainer("", "mod:a", yang::ContainerTraits::Presence);
    schema->addContainer("", "mod:b");
    schema->addContainer("mod:a", "mod:a2");
    schema->addContainer("mod:a/mod:a2", "mod:a3", yang::ContainerTraits::Presence);
    schema->addContainer("mod:b", "mod:b2", yang::ContainerTraits::Presence);
    schema->addList("", "mod:list", {"quote"});
    schema->addContainer("mod:list", "mod:contInList", yang::ContainerTraits::Presence);
    Parser parser(schema);
    std::string input;
    std::ostringstream errorStream;

    SECTION("valid input")
    {
        path_ expectedPath;

        SECTION("mod:a")
        {
            input = "mod:a";
            expectedPath.m_nodes = {{module_{"mod"}, {container_("a")}}};
        }

        SECTION("mod:b/b2")
        {
            input = "mod:b/b2";
            expectedPath.m_nodes = {{{module_{"mod"}}, container_("b")}, {container_("b2")}};
        }

        SECTION("mod:a/a2/a3")
        {
            input = "mod:a/a2/a3";
            expectedPath.m_nodes = {{{module_{"mod"}}, container_("a")}, {container_("a2")}, {container_("a3")}};
        }

        SECTION("mod:list[quote=lol]/contInList")
        {
            input = "mod:list[quote=lol]/contInList";
            auto keys = std::map<std::string, std::string>{
                {"quote", "lol"}};
            expectedPath.m_nodes = {{{module_{"mod"}}, listElement_("list", keys)}, {container_("contInList")}};
        }

        create_ expectedCreate;
        expectedCreate.m_path = expectedPath;
        command_ commandCreate = parser.parseCommand("create " + input, errorStream);
        REQUIRE(commandCreate.type() == typeid(create_));
        create_ create = boost::get<create_>(commandCreate);
        REQUIRE(create == expectedCreate);

        delete_ expectedDelete;
        expectedDelete.m_path = expectedPath;
        command_ commandDelete = parser.parseCommand("delete " + input, errorStream);
        REQUIRE(commandDelete.type() == typeid(delete_));
        delete_ delet = boost::get<delete_>(commandDelete);
        REQUIRE(delet == expectedDelete);
    }
    SECTION("invalid input")
    {
        SECTION("c")
        {
            input = "c";
        }

        SECTION("a/a2")
        {
            input = "a/a2";
        }

        SECTION("list[quote=lol]")
        {
            input = "list[quote=lol]";
        }

        REQUIRE_THROWS(parser.parseCommand("create " + input, errorStream));
        REQUIRE_THROWS(parser.parseCommand("delete " + input, errorStream));
    }
}
