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