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