Charlotte Meyer
4e1a835ddc
This requires PreparedCommand's to work with OsStrings rather than Strings. Acked-by: cpli Acked-by: ElKowar
191 lines
2.8 KiB
Rust
191 lines
2.8 KiB
Rust
use insta::assert_debug_snapshot as assert_snapshot;
|
|
use oyster_parser::{ParseEvent, Parser};
|
|
|
|
fn parse(s: &str) -> Vec<ParseEvent> {
|
|
Parser::new(s).collect()
|
|
}
|
|
|
|
#[test]
|
|
fn empty() {
|
|
let source = "";
|
|
|
|
let actual = parse(source);
|
|
|
|
assert_snapshot!(actual);
|
|
}
|
|
|
|
#[test]
|
|
fn word() {
|
|
let source = "word";
|
|
|
|
let actual = parse(source);
|
|
|
|
assert_snapshot!(actual);
|
|
}
|
|
|
|
#[test]
|
|
fn word_with_escape() {
|
|
let source = "hello\\world";
|
|
|
|
let actual = parse(source);
|
|
|
|
assert_snapshot!(actual);
|
|
}
|
|
|
|
#[test]
|
|
fn unicode() {
|
|
let source = "谚语";
|
|
|
|
let actual = parse(source);
|
|
|
|
assert_snapshot!(actual);
|
|
}
|
|
|
|
#[test]
|
|
fn simple_command() {
|
|
let source = "echo hi";
|
|
|
|
let actual = parse(source);
|
|
|
|
assert_snapshot!(actual);
|
|
}
|
|
|
|
#[test]
|
|
fn semicolon() {
|
|
let source = "hello; hi";
|
|
|
|
let actual = parse(source);
|
|
|
|
assert_snapshot!(actual);
|
|
}
|
|
|
|
#[test]
|
|
fn comment() {
|
|
let source = r"# a
|
|
# b";
|
|
|
|
let actual = parse(source);
|
|
|
|
assert_snapshot!(actual);
|
|
}
|
|
|
|
#[test]
|
|
fn inline_comment() {
|
|
let source = "whoami # hello";
|
|
|
|
let actual = parse(source);
|
|
|
|
assert_snapshot!(actual);
|
|
}
|
|
|
|
#[test]
|
|
fn pipeline() {
|
|
let source = "whoami | cat";
|
|
|
|
let actual = parse(source);
|
|
|
|
assert_snapshot!(actual);
|
|
}
|
|
|
|
#[test]
|
|
fn multiline_pipeline() {
|
|
let source = r"whoami |
|
|
wc -l";
|
|
|
|
let actual = parse(source);
|
|
|
|
assert_snapshot!(actual);
|
|
}
|
|
|
|
#[test]
|
|
fn comment_in_pipeline() {
|
|
let source = r"whoami | # comment
|
|
wc -l";
|
|
|
|
let actual = parse(source);
|
|
|
|
assert_snapshot!(actual);
|
|
}
|
|
|
|
#[test]
|
|
fn reject_leading_pipe() {
|
|
let source = r"whoami
|
|
| cat";
|
|
|
|
let actual = parse(source);
|
|
|
|
assert_snapshot!(actual);
|
|
}
|
|
|
|
#[test]
|
|
fn reject_trailing_pipe() {
|
|
let source = "whoami |";
|
|
|
|
let actual = parse(source);
|
|
|
|
assert_snapshot!(actual);
|
|
}
|
|
|
|
#[test]
|
|
fn reject_pipe_semicolon() {
|
|
let source = "whoami | ; cat";
|
|
|
|
let actual = parse(source);
|
|
|
|
assert_snapshot!(actual);
|
|
}
|
|
|
|
#[test]
|
|
fn reject_double_pipe() {
|
|
let source = "whoami | | cat";
|
|
|
|
let actual = parse(source);
|
|
|
|
assert_snapshot!(actual);
|
|
}
|
|
|
|
#[test]
|
|
fn double_quote_string() {
|
|
let source = r#""hello world""#;
|
|
|
|
let actual = parse(source);
|
|
|
|
assert_snapshot!(actual);
|
|
}
|
|
|
|
#[test]
|
|
fn escaped_char_in_double_quotes() {
|
|
let source = r#""hello \" world""#;
|
|
|
|
let actual = parse(source);
|
|
|
|
assert_snapshot!(actual);
|
|
}
|
|
|
|
#[test]
|
|
fn unterminated_double_quotes() {
|
|
let source = r#""hello world"#;
|
|
|
|
let actual = parse(source);
|
|
|
|
assert_snapshot!(actual);
|
|
}
|
|
|
|
#[test]
|
|
fn command_substitution() {
|
|
let source = r#"echo (whoami)"#;
|
|
|
|
let actual = parse(source);
|
|
|
|
assert_snapshot!(actual);
|
|
}
|
|
|
|
#[test]
|
|
fn quoted_command_substitution() {
|
|
let source = r#"echo "(whoami)
|
|
""#;
|
|
|
|
let actual = parse(source);
|
|
|
|
assert_snapshot!(actual);
|
|
}
|