diff --git a/src/fern.rs b/src/fern.rs index 6a96501..f29a460 100644 --- a/src/fern.rs +++ b/src/fern.rs @@ -8,6 +8,7 @@ pub mod state; pub mod builtin; pub mod jobs; pub mod signal; +#[cfg(test)] pub mod tests; use std::collections::HashSet; diff --git a/src/prompt/mod.rs b/src/prompt/mod.rs index d9645ae..0fe5c2c 100644 --- a/src/prompt/mod.rs +++ b/src/prompt/mod.rs @@ -30,7 +30,6 @@ fn get_hist_path() -> ShResult { } else { let home = env::var("HOME")?; let path = PathBuf::from(format!("{home}/.fernhist")); - flog!(DEBUG, path); Ok(path) } @@ -44,7 +43,6 @@ pub fn read_line() -> ShResult { Ok(line) => { if !line.is_empty() { let hist_path = get_hist_path()?; - flog!(DEBUG, hist_path); editor.add_history_entry(&line)?; editor.save_history(&hist_path)?; } diff --git a/src/tests/error.rs b/src/tests/error.rs new file mode 100644 index 0000000..4e2f933 --- /dev/null +++ b/src/tests/error.rs @@ -0,0 +1,97 @@ +use libsh::error::{ShErr, ShErrKind}; + +use super::super::*; + +#[test] +fn cmd_not_found() { + let input = "foo"; + let token = LexStream::new(Rc::new(input.into()), LexFlags::empty()).next().unwrap().unwrap(); + let err = ShErr::full(ShErrKind::CmdNotFound("foo".into()), "", token.span); + + let err_fmt = format!("{err}"); + insta::assert_snapshot!(err_fmt) +} + +#[test] +fn if_no_fi() { + let input = "if foo; then bar;"; + let tokens = LexStream::new(Rc::new(input.into()), LexFlags::empty()) + .map(|tk| tk.unwrap()) + .collect::>(); + + let node = ParseStream::new(tokens).next().unwrap(); + let Err(e) = node else { panic!() }; + + let err_fmt = format!("{e}"); + insta::assert_snapshot!(err_fmt) +} + +#[test] +fn if_no_then() { + let input = "if foo; bar; fi"; + let tokens = LexStream::new(Rc::new(input.into()), LexFlags::empty()) + .map(|tk| tk.unwrap()) + .collect::>(); + + let node = ParseStream::new(tokens).next().unwrap(); + let Err(e) = node else { panic!() }; + + let err_fmt = format!("{e}"); + insta::assert_snapshot!(err_fmt) +} + +#[test] +fn loop_no_done() { + let input = "while true; do echo foo;"; + let tokens = LexStream::new(Rc::new(input.into()), LexFlags::empty()) + .map(|tk| tk.unwrap()) + .collect::>(); + + let node = ParseStream::new(tokens).next().unwrap(); + let Err(e) = node else { panic!() }; + + let err_fmt = format!("{e}"); + insta::assert_snapshot!(err_fmt) +} + +#[test] +fn loop_no_do() { + let input = "while true; echo foo; done"; + let tokens = LexStream::new(Rc::new(input.into()), LexFlags::empty()) + .map(|tk| tk.unwrap()) + .collect::>(); + + let node = ParseStream::new(tokens).next().unwrap(); + let Err(e) = node else { panic!() }; + + let err_fmt = format!("{e}"); + insta::assert_snapshot!(err_fmt) +} + +#[test] +fn case_no_esac() { + let input = "case foo in foo) bar;; bar) foo;;"; + let tokens = LexStream::new(Rc::new(input.into()), LexFlags::empty()) + .map(|tk| tk.unwrap()) + .collect::>(); + + let node = ParseStream::new(tokens).next().unwrap(); + let Err(e) = node else { panic!() }; + + let err_fmt = format!("{e}"); + insta::assert_snapshot!(err_fmt) +} + +#[test] +fn case_no_in() { + let input = "case foo foo) bar;; bar) foo;; esac"; + let tokens = LexStream::new(Rc::new(input.into()), LexFlags::empty()) + .map(|tk| tk.unwrap()) + .collect::>(); + + let node = ParseStream::new(tokens).next().unwrap(); + let Err(e) = node else { panic!() }; + + let err_fmt = format!("{e}"); + insta::assert_snapshot!(err_fmt) +} diff --git a/src/tests/mod.rs b/src/tests/mod.rs index c79d46e..00ecc9d 100644 --- a/src/tests/mod.rs +++ b/src/tests/mod.rs @@ -2,3 +2,4 @@ pub mod lexer; pub mod parser; pub mod expand; pub mod term; +pub mod error; diff --git a/src/tests/snapshots/fern__tests__error__case_no_esac.snap b/src/tests/snapshots/fern__tests__error__case_no_esac.snap new file mode 100644 index 0000000..9cae343 --- /dev/null +++ b/src/tests/snapshots/fern__tests__error__case_no_esac.snap @@ -0,0 +1,9 @@ +--- +source: src/tests/error.rs +expression: err_fmt +--- + -> [1;1] - Parse Error + | +1 | case foo in foo) bar;; bar) foo;; + | + - Expected 'esac' after case block diff --git a/src/tests/snapshots/fern__tests__error__case_no_in.snap b/src/tests/snapshots/fern__tests__error__case_no_in.snap new file mode 100644 index 0000000..e959f17 --- /dev/null +++ b/src/tests/snapshots/fern__tests__error__case_no_in.snap @@ -0,0 +1,9 @@ +--- +source: src/tests/error.rs +expression: err_fmt +--- + -> [1;1] - Parse Error + | +1 | case foo foo) bar;; bar) foo;; esac + | + - Expected 'in' after case variable name diff --git a/src/tests/snapshots/fern__tests__error__cmd_not_found.snap b/src/tests/snapshots/fern__tests__error__cmd_not_found.snap new file mode 100644 index 0000000..d7884ae --- /dev/null +++ b/src/tests/snapshots/fern__tests__error__cmd_not_found.snap @@ -0,0 +1,9 @@ +--- +source: src/tests/error.rs +expression: err_fmt +--- + -> [1;1] - Command not found: foo + | +1 | foo + | + - diff --git a/src/tests/snapshots/fern__tests__error__if_no_fi.snap b/src/tests/snapshots/fern__tests__error__if_no_fi.snap new file mode 100644 index 0000000..7a651e2 --- /dev/null +++ b/src/tests/snapshots/fern__tests__error__if_no_fi.snap @@ -0,0 +1,9 @@ +--- +source: src/tests/error.rs +expression: err_fmt +--- + -> [1;1] - Parse Error + | +1 | if foo; then bar; + | + - Expected 'fi' after if statement diff --git a/src/tests/snapshots/fern__tests__error__if_no_then.snap b/src/tests/snapshots/fern__tests__error__if_no_then.snap new file mode 100644 index 0000000..7163149 --- /dev/null +++ b/src/tests/snapshots/fern__tests__error__if_no_then.snap @@ -0,0 +1,9 @@ +--- +source: src/tests/error.rs +expression: err_fmt +--- + -> [1;1] - Parse Error + | +1 | if foo; bar; fi + | + - Expected 'then' after 'if' condition diff --git a/src/tests/snapshots/fern__tests__error__loop_no_do.snap b/src/tests/snapshots/fern__tests__error__loop_no_do.snap new file mode 100644 index 0000000..fbf8ced --- /dev/null +++ b/src/tests/snapshots/fern__tests__error__loop_no_do.snap @@ -0,0 +1,9 @@ +--- +source: src/tests/error.rs +expression: err_fmt +--- + -> [1;1] - Parse Error + | +1 | while true; echo foo; done + | + - Expected 'do' after loop condition diff --git a/src/tests/snapshots/fern__tests__error__loop_no_done.snap b/src/tests/snapshots/fern__tests__error__loop_no_done.snap new file mode 100644 index 0000000..0e26f67 --- /dev/null +++ b/src/tests/snapshots/fern__tests__error__loop_no_done.snap @@ -0,0 +1,9 @@ +--- +source: src/tests/error.rs +expression: err_fmt +--- + -> [1;1] - Parse Error + | +1 | while true; do echo foo; + | + - Expected 'done' after loop body