1use crate::blocking::io::BlockingRead;
2use core::str::FromStr;
3use crate::shared::*;
4
5pub struct JsonReader<'a, B: AsMut<[u8]>, R: BlockingRead> {
61 inner: ReaderInner<B, R::Error>,
62 reader: &'a mut R,
63}
64
65#[cfg(feature = "std")]
66impl<'a, R: BlockingRead> JsonReader<'a, Vec<u8>, R> {
67 pub fn new(buf_size: usize, reader: &'a mut R) -> Self {
69 let buf = vec![0u8; buf_size];
70 Self::new_with_provided_buffer(buf, reader, false)
71 }
72
73 pub fn new_with_lenient_comma_handling(buf_size: usize, reader: &'a mut R) -> Self {
76 let buf = vec![0u8; buf_size];
77 Self::new_with_provided_buffer(buf, reader, true)
78 }
79}
80
81impl<'a, B: AsMut<[u8]>, R: BlockingRead> JsonReader<'a, B, R> {
82 pub fn new_with_provided_buffer(buf: B, reader: &'a mut R, lenient_comma_handling: bool) -> Self {
85 Self {
86 inner: ReaderInner::new(buf, lenient_comma_handling),
87 reader,
88 }
89 }
90
91 pub fn next(&mut self) -> JsonParseResult<JsonReadToken<'_>, R::Error> {
97 self.consume_whitespace()?;
98
99 match self.read_next_byte()? {
100 None => {
101 Ok(JsonReadToken::EndOfStream)
102 },
103 Some(b',') => {
104 self.inner.on_comma()?;
105 self.next()
106 }
107 Some(b'{') => {
108 self.inner.ensure_accept_value()?;
109 self.inner.state = ReaderState::Initial;
110 Ok(JsonReadToken::StartObject)
111 },
112 Some(b'}') => {
113 self.inner.ensure_accept_end_nested()?;
114 self.inner.state = ReaderState::AfterValue;
115 Ok(JsonReadToken::EndObject)
116 },
117 Some(b'[') => {
118 self.inner.ensure_accept_value()?;
119 self.inner.state = ReaderState::Initial;
120 Ok(JsonReadToken::StartArray)
121 },
122 Some(b']') => {
123 self.inner.ensure_accept_end_nested()?;
124 self.inner.state = ReaderState::AfterValue;
125 Ok(JsonReadToken::EndArray)
126 },
127
128 Some(b'n') => {
129 self.inner.state_change_for_value()?;
130 self.consume_null_literal()
131 },
132 Some(b't') => {
133 self.inner.state_change_for_value()?;
134 self.consume_true_literal()
135 },
136 Some(b'f') => {
137 self.inner.state_change_for_value()?;
138 self.consume_false_literal()
139 },
140
141 Some(b'"') => self.parse_after_quote(), Some(b) => {
143 self.inner.state_change_for_value()?;
144 match b {
145 b'-' | b'0'..=b'9' => self.parse_number_literal(b),
146 _ => self.parse_err("invalid JSON literal")
147 }
148 },
149 }
150 }
151
152 pub fn expect_key(&mut self) -> JsonParseResult<Option<&str>, R::Error> {
156 let location = self.location();
157 let next = self.next()?;
158 match next {
159 JsonReadToken::Key(key) => Ok(Some(key)),
160 JsonReadToken::EndObject => Ok(None),
161 other => Err(JsonParseError::Parse(other.kind(), location)),
162 }
163 }
164
165 pub fn expect_raw_number(&mut self) -> JsonParseResult<JsonNumber<'_>, R::Error> {
169 let location = self.location();
170 let next = self.next()?;
171 match next {
172 JsonReadToken::NumberLiteral(n) => Ok(n),
173 other => Err(JsonParseError::Parse(other.kind(), location)),
174 }
175 }
176
177 pub fn expect_raw_number_or_end_array(&mut self) -> JsonParseResult<Option<JsonNumber<'_>>, R::Error> {
180 let location = self.location();
181 let next = self.next()?;
182 match next {
183 JsonReadToken::NumberLiteral(n) => Ok(Some(n)),
184 JsonReadToken::EndArray => Ok(None),
185 other => Err(JsonParseError::Parse(other.kind(), location)),
186 }
187 }
188
189 pub fn expect_opt_raw_number(&mut self) -> JsonParseResult<Option<JsonNumber<'_>>, R::Error> {
192 let location = self.location();
193 let next = self.next()?;
194 match next {
195 JsonReadToken::NullLiteral => Ok(None),
196 JsonReadToken::NumberLiteral(n) => Ok(Some(n)),
197 other => Err(JsonParseError::Parse(other.kind(), location)),
198 }
199 }
200
201 pub fn expect_opt_raw_number_or_end_array(&mut self) -> JsonParseResult<Option<Option<JsonNumber<'_>>>, R::Error> {
204 let location = self.location();
205 let next = self.next()?;
206 match next {
207 JsonReadToken::NullLiteral => Ok(Some(None)),
208 JsonReadToken::NumberLiteral(n) => Ok(Some(Some(n))),
209 JsonReadToken::EndArray => Ok(None),
210 other => Err(JsonParseError::Parse(other.kind(), location)),
211 }
212 }
213
214 pub fn expect_number<T: FromStr>(&mut self) -> JsonParseResult<T, R::Error> {
241 let n = self.expect_raw_number()?;
242 match n.parse::<T>() {
243 Ok(n) => Ok(n),
244 Err(_) => self.parse_err("invalid number"),
245 }
246 }
247
248 pub fn expect_number_or_end_array<T: FromStr>(&mut self) -> JsonParseResult<Option<T>, R::Error> {
251 match self.expect_raw_number_or_end_array()? {
252 None => Ok(None),
253 Some(n) => {
254 match n.parse::<T>() {
255 Ok(n) => Ok(Some(n)),
256 Err(_) => self.parse_err("invalid number"),
257 }
258 }
259 }
260 }
261
262 pub fn expect_opt_number<T: FromStr>(&mut self) -> JsonParseResult<Option<T>, R::Error> {
265 match self.expect_opt_raw_number()? {
266 Some(n) => {
267 match n.parse::<T>() {
268 Ok(n) => Ok(Some(n)),
269 Err(_) => self.parse_err("invalid number"),
270 }
271 }
272 None => Ok(None),
273 }
274 }
275
276 pub fn expect_opt_number_or_end_array<T: FromStr>(&mut self) -> JsonParseResult<Option<Option<T>>, R::Error> {
279 match self.expect_opt_raw_number_or_end_array()? {
280 Some(Some(n)) => {
281 match n.parse::<T>() {
282 Ok(n) => Ok(Some(Some(n))),
283 Err(_) => self.parse_err("invalid number"),
284 }
285 }
286 Some(None) => Ok(Some(None)),
287 None => Ok(None),
288 }
289 }
290
291 pub fn expect_string(&mut self) -> JsonParseResult<&str, R::Error> {
293 let location = self.location();
294 let next = self.next()?;
295 match next {
296 JsonReadToken::StringLiteral(s) => Ok(s),
297 other => Err(JsonParseError::Parse(other.kind(), location)),
298 }
299 }
300
301 pub fn expect_string_or_end_array(&mut self) -> JsonParseResult<Option<&str>, R::Error> {
304 let location = self.location();
305 let next = self.next()?;
306 match next {
307 JsonReadToken::StringLiteral(s) => Ok(Some(s)),
308 JsonReadToken::EndArray => Ok(None),
309 other => Err(JsonParseError::Parse(other.kind(), location)),
310 }
311 }
312
313 pub fn expect_opt_string(&mut self) -> JsonParseResult<Option<&str>, R::Error> {
316 let location = self.location();
317 let next = self.next()?;
318 match next {
319 JsonReadToken::NullLiteral => Ok(None),
320 JsonReadToken::StringLiteral(s) => Ok(Some(s)),
321 other => Err(JsonParseError::Parse(other.kind(), location)),
322 }
323 }
324
325 pub fn expect_opt_string_or_end_array(&mut self) -> JsonParseResult<Option<Option<&str>>, R::Error> {
328 let location = self.location();
329 let next = self.next()?;
330 match next {
331 JsonReadToken::NullLiteral => Ok(Some(None)),
332 JsonReadToken::StringLiteral(s) => Ok(Some(Some(s))),
333 JsonReadToken::EndArray => Ok(None),
334 other => Err(JsonParseError::Parse(other.kind(), location)),
335 }
336 }
337
338 pub fn expect_bool(&mut self) -> JsonParseResult<bool, R::Error> {
341 let location = self.location();
342 let next = self.next()?;
343 match next {
344 JsonReadToken::BooleanLiteral(b) => Ok(b),
345 other => Err(JsonParseError::Parse(other.kind(), location)),
346 }
347 }
348
349 pub fn expect_bool_or_end_array(&mut self) -> JsonParseResult<Option<bool>, R::Error> {
352 let location = self.location();
353 let next = self.next()?;
354 match next {
355 JsonReadToken::BooleanLiteral(b) => Ok(Some(b)),
356 JsonReadToken::EndArray => Ok(None),
357 other => Err(JsonParseError::Parse(other.kind(), location)),
358 }
359 }
360
361 pub fn expect_opt_bool(&mut self) -> JsonParseResult<Option<bool>, R::Error> {
364 let location = self.location();
365 let next = self.next()?;
366 match next {
367 JsonReadToken::NullLiteral => Ok(None),
368 JsonReadToken::BooleanLiteral(b) => Ok(Some(b)),
369 other => Err(JsonParseError::Parse(other.kind(), location)),
370 }
371 }
372
373 pub fn expect_opt_bool_or_end_array(&mut self) -> JsonParseResult<Option<Option<bool>>, R::Error> {
376 let location = self.location();
377 let next = self.next()?;
378 match next {
379 JsonReadToken::NullLiteral => Ok(Some(None)),
380 JsonReadToken::BooleanLiteral(b) => Ok(Some(Some(b))),
381 JsonReadToken::EndArray => Ok(None),
382 other => Err(JsonParseError::Parse(other.kind(), location)),
383 }
384 }
385
386 pub fn expect_start_object(&mut self) -> JsonParseResult<(), R::Error> {
388 self.expect_single_token(JsonReadToken::StartObject)
389 }
390
391 pub fn expect_start_object_or_end_array(&mut self) -> JsonParseResult<Option<()>, R::Error> {
394 let location = self.location();
395 let next = self.next()?;
396 match next {
397 JsonReadToken::StartObject => Ok(Some(())),
398 JsonReadToken::EndArray => Ok(None),
399 other => Err(JsonParseError::Parse(other.kind(), location)),
400 }
401 }
402
403 pub fn expect_opt_start_object(&mut self) -> JsonParseResult<Option<()>, R::Error> {
406 let location = self.location();
407 let next = self.next()?;
408 match next {
409 JsonReadToken::NullLiteral => Ok(None),
410 JsonReadToken::StartObject => Ok(Some(())),
411 other => Err(JsonParseError::Parse(other.kind(), location)),
412 }
413 }
414
415 pub fn expect_opt_start_object_or_end_array(&mut self) -> JsonParseResult<Option<Option<()>>, R::Error> {
418 let location = self.location();
419 let next = self.next()?;
420 match next {
421 JsonReadToken::NullLiteral => Ok(Some(None)),
422 JsonReadToken::StartObject => Ok(Some(Some(()))),
423 JsonReadToken::EndArray => Ok(None),
424 other => Err(JsonParseError::Parse(other.kind(), location)),
425 }
426 }
427
428 pub fn expect_end_object(&mut self) -> JsonParseResult<(), R::Error> {
430 self.expect_single_token(JsonReadToken::EndObject)
431 }
432
433 pub fn expect_start_array(&mut self) -> JsonParseResult<(), R::Error> {
435 self.expect_single_token(JsonReadToken::StartArray)
436 }
437
438 pub fn expect_start_array_or_end_array(&mut self) -> JsonParseResult<Option<()>, R::Error> {
441 let location = self.location();
442 let next = self.next()?;
443 match next {
444 JsonReadToken::StartArray => Ok(Some(())),
445 JsonReadToken::EndArray => Ok(None),
446 other => Err(JsonParseError::Parse(other.kind(), location)),
447 }
448 }
449
450 pub fn expect_opt_start_array(&mut self) -> JsonParseResult<Option<()>, R::Error> {
453 let location = self.location();
454 let next = self.next()?;
455 match next {
456 JsonReadToken::NullLiteral => Ok(None),
457 JsonReadToken::StartArray => Ok(Some(())),
458 other => Err(JsonParseError::Parse(other.kind(), location)),
459 }
460 }
461
462 pub fn expect_opt_start_array_or_end_array(&mut self) -> JsonParseResult<Option<Option<()>>, R::Error> {
465 let location = self.location();
466 let next = self.next()?;
467 match next {
468 JsonReadToken::NullLiteral => Ok(Some(None)),
469 JsonReadToken::StartArray => Ok(Some(Some(()))),
470 JsonReadToken::EndArray => Ok(None),
471 other => Err(JsonParseError::Parse(other.kind(), location)),
472 }
473 }
474
475 pub fn expect_end_array(&mut self) -> JsonParseResult<(), R::Error> {
477 self.expect_single_token(JsonReadToken::EndArray)
478 }
479
480 fn expect_single_token(&mut self, expected: JsonReadToken) -> JsonParseResult<(), R::Error> {
481 let next = self.next()?;
482 if next != expected {
483 let kind = next.kind();
484 self.parse_err(kind)?;
485 }
486 Ok(())
487 }
488
489 pub fn expect_end_of_stream(&mut self) -> JsonParseResult<(), R::Error> {
492 self.expect_single_token(JsonReadToken::EndOfStream)
493 }
494
495 pub fn skip_to_end_of_current_scope(&mut self) -> JsonParseResult<(), R::Error> {
501 let mut nesting_level = 1;
502 loop {
503 match self.next()? {
504 JsonReadToken::StartObject | JsonReadToken::StartArray => {
505 nesting_level += 1;
506 }
507 JsonReadToken::EndObject | JsonReadToken::EndArray=> {
508 nesting_level -= 1;
509 if nesting_level == 0 {
510 break;
511 }
512 }
513 JsonReadToken::EndOfStream => {
514 return Err(JsonParseError::Parse(JsonReadToken::EndOfStream.kind(), self.location()));
515 }
516 _ => {
517 continue;
518 }
519 }
520 }
521 Ok(())
522 }
523
524 pub fn skip_value(&mut self) -> JsonParseResult<(), R::Error> {
532 match self.next()? {
533 JsonReadToken::Key(_) |
534 JsonReadToken::EndObject |
535 JsonReadToken::EndArray |
536 JsonReadToken::EndOfStream => {
537 Err(JsonParseError::Parse(JsonReadToken::EndOfStream.kind(), self.location()))
538 }
539 JsonReadToken::StartObject |
540 JsonReadToken::StartArray => {
541 self.skip_to_end_of_current_scope()
542 }
543 JsonReadToken::StringLiteral(_) |
544 JsonReadToken::NumberLiteral(_) |
545 JsonReadToken::BooleanLiteral(_) |
546 JsonReadToken::NullLiteral => {
547 Ok(())
548 }
549 }
550 }
551
552 fn consume_whitespace(&mut self) -> JsonParseResult<(), R::Error> {
553 while let Some(next) = self.read_next_byte()? {
554 match next {
555 b' ' | b'\t' | b'\n' | b'\r' => {
556 }
557 next => {
558 self.inner.parked_next = Some(next);
559 break;
560 }
561 }
562 }
563 Ok(())
564 }
565
566 fn read_next_byte(&mut self) -> JsonParseResult<Option<u8>, R::Error> {
567 if let Some(parked) = self.inner.parked_next.take() {
569 return Ok(Some(parked));
570 }
571
572 if let Some(byte) =self.reader.read()? {
573 self.inner.cur_location.after_byte(byte);
574 Ok(Some(byte))
575 }
576 else {
577 Ok(None)
578 }
579 }
580
581 fn consume_null_literal(&mut self) -> JsonParseResult<JsonReadToken<'_>, R::Error> {
582 if self.read_next_byte()? != Some(b'u') {
583 return self.parse_err("incomplete null literal");
584 }
585 if self.read_next_byte()? != Some(b'l') {
586 return self.parse_err("incomplete null literal");
587 }
588 if self.read_next_byte()? != Some(b'l') {
589 return self.parse_err("incomplete null literal");
590 }
591 Ok(JsonReadToken::NullLiteral)
592 }
593
594 fn consume_true_literal(&mut self) -> JsonParseResult<JsonReadToken<'_>, R::Error> {
595 if self.read_next_byte()? != Some(b'r') {
596 return self.parse_err("incomplete true literal");
597 }
598 if self.read_next_byte()? != Some(b'u') {
599 return self.parse_err("incomplete true literal");
600 }
601 if self.read_next_byte()? != Some(b'e') {
602 return self.parse_err("incomplete true literal");
603 }
604 Ok(JsonReadToken::BooleanLiteral(true))
605 }
606
607 fn consume_false_literal(&mut self) -> JsonParseResult<JsonReadToken<'_>, R::Error> {
608 if self.read_next_byte()? != Some(b'a') {
609 return self.parse_err("incomplete false literal");
610 }
611 if self.read_next_byte()? != Some(b'l') {
612 return self.parse_err("incomplete false literal");
613 }
614 if self.read_next_byte()? != Some(b's') {
615 return self.parse_err("incomplete false literal");
616 }
617 if self.read_next_byte()? != Some(b'e') {
618 return self.parse_err("incomplete false literal");
619 }
620 Ok(JsonReadToken::BooleanLiteral(false))
621 }
622
623 fn parse_after_quote(&mut self) -> JsonParseResult<JsonReadToken<'_>, R::Error> {
624 self.inner.ind_end_buf = 0;
625
626 loop {
627 if let Some(next) = self.read_next_byte()? {
628 match next {
629 b'"' => break,
630 b'\\' => {
631 match self.read_next_byte()? {
632 Some(b'"') => self.inner.append_to_buf(b'"')?,
633 Some(b'\\') => self.inner.append_to_buf(b'\\')?,
634 Some(b'/') => self.inner.append_to_buf(b'/')?,
635 Some(b'b') => self.inner.append_to_buf(0x08)?,
636 Some(b'f') => self.inner.append_to_buf(0x0c)?,
637 Some(b'n') => self.inner.append_to_buf(b'\n')?,
638 Some(b'r') => self.inner.append_to_buf(b'\r')?,
639 Some(b't') => self.inner.append_to_buf(b'\t')?,
640 Some(b'u') => {
641 let cp = self.parse_unicode_codepoint()?;
642 self.inner.append_code_point(cp)?;
643 },
644 _ => return self.parse_err("invalid escape in string literal"),
645 }
646 },
647 ch => {
648 self.inner.append_to_buf(ch)?;
649 }
650 }
651 }
652 else {
653 return self.parse_err("unterminated string literal");
654 }
655 }
656
657 self.consume_whitespace()?;
661 match self.read_next_byte()? {
662 Some(b':') => {
663 match self.inner.state {
664 ReaderState::Initial |
665 ReaderState::BeforeEntry => {
666 self.inner.state = ReaderState::AfterKey;
667 }
668 ReaderState::AfterKey => {
669 return self.parse_err("two keys without value");
670 }
671 ReaderState::AfterValue => {
672 return self.parse_err("missing comma");
673 }
674 }
675 Ok(JsonReadToken::Key(self.inner.buf_as_str()?))
676 },
677 other => {
678 self.inner.state_change_for_value()?;
679 self.inner.parked_next = other;
680 Ok(JsonReadToken::StringLiteral(self.inner.buf_as_str()?))
681 }
682 }
683 }
684
685 fn parse_unicode_codepoint(&mut self) -> JsonParseResult<u16, R::Error> {
686 let mut cp: u16 = 0;
688 for _ in 0..4 {
689 if let Some(b) = self.read_next_byte()? {
690 cp = cp << 4;
691 match b {
692 b'0'..=b'9' => cp += (b - b'0') as u16,
693 b'a'..=b'f' => cp += (b - b'a' + 10) as u16,
694 b'A'..=b'Z' => cp += (b - b'A' + 10) as u16,
695 _ => {
696 return self.parse_err("not a four-digit hex number after \\u");
697 }
698 }
699 }
700 else {
701 return self.parse_err("incomplete UTF codepoint in string literal");
702 }
703 }
704 Ok(cp)
705 }
706
707 fn parse_number_literal(&mut self, b: u8) -> JsonParseResult<JsonReadToken<'_>, R::Error> {
708 self.inner.buf.as_mut()[0] = b;
709 self.inner.ind_end_buf = 1;
710
711 while let Some(next) = self.read_next_byte()? {
712 match next {
713 b'0'..=b'9' |
714 b'+' | b'-' | b'e' | b'E' |
715 b'.' => {
716 self.inner.append_to_buf(next)?;
717 }
718 other => {
719 self.inner.parked_next = Some(other);
720 break;
721 }
722 }
723 }
724 Ok(JsonReadToken::NumberLiteral(JsonNumber(self.inner.buf_as_str().unwrap())))
725 }
726
727 pub fn parse_err<T>(&self, msg: &'static str) -> JsonParseResult<T, R::Error> {
729 self.inner.parse_err(msg)
730 }
731
732 #[inline]
734 pub fn location(&self) -> Location {
735 self.inner.cur_location
736 }
737}
738
739#[cfg(test)]
740mod tests {
741 use std::io;
742 use super::*;
743 use rstest::*;
744 use std::io::{Cursor, Read};
745
746 fn assert_is_similar_error(actual: &JsonParseError<std::io::Error>, expected: &JsonParseError<std::io::Error>) {
747 match actual {
748 JsonParseError::Io(self_e) => {
749 if let JsonParseError::Io(other_e) = expected {
750 assert_eq!(self_e.kind(), other_e.kind());
751 return;
752 }
753 }
754 JsonParseError::Utf8(_) => {
755 if let JsonParseError::Utf8(_) = expected {
756 return;
757 }
758 }
759 JsonParseError::Parse(_, _) => {
760 if let JsonParseError::Parse(_, _) = expected {
761 return;
762 }
763 }
764 JsonParseError::BufferOverflow(_) => {
765 if let JsonParseError::BufferOverflow(_) = expected {
766 return;
767 }
768 }
769 }
770
771 panic!("{:?} != {:?}", actual, expected);
772 }
773
774 #[rstest]
775 #[case::empty("", vec![], None)]
776 #[case::empty_repeated_end_of_stream("", vec![JsonReadToken::EndOfStream, JsonReadToken::EndOfStream, JsonReadToken::EndOfStream, ], None)]
777
778 #[case::null_literal("null", vec![JsonReadToken::NullLiteral], None)]
779 #[case::true_literal("true", vec![JsonReadToken::BooleanLiteral(true)], None)]
780 #[case::false_literal("false", vec![JsonReadToken::BooleanLiteral(false)], None)]
781 #[case::start_object("{", vec![JsonReadToken::StartObject], None)]
782 #[case::end_object("{}", vec![JsonReadToken::StartObject, JsonReadToken::EndObject], None)]
783 #[case::start_array("[", vec![JsonReadToken::StartArray], None)]
784 #[case::end_array("[]", vec![JsonReadToken::StartArray, JsonReadToken::EndArray], None)]
785
786 #[case::key("\"xyz\":", vec![JsonReadToken::Key("xyz")], None)]
787 #[case::key_with_escapes("\"x\\ry\\nz\":", vec![JsonReadToken::Key("x\ry\nz")], None)]
788 #[case::key_ws("\"xyz\" \n:", vec![JsonReadToken::Key("xyz")], None)]
789 #[case::key_value("\"xyz\" \n:\r\tfalse", vec![JsonReadToken::Key("xyz"), JsonReadToken::BooleanLiteral(false)], None)]
790
791 #[case::string_literal(r#""abc""#, vec![JsonReadToken::StringLiteral("abc")], None)]
792 #[case::string_literal_empty(r#""""#, vec![JsonReadToken::StringLiteral("")], None)]
793 #[case::string_literal_quot(r#""\"""#, vec![JsonReadToken::StringLiteral("\"")], None)]
794 #[case::string_literal_backslash(r#""\\""#, vec![JsonReadToken::StringLiteral("\\")], None)]
795 #[case::string_literal_slash(r#""\/""#, vec![JsonReadToken::StringLiteral("/")], None)]
796 #[case::string_literal_backslash(r#""\b""#, vec![JsonReadToken::StringLiteral("\x08")], None)]
797 #[case::string_literal_formfeed(r#""\f""#, vec![JsonReadToken::StringLiteral("\x0c")], None)]
798 #[case::string_literal_linefeed(r#""\n""#, vec![JsonReadToken::StringLiteral("\n")], None)]
799 #[case::string_literal_carriage_return(r#""\r""#, vec![JsonReadToken::StringLiteral("\r")], None)]
800 #[case::string_literal_tab(r#""\t""#, vec![JsonReadToken::StringLiteral("\t")], None)]
801 #[case::string_literal_unicode_y(r#""\u0079""#, vec![JsonReadToken::StringLiteral("y")], None)]
802 #[case::string_literal_unicode_umlaut_two_bytes(r#""\u00e4""#, vec![JsonReadToken::StringLiteral("ä")], None)]
803 #[case::string_literal_unicode_omega_two_bytes(r#""\u03a9""#, vec![JsonReadToken::StringLiteral("Ω")], None)]
804 #[case::string_literal_unicode_euro_three_bytes(r#""\u20ac""#, vec![JsonReadToken::StringLiteral("€")], None)]
805 #[case::string_literal_combined(r#""a\n b\t \u00e4öü \u03a9 12.2\u20ac""#, vec![JsonReadToken::StringLiteral("a\n b\t äöü Ω 12.2€")], None)]
806
807 #[case::number_literal("123", vec![JsonReadToken::NumberLiteral(JsonNumber("123"))], None)]
808 #[case::number_literal_negative("-456", vec![JsonReadToken::NumberLiteral(JsonNumber("-456"))], None)]
809 #[case::number_literal_zero("0", vec![JsonReadToken::NumberLiteral(JsonNumber("0"))], None)]
810 #[case::number_literal_fraction("0.92", vec![JsonReadToken::NumberLiteral(JsonNumber("0.92"))], None)]
811 #[case::number_literal_fraction_small("0.0000000000000092", vec![JsonReadToken::NumberLiteral(JsonNumber("0.0000000000000092"))], None)]
812 #[case::number_literal_fraction_neg("-0.0000000000000092", vec![JsonReadToken::NumberLiteral(JsonNumber("-0.0000000000000092"))], None)]
813 #[case::number_literal_exp_lower("0.92e4", vec![JsonReadToken::NumberLiteral(JsonNumber("0.92e4"))], None)]
814 #[case::number_literal_exp_upper("0.92E6", vec![JsonReadToken::NumberLiteral(JsonNumber("0.92E6"))], None)]
815 #[case::number_literal_pos_exp_lower("0.92e+4", vec![JsonReadToken::NumberLiteral(JsonNumber("0.92e+4"))], None)]
816 #[case::number_literal_pos_exp_upper("0.92E+6", vec![JsonReadToken::NumberLiteral(JsonNumber("0.92E+6"))], None)]
817 #[case::number_literal_neg_exp_lower("0.92e-4", vec![JsonReadToken::NumberLiteral(JsonNumber("0.92e-4"))], None)]
818 #[case::number_literal_neg_exp_upper("0.92E-6", vec![JsonReadToken::NumberLiteral(JsonNumber("0.92E-6"))], None)]
819
820 #[case::number_literal_no_leading_zero(".1", vec![], Some(JsonParseError::Parse("invalid JSON literal", Location::start())))]
821 #[case::no_matching_literal("x", vec![], Some(JsonParseError::Parse("invalid JSON literal", Location::start())))]
822 #[case::invalid_number_continuation("1x", vec![JsonReadToken::NumberLiteral(JsonNumber("1"))], Some(JsonParseError::Parse("missing comma", Location::start())))]
823 #[case::invalid_number_continuation_quote("x\"", vec![], Some(JsonParseError::Parse("invalid JSON literal", Location::start())))]
824
825 #[case::string_literal_unterminated_short(r#""abc "#, vec![], Some(JsonParseError::Parse("unterminated string literal", Location::start())))]
826 #[case::string_literal_unterminated_long(r#""abc "#, vec![], Some(JsonParseError::BufferOverflow(Location::start())))]
827 #[case::string_literal_invalid_escape(r#""\q""#, vec![], Some(JsonParseError::Parse("invalid escape in string literal", Location::start())))]
828 #[case::string_literal_unicode_string_ends(r#""\u004""#, vec![], Some(JsonParseError::Parse("not a four-digit hex number after \\u", Location::start())))]
829 #[case::string_literal_unicode_invalid_character_1(r#""\ux041""#, vec![], Some(JsonParseError::Parse("not a four-digit hex number after \\u", Location::start())))]
830 #[case::string_literal_unicode_invalid_character_2(r#""\u0x41""#, vec![], Some(JsonParseError::Parse("not a four-digit hex number after \\u", Location::start())))]
831 #[case::string_literal_unicode_invalid_character_3(r#""\u00x1""#, vec![], Some(JsonParseError::Parse("not a four-digit hex number after \\u", Location::start())))]
832 #[case::string_literal_unicode_invalid_character_4(r#""\u004x""#, vec![], Some(JsonParseError::Parse("not a four-digit hex number after \\u", Location::start())))]
833 #[case::string_literal_unicode_uppercase_u(r#""\U0041""#, vec![], Some(JsonParseError::Parse("invalid escape in string literal", Location::start())))]
834 #[case::string_literal_unicode_uppercase(r#""\uABCD""#, vec![JsonReadToken::StringLiteral("\u{abcd}")], None)]
835 #[case::string_literal_unicode_mixed_case_1(r#""\uaBcD""#, vec![JsonReadToken::StringLiteral("\u{abcd}")], None)]
836 #[case::string_literal_unicode_mixed_case_2(r#""\uAbCd""#, vec![JsonReadToken::StringLiteral("\u{abcd}")], None)]
837
838 #[case::null_wrong_continuation_1("nul", vec![], Some(JsonParseError::Parse("incomplete null literal", Location::start())))]
839 #[case::null_wrong_continuation_2("nxll", vec![], Some(JsonParseError::Parse("incomplete null literal", Location::start())))]
840 #[case::null_wrong_continuation_3("nUll", vec![], Some(JsonParseError::Parse("incomplete null literal", Location::start())))]
841 #[case::null_wrong_continuation_4("nuxl", vec![], Some(JsonParseError::Parse("incomplete null literal", Location::start())))]
842 #[case::null_wrong_continuation_5("nuLl", vec![], Some(JsonParseError::Parse("incomplete null literal", Location::start())))]
843 #[case::null_wrong_continuation_6("nulx", vec![], Some(JsonParseError::Parse("incomplete null literal", Location::start())))]
844 #[case::null_wrong_continuation_7("nulL", vec![], Some(JsonParseError::Parse("incomplete null literal", Location::start())))]
845 #[case::null_uppercase("Null", vec![], Some(JsonParseError::Parse("invalid JSON literal", Location::start())))]
846 #[case::null_uppercase_2("NULL", vec![], Some(JsonParseError::Parse("invalid JSON literal", Location::start())))]
847
848 #[case::true_wrong_continuation_1("tru", vec![], Some(JsonParseError::Parse("incomplete true literal", Location::start())))]
849 #[case::true_wrong_continuation_2("txue", vec![], Some(JsonParseError::Parse("incomplete true literal", Location::start())))]
850 #[case::true_wrong_continuation_3("tRue", vec![], Some(JsonParseError::Parse("incomplete true literal", Location::start())))]
851 #[case::true_wrong_continuation_4("trxe", vec![], Some(JsonParseError::Parse("incomplete true literal", Location::start())))]
852 #[case::true_wrong_continuation_5("trUe", vec![], Some(JsonParseError::Parse("incomplete true literal", Location::start())))]
853 #[case::true_wrong_continuation_6("trux", vec![], Some(JsonParseError::Parse("incomplete true literal", Location::start())))]
854 #[case::true_wrong_continuation_7("truE", vec![], Some(JsonParseError::Parse("incomplete true literal", Location::start())))]
855 #[case::true_uppercase_1("True", vec![], Some(JsonParseError::Parse("invalid JSON literal", Location::start())))]
856 #[case::true_uppercase_2("TRUE", vec![], Some(JsonParseError::Parse("invalid JSON literal", Location::start())))]
857
858 #[case::false_wrong_continuation_1("fals", vec![], Some(JsonParseError::Parse("incomplete false literal", Location::start())))]
859 #[case::false_wrong_continuation_2("fxlse", vec![], Some(JsonParseError::Parse("incomplete false literal", Location::start())))]
860 #[case::false_wrong_continuation_3("fAlse", vec![], Some(JsonParseError::Parse("incomplete false literal", Location::start())))]
861 #[case::false_wrong_continuation_4("faxse", vec![], Some(JsonParseError::Parse("incomplete false literal", Location::start())))]
862 #[case::false_wrong_continuation_5("faLse", vec![], Some(JsonParseError::Parse("incomplete false literal", Location::start())))]
863 #[case::false_wrong_continuation_6("falxe", vec![], Some(JsonParseError::Parse("incomplete false literal", Location::start())))]
864 #[case::false_wrong_continuation_7("falSe", vec![], Some(JsonParseError::Parse("incomplete false literal", Location::start())))]
865 #[case::false_wrong_continuation_8("falsx", vec![], Some(JsonParseError::Parse("incomplete false literal", Location::start())))]
866 #[case::false_wrong_continuation_9("falsE", vec![], Some(JsonParseError::Parse("incomplete false literal", Location::start())))]
867 #[case::false_uppercase_1("False", vec![], Some(JsonParseError::Parse("invalid JSON literal", Location::start())))]
868 #[case::false_uppercase_2("FALSE", vec![], Some(JsonParseError::Parse("invalid JSON literal", Location::start())))]
869
870 #[case::object_end_just_comma(r#"{, }"#, vec![JsonReadToken::StartObject], Some(JsonParseError::Parse("unexpected comma", Location::start())))]
871 #[case::object_end_trailing_comma(r#"{"a": null, }"#, vec![JsonReadToken::StartObject, JsonReadToken::Key("a"), JsonReadToken::NullLiteral], Some(JsonParseError::Parse("trailing comma", Location::start())))]
872 #[case::object_end_after_key(r#"{"a": }"#, vec![JsonReadToken::StartObject, JsonReadToken::Key("a")], Some(JsonParseError::Parse("key without a value", Location::start())))]
873 #[case::array_end_just_comma(r#"[, ]"#, vec![JsonReadToken::StartArray], Some(JsonParseError::Parse("unexpected comma", Location::start())))]
874 #[case::array_end_trailing_comma(r#"[null, ]"#, vec![JsonReadToken::StartArray, JsonReadToken::NullLiteral], Some(JsonParseError::Parse("trailing comma", Location::start())))]
875 #[case::array_end_after_key(r#"["a": ]"#, vec![JsonReadToken::StartArray, JsonReadToken::Key("a")], Some(JsonParseError::Parse("key without a value", Location::start())))]
876
877 #[case::missing_comma_null(r#"[null null]"#, vec![JsonReadToken::StartArray, JsonReadToken::NullLiteral], Some(JsonParseError::Parse("missing comma", Location::start())))]
878 #[case::missing_comma_true(r#"[null true]"#, vec![JsonReadToken::StartArray, JsonReadToken::NullLiteral], Some(JsonParseError::Parse("missing comma", Location::start())))]
879 #[case::missing_comma_false(r#"[null false]"#, vec![JsonReadToken::StartArray, JsonReadToken::NullLiteral], Some(JsonParseError::Parse("missing comma", Location::start())))]
880 #[case::missing_comma_number(r#"[null 123]"#, vec![JsonReadToken::StartArray, JsonReadToken::NullLiteral], Some(JsonParseError::Parse("missing comma", Location::start())))]
881 #[case::missing_comma_string(r#"[null "abc"]"#, vec![JsonReadToken::StartArray, JsonReadToken::NullLiteral], Some(JsonParseError::Parse("missing comma", Location::start())))]
882 #[case::missing_comma_object(r#"[null {}]"#, vec![JsonReadToken::StartArray, JsonReadToken::NullLiteral], Some(JsonParseError::Parse("missing comma", Location::start())))]
883 #[case::missing_comma_array(r#"[null []]"#, vec![JsonReadToken::StartArray, JsonReadToken::NullLiteral], Some(JsonParseError::Parse("missing comma", Location::start())))]
884 #[case::missing_comma_key(r#"{"a": null "b": 1}"#, vec![JsonReadToken::StartObject, JsonReadToken::Key("a"), JsonReadToken::NullLiteral], Some(JsonParseError::Parse("missing comma", Location::start())))]
885 #[case::key_after_key(r#"{"a": "b": 1}"#, vec![JsonReadToken::StartObject, JsonReadToken::Key("a")], Some(JsonParseError::Parse("two keys without value", Location::start())))]
886 #[case::comma_after_key(r#"{"a": , "b": 1}"#, vec![JsonReadToken::StartObject, JsonReadToken::Key("a")], Some(JsonParseError::Parse("unexpected comma", Location::start())))]
887
888 #[case::object_comma_after_comma(r#"{"a": null, ,}"#, vec![JsonReadToken::StartObject, JsonReadToken::Key("a"), JsonReadToken::NullLiteral], Some(JsonParseError::Parse("unexpected comma", Location::start())))]
889 #[case::array_comma_after_comma(r#"[ null, ,]"#, vec![JsonReadToken::StartArray, JsonReadToken::NullLiteral], Some(JsonParseError::Parse("unexpected comma", Location::start())))]
890
891 #[case::object(r#"{ "a": 1, "b": true, "c": "xyz" }"#, vec![
892 JsonReadToken::StartObject,
893 JsonReadToken::Key("a"),
894 JsonReadToken::NumberLiteral(JsonNumber("1")),
895 JsonReadToken::Key("b"),
896 JsonReadToken::BooleanLiteral(true),
897 JsonReadToken::Key("c"),
898 JsonReadToken::StringLiteral("xyz"),
899 JsonReadToken::EndObject,
900 ], None)]
901 #[case::array(r#"[ 6, "xy", true, null ]"#, vec![
902 JsonReadToken::StartArray,
903 JsonReadToken::NumberLiteral(JsonNumber("6")),
904 JsonReadToken::StringLiteral("xy"),
905 JsonReadToken::BooleanLiteral(true),
906 JsonReadToken::NullLiteral,
907 JsonReadToken::EndArray,
908 ], None)]
909 #[case::complex(r#"{"abc":"yo","xyz":"yo","aaaa":["111","11",{},[],null,true,false,-23987,23987,23.235,null,null,23.235e-1,null,null],"ooo":{"lll":"whatever","ar":[]}}"#, vec![
910 JsonReadToken::StartObject,
911 JsonReadToken::Key("abc"),
912 JsonReadToken::StringLiteral("yo"),
913 JsonReadToken::Key("xyz"),
914 JsonReadToken::StringLiteral("yo"),
915 JsonReadToken::Key("aaaa"),
916 JsonReadToken::StartArray,
917 JsonReadToken::StringLiteral("111"),
918 JsonReadToken::StringLiteral("11"),
919 JsonReadToken::StartObject,
920 JsonReadToken::EndObject,
921 JsonReadToken::StartArray,
922 JsonReadToken::EndArray,
923 JsonReadToken::NullLiteral,
924 JsonReadToken::BooleanLiteral(true),
925 JsonReadToken::BooleanLiteral(false),
926 JsonReadToken::NumberLiteral(JsonNumber("-23987")),
927 JsonReadToken::NumberLiteral(JsonNumber("23987")),
928 JsonReadToken::NumberLiteral(JsonNumber("23.235")),
929 JsonReadToken::NullLiteral,
930 JsonReadToken::NullLiteral,
931 JsonReadToken::NumberLiteral(JsonNumber("23.235e-1")),
932 JsonReadToken::NullLiteral,
933 JsonReadToken::NullLiteral,
934 JsonReadToken::EndArray,
935 JsonReadToken::Key("ooo"),
936 JsonReadToken::StartObject,
937 JsonReadToken::Key("lll"),
938 JsonReadToken::StringLiteral("whatever"),
939 JsonReadToken::Key("ar"),
940 JsonReadToken::StartArray,
941 JsonReadToken::EndArray,
942 JsonReadToken::EndObject,
943 JsonReadToken::EndObject,
944 ], None)]
945
946 fn test_parse(#[case] input: &str, #[case] expected: Vec<JsonReadToken>, #[case] expected_error: Option<JsonParseError<std::io::Error>>) {
947 let input_with_whitespace = format!(" \r\n\t{} \r\n\t", input);
948
949 {
950 let mut r = Cursor::new(input.as_bytes());
951 let mut json_reader = JsonReader::new(64, &mut r);
952 for evt in &expected {
953 let parsed_evt = json_reader.next();
954 assert_eq!(&parsed_evt.unwrap(), evt);
955 }
956 if let Some(expected_error) = &expected_error {
957 match json_reader.next() {
958 Ok(_) => panic!("expected error but was ok: {}", expected_error),
959 Err(e) => assert_is_similar_error(&e, expected_error),
960 }
961 }
962 else {
963 assert_eq!(json_reader.next().unwrap(), JsonReadToken::EndOfStream);
964 }
965 }
966 {
967 let mut r = Cursor::new(input_with_whitespace.as_bytes());
968 let mut json_reader = JsonReader::new(64, &mut r);
969 for evt in &expected {
970 assert_eq!(&json_reader.next().unwrap(), evt);
971 }
972 if let Some(expected_error) = &expected_error {
973 match json_reader.next() {
974 Ok(_) => panic!("expected error but was ok: {}", expected_error),
975 Err(e) => assert_is_similar_error(&e, expected_error),
976 }
977 }
978 else {
979 assert_eq!(json_reader.next().unwrap(), JsonReadToken::EndOfStream);
980 }
981 }
982 }
983
984 #[test]
985 fn test_provided_buffer_fits() -> Result<(), JsonParseError<io::Error>> {
986 let mut r = Cursor::new(b"123".to_vec());
987 let mut reader = JsonReader::new(8, &mut r);
988 assert_eq!(reader.next()?, JsonReadToken::NumberLiteral(JsonNumber("123")));
989 assert_eq!(reader.next()?, JsonReadToken::EndOfStream);
990 Ok(())
991 }
992
993 #[test]
994 fn test_provided_buffer_overflow() -> Result<(), JsonParseError<io::Error>> {
995 let mut r = Cursor::new(b"\"123 123 x\"".to_vec());
996 let mut reader = JsonReader::new(8, &mut r);
997 match reader.next() {
998 Ok(_) => panic!("expected an error"),
999 Err(e) => assert_is_similar_error(&e, &JsonParseError::BufferOverflow(Location::start())),
1000 }
1001 Ok(())
1002 }
1003
1004 #[rstest]
1005 #[case::simple("1", Some(1), Some(1), 1.0, 1.0)]
1006 #[case::big("1345678345", Some(1345678345), Some(1345678345), 1345678345.0, 1345678345.0)]
1007 #[case::bigger("3345678345", Some(3345678345), None, 3345678345.0, 3345678345.0)]
1008 #[case::too_big("13456783459", None, None, 13456783459.0, 13456783459.0)]
1009 #[case::negative("-1", None, Some(-1), -1.0, -1.0)]
1010 #[case::fract("1.0", None, None, 1.0, 1.0)]
1011 #[case::exp("1e3", None, None, 1e3, 1e3)]
1012 #[case::neg_exp("1e-3", None, None, 1e-3, 1e-3)]
1013 #[case::pos_exp("1e+3", None, None, 1e3, 1e3)]
1014 #[case::fract_exp("1.23e3", None, None, 1230.0, 1230.0)]
1015 #[case::fract_neg_exp("1.23e-3", None, None, 1.23e-3, 1.23e-3)]
1016 #[case::fract_pos_exp("1.23e+3", None, None, 1.23e3, 1.23e3)]
1017 fn test_json_number_parse(#[case] s: &str, #[case] expected_u32: Option<u32>, #[case] expected_i32: Option<i32>, #[case] expected_f64: f64, #[case] expected_f32: f32) {
1018 let n = JsonNumber(s);
1019
1020 {
1021 let parsed = n.parse::<u32>();
1022 match expected_u32 {
1023 Some(e) => assert_eq!(e, parsed.unwrap()),
1024 None => assert!(parsed.is_err()),
1025 }
1026 }
1027 {
1028 let parsed = n.parse::<i32>();
1029 match expected_i32 {
1030 Some(e) => assert_eq!(e, parsed.unwrap()),
1031 None => assert!(parsed.is_err()),
1032 }
1033 }
1034 {
1035 let parsed = n.parse::<f64>();
1036 assert_eq!(expected_f64, parsed.unwrap());
1037 }
1038 {
1039 let parsed = n.parse::<f32>();
1040 assert_eq!(expected_f32, parsed.unwrap());
1041 }
1042 }
1043
1044
1045 #[rstest]
1046 #[case::simple(Location::start(), vec![b'a'], Location { offset: 1, line: 1, column: 2,})]
1047 #[case::cr(Location::start(), vec![b'\r'], Location { offset: 1, line: 1, column: 2,})]
1048 #[case::tab(Location::start(), vec![b'\t'], Location { offset: 1, line: 1, column: 2,})]
1049 #[case::nl(Location::start(), vec![b'\n'], Location { offset: 1, line: 2, column: 1,})]
1050 #[case::in_line(Location::start(), vec![b'\r', b'\n', b'\n', b'x', b'y'], Location { offset: 5, line: 3, column: 3,})]
1051 #[case::sequence(Location::start(), vec![b'a', b'b', b'\n', b'x', b'\n'], Location { offset: 5, line: 3, column: 1,})]
1052 fn test_location_after_byte(#[case] mut initial: Location, #[case] bytes: Vec<u8>, #[case] expected: Location) {
1053 for byte in bytes {
1054 initial.after_byte(byte);
1055 }
1056 assert_eq!(initial, expected);
1057 }
1058
1059
1060 #[rstest]
1061 #[case::key(r#""abc": null"#, Some(Some("abc")))]
1062 #[case::other_key(r#""xyz": null"#, Some(Some("xyz")))]
1063 #[case::end_object(r#"}"#, Some(None))]
1064 #[case::null(r#"null"#, None)]
1065 #[case::bool(r#"true"#, None)]
1066 #[case::number(r#"1"#, None)]
1067 #[case::string(r#""a""#, None)]
1068 #[case::start_object(r#"{"#, None)]
1069 #[case::start_array(r#"["#, None)]
1070 #[case::end_array(r#"]"#, None)]
1071 fn test_expect_key(#[case] json: &str, #[case] expected: Option<Option<&str>>) {
1072 let mut r = Cursor::new(json.as_bytes());
1073 let mut json_reader = JsonReader::new(64, &mut r);
1074 match json_reader.expect_key() {
1075 Ok(actual) => assert_eq!(actual, expected.unwrap()),
1076 Err(JsonParseError::Parse(_, _)) => assert!(expected.is_none()),
1077 Err(e) => panic!("unexpected error: {}", e)
1078 }
1079 }
1080
1081 #[rstest]
1082 #[case::simple("1", Ok(1))]
1083 #[case::other_number("500", Err(JsonParseError::Parse("invalid number", Location::start())))]
1084 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1085 #[case::string("\"abc\"", Err(JsonParseError::Parse("", Location::start())))]
1086 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1087 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1088 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1089 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1090 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1091 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1092 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1093 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1094 fn test_expect_number(#[case] json: &str, #[case] expected_num: JsonParseResult<u8, io::Error>) {
1095 let mut r = Cursor::new(json.as_bytes());
1096 let mut json_reader = JsonReader::new(64, &mut r);
1097 match json_reader.expect_number::<u8>() {
1098 Ok(n) => assert_eq!(n, expected_num.unwrap()),
1099 Err(act_e) => match expected_num {
1100 Ok(_) => panic!("unexpected error: {}", act_e),
1101 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1102 }
1103 }
1104 }
1105
1106 #[rstest]
1107 #[case::simple("1", Ok(Some(1)))]
1108 #[case::other_number("500", Err(JsonParseError::Parse("invalid number", Location::start())))]
1109 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1110 #[case::string("\"abc\"", Err(JsonParseError::Parse("", Location::start())))]
1111 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1112 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1113 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1114 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1115 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1116 #[case::end_array("]", Ok(None))]
1117 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1118 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1119 fn test_expect_number_or_end_array(#[case] json: &str, #[case] expected_num: JsonParseResult<Option<u8>, io::Error>) {
1120 let mut r = Cursor::new(json.as_bytes());
1121 let mut json_reader = JsonReader::new(64, &mut r);
1122 match json_reader.expect_number_or_end_array::<u8>() {
1123 Ok(n) => assert_eq!(n, expected_num.unwrap()),
1124 Err(act_e) => match expected_num {
1125 Ok(_) => panic!("unexpected error: {}", act_e),
1126 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1127 }
1128 }
1129 }
1130
1131 #[rstest]
1132 #[case::simple("1", Ok(Some(1)))]
1133 #[case::other_number("500", Err(JsonParseError::Parse("invalid number", Location::start())))]
1134 #[case::null("null", Ok(None))]
1135 #[case::string("\"abc\"", Err(JsonParseError::Parse("", Location::start())))]
1136 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1137 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1138 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1139 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1140 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1141 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1142 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1143 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1144 fn test_expect_opt_number(#[case] json: &str, #[case] expected_num: JsonParseResult<Option<u8>, io::Error>) {
1145 let mut r = Cursor::new(json.as_bytes());
1146 let mut json_reader = JsonReader::new(64, &mut r);
1147 match json_reader.expect_opt_number::<u8>() {
1148 Ok(n) => assert_eq!(n, expected_num.unwrap()),
1149 Err(act_e) => match expected_num {
1150 Ok(_) => panic!("unexpected error: {}", act_e),
1151 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1152 }
1153 }
1154 }
1155
1156 #[rstest]
1157 #[case::simple("1", Ok(Some(Some(1))))]
1158 #[case::other_number("500", Err(JsonParseError::Parse("invalid number", Location::start())))]
1159 #[case::null("null", Ok(Some(None)))]
1160 #[case::string("\"abc\"", Err(JsonParseError::Parse("", Location::start())))]
1161 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1162 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1163 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1164 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1165 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1166 #[case::end_array("]", Ok(None))]
1167 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1168 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1169 fn test_expect_opt_number_or_end_array(#[case] json: &str, #[case] expected_num: JsonParseResult<Option<Option<u8>>, io::Error>) {
1170 let mut r = Cursor::new(json.as_bytes());
1171 let mut json_reader = JsonReader::new(64, &mut r);
1172 match json_reader.expect_opt_number_or_end_array::<u8>() {
1173 Ok(n) => assert_eq!(n, expected_num.unwrap()),
1174 Err(act_e) => match expected_num {
1175 Ok(_) => panic!("unexpected error: {}", act_e),
1176 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1177 }
1178 }
1179 }
1180
1181 #[rstest]
1182 #[case::simple(" 123.45 ", Ok(JsonNumber("123.45")))]
1183 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1184 #[case::string("\"abc\"", Err(JsonParseError::Parse("", Location::start())))]
1185 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1186 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1187 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1188 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1189 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1190 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1191 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1192 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1193 fn test_expect_raw_number(#[case] json: &str, #[case] expected_num: JsonParseResult<JsonNumber, io::Error>) {
1194 let mut r = Cursor::new(json.as_bytes());
1195 let mut json_reader = JsonReader::new(64, &mut r);
1196 match json_reader.expect_raw_number() {
1197 Ok(n) => assert_eq!(n, expected_num.unwrap()),
1198 Err(act_e) => match expected_num {
1199 Ok(_) => panic!("unexpected error: {}", act_e),
1200 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1201 }
1202 }
1203 }
1204
1205 #[rstest]
1206 #[case::simple(" 123.45 ", Ok(Some(JsonNumber("123.45"))))]
1207 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1208 #[case::string("\"abc\"", Err(JsonParseError::Parse("", Location::start())))]
1209 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1210 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1211 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1212 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1213 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1214 #[case::end_array("]", Ok(None))]
1215 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1216 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1217 fn test_expect_raw_number_or_end_array(#[case] json: &str, #[case] expected_num: JsonParseResult<Option<JsonNumber>, io::Error>) {
1218 let mut r = Cursor::new(json.as_bytes());
1219 let mut json_reader = JsonReader::new(64, &mut r);
1220 match json_reader.expect_raw_number_or_end_array() {
1221 Ok(n) => assert_eq!(n, expected_num.unwrap()),
1222 Err(act_e) => match expected_num {
1223 Ok(_) => panic!("unexpected error: {}", act_e),
1224 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1225 }
1226 }
1227 }
1228
1229 #[rstest]
1230 #[case::number(" 5 ", Ok(Some(JsonNumber("5"))))]
1231 #[case::null(" null ", Ok(None))]
1232 #[case::boolean(" ] ", Err(JsonParseError::Parse("", Location::start())))]
1233 #[case::boolean(" true ", Err(JsonParseError::Parse("", Location::start())))]
1234 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1235 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1236 fn test_expect_opt_raw_number(#[case] json: &str, #[case] expected_num: JsonParseResult<Option<JsonNumber>, io::Error>) {
1237 let mut r = Cursor::new(json.as_bytes());
1238 let mut json_reader = JsonReader::new(64, &mut r);
1239 match json_reader.expect_opt_raw_number() {
1240 Ok(o) => assert_eq!(o, expected_num.unwrap()),
1241 Err(act_e) => match expected_num {
1242 Ok(_) => panic!("unexpected error: {}", act_e),
1243 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1244 }
1245 }
1246 }
1247
1248 #[rstest]
1249 #[case::number(" 5 ", Ok(Some(Some(JsonNumber("5")))))]
1250 #[case::null(" null ", Ok(Some(None)))]
1251 #[case::null(" ] ", Ok(None))]
1252 #[case::boolean(" true ", Err(JsonParseError::Parse("", Location::start())))]
1253 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1254 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1255 fn test_expect_opt_raw_number_or_end_array(#[case] json: &str, #[case] expected_num: JsonParseResult<Option<Option<JsonNumber>>, io::Error>) {
1256 let mut r = Cursor::new(json.as_bytes());
1257 let mut json_reader = JsonReader::new(64, &mut r);
1258 match json_reader.expect_opt_raw_number_or_end_array() {
1259 Ok(o) => assert_eq!(o, expected_num.unwrap()),
1260 Err(act_e) => match expected_num {
1261 Ok(_) => panic!("unexpected error: {}", act_e),
1262 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1263 }
1264 }
1265 }
1266
1267 #[rstest]
1268 #[case::simple("\"qrs\"", Ok("qrs"))]
1269 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1270 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1271 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1272 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1273 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1274 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1275 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1276 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1277 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1278 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1279 fn test_expect_string(#[case] json: &str, #[case] expected: JsonParseResult<&str, io::Error>) {
1280 let mut r = Cursor::new(json.as_bytes());
1281 let mut json_reader = JsonReader::new(64, &mut r);
1282 match json_reader.expect_string() {
1283 Ok(n) => assert_eq!(n, expected.unwrap()),
1284 Err(act_e) => match expected {
1285 Ok(_) => panic!("unexpected error: {}", act_e),
1286 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1287 }
1288 }
1289 }
1290
1291 #[rstest]
1292 #[case::simple("\"qrs\"", Ok(Some("qrs")))]
1293 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1294 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1295 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1296 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1297 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1298 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1299 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1300 #[case::end_array("]", Ok(None))]
1301 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1302 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1303 fn test_expect_string_or_end_array(#[case] json: &str, #[case] expected: JsonParseResult<Option<&str>, io::Error>) {
1304 let mut r = Cursor::new(json.as_bytes());
1305 let mut json_reader = JsonReader::new(64, &mut r);
1306 match json_reader.expect_string_or_end_array() {
1307 Ok(n) => assert_eq!(n, expected.unwrap()),
1308 Err(act_e) => match expected {
1309 Ok(_) => panic!("unexpected error: {}", act_e),
1310 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1311 }
1312 }
1313 }
1314
1315 #[rstest]
1316 #[case::simple("\"rst\"", Ok(Some("rst")))]
1317 #[case::null("null", Ok(None))]
1318 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1319 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1320 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1321 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1322 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1323 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1324 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1325 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1326 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1327 fn test_expect_opt_string(#[case] json: &str, #[case] expected: JsonParseResult<Option<&str>, io::Error>) {
1328 let mut r = Cursor::new(json.as_bytes());
1329 let mut json_reader = JsonReader::new(64, &mut r);
1330 match json_reader.expect_opt_string() {
1331 Ok(n) => assert_eq!(n, expected.unwrap()),
1332 Err(act_e) => match expected {
1333 Ok(_) => panic!("unexpected error: {}", act_e),
1334 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1335 }
1336 }
1337 }
1338
1339 #[rstest]
1340 #[case::simple("\"rst\"", Ok(Some(Some("rst"))))]
1341 #[case::null("null", Ok(Some(None)))]
1342 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1343 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1344 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1345 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1346 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1347 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1348 #[case::end_array("]", Ok(None))]
1349 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1350 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1351 fn test_expect_opt_string_or_end_array(#[case] json: &str, #[case] expected: JsonParseResult<Option<Option<&str>>, io::Error>) {
1352 let mut r = Cursor::new(json.as_bytes());
1353 let mut json_reader = JsonReader::new(64, &mut r);
1354 match json_reader.expect_opt_string_or_end_array() {
1355 Ok(n) => assert_eq!(n, expected.unwrap()),
1356 Err(act_e) => match expected {
1357 Ok(_) => panic!("unexpected error: {}", act_e),
1358 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1359 }
1360 }
1361 }
1362
1363 #[rstest]
1364 #[case::bool_true("true", Ok(true))]
1365 #[case::bool_false("false", Ok(false))]
1366 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1367 #[case::string("\"a\"", Err(JsonParseError::Parse("", Location::start())))]
1368 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1369 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1370 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1371 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1372 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1373 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1374 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1375 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1376 fn test_expect_bool(#[case] json: &str, #[case] expected: JsonParseResult<bool, io::Error>) {
1377 let mut r = Cursor::new(json.as_bytes());
1378 let mut json_reader = JsonReader::new(64, &mut r);
1379 match json_reader.expect_bool() {
1380 Ok(n) => assert_eq!(n, expected.unwrap()),
1381 Err(act_e) => match expected {
1382 Ok(_) => panic!("unexpected error: {}", act_e),
1383 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1384 }
1385 }
1386 }
1387
1388 #[rstest]
1389 #[case::bool_true("true", Ok(Some(true)))]
1390 #[case::bool_false("false", Ok(Some(false)))]
1391 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1392 #[case::string("\"a\"", Err(JsonParseError::Parse("", Location::start())))]
1393 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1394 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1395 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1396 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1397 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1398 #[case::end_array("]", Ok(None))]
1399 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1400 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1401 fn test_expect_bool_or_end_array(#[case] json: &str, #[case] expected: JsonParseResult<Option<bool>, io::Error>) {
1402 let mut r = Cursor::new(json.as_bytes());
1403 let mut json_reader = JsonReader::new(64, &mut r);
1404 match json_reader.expect_bool_or_end_array() {
1405 Ok(n) => assert_eq!(n, expected.unwrap()),
1406 Err(act_e) => match expected {
1407 Ok(_) => panic!("unexpected error: {}", act_e),
1408 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1409 }
1410 }
1411 }
1412
1413 #[rstest]
1414 #[case::bool_true("true", Ok(Some(true)))]
1415 #[case::bool_false("false", Ok(Some(false)))]
1416 #[case::null("null", Ok(None))]
1417 #[case::string("\"x\"", Err(JsonParseError::Parse("", Location::start())))]
1418 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1419 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1420 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1421 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1422 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1423 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1424 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1425 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1426 fn test_expect_opt_bool(#[case] json: &str, #[case] expected: JsonParseResult<Option<bool>, io::Error>) {
1427 let mut r = Cursor::new(json.as_bytes());
1428 let mut json_reader = JsonReader::new(64, &mut r);
1429 match json_reader.expect_opt_bool() {
1430 Ok(n) => assert_eq!(n, expected.unwrap()),
1431 Err(act_e) => match expected {
1432 Ok(_) => panic!("unexpected error: {}", act_e),
1433 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1434 }
1435 }
1436 }
1437
1438 #[rstest]
1439 #[case::bool_true("true", Ok(Some(Some(true))))]
1440 #[case::bool_false("false", Ok(Some(Some(false))))]
1441 #[case::null("null", Ok(Some(None)))]
1442 #[case::string("\"x\"", Err(JsonParseError::Parse("", Location::start())))]
1443 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1444 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1445 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1446 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1447 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1448 #[case::end_array("]", Ok(None))]
1449 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1450 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1451 fn test_expect_opt_bool_or_end_array(#[case] json: &str, #[case] expected: JsonParseResult<Option<Option<bool>>, io::Error>) {
1452 let mut r = Cursor::new(json.as_bytes());
1453 let mut json_reader = JsonReader::new(64, &mut r);
1454 match json_reader.expect_opt_bool_or_end_array() {
1455 Ok(n) => assert_eq!(n, expected.unwrap()),
1456 Err(act_e) => match expected {
1457 Ok(_) => panic!("unexpected error: {}", act_e),
1458 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1459 }
1460 }
1461 }
1462
1463 #[rstest]
1464 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1465 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1466 #[case::string("\"a\"", Err(JsonParseError::Parse("", Location::start())))]
1467 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1468 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1469 #[case::start_object("{", Ok(()))]
1470 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1471 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1472 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1473 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1474 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1475 fn test_expect_start_object(#[case] json: &str, #[case] expected: JsonParseResult<(), io::Error>) {
1476 let mut r = Cursor::new(json.as_bytes());
1477 let mut json_reader = JsonReader::new(64, &mut r);
1478 match json_reader.expect_start_object() {
1479 Ok(n) => assert_eq!(n, expected.unwrap()),
1480 Err(act_e) => match expected {
1481 Ok(_) => panic!("unexpected error: {}", act_e),
1482 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1483 }
1484 }
1485 }
1486
1487 #[rstest]
1488 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1489 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1490 #[case::string("\"a\"", Err(JsonParseError::Parse("", Location::start())))]
1491 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1492 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1493 #[case::start_object("{", Ok(Some(())))]
1494 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1495 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1496 #[case::end_array("]", Ok(None))]
1497 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1498 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1499 fn test_expect_start_object_or_end_array(#[case] json: &str, #[case] expected: JsonParseResult<Option<()>, io::Error>) {
1500 let mut r = Cursor::new(json.as_bytes());
1501 let mut json_reader = JsonReader::new(64, &mut r);
1502 match json_reader.expect_start_object_or_end_array() {
1503 Ok(n) => assert_eq!(n, expected.unwrap()),
1504 Err(act_e) => match expected {
1505 Ok(_) => panic!("unexpected error: {}", act_e),
1506 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1507 }
1508 }
1509 }
1510
1511 #[rstest]
1512 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1513 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1514 #[case::string("\"a\"", Err(JsonParseError::Parse("", Location::start())))]
1515 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1516 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1517 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1518 #[case::end_object("}", Ok(()))]
1519 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1520 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1521 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1522 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1523 fn test_expect_end_object(#[case] json: &str, #[case] expected: JsonParseResult<(), io::Error>) {
1524 let mut r = Cursor::new(json.as_bytes());
1525 let mut json_reader = JsonReader::new(64, &mut r);
1526 match json_reader.expect_end_object() {
1527 Ok(n) => assert_eq!(n, expected.unwrap()),
1528 Err(act_e) => match expected {
1529 Ok(_) => panic!("unexpected error: {}", act_e),
1530 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1531 }
1532 }
1533 }
1534
1535 #[rstest]
1536 #[case::bool("false", Err(JsonParseError::Parse("", Location::start())))]
1537 #[case::null("null", Ok(None))]
1538 #[case::string("\"x\"", Err(JsonParseError::Parse("", Location::start())))]
1539 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1540 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1541 #[case::start_object("{", Ok(Some(())))]
1542 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1543 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1544 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1545 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1546 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1547 fn test_expect_opt_start_object(#[case] json: &str, #[case] expected: JsonParseResult<Option<()>, io::Error>) {
1548 let mut r = Cursor::new(json.as_bytes());
1549 let mut json_reader = JsonReader::new(64, &mut r);
1550 match json_reader.expect_opt_start_object() {
1551 Ok(n) => assert_eq!(n, expected.unwrap()),
1552 Err(act_e) => match expected {
1553 Ok(_) => panic!("unexpected error: {}", act_e),
1554 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1555 }
1556 }
1557 }
1558
1559 #[rstest]
1560 #[case::bool("false", Err(JsonParseError::Parse("", Location::start())))]
1561 #[case::null("null", Ok(Some(None)))]
1562 #[case::string("\"x\"", Err(JsonParseError::Parse("", Location::start())))]
1563 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1564 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1565 #[case::start_object("{", Ok(Some(Some(()))))]
1566 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1567 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1568 #[case::end_array("]", Ok(None))]
1569 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1570 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1571 fn test_expect_opt_start_object_or_end_array(#[case] json: &str, #[case] expected: JsonParseResult<Option<Option<()>>, io::Error>) {
1572 let mut r = Cursor::new(json.as_bytes());
1573 let mut json_reader = JsonReader::new(64, &mut r);
1574 match json_reader.expect_opt_start_object_or_end_array() {
1575 Ok(n) => assert_eq!(n, expected.unwrap()),
1576 Err(act_e) => match expected {
1577 Ok(_) => panic!("unexpected error: {}", act_e),
1578 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1579 }
1580 }
1581 }
1582
1583 #[rstest]
1584 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1585 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1586 #[case::string("\"a\"", Err(JsonParseError::Parse("", Location::start())))]
1587 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1588 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1589 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1590 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1591 #[case::start_array("[", Ok(()))]
1592 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1593 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1594 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1595 fn test_expect_start_array(#[case] json: &str, #[case] expected: JsonParseResult<(), io::Error>) {
1596 let mut r = Cursor::new(json.as_bytes());
1597 let mut json_reader = JsonReader::new(64, &mut r);
1598 match json_reader.expect_start_array() {
1599 Ok(n) => assert_eq!(n, expected.unwrap()),
1600 Err(act_e) => match expected {
1601 Ok(_) => panic!("unexpected error: {}", act_e),
1602 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1603 }
1604 }
1605 }
1606
1607 #[rstest]
1608 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1609 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1610 #[case::string("\"a\"", Err(JsonParseError::Parse("", Location::start())))]
1611 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1612 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1613 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1614 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1615 #[case::start_array("[", Ok(Some(())))]
1616 #[case::end_array("]", Ok(None))]
1617 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1618 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1619 fn test_expect_start_array_or_end_array(#[case] json: &str, #[case] expected: JsonParseResult<Option<()>, io::Error>) {
1620 let mut r = Cursor::new(json.as_bytes());
1621 let mut json_reader = JsonReader::new(64, &mut r);
1622 match json_reader.expect_start_array_or_end_array() {
1623 Ok(n) => assert_eq!(n, expected.unwrap()),
1624 Err(act_e) => match expected {
1625 Ok(_) => panic!("unexpected error: {}", act_e),
1626 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1627 }
1628 }
1629 }
1630
1631 #[rstest]
1632 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1633 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1634 #[case::string("\"a\"", Err(JsonParseError::Parse("", Location::start())))]
1635 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1636 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1637 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1638 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1639 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1640 #[case::end_array("]", Ok(()))]
1641 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1642 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1643 fn test_expect_end_array(#[case] json: &str, #[case] expected: JsonParseResult<(), io::Error>) {
1644 let mut r = Cursor::new(json.as_bytes());
1645 let mut json_reader = JsonReader::new(64, &mut r);
1646 match json_reader.expect_end_array() {
1647 Ok(n) => assert_eq!(n, expected.unwrap()),
1648 Err(act_e) => match expected {
1649 Ok(_) => panic!("unexpected error: {}", act_e),
1650 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1651 }
1652 }
1653 }
1654
1655 #[rstest]
1656 #[case::bool("false", Err(JsonParseError::Parse("", Location::start())))]
1657 #[case::null("null", Ok(None))]
1658 #[case::string("\"x\"", Err(JsonParseError::Parse("", Location::start())))]
1659 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1660 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1661 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1662 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1663 #[case::start_array("[", Ok(Some(())))]
1664 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1665 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1666 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1667 fn test_expect_opt_start_array(#[case] json: &str, #[case] expected: JsonParseResult<Option<()>, io::Error>) {
1668 let mut r = Cursor::new(json.as_bytes());
1669 let mut json_reader = JsonReader::new(64, &mut r);
1670 match json_reader.expect_opt_start_array() {
1671 Ok(n) => assert_eq!(n, expected.unwrap()),
1672 Err(act_e) => match expected {
1673 Ok(_) => panic!("unexpected error: {}", act_e),
1674 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1675 }
1676 }
1677 }
1678
1679 #[rstest]
1680 #[case::bool("false", Err(JsonParseError::Parse("", Location::start())))]
1681 #[case::null("null", Ok(Some(None)))]
1682 #[case::string("\"x\"", Err(JsonParseError::Parse("", Location::start())))]
1683 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1684 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1685 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1686 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1687 #[case::start_array("[", Ok(Some(Some(()))))]
1688 #[case::end_array("]", Ok(None))]
1689 #[case::end_array("", Err(JsonParseError::Parse("", Location::start())))]
1690 #[case::end_array(" ", Err(JsonParseError::Parse("", Location::start())))]
1691 fn test_expect_opt_start_array_or_end_array(#[case] json: &str, #[case] expected: JsonParseResult<Option<Option<()>>, io::Error>) {
1692 let mut r = Cursor::new(json.as_bytes());
1693 let mut json_reader = JsonReader::new(64, &mut r);
1694 match json_reader.expect_opt_start_array_or_end_array() {
1695 Ok(n) => assert_eq!(n, expected.unwrap()),
1696 Err(act_e) => match expected {
1697 Ok(_) => panic!("unexpected error: {}", act_e),
1698 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1699 }
1700 }
1701 }
1702
1703 #[rstest]
1704 #[case::null("null", Err(JsonParseError::Parse("", Location::start())))]
1705 #[case::bool("true", Err(JsonParseError::Parse("", Location::start())))]
1706 #[case::string("\"a\"", Err(JsonParseError::Parse("", Location::start())))]
1707 #[case::number("12", Err(JsonParseError::Parse("", Location::start())))]
1708 #[case::key("\"abc\": ", Err(JsonParseError::Parse("", Location::start())))]
1709 #[case::start_object("{", Err(JsonParseError::Parse("", Location::start())))]
1710 #[case::end_object("}", Err(JsonParseError::Parse("", Location::start())))]
1711 #[case::start_array("[", Err(JsonParseError::Parse("", Location::start())))]
1712 #[case::end_array("]", Err(JsonParseError::Parse("", Location::start())))]
1713 #[case::end_array("", Ok(()))]
1714 #[case::end_array(" ", Ok(()))]
1715 fn test_expect_end_of_stream(#[case] json: &str, #[case] expected: JsonParseResult<(), io::Error>) {
1716 let mut r = Cursor::new(json.as_bytes());
1717 let mut json_reader = JsonReader::new(64, &mut r);
1718 match json_reader.expect_end_of_stream() {
1719 Ok(n) => assert_eq!(n, expected.unwrap()),
1720 Err(act_e) => match expected {
1721 Ok(_) => panic!("unexpected error: {}", act_e),
1722 Err(exp_e) => assert_is_similar_error(&act_e, &exp_e),
1723 }
1724 }
1725 }
1726
1727 #[test]
1728 fn test_with_lenient_comma() {
1729 let json = r#"
1730 { "a": 1}
1731 { "a": 2}
1732 "#;
1733
1734 {
1735 let mut r = Cursor::new(json.as_bytes());
1736 let result = try_read_json_lines(&mut JsonReader::new(64, &mut r));
1737 assert!(result.is_err());
1738 }
1739
1740 {
1741 let mut r = Cursor::new(json.as_bytes());
1742 let result = try_read_json_lines(&mut JsonReader::new_with_lenient_comma_handling(64, &mut r));
1743 assert_eq!(result.unwrap(), vec![1, 2]);
1744 }
1745 }
1746
1747 fn try_read_json_lines<R: Read>(json_reader: &mut JsonReader<Vec<u8>, R>) -> JsonParseResult<Vec<u32>, io::Error> {
1748 let mut result = Vec::new();
1749 while json_reader.next()? == JsonReadToken::StartObject {
1750 loop {
1751 match json_reader.expect_key()? {
1752 Some("a") => result.push( json_reader.expect_number()?),
1753 Some(_) => json_reader.skip_value()?,
1754 None => break,
1755 }
1756 }
1757 }
1758 Ok(result)
1759 }
1760
1761 #[rstest]
1762 #[case::end_object_empty("}, 77", false)]
1763 #[case::end_object_simple(r#" "a": 10, "b": null }, 77"#, false)]
1764 #[case::end_object_nested(r#" "a": 10, "x": { "q": 99, "r": [1, 2, 3] }, "b": null }, 77"#, false)]
1765 #[case::end_array_empty("], 77", false)]
1766 #[case::end_array_simple(r#"99, "abc", null, true], 77"#, false)]
1767 #[case::end_array_nested(r#"99, [1, [], true, {"abc": { "xyz": [1, 2, 3]}}], "abc", null, true], 77"#, false)]
1768 #[case::number("1, 77", true)]
1769 #[case::boolean("true, 77", true)]
1770 #[case::null("null, 77", true)]
1771 fn test_skip_to_end_of_current_scope(#[case] json: &str, #[case] should_fail: bool) -> JsonParseResult<(), io::Error> {
1772 let mut r = Cursor::new(json.as_bytes());
1773 let mut json_reader = JsonReader::new(64, &mut r);
1774 match json_reader.skip_to_end_of_current_scope() {
1775 Ok(_) => {
1776 assert!(!should_fail);
1777 assert_eq!(77, json_reader.expect_number::<u32>()?);
1778 }
1779 Err(_) => {
1780 assert!(should_fail);
1781 }
1782 }
1783 Ok(())
1784 }
1785
1786 #[rstest]
1787 #[case::number(r#"123, 77"#, false)]
1788 #[case::string(r#""abc", 77"#, false)]
1789 #[case::boolean(r#"true, 77"#, false)]
1790 #[case::null(r#"null, 77"#, false)]
1791 #[case::object_empty(r#"{}, 77"#, false)]
1792 #[case::object_simple(r#"{ "a": 10, "b": null }, 77"#, false)]
1793 #[case::object_nested(r#"{ "a": 10, "x": { "q": 99, "r": [1, 2, 3] }, "b": null }, 77"#, false)]
1794 #[case::array_empty("[], 77", false)]
1795 #[case::array_simple(r#"[99, "abc", null, true], 77"#, false)]
1796 #[case::array_nested(r#"[99, [1, [], true, {"abc": { "xyz": [1, 2, 3]}}], "abc", null, true], 77"#, false)]
1797 fn test_skip_value(#[case] json: &str, #[case] should_fail: bool) -> JsonParseResult<(), io::Error> {
1798 let mut r = Cursor::new(json.as_bytes());
1799 let mut json_reader = JsonReader::new(64, &mut r);
1800 match json_reader.skip_value() {
1801 Ok(_) => {
1802 assert!(!should_fail);
1803 assert_eq!(77, json_reader.expect_number::<u32>()?);
1804 }
1805 Err(_) => {
1806 assert!(should_fail);
1807 }
1808 }
1809 Ok(())
1810 }
1811}