Skip to content

Commit b825e60

Browse files
committed
Macros documented (#77), split tests even more
1 parent e7fe45f commit b825e60

File tree

4 files changed

+546
-510
lines changed

4 files changed

+546
-510
lines changed

src/lib.rs

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,20 @@ pub fn stringify_pretty<T>(root: T, spaces: u16) -> String where T: Into<JsonVal
261261
root.pretty(spaces)
262262
}
263263

264-
264+
/// Helper macro for creating instances of `JsonValue::Array`.
265+
///
266+
/// ```
267+
/// # #[macro_use] extern crate json;
268+
/// # fn main() {
269+
/// let data = array!["foo", 42, false];
270+
///
271+
/// assert_eq!(data[0], "foo");
272+
/// assert_eq!(data[1], 42);
273+
/// assert_eq!(data[2], false);
274+
///
275+
/// assert_eq!(data.dump(), r#"["foo",42,false]"#);
276+
/// # }
277+
/// ```
265278
#[macro_export]
266279
macro_rules! array {
267280
[] => ($crate::JsonValue::new_array());
@@ -277,6 +290,22 @@ macro_rules! array {
277290
})
278291
}
279292

293+
/// Helper macro for creating instances of `JsonValue::Object`.
294+
///
295+
/// ```
296+
/// # #[macro_use] extern crate json;
297+
/// # fn main() {
298+
/// let data = object!{
299+
/// "foo" => 42,
300+
/// "bar" => false
301+
/// };
302+
///
303+
/// assert_eq!(data["foo"], 42);
304+
/// assert_eq!(data["bar"], false);
305+
///
306+
/// assert_eq!(data.dump(), r#"{"foo":42,"bar":false}"#);
307+
/// # }
308+
/// ```
280309
#[macro_export]
281310
macro_rules! object {
282311
{} => ($crate::JsonValue::new_object());

tests/parse.rs

Lines changed: 270 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,270 @@
1+
#[macro_use]
2+
extern crate json;
3+
4+
use json::number::Number;
5+
use json::{ parse, JsonValue, Null };
6+
7+
#[test]
8+
fn parse_true() {
9+
assert_eq!(parse("true").unwrap(), true);
10+
}
11+
12+
#[test]
13+
fn parse_false() {
14+
assert_eq!(parse("false").unwrap(), false);
15+
}
16+
17+
#[test]
18+
fn parse_null() {
19+
assert!(parse("null").unwrap().is_null());
20+
}
21+
22+
#[test]
23+
fn parse_number() {
24+
assert_eq!(parse("3.141592653589793").unwrap(), 3.141592653589793);
25+
}
26+
27+
#[test]
28+
fn parse_small_number() {
29+
assert_eq!(parse("0.05").unwrap(), 0.05);
30+
}
31+
32+
#[test]
33+
fn parse_very_long_float() {
34+
let parsed = parse("2.22507385850720113605740979670913197593481954635164564e-308").unwrap();
35+
36+
// Handles convertion correctly
37+
assert_eq!(parsed.as_f64().unwrap(), 2.225073858507201e-308);
38+
39+
// Exhausts u64
40+
assert_eq!(parsed, Number::from_parts(true, 2225073858507201136, -326));
41+
}
42+
43+
#[test]
44+
fn parse_integer() {
45+
assert_eq!(parse("42").unwrap(), 42);
46+
}
47+
48+
#[test]
49+
fn parse_negative_zero() {
50+
assert_eq!(parse("-0").unwrap(), JsonValue::from(-0f64));
51+
}
52+
53+
#[test]
54+
fn parse_negative_integer() {
55+
assert_eq!(parse("-42").unwrap(), -42);
56+
}
57+
58+
#[test]
59+
fn parse_number_with_leading_zero() {
60+
assert!(parse("01").is_err());
61+
}
62+
63+
#[test]
64+
fn parse_negative_number_with_leading_zero() {
65+
assert!(parse("-01").is_err());
66+
}
67+
68+
#[test]
69+
fn parse_number_with_e() {
70+
assert_eq!(parse("5e2").unwrap(), 500);
71+
assert_eq!(parse("5E2").unwrap(), 500);
72+
}
73+
74+
#[test]
75+
fn parse_number_with_positive_e() {
76+
assert_eq!(parse("5e+2").unwrap(), 500);
77+
assert_eq!(parse("5E+2").unwrap(), 500);
78+
}
79+
80+
#[test]
81+
fn parse_number_with_negative_e() {
82+
assert_eq!(parse("5e-2").unwrap(), 0.05);
83+
assert_eq!(parse("5E-2").unwrap(), 0.05);
84+
}
85+
86+
#[test]
87+
fn parse_number_with_invalid_e() {
88+
assert!(parse("0e").is_err());
89+
}
90+
91+
#[test]
92+
fn parse_large_number() {
93+
assert_eq!(parse("18446744073709551616").unwrap(), 18446744073709552000f64);
94+
}
95+
96+
#[test]
97+
fn parse_array() {
98+
assert_eq!(parse(r#"[10, "foo", true, null]"#).unwrap(), array![
99+
10,
100+
"foo",
101+
true,
102+
Null
103+
]);
104+
}
105+
106+
#[test]
107+
fn parse_object() {
108+
assert_eq!(parse(r#"
109+
110+
{
111+
"foo": "bar",
112+
"num": 10
113+
}
114+
115+
"#).unwrap(), object!{
116+
"foo" => "bar",
117+
"num" => 10
118+
});
119+
}
120+
121+
#[test]
122+
fn parse_object_with_array(){
123+
assert_eq!(parse(r#"
124+
125+
{
126+
"foo": [1, 2, 3]
127+
}
128+
129+
"#).unwrap(), object!{
130+
"foo" => array![1, 2, 3]
131+
});
132+
}
133+
134+
#[test]
135+
fn parse_nested_object() {
136+
assert_eq!(parse(r#"
137+
138+
{
139+
"l10n": [ {
140+
"product": {
141+
"inStock": {
142+
"DE": "Lieferung innerhalb von 1-3 Werktagen"
143+
}
144+
}
145+
} ]
146+
}
147+
148+
"#).unwrap(), object!{
149+
"l10n" => array![ object!{
150+
"product" => object!{
151+
"inStock" => object!{
152+
"DE" => "Lieferung innerhalb von 1-3 Werktagen"
153+
}
154+
}
155+
} ]
156+
});
157+
}
158+
159+
#[test]
160+
fn parse_and_index_from_object() {
161+
let data = parse("{ \"pi\": 3.14 }").unwrap();
162+
let ref pi = data["pi"];
163+
164+
assert_eq!(pi, 3.14);
165+
}
166+
167+
#[test]
168+
fn parse_and_index_mut_from_object() {
169+
let mut data = parse(r#"
170+
171+
{
172+
"foo": 100
173+
}
174+
175+
"#).unwrap();
176+
177+
assert_eq!(data["foo"], 100);
178+
179+
data["foo"] = 200.into();
180+
181+
assert_eq!(data["foo"], 200);
182+
}
183+
184+
#[test]
185+
fn parse_and_index_mut_from_null() {
186+
let mut data = parse("null").unwrap();
187+
188+
assert!(data["foo"]["bar"].is_null());
189+
190+
// test that data didn't coerece to object
191+
assert!(data.is_null());
192+
193+
data["foo"]["bar"] = 100.into();
194+
195+
assert!(data.is_object());
196+
assert_eq!(data["foo"]["bar"], 100);
197+
198+
assert_eq!(data.dump(), r#"{"foo":{"bar":100}}"#);
199+
}
200+
201+
#[test]
202+
fn parse_and_index_from_array() {
203+
let data = parse(r#"[100, 200, false, null, "foo"]"#).unwrap();
204+
205+
assert_eq!(data[0], Number::from(100));
206+
assert_eq!(data[1], 200);
207+
assert_eq!(data[2], false);
208+
assert_eq!(data[3], Null);
209+
assert_eq!(data[4], "foo");
210+
assert_eq!(data[5], Null);
211+
}
212+
213+
#[test]
214+
fn parse_and_index_mut_from_array() {
215+
let mut data = parse(r#"[100, 200, false, null, "foo"]"#).unwrap();
216+
217+
assert!(data[3].is_null());
218+
assert!(data[5].is_null());
219+
220+
data[3] = "modified".into();
221+
data[5] = "implicid push".into();
222+
223+
assert_eq!(data[3], "modified");
224+
assert_eq!(data[5], "implicid push");
225+
}
226+
227+
#[test]
228+
fn parse_escaped_characters() {
229+
let data = parse(r#"
230+
231+
"\r\n\t\b\f\\\/\""
232+
233+
"#).unwrap();
234+
235+
assert!(data.is_string());
236+
assert_eq!(data, "\r\n\t\u{8}\u{c}\\/\"");
237+
}
238+
239+
#[test]
240+
fn parse_escaped_unicode() {
241+
let data = parse(r#"
242+
243+
"\u2764\ufe0f"
244+
245+
"#).unwrap();
246+
247+
assert_eq!(data, "❤️");
248+
}
249+
250+
#[test]
251+
fn parse_escaped_unicode_surrogate() {
252+
let data = parse(r#"
253+
254+
"\uD834\uDD1E"
255+
256+
"#).unwrap();
257+
258+
assert_eq!(data, "𝄞");
259+
}
260+
261+
#[test]
262+
fn parse_escaped_unicode_surrogate_fail() {
263+
let err = parse(r#"
264+
265+
"\uD834 \uDD1E"
266+
267+
"#);
268+
269+
assert!(err.is_err());
270+
}

0 commit comments

Comments
 (0)