Implemented subshells and improved error handling

This commit is contained in:
2025-03-29 22:16:26 -04:00
parent 1eb19092cc
commit 80b6453597
15 changed files with 222 additions and 35 deletions

View File

@@ -10,6 +10,58 @@ fn cmd_not_found() {
insta::assert_snapshot!(err_fmt)
}
#[test]
fn unclosed_subsh() {
let input = "(foo";
let token = LexStream::new(Arc::new(input.into()), LexFlags::empty()).skip(1).next().unwrap();
let Err(err) = token else {
panic!("{:?}",token);
};
let err_fmt = format!("{err}");
insta::assert_snapshot!(err_fmt)
}
#[test]
fn unclosed_dquote() {
let input = "\"foo bar";
let token = LexStream::new(Arc::new(input.into()), LexFlags::empty()).skip(1).next().unwrap();
let Err(err) = token else {
panic!();
};
let err_fmt = format!("{err}");
insta::assert_snapshot!(err_fmt)
}
#[test]
fn unclosed_squote() {
let input = "'foo bar";
let token = LexStream::new(Arc::new(input.into()), LexFlags::empty()).skip(1).next().unwrap();
let Err(err) = token else {
panic!();
};
let err_fmt = format!("{err}");
insta::assert_snapshot!(err_fmt)
}
#[test]
fn unclosed_brc_grp() {
let input = "{ foo bar";
let tokens = LexStream::new(Arc::new(input.into()), LexFlags::empty())
.map(|tk| tk.unwrap())
.collect::<Vec<_>>();
let node = ParseStream::new(tokens).next().unwrap();
let Err(err) = node else {
panic!();
};
let err_fmt = format!("{err}");
insta::assert_snapshot!(err_fmt)
}
#[test]
fn if_no_fi() {
let input = "if foo; then bar;";

View File

@@ -5,7 +5,7 @@ use super::*;
#[test]
fn simple_expansion() {
let varsub = "$foo";
write_vars(|v| v.set_var("foo", "this is the value of the variable".into()));
write_vars(|v| v.set_var("foo", "this is the value of the variable".into(), false));
let mut tokens: Vec<Tk> = LexStream::new(Arc::new(varsub.to_string()), LexFlags::empty())
.map(|tk| tk.unwrap())
@@ -14,7 +14,7 @@ fn simple_expansion() {
let var_tk = tokens.pop().unwrap();
let var_span = var_tk.span.clone();
let exp_tk = var_tk.expand(var_span, TkFlags::empty()).unwrap();
let exp_tk = var_tk.expand().unwrap();
write_vars(|v| v.vars_mut().clear());
insta::assert_debug_snapshot!(exp_tk.get_words())
}

View File

@@ -6,5 +6,5 @@ expression: err_fmt
-> [1;1]
 |
1 | case foo foo) bar;; bar) foo;; esac
 | ^^^^^^^^^^^^^^^^^^^^
 | ^^^^^^^^^^^^^^^^^^^
 |

View File

@@ -6,5 +6,5 @@ expression: err_fmt
-> [1;1]
 |
1 | if foo; bar; fi
 | ^^^^^^^^^^^^^
 | ^^^^^^^^^^^^
 |

View File

@@ -6,5 +6,5 @@ expression: err_fmt
-> [1;1]
 |
1 | while true; echo foo; done
 | ^^^^^^^^^^^^^^^^^^^^^^
 | ^^^^^^^^^^^^^^^^^^^^^
 |

View File

@@ -0,0 +1,10 @@
---
source: src/tests/error.rs
expression: err_fmt
---
Parse Error - Expected a closing brace for this brace group
-> [1;1]
 |
1 | { foo bar
 | ^^^^^^^^^
 |

View File

@@ -0,0 +1,10 @@
---
source: src/tests/error.rs
expression: err_fmt
---
Parse Error - Unterminated quote
-> [1;1]
 |
1 | "foo bar
 | ^^^^^^^^
 |

View File

@@ -0,0 +1,10 @@
---
source: src/tests/error.rs
expression: err_fmt
---
Parse Error - Unterminated quote
-> [1;1]
 |
1 | 'foo bar
 | ^^^^^^^^
 |

View File

@@ -0,0 +1,10 @@
---
source: src/tests/error.rs
expression: err_fmt
---
Parse Error - Unclosed subshell
-> [1;1]
 |
1 | (foo
 | ^
 |