1#include "Ast.hpp"2#include "Parser.hpp"3#include "macros.hpp"4#include <cassert>5#include <catch2/catch_test_macros.hpp>67TEST_CASE("parse compound command", "[parser]")8{910 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}3637TEST_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}