blob: d6079fb2ac5135db2579a63b5f70e7024628e9ca [file] [log] [blame]
/*
* 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");
tree.addList("", "list", {"number"});
tree.addContainer("list", "contInList");
tree.addList("", "twoKeyList", {"number", "name"});
CParser parser(tree);
std::string input;
std::ostringstream errorStream;
SECTION("valid input")
{
cd_ expected;
SECTION("container")
{
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"));
}
}
SECTION("list elements")
{
SECTION("list[number=1]")
{
input = "cd list[number=1]";
auto keys = std::map<std::string, std::string>{
{"number", "1"}
};
expected.m_path.m_nodes.push_back(listElement_("list", keys));
}
SECTION("list[number=1]/contInList")
{
input = "cd list[number=1]/contInList";
auto keys = std::map<std::string, std::string>{
{"number", "1"}};
expected.m_path.m_nodes.push_back(listElement_("list", keys));
expected.m_path.m_nodes.push_back(container_("contInList"));
}
SECTION("twoKeyList[number=4 name=abcd]")
{
input = "cd twoKeyList[number=4 name=abcd]";
auto keys = std::map<std::string, std::string>{
{"number", "4"},
{"name", "abcd"}};
expected.m_path.m_nodes.push_back(listElement_("twoKeyList", keys));
}
}
SECTION("whitespace handling")
{
SECTION(" cd a ")
{
input = " cd a ";
expected.m_path.m_nodes.push_back(container_("a"));
}
}
cd_ command = parser.parseCommand(input, errorStream);
REQUIRE(command == expected);
}
SECTION("invalid input")
{
SECTION("missing space between a command and its arguments")
{
SECTION("cda")
{
input = "cda";
}
}
SECTION("garbage arguments handling")
{
SECTION("cd a garbage")
{
input = "cd a garbage";
}
SECTION("cd a/a2 garbage")
{
input = "cd a/a2 garbage";
}
}
SECTION("invalid identifiers")
{
SECTION("nonexistent")
{
input = "cd nonexistent";
}
SECTION("nonexistent/lol")
{
input = "cd nonexistent/lol";
}
}
SECTION("invalid list key identifiers")
{
SECTION("list")
{
input = "cd list";
}
SECTION("list[]")
{
input = "cd list[]";
}
SECTION("twoKeyList[invalidKey=4]")
{
input = "cd twoKeyList[invalidKey=4]";
}
SECTION("twoKeyList[number=4 number=5]")
{
input = "cd twoKeyList[number=4 number=5]";
}
SECTION("twoKeyList[number=4 name=lol number=7]")
{
input = "cd twoKeyList[number=4 name=lol number=7]";
}
SECTION("twoKeyList[number=4]")
{
input = "cd twoKeyList[number=4]";
}
}
REQUIRE_THROWS(parser.parseCommand(input, errorStream));
}
}