diff --git a/integration/tests_error_parser/missing_quote.err b/integration/tests_error_parser/missing_quote.err new file mode 100644 index 000000000..eae9e475a --- /dev/null +++ b/integration/tests_error_parser/missing_quote.err @@ -0,0 +1,6 @@ +error: Parsing literal + --> tests_error_parser/missing_quote.hurl:4:41 + | + 4 | jsonpath "$.error.message" == "not found + | ^ expecting '"' + | \ No newline at end of file diff --git a/integration/tests_error_parser/missing_quote.exit b/integration/tests_error_parser/missing_quote.exit new file mode 100644 index 000000000..d8263ee98 --- /dev/null +++ b/integration/tests_error_parser/missing_quote.exit @@ -0,0 +1 @@ +2 \ No newline at end of file diff --git a/integration/tests_error_parser/missing_quote.hurl b/integration/tests_error_parser/missing_quote.hurl new file mode 100644 index 000000000..d3d3c19a7 --- /dev/null +++ b/integration/tests_error_parser/missing_quote.hurl @@ -0,0 +1,4 @@ +POST http://localhost:8000/not-found +HTTP/1.1 404 +[Asserts] +jsonpath "$.error.message" == "not found diff --git a/packages/hurl_core/src/parser/predicate_value.rs b/packages/hurl_core/src/parser/predicate_value.rs index dcd0dd73a..5ce666598 100644 --- a/packages/hurl_core/src/parser/predicate_value.rs +++ b/packages/hurl_core/src/parser/predicate_value.rs @@ -117,4 +117,24 @@ mod tests { assert_eq!(error.inner, ParseError::PredicateValue {}); assert!(!error.recoverable); } + + #[test] + fn test_predicate_value_error_missing_quote() { + let mut reader = Reader::init("\"not_found"); + let error = predicate_value(&mut reader).err().unwrap(); + assert_eq!( + error.pos, + Pos { + line: 1, + column: 11 + } + ); + assert_eq!( + error.inner, + ParseError::Expecting { + value: "\"".to_string() + } + ); + assert!(!error.recoverable); + } } diff --git a/packages/hurl_core/src/parser/string.rs b/packages/hurl_core/src/parser/string.rs index fe0159c22..4e0b6924e 100644 --- a/packages/hurl_core/src/parser/string.rs +++ b/packages/hurl_core/src/parser/string.rs @@ -152,23 +152,23 @@ pub fn quoted_template(reader: &mut Reader) -> ParseResult<'static, Template> { let mut chars = vec![]; loop { let pos = reader.state.pos.clone(); + let save = reader.state.clone(); match any_char(vec!['"'], reader) { Err(e) => { if e.recoverable { + reader.state = save; break; } else { return Err(e); } } Ok((c, s)) => { - if s == "\"" { - break; - } chars.push((c, s, pos)); end = reader.state.clone().pos; } } } + literal("\"", reader)?; let encoded_string = template::EncodedString { source_info: SourceInfo { start: start.clone(), @@ -524,6 +524,20 @@ mod tests { assert_eq!(reader.state.cursor, 8); } + #[test] + fn test_quoted_template_error_missing_closing_quote() { + let mut reader = Reader::init("\"not found"); + let error = quoted_template(&mut reader).err().unwrap(); + assert_eq!( + error.pos, + Pos { + line: 1, + column: 11 + } + ); + assert!(!error.recoverable); + } + #[test] fn test_quoted_string() { let mut reader = Reader::init("\"\"");