1use crate::deserialize::error::{DeserializeError as Error, DeserializeErrorKind as ErrorKind};
7use aws_smithy_types::Number;
8use ErrorKind::*;
9
10pub mod error;
11pub mod token;
12
13pub use token::{EscapeError, EscapedStr, Offset, Token};
14
15pub fn json_token_iter(input: &[u8]) -> JsonTokenIterator<'_> {
29 JsonTokenIterator {
30 input,
31 index: 0,
32 state_stack: vec![State::Initial],
33 }
34}
35
36#[derive(Copy, Clone, Debug, Eq, PartialEq)]
38enum State {
39 Initial,
41 ArrayFirstValueOrEnd,
43 ArrayNextValueOrEnd,
45 ObjectFirstKeyOrEnd,
47 ObjectNextKeyOrEnd,
49 ObjectFieldValue,
51}
52
53pub struct JsonTokenIterator<'a> {
56 input: &'a [u8],
57 index: usize,
58 state_stack: Vec<State>,
59}
60
61impl<'a> JsonTokenIterator<'a> {
62 fn peek_byte(&self) -> Option<u8> {
64 if self.index >= self.input.len() {
65 None
66 } else {
67 Some(self.input[self.index])
68 }
69 }
70
71 fn peek_expect(&self) -> Result<u8, Error> {
74 self.peek_byte().ok_or_else(|| self.error(UnexpectedEos))
75 }
76
77 fn advance(&mut self) {
79 if self.index < self.input.len() {
80 self.index += 1;
81 }
82 }
83
84 fn next_byte(&mut self) -> Option<u8> {
86 let next = self.peek_byte();
87 self.advance();
88 next
89 }
90
91 fn next_expect(&mut self) -> Result<u8, Error> {
94 self.next_byte().ok_or_else(|| self.error(UnexpectedEos))
95 }
96
97 fn error_at(&self, offset: usize, kind: ErrorKind) -> Error {
99 Error::new(kind, Some(offset))
100 }
101
102 fn error(&self, kind: ErrorKind) -> Error {
104 self.error_at(self.index, kind)
105 }
106
107 fn discard_whitespace(&mut self) {
109 while let Some(byte) = self.peek_byte() {
110 match byte {
111 b' ' | b'\t' | b'\r' | b'\n' => {
112 self.advance();
113 }
114 _ => break,
115 }
116 }
117 }
118
119 fn state(&self) -> State {
121 self.state_stack[self.state_stack.len() - 1]
122 }
123
124 fn replace_state(&mut self, state: State) {
126 self.state_stack.pop();
127 self.state_stack.push(state);
128 }
129
130 fn offset(&self) -> Offset {
132 Offset(self.index)
133 }
134
135 fn start_object(&mut self) -> Token<'a> {
137 let offset = self.offset();
138 let byte = self.next_byte();
139 debug_assert_eq!(byte, Some(b'{'));
140 self.state_stack.push(State::ObjectFirstKeyOrEnd);
141 Token::StartObject { offset }
142 }
143
144 fn end_object(&mut self) -> Token<'a> {
146 let offset = self.offset();
147 let (byte, state) = (self.next_byte(), self.state_stack.pop());
148 debug_assert_eq!(byte, Some(b'}'));
149 debug_assert!(
150 state == Some(State::ObjectFirstKeyOrEnd) || state == Some(State::ObjectNextKeyOrEnd)
151 );
152 Token::EndObject { offset }
153 }
154
155 fn start_array(&mut self) -> Token<'a> {
157 let offset = self.offset();
158 let byte = self.next_byte();
159 debug_assert_eq!(byte, Some(b'['));
160 self.state_stack.push(State::ArrayFirstValueOrEnd);
161 Token::StartArray { offset }
162 }
163
164 fn end_array(&mut self) -> Token<'a> {
166 let offset = self.offset();
167 let (byte, state) = (self.next_byte(), self.state_stack.pop());
168 debug_assert_eq!(byte, Some(b']'));
169 debug_assert!(
170 state == Some(State::ArrayFirstValueOrEnd) || state == Some(State::ArrayNextValueOrEnd)
171 );
172 Token::EndArray { offset }
173 }
174
175 fn read_string(&mut self) -> Result<&'a str, Error> {
177 let quote_byte = self.next_byte();
179 debug_assert_eq!(quote_byte, Some(b'\"'));
180
181 let start = self.index;
183 loop {
184 match self.peek_expect()? {
185 b'"' => {
186 let value = std::str::from_utf8(&self.input[start..self.index])
187 .map_err(|_| self.error(InvalidUtf8))?;
188 self.advance();
189 return Ok(value);
190 }
191 b'\\' => match self.next_expect()? {
192 b'\\' | b'/' | b'"' | b'b' | b'f' | b'n' | b'r' | b't' => self.advance(),
193 b'u' => {
194 if self.index + 4 > self.input.len() {
195 return Err(self.error_at(self.input.len(), UnexpectedEos));
196 }
197 self.index += 4;
198 }
199 byte => return Err(self.error(InvalidEscape(byte.into()))),
200 },
201 byte @ 0x00..=0x1F => return Err(self.error(UnexpectedControlCharacter(byte))),
202 _ => self.advance(),
203 }
204 }
205 }
206
207 fn expect_literal(&mut self, expected: &[u8]) -> Result<(), Error> {
209 let (start, end) = (self.index, self.index + expected.len());
210 if end > self.input.len() {
211 return Err(self.error_at(self.input.len(), UnexpectedEos));
212 }
213 if expected != &self.input[start..end] {
214 return Err(self.error_at(
215 start,
216 ExpectedLiteral(std::str::from_utf8(expected).unwrap().into()),
217 ));
218 }
219 self.index = end;
220 Ok(())
221 }
222
223 fn expect_null(&mut self) -> Result<Token<'a>, Error> {
225 let offset = self.offset();
226 self.expect_literal(b"null")?;
227 Ok(Token::ValueNull { offset })
228 }
229
230 fn expect_bool(&mut self) -> Result<Token<'a>, Error> {
232 let offset = self.offset();
233 match self.peek_expect()? {
234 b't' => {
235 self.expect_literal(b"true")?;
236 Ok(Token::ValueBool {
237 offset,
238 value: true,
239 })
240 }
241 b'f' => {
242 self.expect_literal(b"false")?;
243 Ok(Token::ValueBool {
244 offset,
245 value: false,
246 })
247 }
248 _ => unreachable!(
249 "this function must only be called when the next character is 't' or 'f'"
250 ),
251 }
252 }
253
254 fn skip_exponent(&mut self) {
256 self.advance();
257 match self.peek_byte() {
258 Some(b'-') => self.advance(),
259 Some(b'+') => self.advance(),
260 _ => {}
261 }
262 while let Some(b'0'..=b'9') = self.peek_byte() {
263 self.advance();
264 }
265 }
266
267 fn skip_decimal(&mut self) {
269 self.advance();
270 while let Some(byte) = self.peek_byte() {
271 match byte {
272 b'0'..=b'9' => self.advance(),
273 b'e' | b'E' => self.skip_exponent(),
274 _ => break,
275 }
276 }
277 }
278
279 fn scan_number(&mut self) -> (usize, usize, bool, bool) {
286 let start_index = self.index;
287 let negative = if self.peek_byte() == Some(b'-') {
288 self.advance();
289 true
290 } else {
291 false
292 };
293 let mut floating = false;
294 while let Some(byte) = self.peek_byte() {
295 match byte {
296 b'0'..=b'9' => self.advance(),
297 b'.' => {
298 floating = true;
299 self.skip_decimal();
300 }
301 b'e' | b'E' => {
302 floating = true;
303 self.skip_exponent();
304 }
305 _ => break,
306 }
307 }
308 (start_index, self.index, negative, floating)
309 }
310
311 fn expect_number(&mut self) -> Result<Token<'a>, Error> {
313 let offset = self.offset();
314 let (start, end, negative, floating) = self.scan_number();
315 let number_slice = &self.input[start..end];
316
317 debug_assert!(std::str::from_utf8(number_slice).is_ok());
319 let number_str = unsafe { std::str::from_utf8_unchecked(number_slice) };
320
321 use std::str::FromStr;
322 Ok(Token::ValueNumber {
323 offset,
324 value: if floating {
325 Number::Float(
326 f64::from_str(number_str).map_err(|_| self.error_at(start, InvalidNumber))?,
327 )
328 } else if negative {
329 match u64::from_str(&number_str[1..]) {
331 Ok(positive) => {
332 if positive <= i64::MAX as u64 {
334 Number::NegInt(-(positive as i64))
335 } else if positive == (i64::MAX as u64) + 1 {
336 Number::NegInt(i64::MIN)
338 } else {
339 Number::Float(-(positive as f64))
341 }
342 }
343 Err(_) => {
344 Number::Float(
346 f64::from_str(number_str)
347 .map_err(|_| self.error_at(start, InvalidNumber))?,
348 )
349 }
350 }
351 } else {
352 match u64::from_str(number_str) {
354 Ok(n) => Number::PosInt(n),
355 Err(_) => {
356 Number::Float(
358 f64::from_str(number_str)
359 .map_err(|_| self.error_at(start, InvalidNumber))?,
360 )
361 }
362 }
363 },
364 })
365 }
366
367 fn read_value(&mut self) -> Result<Token<'a>, Error> {
371 self.discard_whitespace();
372 let offset = self.offset();
373 match self.peek_expect()? {
374 b'{' => Ok(self.start_object()),
375 b'[' => Ok(self.start_array()),
376 b'"' => self.read_string().map(|s| Token::ValueString {
377 offset,
378 value: EscapedStr::new(s),
379 }),
380 byte => {
381 let value = match byte {
382 b'n' => self.expect_null(),
383 b't' | b'f' => self.expect_bool(),
384 b'-' | (b'0'..=b'9') => self.expect_number(),
385 byte => Err(self.error(UnexpectedToken(
386 byte.into(),
387 "'{', '[', '\"', 'null', 'true', 'false', <number>",
388 ))),
389 }?;
390 if let Some(byte) = self.peek_byte() {
392 match byte {
393 b' ' | b'\t' | b'\r' | b'\n' | b'}' | b']' | b',' => {}
394 _ => {
395 return Err(self.error(UnexpectedToken(
396 byte.into(),
397 "<whitespace>, '}', ']', ','",
398 )))
399 }
400 }
401 }
402 Ok(value)
403 }
404 }
405 }
406
407 fn state_array_first_value_or_end(&mut self) -> Result<Token<'a>, Error> {
409 match self.peek_expect()? {
410 b']' => Ok(self.end_array()),
411 _ => {
412 self.replace_state(State::ArrayNextValueOrEnd);
413 self.read_value()
414 }
415 }
416 }
417
418 fn state_array_next_value_or_end(&mut self) -> Result<Token<'a>, Error> {
420 match self.peek_expect()? {
421 b']' => Ok(self.end_array()),
422 b',' => {
423 self.advance();
424 self.read_value()
425 }
426 byte => Err(self.error(UnexpectedToken(byte.into(), "']', ','"))),
427 }
428 }
429
430 fn object_key(&mut self) -> Result<Token<'a>, Error> {
432 let offset = self.offset();
433 match self.peek_expect()? {
434 b'"' => {
435 self.replace_state(State::ObjectFieldValue);
436 self.read_string().map(|s| Token::ObjectKey {
437 offset,
438 key: EscapedStr::new(s),
439 })
440 }
441 byte => Err(self.error(UnexpectedToken(byte.into(), "'\"'"))),
442 }
443 }
444
445 fn state_object_first_key_or_end(&mut self) -> Result<Token<'a>, Error> {
447 match self.peek_expect()? {
448 b'}' => Ok(self.end_object()),
449 _ => self.object_key(),
450 }
451 }
452
453 fn state_object_next_key_or_end(&mut self) -> Result<Token<'a>, Error> {
455 match self.peek_expect()? {
456 b'}' => Ok(self.end_object()),
457 b',' => {
458 self.advance();
459 self.discard_whitespace();
460 self.object_key()
461 }
462 byte => Err(self.error(UnexpectedToken(byte.into(), "'}', ','"))),
463 }
464 }
465
466 fn state_object_field_value(&mut self) -> Result<Token<'a>, Error> {
468 match self.peek_expect()? {
469 b':' => {
470 self.advance();
471 self.replace_state(State::ObjectNextKeyOrEnd);
472 self.read_value()
473 }
474 byte => Err(self.error(UnexpectedToken(byte.into(), "':'"))),
475 }
476 }
477}
478
479impl<'a> Iterator for JsonTokenIterator<'a> {
480 type Item = Result<Token<'a>, Error>;
481
482 fn next(&mut self) -> Option<Self::Item> {
483 debug_assert!(self.index <= self.input.len());
484 if self.index == self.input.len() {
485 return None;
486 }
487
488 self.discard_whitespace();
489 let result = match self.state() {
490 State::Initial => self.peek_byte().map(|_| self.read_value()),
491 State::ArrayFirstValueOrEnd => Some(self.state_array_first_value_or_end()),
492 State::ArrayNextValueOrEnd => Some(self.state_array_next_value_or_end()),
493 State::ObjectFirstKeyOrEnd => Some(self.state_object_first_key_or_end()),
494 State::ObjectNextKeyOrEnd => Some(self.state_object_next_key_or_end()),
495 State::ObjectFieldValue => Some(self.state_object_field_value()),
496 };
497 if result.as_ref().map(|r| r.is_err()).unwrap_or(false) {
499 self.index = self.input.len();
500 }
501 result
502 }
503}
504
505fn must_not_be_finite(f: f64) -> Result<f64, ()> {
506 if !f.is_finite() {
507 Ok(f)
508 } else {
509 Err(())
510 }
511}
512
513#[cfg(test)]
514mod tests {
515 use crate::deserialize::error::{DeserializeError as Error, DeserializeErrorKind as ErrorKind};
516 use crate::deserialize::token::expect_number_as_string_or_null;
517 use crate::deserialize::token::test::{
518 end_array, end_object, object_key, start_array, start_object, value_bool, value_null,
519 value_number, value_string,
520 };
521 use crate::deserialize::{json_token_iter, EscapedStr, Token};
522 use aws_smithy_types::Number;
523 use proptest::prelude::*;
524
525 #[track_caller]
526 fn expect_token(
527 expected: Option<Result<Token<'_>, Error>>,
528 actual: Option<Result<Token<'_>, Error>>,
529 ) {
530 let (expected, actual) = (
531 expected.transpose().expect("err in expected"),
532 actual.transpose().expect("err in actual"),
533 );
534 assert_eq!(expected, actual);
535 }
536
537 macro_rules! expect_err {
538 ($kind:pat, $offset:expr, $value:expr) => {
539 let err: Error = $value.transpose().err().expect("expected error");
540 assert!(matches!(err.kind, $kind));
541 assert_eq!($offset, err.offset);
542 };
543 }
544
545 #[test]
546 fn test_empty() {
547 assert!(json_token_iter(b"").next().is_none());
548 assert!(json_token_iter(b" ").next().is_none());
549 assert!(json_token_iter(b"\t").next().is_none());
550 }
551
552 #[test]
553 fn test_empty_string() {
554 let mut iter = json_token_iter(b"\"\"");
555 expect_token(value_string(0, ""), iter.next());
556 expect_token(None, iter.next());
557
558 let mut iter = json_token_iter(b" \r\n\t \"\" ");
559 expect_token(value_string(5, ""), iter.next());
560 expect_token(None, iter.next());
561 }
562
563 #[test]
564 fn test_empty_array() {
565 let mut iter = json_token_iter(b"[]");
566 expect_token(start_array(0), iter.next());
567 expect_token(end_array(1), iter.next());
568 expect_token(None, iter.next());
569 }
570
571 #[test]
572 fn test_empty_object() {
573 let mut iter = json_token_iter(b"{}");
574 expect_token(start_object(0), iter.next());
575 expect_token(end_object(1), iter.next());
576 expect_token(None, iter.next());
577 }
578
579 #[test]
580 fn test_null() {
581 expect_token(value_null(1), json_token_iter(b" null ").next());
582
583 let mut iter = json_token_iter(b"[null, null,null]");
584 expect_token(start_array(0), iter.next());
585 expect_token(value_null(1), iter.next());
586 expect_token(value_null(7), iter.next());
587 expect_token(value_null(12), iter.next());
588 expect_token(end_array(16), iter.next());
589 expect_token(None, iter.next());
590
591 assert!(json_token_iter(b"n").next().unwrap().is_err());
592 assert!(json_token_iter(b"nul").next().unwrap().is_err());
593 assert!(json_token_iter(b"nulll").next().unwrap().is_err());
594 }
595
596 #[test]
597 fn test_bools() {
598 assert!(json_token_iter(b"tru").next().unwrap().is_err());
599 assert!(json_token_iter(b"truee").next().unwrap().is_err());
600 assert!(json_token_iter(b"f").next().unwrap().is_err());
601 assert!(json_token_iter(b"falsee").next().unwrap().is_err());
602 expect_token(value_bool(1, true), json_token_iter(b" true ").next());
603 expect_token(value_bool(0, false), json_token_iter(b"false").next());
604
605 let mut iter = json_token_iter(b"[true,false]");
606 expect_token(start_array(0), iter.next());
607 expect_token(value_bool(1, true), iter.next());
608 expect_token(value_bool(6, false), iter.next());
609 expect_token(end_array(11), iter.next());
610 expect_token(None, iter.next());
611 }
612
613 proptest! {
614 #[test]
615 fn string_prop_test(input in ".*") {
616 let json: String = serde_json::to_string(&input).unwrap();
617 let mut iter = json_token_iter(json.as_bytes());
618 expect_token(value_string(0, &json[1..(json.len() - 1)]), iter.next());
619 expect_token(None, iter.next());
620 }
621
622 #[test]
623 fn integer_prop_test(input: i64) {
624 let json = serde_json::to_string(&input).unwrap();
625 let mut iter = json_token_iter(json.as_bytes());
626 let expected = if input < 0 {
627 Number::NegInt(input)
628 } else {
629 Number::PosInt(input as u64)
630 };
631 expect_token(value_number(0, expected), iter.next());
632 expect_token(None, iter.next());
633 }
634
635 #[test]
636 fn float_prop_test(input: f64) {
637 let json = serde_json::to_string(&input).unwrap();
638 let mut iter = json_token_iter(json.as_bytes());
639 expect_token(value_number(0, Number::Float(input)), iter.next());
640 expect_token(None, iter.next());
641 }
642 }
643
644 #[test]
645 fn valid_numbers() {
646 let expect = |number, input| {
647 expect_token(value_number(0, number), json_token_iter(input).next());
648 };
649 expect(Number::Float(0.0), b"0.");
650 expect(Number::Float(0.0), b"0e0");
651 expect(Number::Float(0.0), b"0E0");
652 expect(Number::Float(10.0), b"1E1");
653 expect(Number::Float(10.0), b"1E+1");
654 expect(Number::Float(100.0), b"1e+2");
655
656 expect(Number::NegInt(-50000), b"-50000");
657 expect(
658 Number::Float(-18446744073709551615.0),
659 b"-18446744073709551615",
660 );
661 }
662
663 #[test]
664 fn out_of_range_floats_produce_infinity() {
665 let expect_infinity = |input, should_be_positive| {
668 let token = json_token_iter(input).next().unwrap().unwrap();
669 if let Token::ValueNumber {
670 value: Number::Float(f),
671 ..
672 } = token
673 {
674 assert!(
675 f.is_infinite(),
676 "Expected infinity for out-of-range value, got {}",
677 f
678 );
679 if should_be_positive {
680 assert!(f.is_sign_positive(), "Expected positive infinity");
681 } else {
682 assert!(f.is_sign_negative(), "Expected negative infinity");
683 }
684 } else {
685 panic!("Expected Float token, got {:?}", token);
686 }
687 };
688
689 expect_infinity(b"1.8e308", true);
691 expect_infinity(b"9.9e999", true);
692
693 expect_infinity(b"-1.8e308", false);
695 expect_infinity(b"-9.9e999", false);
696 }
697
698 #[test]
701 fn invalid_numbers_we_are_intentionally_accepting() {
702 let expect = |number, input| {
703 expect_token(value_number(0, number), json_token_iter(input).next());
704 };
705
706 expect(Number::NegInt(-1), b"-01");
707 expect(Number::Float(-2.0), b"-2.");
708 expect(Number::Float(0.0), b"0.e1");
709 expect(Number::Float(0.002), b"2.e-3");
710 expect(Number::Float(2000.0), b"2.e3");
711 expect(Number::NegInt(-12), b"-012");
712 expect(Number::Float(-0.123), b"-.123");
713 expect(Number::Float(1.0), b"1.");
714 expect(Number::PosInt(12), b"012");
715 }
716
717 #[test]
718 fn invalid_numbers() {
719 macro_rules! unexpected_token {
720 ($input:expr, $token:pat, $offset:expr, $msg:pat) => {
721 let tokens: Vec<Result<Token<'_>, Error>> = json_token_iter($input).collect();
722 assert_eq!(1, tokens.len());
723 expect_err!(
724 ErrorKind::UnexpectedToken($token, $msg),
725 Some($offset),
726 tokens.into_iter().next()
727 );
728 };
729 }
730
731 let invalid_number = |input, offset| {
732 let tokens: Vec<Result<Token<'_>, Error>> = json_token_iter(input).collect();
733 assert_eq!(1, tokens.len());
734 expect_err!(
735 ErrorKind::InvalidNumber,
736 Some(offset),
737 tokens.into_iter().next()
738 );
739 };
740
741 unexpected_token!(
742 b".",
743 '.',
744 0,
745 "'{', '[', '\"', 'null', 'true', 'false', <number>"
746 );
747 unexpected_token!(
748 b".0",
749 '.',
750 0,
751 "'{', '[', '\"', 'null', 'true', 'false', <number>"
752 );
753 unexpected_token!(b"0-05", '-', 1, "<whitespace>, '}', ']', ','");
754 unexpected_token!(b"0x05", 'x', 1, "<whitespace>, '}', ']', ','");
755 unexpected_token!(b"123.invalid", 'i', 4, "<whitespace>, '}', ']', ','");
756 unexpected_token!(b"123invalid", 'i', 3, "<whitespace>, '}', ']', ','");
757 unexpected_token!(
758 b"asdf",
759 'a',
760 0,
761 "'{', '[', '\"', 'null', 'true', 'false', <number>"
762 );
763
764 invalid_number(b"-a", 0);
765 invalid_number(b"1e", 0);
766 invalid_number(b"1e-", 0);
767
768 invalid_number(b"123.0Einvalid", 0);
770 }
771
772 #[test]
773 fn test_unclosed_array() {
774 let mut iter = json_token_iter(br#" [null "#);
775 expect_token(start_array(1), iter.next());
776 expect_token(value_null(2), iter.next());
777 expect_err!(ErrorKind::UnexpectedEos, Some(7), iter.next());
778 }
779
780 #[test]
781 fn test_array_with_items() {
782 let mut iter = json_token_iter(b"[[], {}, \"test\"]");
783 expect_token(start_array(0), iter.next());
784 expect_token(start_array(1), iter.next());
785 expect_token(end_array(2), iter.next());
786 expect_token(start_object(5), iter.next());
787 expect_token(end_object(6), iter.next());
788 expect_token(value_string(9, "test"), iter.next());
789 expect_token(end_array(15), iter.next());
790 expect_token(None, iter.next());
791 }
792
793 #[test]
794 fn test_object_with_items() {
795 let mut tokens = json_token_iter(
796 br#"{ "some_int": 5,
797 "some_float": 5.2,
798 "some_negative": -5,
799 "some_negative_float": -2.4,
800 "some_string": "test",
801 "some_struct": { "nested": "asdf" },
802 "some_array": ["one", "two"] }"#,
803 );
804 expect_token(start_object(0), tokens.next());
805 expect_token(object_key(2, "some_int"), tokens.next());
806 expect_token(value_number(14, Number::PosInt(5)), tokens.next());
807 expect_token(object_key(35, "some_float"), tokens.next());
808 expect_token(value_number(49, Number::Float(5.2)), tokens.next());
809 expect_token(object_key(72, "some_negative"), tokens.next());
810 expect_token(value_number(89, Number::NegInt(-5)), tokens.next());
811 expect_token(object_key(111, "some_negative_float"), tokens.next());
812 expect_token(value_number(134, Number::Float(-2.4)), tokens.next());
813 expect_token(object_key(158, "some_string"), tokens.next());
814 expect_token(value_string(173, "test"), tokens.next());
815 expect_token(object_key(199, "some_struct"), tokens.next());
816 expect_token(start_object(214), tokens.next());
817 expect_token(object_key(216, "nested"), tokens.next());
818 expect_token(value_string(226, "asdf"), tokens.next());
819 expect_token(end_object(233), tokens.next());
820 expect_token(object_key(254, "some_array"), tokens.next());
821 expect_token(start_array(268), tokens.next());
822 expect_token(value_string(269, "one"), tokens.next());
823 expect_token(value_string(276, "two"), tokens.next());
824 expect_token(end_array(281), tokens.next());
825 expect_token(end_object(283), tokens.next());
826 expect_token(None, tokens.next());
827 }
828
829 #[test]
830 fn test_object_trailing_comma() {
831 let mut iter = json_token_iter(br#" { "test": "trailing", } "#);
832 expect_token(start_object(1), iter.next());
833 expect_token(object_key(3, "test"), iter.next());
834 expect_token(value_string(11, "trailing"), iter.next());
835 expect_err!(
836 ErrorKind::UnexpectedToken('}', "'\"'"),
837 Some(23),
838 iter.next()
839 );
840 assert!(iter.next().is_none());
841 }
842
843 #[test]
844 fn test_object_no_colon() {
845 let mut iter = json_token_iter(br#" {"test" "#);
846 expect_token(start_object(1), iter.next());
847 expect_token(object_key(2, "test"), iter.next());
848 expect_err!(ErrorKind::UnexpectedEos, Some(9), iter.next());
849 expect_token(None, iter.next());
850 }
851
852 #[test]
853 fn unescaped_ctrl_characters() {
854 assert!(json_token_iter(b"\"test\x00test\"")
855 .next()
856 .unwrap()
857 .is_err());
858 assert!(json_token_iter(b"\"test\ntest\"").next().unwrap().is_err());
859 assert!(json_token_iter(b"\"test\ttest\"").next().unwrap().is_err());
860 }
861
862 #[test]
863 fn escaped_str() {
864 let escaped = EscapedStr::new("foo\\nbar");
865 assert_eq!("foo\\nbar", escaped.as_escaped_str());
866 assert_eq!("foo\nbar", escaped.to_unescaped().unwrap());
867 }
868
869 #[test]
870 fn test_integer_overflow_to_float() {
871 let input = b"18450000000000000000";
873 let mut iter = json_token_iter(input);
874 match iter.next() {
875 Some(Ok(Token::ValueNumber {
876 value: Number::Float(f),
877 ..
878 })) => {
879 assert!(f.is_finite());
880 assert!(f > 0.0);
881 }
882 other => panic!("Expected Float token, got {:?}", other),
883 }
884
885 let input = b"-9223372036854775809";
887 let mut iter = json_token_iter(input);
888 match iter.next() {
889 Some(Ok(Token::ValueNumber {
890 value: Number::Float(f),
891 ..
892 })) => {
893 assert!(f.is_finite());
894 assert!(f < 0.0);
895 }
896 other => panic!("Expected Float token, got {:?}", other),
897 }
898
899 let large_num = b"100000000000000000000000000000000000000000000000000000000000000\
901 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
902 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
903 00000000000000000000000000000000000000000000000000000000000000000000000";
904 let mut iter = json_token_iter(large_num);
905 match iter.next() {
906 Some(Ok(Token::ValueNumber {
907 value: Number::Float(f),
908 ..
909 })) => {
910 assert_eq!(f, f64::INFINITY);
911 }
912 other => panic!("Expected Float(infinity) token, got {:?}", other),
913 }
914 }
915
916 #[test]
917 fn test_integer_within_range() {
918 let input = b"9007199254740993";
920 let mut iter = json_token_iter(input);
921 match iter.next() {
922 Some(Ok(Token::ValueNumber {
923 value: Number::PosInt(n),
924 ..
925 })) => {
926 assert_eq!(n, 9007199254740993);
927 }
928 other => panic!("Expected PosInt token, got {:?}", other),
929 }
930
931 let input = b"-9223372036854775808";
932 let mut iter = json_token_iter(input);
933 match iter.next() {
934 Some(Ok(Token::ValueNumber {
935 value: Number::NegInt(n),
936 ..
937 })) => {
938 assert_eq!(n, i64::MIN);
939 }
940 other => panic!("Expected NegInt token, got {:?}", other),
941 }
942 }
943
944 #[test]
945 fn test_integer_boundaries() {
946 let input = b"0";
948 let mut iter = json_token_iter(input);
949 match iter.next() {
950 Some(Ok(Token::ValueNumber {
951 value: Number::PosInt(0),
952 ..
953 })) => {}
954 other => panic!("Expected PosInt(0), got {:?}", other),
955 }
956
957 let input = b"-123";
959 let mut iter = json_token_iter(input);
960 match iter.next() {
961 Some(Ok(Token::ValueNumber {
962 value: Number::NegInt(-123),
963 ..
964 })) => {}
965 other => panic!("Expected NegInt(-123), got {:?}", other),
966 }
967
968 let input = b"9223372036854775807";
970 let mut iter = json_token_iter(input);
971 match iter.next() {
972 Some(Ok(Token::ValueNumber {
973 value: Number::PosInt(n),
974 ..
975 })) => {
976 assert_eq!(n, i64::MAX as u64);
977 }
978 other => panic!("Expected PosInt(i64::MAX), got {:?}", other),
979 }
980
981 let input = b"-9223372036854775807";
983 let mut iter = json_token_iter(input);
984 match iter.next() {
985 Some(Ok(Token::ValueNumber {
986 value: Number::NegInt(n),
987 ..
988 })) => {
989 assert_eq!(n, i64::MIN + 1);
990 }
991 other => panic!("Expected NegInt(i64::MIN + 1), got {:?}", other),
992 }
993
994 let input = b"18446744073709551615";
996 let mut iter = json_token_iter(input);
997 match iter.next() {
998 Some(Ok(Token::ValueNumber {
999 value: Number::PosInt(n),
1000 ..
1001 })) => {
1002 assert_eq!(n, u64::MAX);
1003 }
1004 other => panic!("Expected PosInt(u64::MAX), got {:?}", other),
1005 }
1006 }
1007
1008 #[cfg(test)]
1009 mod proptest_tests {
1010 use super::*;
1011
1012 proptest! {
1013 #[test]
1014 fn positive_integers_within_u64_parse_as_posint(n in 0u64..=u64::MAX) {
1015 let input = n.to_string();
1016 let input_bytes = input.as_bytes();
1017 let mut iter = json_token_iter(input_bytes);
1018
1019 match iter.next() {
1020 Some(Ok(Token::ValueNumber { value: Number::PosInt(parsed), .. })) => {
1021 prop_assert_eq!(parsed, n);
1022 }
1023 other => {
1024 return Err(proptest::test_runner::TestCaseError::fail(
1025 format!("Expected PosInt({}), got {:?}", n, other)
1026 ));
1027 }
1028 }
1029 }
1030
1031 #[test]
1032 fn negative_integers_within_i64_parse_as_negint(n in i64::MIN..=i64::MAX) {
1033 if n >= 0 {
1034 return Ok(());
1035 }
1036
1037 let input = n.to_string();
1038 let input_bytes = input.as_bytes();
1039 let mut iter = json_token_iter(input_bytes);
1040
1041 match iter.next() {
1042 Some(Ok(Token::ValueNumber { value: Number::NegInt(parsed), .. })) => {
1043 prop_assert_eq!(parsed, n);
1044 }
1045 other => {
1046 return Err(proptest::test_runner::TestCaseError::fail(
1047 format!("Expected NegInt({}), got {:?}", n, other)
1048 ));
1049 }
1050 }
1051 }
1052
1053 #[test]
1054 fn large_integers_overflow_to_float(
1055 num_str in "1[0-9]{20,49}"
1058 ) {
1059 let input_bytes = num_str.as_bytes();
1060 let mut iter = json_token_iter(input_bytes);
1061
1062 match iter.next() {
1063 Some(Ok(Token::ValueNumber { value: Number::Float(f), .. })) => {
1064 prop_assert!(f.is_finite());
1065 prop_assert!(f > 0.0);
1066 }
1067 other => {
1068 return Err(proptest::test_runner::TestCaseError::fail(
1069 format!("Expected Float for large number, got {:?}", other)
1070 ));
1071 }
1072 }
1073
1074 let mut iter = json_token_iter(input_bytes);
1076 let result = expect_number_as_string_or_null(iter.next(), input_bytes)?;
1077 prop_assert_eq!(result, Some(num_str.as_str()));
1078 }
1079 }
1080 }
1081}