added more tests
This commit is contained in:
@@ -8,6 +8,7 @@ pub mod state;
|
|||||||
pub mod builtin;
|
pub mod builtin;
|
||||||
pub mod jobs;
|
pub mod jobs;
|
||||||
pub mod signal;
|
pub mod signal;
|
||||||
|
#[cfg(test)]
|
||||||
pub mod tests;
|
pub mod tests;
|
||||||
|
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ fn get_hist_path() -> ShResult<PathBuf> {
|
|||||||
} else {
|
} else {
|
||||||
let home = env::var("HOME")?;
|
let home = env::var("HOME")?;
|
||||||
let path = PathBuf::from(format!("{home}/.fernhist"));
|
let path = PathBuf::from(format!("{home}/.fernhist"));
|
||||||
flog!(DEBUG, path);
|
|
||||||
Ok(path)
|
Ok(path)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -44,7 +43,6 @@ pub fn read_line() -> ShResult<String> {
|
|||||||
Ok(line) => {
|
Ok(line) => {
|
||||||
if !line.is_empty() {
|
if !line.is_empty() {
|
||||||
let hist_path = get_hist_path()?;
|
let hist_path = get_hist_path()?;
|
||||||
flog!(DEBUG, hist_path);
|
|
||||||
editor.add_history_entry(&line)?;
|
editor.add_history_entry(&line)?;
|
||||||
editor.save_history(&hist_path)?;
|
editor.save_history(&hist_path)?;
|
||||||
}
|
}
|
||||||
|
|||||||
97
src/tests/error.rs
Normal file
97
src/tests/error.rs
Normal file
@@ -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::<Vec<_>>();
|
||||||
|
|
||||||
|
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::<Vec<_>>();
|
||||||
|
|
||||||
|
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::<Vec<_>>();
|
||||||
|
|
||||||
|
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::<Vec<_>>();
|
||||||
|
|
||||||
|
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::<Vec<_>>();
|
||||||
|
|
||||||
|
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::<Vec<_>>();
|
||||||
|
|
||||||
|
let node = ParseStream::new(tokens).next().unwrap();
|
||||||
|
let Err(e) = node else { panic!() };
|
||||||
|
|
||||||
|
let err_fmt = format!("{e}");
|
||||||
|
insta::assert_snapshot!(err_fmt)
|
||||||
|
}
|
||||||
@@ -2,3 +2,4 @@ pub mod lexer;
|
|||||||
pub mod parser;
|
pub mod parser;
|
||||||
pub mod expand;
|
pub mod expand;
|
||||||
pub mod term;
|
pub mod term;
|
||||||
|
pub mod error;
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
source: src/tests/error.rs
|
||||||
|
expression: err_fmt
|
||||||
|
---
|
||||||
|
[36m[1m->[0m [[36m[1m1[0m;[36m[1m1[0m] - [31m[1mParse Error[0m
|
||||||
|
[36m[1m |[0m
|
||||||
|
[36m[1m1 |[0m case foo in foo) bar;; bar) foo;;
|
||||||
|
[36m[1m |[0m
|
||||||
|
[36m[1m-[0m Expected 'esac' after case block
|
||||||
9
src/tests/snapshots/fern__tests__error__case_no_in.snap
Normal file
9
src/tests/snapshots/fern__tests__error__case_no_in.snap
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
source: src/tests/error.rs
|
||||||
|
expression: err_fmt
|
||||||
|
---
|
||||||
|
[36m[1m->[0m [[36m[1m1[0m;[36m[1m1[0m] - [31m[1mParse Error[0m
|
||||||
|
[36m[1m |[0m
|
||||||
|
[36m[1m1 |[0m case foo foo) bar;; bar) foo;; esac
|
||||||
|
[36m[1m |[0m
|
||||||
|
[36m[1m-[0m Expected 'in' after case variable name
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
source: src/tests/error.rs
|
||||||
|
expression: err_fmt
|
||||||
|
---
|
||||||
|
[36m[1m->[0m [[36m[1m1[0m;[36m[1m1[0m] - [31m[1mCommand not found: foo[0m
|
||||||
|
[36m[1m |[0m
|
||||||
|
[36m[1m1 |[0m foo
|
||||||
|
[36m[1m |[0m
|
||||||
|
[36m[1m-[0m
|
||||||
9
src/tests/snapshots/fern__tests__error__if_no_fi.snap
Normal file
9
src/tests/snapshots/fern__tests__error__if_no_fi.snap
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
source: src/tests/error.rs
|
||||||
|
expression: err_fmt
|
||||||
|
---
|
||||||
|
[36m[1m->[0m [[36m[1m1[0m;[36m[1m1[0m] - [31m[1mParse Error[0m
|
||||||
|
[36m[1m |[0m
|
||||||
|
[36m[1m1 |[0m if foo; then bar;
|
||||||
|
[36m[1m |[0m
|
||||||
|
[36m[1m-[0m Expected 'fi' after if statement
|
||||||
9
src/tests/snapshots/fern__tests__error__if_no_then.snap
Normal file
9
src/tests/snapshots/fern__tests__error__if_no_then.snap
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
source: src/tests/error.rs
|
||||||
|
expression: err_fmt
|
||||||
|
---
|
||||||
|
[36m[1m->[0m [[36m[1m1[0m;[36m[1m1[0m] - [31m[1mParse Error[0m
|
||||||
|
[36m[1m |[0m
|
||||||
|
[36m[1m1 |[0m if foo; bar; fi
|
||||||
|
[36m[1m |[0m
|
||||||
|
[36m[1m-[0m Expected 'then' after 'if' condition
|
||||||
9
src/tests/snapshots/fern__tests__error__loop_no_do.snap
Normal file
9
src/tests/snapshots/fern__tests__error__loop_no_do.snap
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
source: src/tests/error.rs
|
||||||
|
expression: err_fmt
|
||||||
|
---
|
||||||
|
[36m[1m->[0m [[36m[1m1[0m;[36m[1m1[0m] - [31m[1mParse Error[0m
|
||||||
|
[36m[1m |[0m
|
||||||
|
[36m[1m1 |[0m while true; echo foo; done
|
||||||
|
[36m[1m |[0m
|
||||||
|
[36m[1m-[0m Expected 'do' after loop condition
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
source: src/tests/error.rs
|
||||||
|
expression: err_fmt
|
||||||
|
---
|
||||||
|
[36m[1m->[0m [[36m[1m1[0m;[36m[1m1[0m] - [31m[1mParse Error[0m
|
||||||
|
[36m[1m |[0m
|
||||||
|
[36m[1m1 |[0m while true; do echo foo;
|
||||||
|
[36m[1m |[0m
|
||||||
|
[36m[1m-[0m Expected 'done' after loop body
|
||||||
Reference in New Issue
Block a user