I really dont know what im doing with these tests sorry
This commit is contained in:
parent
cc980115fc
commit
b3bdd4ac64
|
@ -464,6 +464,7 @@ pub fn lex_signature(
|
||||||
(state.output, state.error)
|
(state.output, state.error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
pub struct LexState<'a> {
|
pub struct LexState<'a> {
|
||||||
pub input: &'a [u8],
|
pub input: &'a [u8],
|
||||||
pub output: Vec<Token>,
|
pub output: Vec<Token>,
|
||||||
|
|
|
@ -16,7 +16,7 @@ pub use flatten::{
|
||||||
flatten_block, flatten_expression, flatten_pipeline, flatten_pipeline_element, FlatShape,
|
flatten_block, flatten_expression, flatten_pipeline, flatten_pipeline_element, FlatShape,
|
||||||
};
|
};
|
||||||
pub use known_external::KnownExternal;
|
pub use known_external::KnownExternal;
|
||||||
pub use lex::{lex, lex_signature, Token, TokenContents};
|
pub use lex::{lex, lex_n_tokens, lex_signature, LexState, Token, TokenContents};
|
||||||
pub use lite_parser::{lite_parse, LiteBlock, LiteCommand};
|
pub use lite_parser::{lite_parse, LiteBlock, LiteCommand};
|
||||||
pub use nu_protocol::parser_path::*;
|
pub use nu_protocol::parser_path::*;
|
||||||
pub use parse_keywords::*;
|
pub use parse_keywords::*;
|
||||||
|
|
|
@ -5784,8 +5784,7 @@ pub fn parse_record(working_set: &mut StateWorkingSet, span: Span) -> Expression
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
let value = parse_value(working_set, tokens[idx].span, &SyntaxShape::Any);
|
let value = parse_value(working_set, tokens[idx].span, &SyntaxShape::Any);
|
||||||
if let Some(parse_error) = check_record_key_or_value(&working_set, &value, "value")
|
if let Some(parse_error) = check_record_key_or_value(working_set, &value, "value") {
|
||||||
{
|
|
||||||
working_set.error(parse_error);
|
working_set.error(parse_error);
|
||||||
garbage(working_set, value.span)
|
garbage(working_set, value.span)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use nu_parser::{lex, lex_signature, Token, TokenContents};
|
use nu_parser::{lex, lex_n_tokens, lex_signature, LexState, Token, TokenContents};
|
||||||
use nu_protocol::{ParseError, Span};
|
use nu_protocol::{ParseError, Span};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -281,3 +281,26 @@ fn lex_comments() {
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn lex_manually() {
|
||||||
|
let file = b"'a'\n#comment\n#comment again\n| continue";
|
||||||
|
let mut lex_state = LexState {
|
||||||
|
input: file,
|
||||||
|
output: Vec::new(),
|
||||||
|
error: None,
|
||||||
|
span_offset: 10,
|
||||||
|
};
|
||||||
|
assert_eq!(lex_n_tokens(&mut lex_state, &[], &[], false, 1), 1);
|
||||||
|
assert_eq!(lex_state.output.len(), 1);
|
||||||
|
assert_eq!(lex_n_tokens(&mut lex_state, &[], &[], false, 5), 5);
|
||||||
|
assert_eq!(lex_state.output.len(), 6);
|
||||||
|
// Next token is the pipe.
|
||||||
|
// This shortens the output because it exhausts the input before it can
|
||||||
|
// compensate for the EOL tokens lost to the line continuation
|
||||||
|
assert_eq!(lex_n_tokens(&mut lex_state, &[], &[], false, 1), -1);
|
||||||
|
assert_eq!(lex_state.output.len(), 5);
|
||||||
|
assert_eq!(file.len(), lex_state.span_offset - 10);
|
||||||
|
let last_span = lex_state.output.last().unwrap().span;
|
||||||
|
assert_eq!(&file[last_span.start - 10..last_span.end - 10], b"continue");
|
||||||
|
}
|
||||||
|
|
|
@ -2397,3 +2397,56 @@ mod operator {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod record {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
use nu_protocol::ast::RecordItem;
|
||||||
|
|
||||||
|
#[rstest]
|
||||||
|
#[case(b"{ :: x }", "Invalid literal")] // Key is bare colon
|
||||||
|
#[case(b"{ a: x:y }", "Invalid literal")] // Value is bare word with colon
|
||||||
|
#[case(b"{ a: x('y'):z }", "Invalid literal")] // Value is bare string interpolation with colon
|
||||||
|
#[case(b"{ ;: x }", "Parse mismatch during operation.")] // Key is a non-item token
|
||||||
|
#[case(b"{ a: || }", "Parse mismatch during operation.")] // Value is a non-item token
|
||||||
|
fn refuse_confusing_record(#[case] expr: &[u8], #[case] error: &str) {
|
||||||
|
dbg!(String::from_utf8_lossy(expr));
|
||||||
|
let engine_state = EngineState::new();
|
||||||
|
let mut working_set = StateWorkingSet::new(&engine_state);
|
||||||
|
parse(&mut working_set, None, expr, false);
|
||||||
|
assert_eq!(
|
||||||
|
working_set.parse_errors.first().map(|e| e.to_string()),
|
||||||
|
Some(error.to_string())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[rstest]
|
||||||
|
#[case(b"{ a: 2024-07-23T22:54:54.532100627+02:00 b:xy }")]
|
||||||
|
fn parse_datetime_in_record(#[case] expr: &[u8]) {
|
||||||
|
dbg!(String::from_utf8_lossy(expr));
|
||||||
|
let engine_state = EngineState::new();
|
||||||
|
let mut working_set = StateWorkingSet::new(&engine_state);
|
||||||
|
let block = parse(&mut working_set, None, expr, false);
|
||||||
|
assert!(working_set.parse_errors.first().is_none());
|
||||||
|
let pipeline_el_expr = &block
|
||||||
|
.pipelines
|
||||||
|
.first()
|
||||||
|
.unwrap()
|
||||||
|
.elements
|
||||||
|
.first()
|
||||||
|
.unwrap()
|
||||||
|
.expr
|
||||||
|
.expr;
|
||||||
|
dbg!(pipeline_el_expr);
|
||||||
|
match pipeline_el_expr {
|
||||||
|
Expr::FullCellPath(v) => match &v.head.expr {
|
||||||
|
Expr::Record(fields) => assert!(matches!(
|
||||||
|
fields[0],
|
||||||
|
RecordItem::Pair(_, Expression { ty: Type::Date, .. })
|
||||||
|
)),
|
||||||
|
_ => panic!("Expected record head"),
|
||||||
|
},
|
||||||
|
_ => panic!("Expected full cell path"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user