This commit is contained in:
2025-03-15 00:02:05 -04:00
parent 34cc2b3976
commit 97b4b1835d
75 changed files with 4335 additions and 7918 deletions

19
src/tests/expand.rs Normal file
View File

@@ -0,0 +1,19 @@
use parse::lex::{Tk, TkFlags, TkRule};
use state::write_vars;
use super::super::*;
#[test]
fn simple_expansion() {
let varsub = "$foo";
write_vars(|v| v.new_var("foo", "this is the value of the variable".into()));
let mut tokens: Vec<Tk> = LexStream::new(varsub, LexFlags::empty())
.filter(|tk| !matches!(tk.class, TkRule::EOI | TkRule::SOI))
.collect();
let var_tk = tokens.pop().unwrap();
let var_span = var_tk.span.clone();
let exp_tk = var_tk.expand(var_span, TkFlags::empty());
write_vars(|v| v.vars_mut().clear());
insta::assert_debug_snapshot!(exp_tk.get_words())
}

36
src/tests/lexer.rs Normal file
View File

@@ -0,0 +1,36 @@
use super::super::*;
#[test]
fn lex_simple() {
let input = "echo hello world";
let tokens: Vec<_> = LexStream::new(input, LexFlags::empty()).collect();
insta::assert_debug_snapshot!(tokens)
}
#[test]
fn lex_redir() {
let input = "echo foo > bar.txt";
let tokens: Vec<_> = LexStream::new(input, LexFlags::empty()).collect();
insta::assert_debug_snapshot!(tokens)
}
#[test]
fn lex_redir_fds() {
let input = "echo foo 1>&2";
let tokens: Vec<_> = LexStream::new(input, LexFlags::empty()).collect();
insta::assert_debug_snapshot!(tokens)
}
#[test]
fn lex_quote_str() {
let input = "echo \"foo bar\" biz baz";
let tokens: Vec<_> = LexStream::new(input, LexFlags::empty()).collect();
insta::assert_debug_snapshot!(tokens)
}
#[test]
fn lex_with_keywords() {
let input = "if true; then echo foo; fi";
let tokens: Vec<_> = LexStream::new(input, LexFlags::empty()).collect();
insta::assert_debug_snapshot!(tokens)
}

4
src/tests/mod.rs Normal file
View File

@@ -0,0 +1,4 @@
pub mod lexer;
pub mod parser;
pub mod expand;
pub mod term;

37
src/tests/parser.rs Normal file
View File

@@ -0,0 +1,37 @@
use super::super::*;
#[test]
fn parse_simple() {
let input = "echo hello world";
let tk_stream: Vec<_> = LexStream::new(input, LexFlags::empty()).collect();
let nodes: Vec<_> = ParseStream::new(tk_stream).collect();
insta::assert_debug_snapshot!(nodes)
}
#[test]
fn parse_pipeline() {
let input = "echo foo | sed s/foo/bar";
let tk_stream: Vec<_> = LexStream::new(input, LexFlags::empty()).collect();
let nodes: Vec<_> = ParseStream::new(tk_stream).collect();
insta::assert_debug_snapshot!(nodes)
}
#[test]
fn parse_conjunction() {
let input = "echo foo && echo bar";
let tk_stream: Vec<_> = LexStream::new(input, LexFlags::empty()).collect();
let nodes: Vec<_> = ParseStream::new(tk_stream).collect();
insta::assert_debug_snapshot!(nodes)
}
#[test]
fn parse_conjunction_and_pipeline() {
let input = "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/";
let tk_stream: Vec<_> = LexStream::new(input, LexFlags::empty()).collect();
let nodes: Vec<_> = ParseStream::new(tk_stream).collect();
insta::assert_debug_snapshot!(nodes)
}

View File

@@ -0,0 +1,13 @@
---
source: src/tests/expand.rs
expression: exp_tk.get_words()
---
[
"this",
"is",
"the",
"value",
"of",
"the",
"variable",
]

View File

@@ -0,0 +1,78 @@
---
source: src/tests/lexer.rs
expression: tokens
---
[
Tk {
class: SOI,
err_span: None,
err: Null,
span: Span {
range: 0..0,
source: "echo \"foo bar\" biz baz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 0..4,
source: "echo \"foo bar\" biz baz",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 5..14,
source: "echo \"foo bar\" biz baz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 15..18,
source: "echo \"foo bar\" biz baz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 19..22,
source: "echo \"foo bar\" biz baz",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: EOI,
err_span: None,
err: Null,
span: Span {
range: 22..22,
source: "echo \"foo bar\" biz baz",
},
flags: TkFlags(
0x0,
),
},
]

View File

@@ -0,0 +1,78 @@
---
source: src/tests/lexer.rs
expression: tokens
---
[
Tk {
class: SOI,
err_span: None,
err: Null,
span: Span {
range: 0..0,
source: "echo foo > bar.txt",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 0..4,
source: "echo foo > bar.txt",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 5..8,
source: "echo foo > bar.txt",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Redir,
err_span: None,
err: Null,
span: Span {
range: 9..10,
source: "echo foo > bar.txt",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 11..18,
source: "echo foo > bar.txt",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: EOI,
err_span: None,
err: Null,
span: Span {
range: 18..18,
source: "echo foo > bar.txt",
},
flags: TkFlags(
0x0,
),
},
]

View File

@@ -0,0 +1,66 @@
---
source: src/tests/lexer.rs
expression: tokens
---
[
Tk {
class: SOI,
err_span: None,
err: Null,
span: Span {
range: 0..0,
source: "echo foo 1>&2",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 0..4,
source: "echo foo 1>&2",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 5..8,
source: "echo foo 1>&2",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Redir,
err_span: None,
err: Null,
span: Span {
range: 9..13,
source: "echo foo 1>&2",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: EOI,
err_span: None,
err: Null,
span: Span {
range: 13..13,
source: "echo foo 1>&2",
},
flags: TkFlags(
0x0,
),
},
]

View File

@@ -0,0 +1,66 @@
---
source: src/tests/lexer.rs
expression: tokens
---
[
Tk {
class: SOI,
err_span: None,
err: Null,
span: Span {
range: 0..0,
source: "echo hello world",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 0..4,
source: "echo hello world",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 5..10,
source: "echo hello world",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 11..16,
source: "echo hello world",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: EOI,
err_span: None,
err: Null,
span: Span {
range: 16..16,
source: "echo hello world",
},
flags: TkFlags(
0x0,
),
},
]

View File

@@ -0,0 +1,126 @@
---
source: src/tests/lexer.rs
expression: tokens
---
[
Tk {
class: SOI,
err_span: None,
err: Null,
span: Span {
range: 0..0,
source: "if true; then echo foo; fi",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 0..2,
source: "if true; then echo foo; fi",
},
flags: TkFlags(
KEYWORD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 3..7,
source: "if true; then echo foo; fi",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Sep,
err_span: None,
err: Null,
span: Span {
range: 7..9,
source: "if true; then echo foo; fi",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 9..13,
source: "if true; then echo foo; fi",
},
flags: TkFlags(
KEYWORD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 14..18,
source: "if true; then echo foo; fi",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 19..22,
source: "if true; then echo foo; fi",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Sep,
err_span: None,
err: Null,
span: Span {
range: 22..24,
source: "if true; then echo foo; fi",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 24..26,
source: "if true; then echo foo; fi",
},
flags: TkFlags(
KEYWORD,
),
},
Tk {
class: EOI,
err_span: None,
err: Null,
span: Span {
range: 26..26,
source: "if true; then echo foo; fi",
},
flags: TkFlags(
0x0,
),
},
]

View File

@@ -0,0 +1,282 @@
---
source: src/tests/parser.rs
expression: nodes
---
[
Match(
Node {
class: CmdList {
elements: [
ConjunctNode {
cmd: Node {
class: Pipeline {
cmds: [
Node {
class: Command {
assignments: [],
argv: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 0..4,
source: "echo foo && echo bar",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 5..8,
source: "echo foo && echo bar",
},
flags: TkFlags(
0x0,
),
},
],
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 0..4,
source: "echo foo && echo bar",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 5..8,
source: "echo foo && echo bar",
},
flags: TkFlags(
0x0,
),
},
],
},
],
pipe_err: false,
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 0..4,
source: "echo foo && echo bar",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 5..8,
source: "echo foo && echo bar",
},
flags: TkFlags(
0x0,
),
},
],
},
operator: And,
},
ConjunctNode {
cmd: Node {
class: Pipeline {
cmds: [
Node {
class: Command {
assignments: [],
argv: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 12..16,
source: "echo foo && echo bar",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 17..20,
source: "echo foo && echo bar",
},
flags: TkFlags(
0x0,
),
},
],
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 12..16,
source: "echo foo && echo bar",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 17..20,
source: "echo foo && echo bar",
},
flags: TkFlags(
0x0,
),
},
],
},
],
pipe_err: false,
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 12..16,
source: "echo foo && echo bar",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 17..20,
source: "echo foo && echo bar",
},
flags: TkFlags(
0x0,
),
},
],
},
operator: Null,
},
],
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 0..4,
source: "echo foo && echo bar",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 5..8,
source: "echo foo && echo bar",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: And,
err_span: None,
err: Null,
span: Span {
range: 9..11,
source: "echo foo && echo bar",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 12..16,
source: "echo foo && echo bar",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 17..20,
source: "echo foo && echo bar",
},
flags: TkFlags(
0x0,
),
},
],
},
),
]

View File

@@ -0,0 +1,962 @@
---
source: src/tests/parser.rs
expression: nodes
---
[
Match(
Node {
class: CmdList {
elements: [
ConjunctNode {
cmd: Node {
class: Pipeline {
cmds: [
Node {
class: Command {
assignments: [],
argv: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 0..4,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 5..8,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
],
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 0..4,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 5..8,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
],
},
Node {
class: Command {
assignments: [],
argv: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 11..14,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 15..24,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
],
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 11..14,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 15..24,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
],
},
],
pipe_err: false,
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 0..4,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 5..8,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Pipe,
err_span: None,
err: Null,
span: Span {
range: 9..10,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 11..14,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 15..24,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
],
},
operator: And,
},
ConjunctNode {
cmd: Node {
class: Pipeline {
cmds: [
Node {
class: Command {
assignments: [],
argv: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 28..32,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 33..36,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
],
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 28..32,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 33..36,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
],
},
Node {
class: Command {
assignments: [],
argv: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 39..42,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 43..52,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
],
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 39..42,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 43..52,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
],
},
],
pipe_err: false,
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 28..32,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 33..36,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Pipe,
err_span: None,
err: Null,
span: Span {
range: 37..38,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 39..42,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 43..52,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
],
},
operator: Or,
},
ConjunctNode {
cmd: Node {
class: Pipeline {
cmds: [
Node {
class: Command {
assignments: [],
argv: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 56..60,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 61..64,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 65..68,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
],
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 56..60,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 61..64,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 65..68,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
],
},
Node {
class: Command {
assignments: [],
argv: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 71..74,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 75..80,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 81..88,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 89..93,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
],
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 71..74,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 75..80,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 81..88,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 89..93,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
],
},
],
pipe_err: false,
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 56..60,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 61..64,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 65..68,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Pipe,
err_span: None,
err: Null,
span: Span {
range: 69..70,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 71..74,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 75..80,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 81..88,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 89..93,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
],
},
operator: Null,
},
],
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 0..4,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 5..8,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Pipe,
err_span: None,
err: Null,
span: Span {
range: 9..10,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 11..14,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 15..24,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: And,
err_span: None,
err: Null,
span: Span {
range: 25..27,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 28..32,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 33..36,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Pipe,
err_span: None,
err: Null,
span: Span {
range: 37..38,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 39..42,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 43..52,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Or,
err_span: None,
err: Null,
span: Span {
range: 53..55,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 56..60,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 61..64,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 65..68,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Pipe,
err_span: None,
err: Null,
span: Span {
range: 69..70,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 71..74,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 75..80,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 81..88,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 89..93,
source: "echo foo | sed s/foo/bar && echo bar | sed s/bar/foo || echo foo bar | sed s/foo bar/bar foo/",
},
flags: TkFlags(
0x0,
),
},
],
},
),
]

View File

@@ -0,0 +1,278 @@
---
source: src/tests/parser.rs
expression: nodes
---
[
Match(
Node {
class: CmdList {
elements: [
ConjunctNode {
cmd: Node {
class: Pipeline {
cmds: [
Node {
class: Command {
assignments: [],
argv: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 0..4,
source: "echo foo | sed s/foo/bar",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 5..8,
source: "echo foo | sed s/foo/bar",
},
flags: TkFlags(
0x0,
),
},
],
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 0..4,
source: "echo foo | sed s/foo/bar",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 5..8,
source: "echo foo | sed s/foo/bar",
},
flags: TkFlags(
0x0,
),
},
],
},
Node {
class: Command {
assignments: [],
argv: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 11..14,
source: "echo foo | sed s/foo/bar",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 15..24,
source: "echo foo | sed s/foo/bar",
},
flags: TkFlags(
0x0,
),
},
],
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 11..14,
source: "echo foo | sed s/foo/bar",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 15..24,
source: "echo foo | sed s/foo/bar",
},
flags: TkFlags(
0x0,
),
},
],
},
],
pipe_err: false,
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 0..4,
source: "echo foo | sed s/foo/bar",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 5..8,
source: "echo foo | sed s/foo/bar",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Pipe,
err_span: None,
err: Null,
span: Span {
range: 9..10,
source: "echo foo | sed s/foo/bar",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 11..14,
source: "echo foo | sed s/foo/bar",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 15..24,
source: "echo foo | sed s/foo/bar",
},
flags: TkFlags(
0x0,
),
},
],
},
operator: Null,
},
],
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 0..4,
source: "echo foo | sed s/foo/bar",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 5..8,
source: "echo foo | sed s/foo/bar",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Pipe,
err_span: None,
err: Null,
span: Span {
range: 9..10,
source: "echo foo | sed s/foo/bar",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 11..14,
source: "echo foo | sed s/foo/bar",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 15..24,
source: "echo foo | sed s/foo/bar",
},
flags: TkFlags(
0x0,
),
},
],
},
),
]

View File

@@ -0,0 +1,193 @@
---
source: src/tests/parser.rs
expression: nodes
---
[
Match(
Node {
class: CmdList {
elements: [
ConjunctNode {
cmd: Node {
class: Pipeline {
cmds: [
Node {
class: Command {
assignments: [],
argv: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 0..4,
source: "echo hello world",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 5..10,
source: "echo hello world",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 11..16,
source: "echo hello world",
},
flags: TkFlags(
0x0,
),
},
],
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 0..4,
source: "echo hello world",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 5..10,
source: "echo hello world",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 11..16,
source: "echo hello world",
},
flags: TkFlags(
0x0,
),
},
],
},
],
pipe_err: false,
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 0..4,
source: "echo hello world",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 5..10,
source: "echo hello world",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 11..16,
source: "echo hello world",
},
flags: TkFlags(
0x0,
),
},
],
},
operator: Null,
},
],
},
flags: NdFlags(
0x0,
),
redirs: [],
tokens: [
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 0..4,
source: "echo hello world",
},
flags: TkFlags(
IS_CMD,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 5..10,
source: "echo hello world",
},
flags: TkFlags(
0x0,
),
},
Tk {
class: Str,
err_span: None,
err: Null,
span: Span {
range: 11..16,
source: "echo hello world",
},
flags: TkFlags(
0x0,
),
},
],
},
),
]

View File

@@ -0,0 +1,5 @@
---
source: src/tests/term.rs
expression: styled
---
text with background

View File

@@ -0,0 +1,5 @@
---
source: src/tests/term.rs
expression: styled
---
styled text

View File

@@ -0,0 +1,5 @@
---
source: src/tests/term.rs
expression: styled
---
reset test

View File

@@ -0,0 +1,5 @@
---
source: src/tests/term.rs
expression: styled
---
RGB styled text

View File

@@ -0,0 +1,5 @@
---
source: src/tests/term.rs
expression: styled
---
multi-style text

View File

@@ -0,0 +1,5 @@
---
source: src/tests/term.rs
expression: styled
---
hello world

41
src/tests/term.rs Normal file
View File

@@ -0,0 +1,41 @@
use libsh::term::{Style, StyleSet, Styled};
use super::super::*;
#[test]
fn styled_simple() {
let input = "hello world";
let styled = input.styled(Style::Green);
insta::assert_snapshot!(styled)
}
#[test]
fn styled_multiple() {
let input = "styled text";
let styled = input.styled(Style::Red | Style::Bold | Style::Underline);
insta::assert_snapshot!(styled);
}
#[test]
fn styled_rgb() {
let input = "RGB styled text";
let styled = input.styled(Style::RGB(255, 99, 71)); // Tomato color
insta::assert_snapshot!(styled);
}
#[test]
fn styled_background() {
let input = "text with background";
let styled = input.styled(Style::BgBlue | Style::Bold);
insta::assert_snapshot!(styled);
}
#[test]
fn styled_set() {
let input = "multi-style text";
let style_set = StyleSet::new().add(Style::Magenta).add(Style::Italic);
let styled = input.styled(style_set);
insta::assert_snapshot!(styled);
}
#[test]
fn styled_reset() {
let input = "reset test";
let styled = input.styled(Style::Bold | Style::Reset);
insta::assert_snapshot!(styled);
}