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

namespace std {
std::ostream& operator<<(std::ostream& s, const std::set<std::string> set)
{
    s << std::endl
      << "{";
    std::copy(set.begin(), set.end(), std::experimental::make_ostream_joiner(s, ", "));
    s << "}" << std::endl;
    return s;
}
}

TEST_CASE("parser methods")
{
    auto schema = std::make_shared<StaticSchema>();
    schema->addModule("example");
    schema->addModule("second");
    schema->addContainer("/", "example:a");
    schema->addList("/example:a", "example:listInCont", {"number"});
    schema->addContainer("/", "second:a");
    schema->addContainer("/", "example:b");
    schema->addContainer("/example:a", "example:a2");
    schema->addContainer("/example:b", "example:b2");
    schema->addContainer("/example:a/example:a2", "example:a3");
    schema->addContainer("/example:b/example:b2", "example:b3");
    schema->addList("/", "example:list", {"number"});
    schema->addContainer("/example:list", "example:contInList");
    schema->addList("/", "example:twoKeyList", {"number", "name"});
    Parser parser(schema);

    SECTION("availableNodes")
    {
        std::set<std::string> expected;
        boost::optional<boost::variant<boost::variant<dataPath_, schemaPath_>, module_>> arg{boost::none};
        SECTION("cwd: /")
        {
            SECTION("arg: <none>")
            {
                expected = {"example:a", "example:b", "example:list", "example:twoKeyList", "second:a"};
            }

            SECTION("arg: example:a")
            {
                arg = dataPath_{Scope::Relative, {{module_{"example"}, container_{"a"}}}};
                expected = {"example:a2", "example:listInCont"};
            }

            SECTION("arg: example:list")
            {
                arg = dataPath_{Scope::Relative, {{module_{"example"}, list_{"list"}}}};
                expected = {"example:contInList"};
            }

            SECTION("arg: /example:a")
            {
                arg = dataPath_{Scope::Absolute, {{module_{"example"}, container_{"a"}}}};
                expected = {"example:a2", "example:listInCont"};
            }

            SECTION("arg: /example:list")
            {
                arg = dataPath_{Scope::Absolute, {{module_{"example"}, list_{"list"}}}};
                expected = {"example:contInList"};
            }
        }
        SECTION("cwd: /example:a")
        {
            parser.changeNode({Scope::Relative, {{module_{"example"}, container_{"a"}}}});

            SECTION("arg: <none>")
            {
                expected = {"example:a2", "example:listInCont"};
            }

            SECTION("arg: example:a2")
            {
                arg = dataPath_{Scope::Relative, {{container_{"a2"}}}};
                expected = {"example:a3"};
            }

            SECTION("arg: example:listInCont")
            {
                arg = dataPath_{Scope::Relative, {{list_{"listInCont"}}}};
            }

            SECTION("arg: /example:a")
            {
                arg = dataPath_{Scope::Absolute, {{module_{"example"}, container_{"a"}}}};
                expected = {"example:a2", "example:listInCont"};
            }

            SECTION("arg: /example:list")
            {
                arg = dataPath_{Scope::Absolute, {{module_{"example"}, list_{"list"}}}};
                expected = {"example:contInList"};
            }
        }
        SECTION("cwd: /example:list")
        {
            parser.changeNode({Scope::Relative, {{module_{"example"}, list_{"list"}}}});

            SECTION("arg: <none>")
            {
                expected = {"example:contInList"};
            }

            SECTION("arg: example:contInList")
            {
                arg = dataPath_{Scope::Relative, {{container_{"contInList"}}}};
            }

            SECTION("arg: /example:a")
            {
                arg = dataPath_{Scope::Absolute, {{module_{"example"}, container_{"a"}}}};
                expected = {"example:a2", "example:listInCont"};
            }

            SECTION("arg: /example:list")
            {
                arg = dataPath_{Scope::Absolute, {{module_{"example"}, list_{"list"}}}};
                expected = {"example:contInList"};
            }
        }

        REQUIRE(expected == parser.availableNodes(arg, Recursion::NonRecursive));
    }
}
