nushell/crates/nu-parser/tests/test_parser.rs

145 lines
4.6 KiB
Rust
Raw Normal View History

2021-09-02 08:25:22 +00:00
use nu_parser::ParseError;
2021-08-30 18:36:07 +00:00
use nu_parser::*;
2021-09-02 18:21:37 +00:00
use nu_protocol::{
2021-09-03 02:15:01 +00:00
ast::{Expr, Expression, Pipeline, Statement},
2021-09-02 18:21:37 +00:00
engine::{EngineState, StateWorkingSet},
Signature, SyntaxShape,
};
2021-08-30 18:36:07 +00:00
#[test]
pub fn parse_int() {
2021-09-02 08:25:22 +00:00
let engine_state = EngineState::new();
let mut working_set = StateWorkingSet::new(&engine_state);
2021-08-30 18:36:07 +00:00
2021-09-02 18:21:37 +00:00
let (block, err) = parse_source(&mut working_set, b"3", true);
2021-08-30 18:36:07 +00:00
assert!(err.is_none());
assert!(block.len() == 1);
2021-09-03 02:15:01 +00:00
match &block[0] {
2021-09-03 07:35:29 +00:00
Statement::Pipeline(Pipeline { expressions }) => {
2021-09-03 02:15:01 +00:00
assert!(expressions.len() == 1);
assert!(matches!(
expressions[0],
Expression {
expr: Expr::Int(3),
..
}
))
}
_ => panic!("No match"),
}
2021-08-30 18:36:07 +00:00
}
#[test]
pub fn parse_call() {
2021-09-02 08:25:22 +00:00
let engine_state = EngineState::new();
let mut working_set = StateWorkingSet::new(&engine_state);
2021-08-30 18:36:07 +00:00
let sig = Signature::build("foo").named("--jazz", SyntaxShape::Int, "jazz!!", Some('j'));
2021-09-02 18:21:37 +00:00
working_set.add_decl(sig.predeclare());
2021-08-30 18:36:07 +00:00
2021-09-02 18:21:37 +00:00
let (block, err) = parse_source(&mut working_set, b"foo", true);
2021-08-30 18:36:07 +00:00
assert!(err.is_none());
assert!(block.len() == 1);
match &block[0] {
2021-09-03 02:15:01 +00:00
Statement::Pipeline(Pipeline { expressions }) => {
assert_eq!(expressions.len(), 1);
if let Expression {
expr: Expr::Call(call),
..
} = &expressions[0]
{
assert_eq!(call.decl_id, 0);
}
2021-08-30 18:36:07 +00:00
}
_ => panic!("not a call"),
}
}
#[test]
pub fn parse_call_missing_flag_arg() {
2021-09-02 08:25:22 +00:00
let engine_state = EngineState::new();
let mut working_set = StateWorkingSet::new(&engine_state);
2021-08-30 18:36:07 +00:00
let sig = Signature::build("foo").named("--jazz", SyntaxShape::Int, "jazz!!", Some('j'));
2021-09-02 18:21:37 +00:00
working_set.add_decl(sig.predeclare());
2021-08-30 18:36:07 +00:00
2021-09-02 18:21:37 +00:00
let (_, err) = parse_source(&mut working_set, b"foo --jazz", true);
2021-08-30 18:36:07 +00:00
assert!(matches!(err, Some(ParseError::MissingFlagParam(..))));
}
#[test]
pub fn parse_call_missing_short_flag_arg() {
2021-09-02 08:25:22 +00:00
let engine_state = EngineState::new();
let mut working_set = StateWorkingSet::new(&engine_state);
2021-08-30 18:36:07 +00:00
let sig = Signature::build("foo").named("--jazz", SyntaxShape::Int, "jazz!!", Some('j'));
2021-09-02 18:21:37 +00:00
working_set.add_decl(sig.predeclare());
2021-08-30 18:36:07 +00:00
2021-09-02 18:21:37 +00:00
let (_, err) = parse_source(&mut working_set, b"foo -j", true);
2021-08-30 18:36:07 +00:00
assert!(matches!(err, Some(ParseError::MissingFlagParam(..))));
}
#[test]
pub fn parse_call_too_many_shortflag_args() {
2021-09-02 08:25:22 +00:00
let engine_state = EngineState::new();
let mut working_set = StateWorkingSet::new(&engine_state);
2021-08-30 18:36:07 +00:00
let sig = Signature::build("foo")
.named("--jazz", SyntaxShape::Int, "jazz!!", Some('j'))
.named("--math", SyntaxShape::Int, "math!!", Some('m'));
2021-09-02 18:21:37 +00:00
working_set.add_decl(sig.predeclare());
let (_, err) = parse_source(&mut working_set, b"foo -mj", true);
2021-08-30 18:36:07 +00:00
assert!(matches!(
err,
Some(ParseError::ShortFlagBatchCantTakeArg(..))
));
}
#[test]
pub fn parse_call_unknown_shorthand() {
2021-09-02 08:25:22 +00:00
let engine_state = EngineState::new();
let mut working_set = StateWorkingSet::new(&engine_state);
2021-08-30 18:36:07 +00:00
let sig = Signature::build("foo").switch("--jazz", "jazz!!", Some('j'));
2021-09-02 18:21:37 +00:00
working_set.add_decl(sig.predeclare());
let (_, err) = parse_source(&mut working_set, b"foo -mj", true);
2021-08-30 18:36:07 +00:00
assert!(matches!(err, Some(ParseError::UnknownFlag(..))));
}
#[test]
pub fn parse_call_extra_positional() {
2021-09-02 08:25:22 +00:00
let engine_state = EngineState::new();
let mut working_set = StateWorkingSet::new(&engine_state);
2021-08-30 18:36:07 +00:00
let sig = Signature::build("foo").switch("--jazz", "jazz!!", Some('j'));
2021-09-02 18:21:37 +00:00
working_set.add_decl(sig.predeclare());
let (_, err) = parse_source(&mut working_set, b"foo -j 100", true);
2021-08-30 18:36:07 +00:00
assert!(matches!(err, Some(ParseError::ExtraPositional(..))));
}
#[test]
pub fn parse_call_missing_req_positional() {
2021-09-02 08:25:22 +00:00
let engine_state = EngineState::new();
let mut working_set = StateWorkingSet::new(&engine_state);
2021-08-30 18:36:07 +00:00
let sig = Signature::build("foo").required("jazz", SyntaxShape::Int, "jazz!!");
2021-09-02 18:21:37 +00:00
working_set.add_decl(sig.predeclare());
let (_, err) = parse_source(&mut working_set, b"foo", true);
2021-08-30 18:36:07 +00:00
assert!(matches!(err, Some(ParseError::MissingPositional(..))));
}
#[test]
pub fn parse_call_missing_req_flag() {
2021-09-02 08:25:22 +00:00
let engine_state = EngineState::new();
let mut working_set = StateWorkingSet::new(&engine_state);
2021-08-30 18:36:07 +00:00
let sig = Signature::build("foo").required_named("--jazz", SyntaxShape::Int, "jazz!!", None);
2021-09-02 18:21:37 +00:00
working_set.add_decl(sig.predeclare());
let (_, err) = parse_source(&mut working_set, b"foo", true);
2021-08-30 18:36:07 +00:00
assert!(matches!(err, Some(ParseError::MissingRequiredFlag(..))));
}