
/*
 * 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_doctest.hpp"
#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->addLeaf("/mod:list", "mod:quote", yang::LeafDataTypes::String);
    schema->addContainer("/mod:list", "mod:contInList", yang::ContainerTraits::Presence);
    Parser parser(schema);
    std::string input;
    std::ostringstream errorStream;

    SECTION("valid input")
    {
        dataPath_ 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, leaf_data_>{
                {"quote", std::string{"lol"}}};
            expectedPath.m_nodes = {{{module_{"mod"}}, listElement_("list", keys)}, {container_("contInList")}};
        }

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

        SECTION("mod:list[quote=\"single'quote\"]/contInList")
        {
            input = "mod:list[quote=\"single'quote\"]/contInList";
            auto keys = std::map<std::string, leaf_data_>{
                {"quote", std::string{"single'quote"}}};
            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);

        REQUIRE(pathToDataString(create.m_path, Prefixes::WhenNeeded) == input);

        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_AS(parser.parseCommand("create " + input, errorStream), InvalidCommandException);
        REQUIRE_THROWS_AS(parser.parseCommand("delete " + input, errorStream), InvalidCommandException);
    }
}
