mush

git clone git://git.lin.moe/mush.git

 1#include "Ast.hpp"
 2#include "Parser.hpp"
 3#include "macros.hpp"
 4#include <cassert>
 5#include <catch2/catch_test_macros.hpp>
 6
 7TEST_CASE("parse compound command", "[parser]")
 8{
 9
10	std::map<std::string, ast::CommandType> expressions = {
11	    {"{ls;}", ast::CommandType::brace_group},
12	    {"{\nls\n}", ast::CommandType::brace_group},
13	    {"(ls)", ast::CommandType::subshell},
14	    {"(\nls\n)", ast::CommandType::subshell},
15	    {"if true; then true; fi", ast::CommandType::if_clause},
16	    {"if true; then \n true \n fi", ast::CommandType::if_clause},
17	    {"for i in $j; do echo $i; done", ast::CommandType::for_clause},
18	    {"for i in $j; do \necho $i\n done", ast::CommandType::for_clause},
19	    {"while false; do echo $i; done", ast::CommandType::loop_clause},
20	    {"while false; do \necho $i\n done", ast::CommandType::loop_clause},
21	    {"until false; do echo $i; done", ast::CommandType::loop_clause},
22	    {"until false; do \necho $i\n done", ast::CommandType::loop_clause},
23	    {"case \"$i\" in p1) cmd1;; p2) cmd2;; *) defaultcmd;; esac",
24	     ast::CommandType::case_clase},
25	    {"fn() {cmd1; cmd2;}", ast::CommandType::function_define},
26	    {"fn() {cmd1\n cmd2\n}", ast::CommandType::function_define}};
27	for (const auto &[i, cmd_type] : expressions) {
28		auto in = std::istringstream{i};
29		auto p = parsing::Parser(in);
30		auto s = p.compoundCommand();
31		CAPTURE_PARSER_ERROR(p);
32		REQUIRE(s != nullptr);
33		REQUIRE(s->type == cmd_type);
34	}
35}
36
37TEST_CASE("Parse program", "[parser]")
38{
39	std::array expressions = {"ls", "ls | grep", "ls && ls", "ls ;ls",
40				  "if true; then echo 1; fi"};
41	for (const auto &i : expressions) {
42		auto in = std::istringstream{i};
43		auto p = parsing::Parser(in);
44		auto s = p.expectProgram();
45		CAPTURE_PARSER_ERROR(p);
46		REQUIRE(s != nullptr);
47	}
48}