use super::*; fn parse(x: &[u8]) -> Ast { do_parse(x).unwrap() } fn parse_test(l: Ast, r: Ast) { if l != r { let mut left = Vec::new(); l.cdisplay(&mut left).unwrap(); let mut right = Vec::new(); r.cdisplay(&mut right).unwrap(); let left = String::from_utf8_lossy(&left); let right = String::from_utf8_lossy(&right); panic!("parse equality error\nleft: {left}\nright: {right}") } } #[test] fn command_interp() { parse_test( parse(br#""$(echo echo)""#), pipes([cmd([str([cmdp(pipes([cmd([ estr(b"echo"), estr(b"echo"), ])]))])])]), ) } #[test] fn string_concat() { parse_test( parse(br#" foo'bar'"baz" "#), pipes([cmd([estr(b"foobarbaz")])]), ); } #[test] fn simple_string() { parse_test(parse(b"foo"), pipes([cmd([estr(b"foo")])])); } #[test] fn simple_var() { parse_test(parse(b"$foo"), pipes([cmd([str([var(b"foo")])])])); } #[test] fn ls_pipe_cat() { parse_test( parse(b"ls | cat"), pipes([cmd([estr(b"ls")]), cmd([estr(b"cat")])]), ); } #[test] fn ls_pipe_cat_nospace() { parse_test( parse(b"ls|cat"), pipes([cmd([estr(b"ls")]), cmd([estr(b"cat")])]), ); } #[test] fn unclosed_single_quote() { assert!(do_parse(b"x'").is_err()) } #[test] fn unclosed_double_quote() { assert!(do_parse(b"x\"").is_err()) } #[test] fn tilde() { parse_test( parse(b"echo ~"), pipes([cmd([estr(b"echo"), str([var(b"HOME")])])]), ); } #[test] fn set_variable_in_fun() { parse_test( parse(b"fun setter { set x = 1 }"), decl(estr(b"setter"), assign(estr(b"x"), estr(b"1"))), ); } #[test] fn variable_with_defaults() { parse_test( parse(b"${x:-y}"), pipes([cmd([str([var_default(b"x", estr(b"y"))])])]), ); } #[test] fn escape_newline() { parse_test(parse(b"\"\\n\""), pipes([cmd([estr(b"\n")])])); } #[test] fn escape_carriage_return() { parse_test(parse(b"\"\\r\""), pipes([cmd([estr(b"\r")])])); } #[test] fn escape_tab() { parse_test(parse(b"\"\\t\""), pipes([cmd([estr(b"\t")])])); }