1 #![cfg(not(feature = "preserve_order"))]
2 #![allow(clippy::assertions_on_result_states)]
3
4 use serde_json::{json, Deserializer, Value};
5
6 // Rustfmt issue https://github.com/rust-lang-nursery/rustfmt/issues/2740
7 #[rustfmt::skip]
8 macro_rules! test_stream {
9 ($data:expr, $ty:ty, |$stream:ident| $test:block) => {
10 {
11 let de = Deserializer::from_str($data);
12 let mut $stream = de.into_iter::<$ty>();
13 assert_eq!($stream.byte_offset(), 0);
14 $test
15 }
16 {
17 let de = Deserializer::from_slice($data.as_bytes());
18 let mut $stream = de.into_iter::<$ty>();
19 assert_eq!($stream.byte_offset(), 0);
20 $test
21 }
22 {
23 let mut bytes = $data.as_bytes();
24 let de = Deserializer::from_reader(&mut bytes);
25 let mut $stream = de.into_iter::<$ty>();
26 assert_eq!($stream.byte_offset(), 0);
27 $test
28 }
29 };
30 }
31
32 #[test]
test_json_stream_newlines()33 fn test_json_stream_newlines() {
34 let data = "{\"x\":39} {\"x\":40}{\"x\":41}\n{\"x\":42}";
35
36 test_stream!(data, Value, |stream| {
37 assert_eq!(stream.next().unwrap().unwrap()["x"], 39);
38 assert_eq!(stream.byte_offset(), 8);
39
40 assert_eq!(stream.next().unwrap().unwrap()["x"], 40);
41 assert_eq!(stream.byte_offset(), 17);
42
43 assert_eq!(stream.next().unwrap().unwrap()["x"], 41);
44 assert_eq!(stream.byte_offset(), 25);
45
46 assert_eq!(stream.next().unwrap().unwrap()["x"], 42);
47 assert_eq!(stream.byte_offset(), 34);
48
49 assert!(stream.next().is_none());
50 assert_eq!(stream.byte_offset(), 34);
51 });
52 }
53
54 #[test]
test_json_stream_trailing_whitespaces()55 fn test_json_stream_trailing_whitespaces() {
56 let data = "{\"x\":42} \t\n";
57
58 test_stream!(data, Value, |stream| {
59 assert_eq!(stream.next().unwrap().unwrap()["x"], 42);
60 assert_eq!(stream.byte_offset(), 8);
61
62 assert!(stream.next().is_none());
63 assert_eq!(stream.byte_offset(), 11);
64 });
65 }
66
67 #[test]
test_json_stream_truncated()68 fn test_json_stream_truncated() {
69 let data = "{\"x\":40}\n{\"x\":";
70
71 test_stream!(data, Value, |stream| {
72 assert_eq!(stream.next().unwrap().unwrap()["x"], 40);
73 assert_eq!(stream.byte_offset(), 8);
74
75 assert!(stream.next().unwrap().unwrap_err().is_eof());
76 assert_eq!(stream.byte_offset(), 9);
77 });
78 }
79
80 #[test]
test_json_stream_truncated_decimal()81 fn test_json_stream_truncated_decimal() {
82 let data = "{\"x\":4.";
83
84 test_stream!(data, Value, |stream| {
85 assert!(stream.next().unwrap().unwrap_err().is_eof());
86 assert_eq!(stream.byte_offset(), 0);
87 });
88 }
89
90 #[test]
test_json_stream_truncated_negative()91 fn test_json_stream_truncated_negative() {
92 let data = "{\"x\":-";
93
94 test_stream!(data, Value, |stream| {
95 assert!(stream.next().unwrap().unwrap_err().is_eof());
96 assert_eq!(stream.byte_offset(), 0);
97 });
98 }
99
100 #[test]
test_json_stream_truncated_exponent()101 fn test_json_stream_truncated_exponent() {
102 let data = "{\"x\":4e";
103
104 test_stream!(data, Value, |stream| {
105 assert!(stream.next().unwrap().unwrap_err().is_eof());
106 assert_eq!(stream.byte_offset(), 0);
107 });
108 }
109
110 #[test]
test_json_stream_empty()111 fn test_json_stream_empty() {
112 let data = "";
113
114 test_stream!(data, Value, |stream| {
115 assert!(stream.next().is_none());
116 assert_eq!(stream.byte_offset(), 0);
117 });
118 }
119
120 #[test]
test_json_stream_primitive()121 fn test_json_stream_primitive() {
122 let data = "{} true{}1[]\nfalse\"hey\"2 ";
123
124 test_stream!(data, Value, |stream| {
125 assert_eq!(stream.next().unwrap().unwrap(), json!({}));
126 assert_eq!(stream.byte_offset(), 2);
127
128 assert_eq!(stream.next().unwrap().unwrap(), true);
129 assert_eq!(stream.byte_offset(), 7);
130
131 assert_eq!(stream.next().unwrap().unwrap(), json!({}));
132 assert_eq!(stream.byte_offset(), 9);
133
134 assert_eq!(stream.next().unwrap().unwrap(), 1);
135 assert_eq!(stream.byte_offset(), 10);
136
137 assert_eq!(stream.next().unwrap().unwrap(), json!([]));
138 assert_eq!(stream.byte_offset(), 12);
139
140 assert_eq!(stream.next().unwrap().unwrap(), false);
141 assert_eq!(stream.byte_offset(), 18);
142
143 assert_eq!(stream.next().unwrap().unwrap(), "hey");
144 assert_eq!(stream.byte_offset(), 23);
145
146 assert_eq!(stream.next().unwrap().unwrap(), 2);
147 assert_eq!(stream.byte_offset(), 24);
148
149 assert!(stream.next().is_none());
150 assert_eq!(stream.byte_offset(), 25);
151 });
152 }
153
154 #[test]
test_json_stream_invalid_literal()155 fn test_json_stream_invalid_literal() {
156 let data = "truefalse";
157
158 test_stream!(data, Value, |stream| {
159 let second = stream.next().unwrap().unwrap_err();
160 assert_eq!(second.to_string(), "trailing characters at line 1 column 5");
161 });
162 }
163
164 #[test]
test_json_stream_invalid_number()165 fn test_json_stream_invalid_number() {
166 let data = "1true";
167
168 test_stream!(data, Value, |stream| {
169 let second = stream.next().unwrap().unwrap_err();
170 assert_eq!(second.to_string(), "trailing characters at line 1 column 2");
171 });
172 }
173
174 #[test]
test_error()175 fn test_error() {
176 let data = "true wrong false";
177
178 test_stream!(data, Value, |stream| {
179 assert_eq!(stream.next().unwrap().unwrap(), true);
180 assert!(stream.next().unwrap().is_err());
181 assert!(stream.next().is_none());
182 });
183 }
184