• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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