extern crate conch_parser;
use conch_parser::ast::builder::*;
use conch_parser::parse::ParseError::*;
use conch_parser::token::Token;
mod parse_support;
use parse_support::*;
#[test]
fn test_subshell_valid() {
let mut p = make_parser("( foo\nbar; baz\n#comment\n )");
let correct = CommandGroup {
commands: vec!(cmd("foo"), cmd("bar"), cmd("baz")),
trailing_comments: vec!(Newline(Some("#comment".into()))),
};
assert_eq!(correct, p.subshell().unwrap());
}
#[test]
fn test_subshell_valid_separator_not_needed() {
let correct = CommandGroup {
commands: vec!(cmd("foo")),
trailing_comments: vec!(),
};
assert_eq!(correct, make_parser("( foo )").subshell().unwrap());
let correct_with_comment = CommandGroup {
commands: vec!(cmd("foo")),
trailing_comments: vec!(Newline(Some("#comment".into()))),
};
assert_eq!(correct_with_comment, make_parser("( foo\n#comment\n )").subshell().unwrap());
}
#[test]
fn test_subshell_space_between_parens_not_needed() {
let mut p = make_parser("(foo )");
p.subshell().unwrap();
let mut p = make_parser("( foo)");
p.subshell().unwrap();
let mut p = make_parser("(foo)");
p.subshell().unwrap();
}
#[test]
fn test_subshell_invalid_missing_keyword() {
assert_eq!(Err(Unmatched(Token::ParenOpen, src(0,1,1))), make_parser("( foo\nbar; baz").subshell());
assert_eq!(Err(Unexpected(Token::Name(String::from("foo")), src(0,1,1))),
make_parser("foo\nbar; baz; )").subshell());
}
#[test]
fn test_subshell_invalid_quoted() {
let cmds = [
("'(' foo\nbar; baz; )", Unexpected(Token::SingleQuote, src(0,1,1))),
("( foo\nbar; baz; ')'", Unmatched(Token::ParenOpen, src(0,1,1))),
("\"(\" foo\nbar; baz; )", Unexpected(Token::DoubleQuote, src(0,1,1))),
("( foo\nbar; baz; \")\"", Unmatched(Token::ParenOpen, src(0,1,1))),
];
for &(c, ref e) in cmds.into_iter() {
match make_parser(c).subshell() {
Ok(result) => panic!("Unexpectedly parsed \"{}\" as\n{:#?}", c, result),
Err(ref err) => if err != e {
panic!("Expected the source \"{}\" to return the error `{:?}`, but got `{:?}`",
c, e, err);
},
}
}
}
#[test]
fn test_subshell_invalid_missing_body() {
assert_eq!(Err(Unexpected(Token::ParenClose, src(2,2,1))), make_parser("(\n)").subshell());
assert_eq!(Err(Unexpected(Token::ParenClose, src(1,1,2))), make_parser("()").subshell());
}