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