summaryrefslogtreecommitdiffstats
path: root/src/parse/test_ast.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse/test_ast.rs')
-rw-r--r--src/parse/test_ast.rs56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/parse/test_ast.rs b/src/parse/test_ast.rs
index b16eba4..19bf7af 100644
--- a/src/parse/test_ast.rs
+++ b/src/parse/test_ast.rs
@@ -79,6 +79,12 @@ macro_rules! w {
}
}
+macro_rules! wpa {
+ ($($word:expr),*) => {
+ WordPart::Alternation(vec![$($word),*])
+ }
+}
+
macro_rules! wpv {
($var:literal) => {
WordPart::Var($var.to_string())
@@ -231,3 +237,53 @@ fn test_parts() {
cs!(p!(e!(w!("perl"), w!(wpb!("-E"), wps!("say \"foo\"")))))
);
}
+
+#[test]
+fn test_alternation() {
+ parse_eq!(
+ "echo {foo,bar}",
+ cs!(p!(e!(w!("echo"), w!(wpa!(w!("foo"), w!("bar"))))))
+ );
+ parse_eq!(
+ "echo {foo,bar}.rs",
+ cs!(p!(e!(
+ w!("echo"),
+ w!(wpa!(w!("foo"), w!("bar")), wpb!(".rs"))
+ )))
+ );
+ parse_eq!(
+ "echo {foo,bar,baz}.rs",
+ cs!(p!(e!(
+ w!("echo"),
+ w!(wpa!(w!("foo"), w!("bar"), w!("baz")), wpb!(".rs"))
+ )))
+ );
+ parse_eq!(
+ "echo {foo,}.rs",
+ cs!(p!(e!(w!("echo"), w!(wpa!(w!("foo"), w!()), wpb!(".rs")))))
+ );
+ parse_eq!("echo {foo}", cs!(p!(e!(w!("echo"), w!(wpa!(w!("foo")))))));
+ parse_eq!("echo {}", cs!(p!(e!(w!("echo"), w!(wpa!(w!()))))));
+ parse_eq!(
+ "echo {foo,bar}.{rs,c}",
+ cs!(p!(e!(
+ w!("echo"),
+ w!(
+ wpa!(w!("foo"), w!("bar")),
+ wpb!("."),
+ wpa!(w!("rs"), w!("c"))
+ )
+ )))
+ );
+ parse_eq!(
+ "echo {$foo,\"${HOME}/bin\"}.{'r'\"s\",c}",
+ cs!(p!(e!(
+ w!("echo"),
+ w!(
+ wpa!(w!(wpv!("foo")), w!(wpv!("HOME"), wpd!("/bin"))),
+ wpb!("."),
+ wpa!(w!(wps!("r"), wpd!("s")), w!("c"))
+ )
+ )))
+ );
+}