1 #[macro_use]
2 extern crate json;
3
4 use json::{ parse, JsonValue, JsonError, Null };
5
6 #[test]
is_as_string()7 fn is_as_string() {
8 let string = JsonValue::from("foo");
9
10 assert!(string.is_string());
11 assert_eq!(string.as_str().unwrap(), "foo");
12 }
13
14 #[test]
is_as_number()15 fn is_as_number() {
16 let number = JsonValue::from(42);
17
18 assert!(number.is_number());
19 assert_eq!(number.as_f64().unwrap(), 42.0f64);
20 assert_eq!(number.as_f32().unwrap(), 42.0f32);
21 assert_eq!(number.as_u64().unwrap(), 42u64);
22 assert_eq!(number.as_u32().unwrap(), 42u32);
23 assert_eq!(number.as_u16().unwrap(), 42u16);
24 assert_eq!(number.as_u8().unwrap(), 42u8);
25 assert_eq!(number.as_usize().unwrap(), 42usize);
26 assert_eq!(number.as_i64().unwrap(), 42i64);
27 assert_eq!(number.as_i32().unwrap(), 42i32);
28 assert_eq!(number.as_i16().unwrap(), 42i16);
29 assert_eq!(number.as_i8().unwrap(), 42i8);
30 assert_eq!(number.as_isize().unwrap(), 42isize);
31
32 let number = JsonValue::from(-1);
33
34 assert_eq!(number.as_u64(), None);
35 assert_eq!(number.as_u32(), None);
36 assert_eq!(number.as_u16(), None);
37 assert_eq!(number.as_u8(), None);
38 assert_eq!(number.as_usize(), None);
39 assert_eq!(number.as_i64(), Some(-1));
40 assert_eq!(number.as_i32(), Some(-1));
41 assert_eq!(number.as_i16(), Some(-1));
42 assert_eq!(number.as_i8(), Some(-1));
43 assert_eq!(number.as_isize(), Some(-1));
44
45 let number = JsonValue::from(40_000);
46
47 assert_eq!(number.as_u8(), None);
48 assert_eq!(number.as_u16(), Some(40_000));
49 assert_eq!(number.as_i8(), None);
50 assert_eq!(number.as_i16(), None);
51 assert_eq!(number.as_i32(), Some(40_000));
52
53 let number = JsonValue::from(-5.5);
54 assert_eq!(number.as_i8(), None);
55 assert_eq!(number.as_i16(), None);
56 assert_eq!(number.as_i32(), None);
57 assert_eq!(number.as_u8(), None);
58 assert_eq!(number.as_u16(), None);
59 assert_eq!(number.as_u32(), None);
60 }
61
62 #[test]
as_fixed_point()63 fn as_fixed_point() {
64 let number = JsonValue::from(3.14);
65
66 assert_eq!(number.as_fixed_point_u64(4).unwrap(), 31400_u64);
67 assert_eq!(number.as_fixed_point_u64(2).unwrap(), 314_u64);
68 assert_eq!(number.as_fixed_point_u64(0).unwrap(), 3_u64);
69
70 assert_eq!(number.as_fixed_point_i64(4).unwrap(), 31400_i64);
71 assert_eq!(number.as_fixed_point_i64(2).unwrap(), 314_i64);
72 assert_eq!(number.as_fixed_point_i64(0).unwrap(), 3_i64);
73
74 let number = JsonValue::from(-3.14);
75
76 assert_eq!(number.as_fixed_point_u64(4), None);
77 assert_eq!(number.as_fixed_point_u64(2), None);
78 assert_eq!(number.as_fixed_point_u64(0), None);
79
80 assert_eq!(number.as_fixed_point_i64(4).unwrap(), -31400_i64);
81 assert_eq!(number.as_fixed_point_i64(2).unwrap(), -314_i64);
82 assert_eq!(number.as_fixed_point_i64(0).unwrap(), -3_i64);
83 }
84
85 #[test]
is_as_boolean()86 fn is_as_boolean() {
87 let boolean = JsonValue::Boolean(true);
88
89 assert!(boolean.is_boolean());
90 assert_eq!(boolean.as_bool().unwrap(), true);
91 }
92
93 #[test]
is_true()94 fn is_true() {
95 let boolean = JsonValue::Boolean(true);
96
97 assert_eq!(boolean, true);
98 }
99
100 #[test]
is_false()101 fn is_false() {
102 let boolean = JsonValue::Boolean(false);
103
104 assert_eq!(boolean, false);
105 }
106
107 #[test]
is_null()108 fn is_null() {
109 let null = JsonValue::Null;
110
111 assert!(null.is_null());
112 }
113
114 #[test]
is_empty()115 fn is_empty() {
116 assert!(Null.is_empty());
117 assert!(json::from(0).is_empty());
118 assert!(json::from("").is_empty());
119 assert!(json::from(false).is_empty());
120 assert!(array![].is_empty());
121 assert!(object!{}.is_empty());
122
123 assert!(!json::from(1).is_empty());
124 assert!(!json::from("foo").is_empty());
125 assert!(!json::from(true).is_empty());
126 assert!(!array![0].is_empty());
127 assert!(!object!{ foo: false }.is_empty());
128 }
129
130 #[test]
array_len()131 fn array_len() {
132 let data = array![0, 1, 2, 3];
133
134 assert_eq!(data.len(), 4);
135 }
136
137 #[test]
array_contains()138 fn array_contains() {
139 let data = array![true, null, 3.14, "foo"];
140
141 assert!(data.contains(true));
142 assert!(data.contains(Null));
143 assert!(data.contains(3.14));
144 assert!(data.contains("foo"));
145
146 assert!(!data.contains(false));
147 assert!(!data.contains(42));
148 assert!(!data.contains("bar"));
149 }
150
151 #[test]
array_push()152 fn array_push() {
153 let mut data = array![1, 2];
154
155 data.push(3).unwrap();
156
157 assert_eq!(data, array![1, 2, 3]);
158 }
159
160 #[test]
array_pop()161 fn array_pop() {
162 let mut data = array![1, 2, 3];
163
164 assert_eq!(data.pop(), 3);
165 assert_eq!(data, array![1, 2]);
166 }
167
168 #[test]
array_remove()169 fn array_remove() {
170 let mut data = array![1, 2, 3];
171
172 assert_eq!(data.array_remove(1), 2);
173 assert_eq!(data, array![1, 3]);
174 // Test with index out of bounds
175 assert_eq!(data.array_remove(2), JsonValue::Null);
176 }
177
178 #[test]
array_members()179 fn array_members() {
180 let data = array![1, "foo"];
181
182 for member in data.members() {
183 assert!(!member.is_null());
184 }
185
186 let mut members = data.members();
187
188 assert_eq!(members.next().unwrap(), 1);
189 assert_eq!(members.next().unwrap(), "foo");
190 assert!(members.next().is_none());
191 }
192
193 #[test]
array_members_rev()194 fn array_members_rev() {
195 let data = array![1, "foo"];
196
197 for member in data.members() {
198 assert!(!member.is_null());
199 }
200
201 let mut members = data.members().rev();
202
203 assert_eq!(members.next().unwrap(), "foo");
204 assert_eq!(members.next().unwrap(), 1);
205 assert!(members.next().is_none());
206 }
207
208 #[test]
array_members_mut()209 fn array_members_mut() {
210 let mut data = array![null, null];
211
212 for member in data.members_mut() {
213 assert!(member.is_null());
214 *member = 100.into();
215 }
216
217 assert_eq!(data, array![100, 100]);
218 }
219
220 #[test]
array_members_mut_rev()221 fn array_members_mut_rev() {
222 let mut data = array![null, null];
223 let mut item = 100;
224
225 for member in data.members_mut().rev() {
226 assert!(member.is_null());
227 *member = item.into();
228 item += 1;
229 }
230
231 assert_eq!(data, array![item - 1, item - 2]);
232 }
233
234 #[test]
object_len()235 fn object_len() {
236 let data = object!{
237 a: true,
238 b: false
239 };
240
241 assert_eq!(data.len(), 2);
242 }
243
244 #[test]
object_remove()245 fn object_remove() {
246 let mut data = object!{
247 foo: "bar",
248 answer: 42
249 };
250
251 assert_eq!(data.remove("foo"), "bar");
252 assert_eq!(data, object!{ answer: 42 });
253 }
254
255 #[test]
object_entries()256 fn object_entries() {
257 let data = object!{
258 a: 1,
259 b: "foo"
260 };
261
262 for (_, value) in data.entries() {
263 assert!(!value.is_null());
264 }
265
266 let mut entries = data.entries();
267
268 let (key, value) = entries.next().unwrap();
269 assert_eq!(key, "a");
270 assert_eq!(value, 1);
271
272 let (key, value) = entries.next().unwrap();
273 assert_eq!(key, "b");
274 assert_eq!(value, "foo");
275
276 assert!(entries.next().is_none());
277 }
278
279 #[test]
object_entries_rev()280 fn object_entries_rev() {
281 let data = object!{
282 a: 1,
283 b: "foo"
284 };
285
286 for (_, value) in data.entries().rev() {
287 assert!(!value.is_null());
288 }
289
290 let mut entries = data.entries().rev();
291
292 let (key, value) = entries.next().unwrap();
293 assert_eq!(key, "b");
294 assert_eq!(value, "foo");
295
296 let (key, value) = entries.next().unwrap();
297 assert_eq!(key, "a");
298 assert_eq!(value, 1);
299
300 assert!(entries.next().is_none());
301 }
302
303 #[test]
object_entries_mut()304 fn object_entries_mut() {
305 let mut data = object!{
306 a: null,
307 b: null
308 };
309
310 for (_, value) in data.entries_mut() {
311 assert!(value.is_null());
312 *value = 100.into();
313 }
314
315 assert_eq!(data, object!{
316 a: 100,
317 b: 100
318 });
319 }
320
321 #[test]
object_entries_mut_rev()322 fn object_entries_mut_rev() {
323 let mut data = object!{
324 a: null,
325 b: null
326 };
327 let mut item = 100;
328
329 for (_, value) in data.entries_mut().rev() {
330 assert!(value.is_null());
331 *value = item.into();
332 item += 1;
333 }
334
335 assert_eq!(data, object!{
336 a: item - 1,
337 b: item - 2
338 });
339 }
340
341 #[test]
object_dump_minified()342 fn object_dump_minified() {
343 let object = object!{
344 name: "Maciej",
345 age: 30
346 };
347
348 assert_eq!(object.dump(), "{\"name\":\"Maciej\",\"age\":30}");
349 }
350
351 #[test]
object_dump_pretty()352 fn object_dump_pretty() {
353 let object = object!{
354 name: "Urlich",
355 age: 50,
356 parents: {
357 mother: "Helga",
358 father: "Brutus"
359 },
360 cars: [ "Golf", "Mercedes", "Porsche" ]
361 };
362
363 assert_eq!(object.pretty(2),
364 "{\n \"name\": \"Urlich\",\n \"age\": 50,\n \"parents\": {\n \"mother\": \"Helga\",\n \"father\": \"Brutus\"\n },\n \"cars\": [\n \"Golf\",\n \"Mercedes\",\n \"Porsche\"\n ]\n}");
365 }
366
367 #[test]
null_len()368 fn null_len() {
369 let data = json::Null;
370
371 assert_eq!(data.len(), 0);
372 }
373
374 #[test]
index_by_str()375 fn index_by_str() {
376 let data = object!{
377 foo: "bar"
378 };
379
380 assert_eq!(data["foo"], "bar");
381 }
382
383 #[test]
index_by_string()384 fn index_by_string() {
385 let data = object!{
386 "foo": "bar"
387 };
388
389 assert_eq!(data["foo".to_string()], "bar");
390 }
391
392 #[test]
index_by_string_ref()393 fn index_by_string_ref() {
394 let data = object!{
395 foo: "bar"
396 };
397
398 let key = "foo".to_string();
399 let ref key_ref = key;
400
401 assert_eq!(data[key_ref], "bar");
402 }
403
404 #[test]
index_mut_by_str()405 fn index_mut_by_str() {
406 let mut data = object!{
407 foo: null
408 };
409
410 data["foo"] = "bar".into();
411
412 assert_eq!(data["foo"], "bar");
413 }
414
415 #[test]
index_mut_by_string()416 fn index_mut_by_string() {
417 let mut data = object!{
418 foo: null
419 };
420
421 data["foo".to_string()] = "bar".into();
422
423 assert_eq!(data["foo"], "bar");
424 }
425
426 #[test]
index_mut_by_string_ref()427 fn index_mut_by_string_ref() {
428 let mut data = object!{
429 foo: null
430 };
431
432 let key = "foo".to_string();
433 let ref key_ref = key;
434
435 data[key_ref] = "bar".into();
436
437 assert_eq!(data["foo"], "bar");
438 }
439
440 #[test]
object_index_by_str()441 fn object_index_by_str() {
442 let val = object!{
443 foo: "bar"
444 };
445 if let JsonValue::Object(data) = val {
446 assert_eq!(data["foo"], "bar");
447 }
448 }
449
450 #[test]
object_index_by_string()451 fn object_index_by_string() {
452 let val = object!{
453 foo: "bar"
454 };
455
456 if let JsonValue::Object(data) = val {
457 assert_eq!(data["foo".to_string()], "bar");
458 }
459 }
460
461 #[test]
object_index_by_string_ref()462 fn object_index_by_string_ref() {
463 let val = object!{
464 foo: "bar"
465 };
466
467 let key = "foo".to_string();
468 let ref key_ref = key;
469
470 if let JsonValue::Object(data) = val {
471 assert_eq!(data[key_ref], "bar");
472 }
473 }
474
475 #[test]
object_index_mut_by_str()476 fn object_index_mut_by_str() {
477 let val = object!{
478 foo: null
479 };
480
481 if let JsonValue::Object(mut data) = val {
482 data["foo"] = "bar".into();
483
484 assert_eq!(data["foo"], "bar");
485 }
486 }
487
488 #[test]
object_index_mut_by_string()489 fn object_index_mut_by_string() {
490 let val = object!{
491 foo: null
492 };
493
494 if let JsonValue::Object(mut data) = val {
495 data["foo".to_string()] = "bar".into();
496
497 assert_eq!(data["foo"], "bar");
498 }
499 }
500
501 #[test]
object_index_mut_by_string_ref()502 fn object_index_mut_by_string_ref() {
503 let val = object!{
504 foo: null
505 };
506
507 let key = "foo".to_string();
508 let ref key_ref = key;
509
510 if let JsonValue::Object(mut data) = val {
511 data[key_ref] = "bar".into();
512
513 assert_eq!(data["foo"], "bar");
514 }
515 }
516
517 #[test]
fmt_string()518 fn fmt_string() {
519 let data: JsonValue = "foobar".into();
520
521 assert_eq!(format!("{}", data), "foobar");
522 assert_eq!(format!("{:#}", data), r#""foobar""#);
523 }
524
525 #[test]
fmt_number()526 fn fmt_number() {
527 let data: JsonValue = 42.into();
528
529 assert_eq!(format!("{}", data), "42");
530 assert_eq!(format!("{:#}", data), "42");
531 }
532
533 #[test]
fmt_boolean()534 fn fmt_boolean() {
535 let data: JsonValue = true.into();
536
537 assert_eq!(format!("{}", data), "true");
538 assert_eq!(format!("{:#}", data), "true");
539 }
540
541 #[test]
fmt_null()542 fn fmt_null() {
543 let data = Null;
544
545 assert_eq!(format!("{}", data), "null");
546 assert_eq!(format!("{:#}", data), "null");
547 }
548
549 #[test]
fmt_array()550 fn fmt_array() {
551 let data = array![1, true, "three"];
552
553 assert_eq!(format!("{}", data), r#"[1,true,"three"]"#);
554 assert_eq!(format!("{:#}", data), "[\n 1,\n true,\n \"three\"\n]");
555 }
556
557 #[test]
fmt_object()558 fn fmt_object() {
559 let data = object!{
560 foo: "bar",
561 answer: 42
562 };
563
564 assert_eq!(format!("{}", data), r#"{"foo":"bar","answer":42}"#);
565 assert_eq!(format!("{:#}", data), "{\n \"foo\": \"bar\",\n \"answer\": 42\n}");
566 }
567
568 #[test]
error_unexpected_character()569 fn error_unexpected_character() {
570 let err = parse("\n\nnulX\n").unwrap_err();
571
572 assert_eq!(err, JsonError::UnexpectedCharacter {
573 ch: 'X',
574 line: 3,
575 column: 4,
576 });
577
578 assert_eq!(format!("{}", err), "Unexpected character: X at (3:4)");
579 }
580
581 #[test]
error_unexpected_unicode_character()582 fn error_unexpected_unicode_character() {
583 let err = parse("\n\nnul\n").unwrap_err();
584
585 assert_eq!(err, JsonError::UnexpectedCharacter {
586 ch: '',
587 line: 3,
588 column: 4,
589 });
590
591 assert_eq!(format!("{}", err), "Unexpected character: at (3:4)");
592 }
593
594 #[test]
error_unexpected_token()595 fn error_unexpected_token() {
596 let err = parse("\n [\n null,\n ] \n").unwrap_err();
597
598 assert_eq!(err, JsonError::UnexpectedCharacter {
599 ch: ']',
600 line: 4,
601 column: 3,
602 });
603
604 assert_eq!(format!("{}", err), "Unexpected character: ] at (4:3)");
605 }
606
607 #[test]
writer_generator()608 fn writer_generator() {
609 let data = object!{
610 foo: ["bar", 100, true]
611 };
612
613 let mut buf = Vec::new();
614
615 data.write(&mut buf).expect("Can't fail with a Vec");
616
617 assert_eq!(String::from_utf8(buf).unwrap(), r#"{"foo":["bar",100,true]}"#);
618 }
619
620 #[test]
pretty_writer_generator()621 fn pretty_writer_generator() {
622 let data = object!{
623 foo: ["bar", 100, true]
624 };
625
626 let mut buf = Vec::new();
627
628 data.write_pretty(&mut buf, 4).expect("Can't fail with a Vec");
629
630 assert_eq!(String::from_utf8(buf).unwrap(), "{\n \"foo\": [\n \"bar\",\n 100,\n true\n ]\n}");
631 }
632
633 #[test]
equality()634 fn equality() {
635 let left = object!{
636 foo: ["bar", 100, true]
637 };
638
639 let left_copy = object!{
640 foo: ["bar", 100, true]
641 };
642
643 let left_string = object!{
644 foo: [JsonValue::String("bar".to_string()), 100, true]
645 };
646
647 let left_short = object!{
648 foo: [JsonValue::Short(unsafe { json::short::Short::from_slice("bar") }), 100, true]
649 };
650
651 let change_bool = object!{
652 foo: ["bar", 100, false]
653 };
654
655 let change_string = object!{
656 foo: [JsonValue::String("sna".to_string()), 100, true]
657 };
658
659 let change_short = object!{
660 foo: [JsonValue::Short(unsafe { json::short::Short::from_slice("sna") }), 100, true]
661 };
662
663 assert_eq!(left, left_copy);
664 assert_eq!(left, left_string);
665 assert_eq!(left, left_short);
666 assert_ne!(left, change_bool);
667 assert_ne!(left, change_string);
668 assert_ne!(left, change_short);
669 }
670