1 #![allow(
2 clippy::derive_partial_eq_without_eq,
3 clippy::empty_enum,
4 clippy::unreadable_literal
5 )]
6 #![cfg_attr(feature = "unstable", feature(never_type))]
7
8 use serde::de::{Deserialize, IntoDeserializer};
9 use serde_derive::Deserialize;
10 use serde_test::{assert_de_tokens_error, Token};
11 use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet};
12 use std::ffi::{CStr, CString};
13 use std::num::{
14 NonZeroI128, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI8, NonZeroIsize, NonZeroU128,
15 NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU8, NonZeroUsize, Wrapping,
16 };
17 use std::time::{Duration, SystemTime};
18
19 #[derive(Copy, Clone, PartialEq, Debug, Deserialize)]
20 struct UnitStruct;
21
22 #[derive(PartialEq, Debug, Deserialize)]
23 struct Struct {
24 a: i32,
25 b: i32,
26 #[serde(skip_deserializing)]
27 c: i32,
28 }
29
30 #[derive(PartialEq, Debug, Deserialize)]
31 #[serde(deny_unknown_fields)]
32 struct StructDenyUnknown {
33 a: i32,
34 #[serde(skip_deserializing)]
35 b: i32,
36 }
37
38 #[derive(PartialEq, Debug, Deserialize)]
39 #[serde(deny_unknown_fields)]
40 struct StructSkipAllDenyUnknown {
41 #[serde(skip_deserializing)]
42 a: i32,
43 }
44
45 #[derive(Default, PartialEq, Debug)]
46 struct NotDeserializable;
47
48 #[derive(PartialEq, Debug, Deserialize)]
49 enum Enum {
50 #[allow(dead_code)]
51 #[serde(skip_deserializing)]
52 Skipped,
53 Unit,
54 Simple(i32),
55 Seq(i32, i32, i32),
56 Map {
57 a: i32,
58 b: i32,
59 c: i32,
60 },
61 SimpleWithSkipped(#[serde(skip_deserializing)] NotDeserializable),
62 }
63
64 #[derive(PartialEq, Debug, Deserialize)]
65 enum EnumSkipAll {
66 #[allow(dead_code)]
67 #[serde(skip_deserializing)]
68 Skipped,
69 }
70
71 #[test]
test_i8()72 fn test_i8() {
73 let test = assert_de_tokens_error::<i8>;
74
75 // from signed
76 test(
77 &[Token::I16(-129)],
78 "invalid value: integer `-129`, expected i8",
79 );
80 test(
81 &[Token::I32(-129)],
82 "invalid value: integer `-129`, expected i8",
83 );
84 test(
85 &[Token::I64(-129)],
86 "invalid value: integer `-129`, expected i8",
87 );
88 test(
89 &[Token::I16(128)],
90 "invalid value: integer `128`, expected i8",
91 );
92 test(
93 &[Token::I32(128)],
94 "invalid value: integer `128`, expected i8",
95 );
96 test(
97 &[Token::I64(128)],
98 "invalid value: integer `128`, expected i8",
99 );
100
101 // from unsigned
102 test(
103 &[Token::U8(128)],
104 "invalid value: integer `128`, expected i8",
105 );
106 test(
107 &[Token::U16(128)],
108 "invalid value: integer `128`, expected i8",
109 );
110 test(
111 &[Token::U32(128)],
112 "invalid value: integer `128`, expected i8",
113 );
114 test(
115 &[Token::U64(128)],
116 "invalid value: integer `128`, expected i8",
117 );
118 }
119
120 #[test]
test_i16()121 fn test_i16() {
122 let test = assert_de_tokens_error::<i16>;
123
124 // from signed
125 test(
126 &[Token::I32(-32769)],
127 "invalid value: integer `-32769`, expected i16",
128 );
129 test(
130 &[Token::I64(-32769)],
131 "invalid value: integer `-32769`, expected i16",
132 );
133 test(
134 &[Token::I32(32768)],
135 "invalid value: integer `32768`, expected i16",
136 );
137 test(
138 &[Token::I64(32768)],
139 "invalid value: integer `32768`, expected i16",
140 );
141
142 // from unsigned
143 test(
144 &[Token::U16(32768)],
145 "invalid value: integer `32768`, expected i16",
146 );
147 test(
148 &[Token::U32(32768)],
149 "invalid value: integer `32768`, expected i16",
150 );
151 test(
152 &[Token::U64(32768)],
153 "invalid value: integer `32768`, expected i16",
154 );
155 }
156
157 #[test]
test_i32()158 fn test_i32() {
159 let test = assert_de_tokens_error::<i32>;
160
161 // from signed
162 test(
163 &[Token::I64(-2147483649)],
164 "invalid value: integer `-2147483649`, expected i32",
165 );
166 test(
167 &[Token::I64(2147483648)],
168 "invalid value: integer `2147483648`, expected i32",
169 );
170
171 // from unsigned
172 test(
173 &[Token::U32(2147483648)],
174 "invalid value: integer `2147483648`, expected i32",
175 );
176 test(
177 &[Token::U64(2147483648)],
178 "invalid value: integer `2147483648`, expected i32",
179 );
180 }
181
182 #[test]
test_i64()183 fn test_i64() {
184 let test = assert_de_tokens_error::<i64>;
185
186 // from unsigned
187 test(
188 &[Token::U64(9223372036854775808)],
189 "invalid value: integer `9223372036854775808`, expected i64",
190 );
191 }
192
193 #[test]
test_i128()194 fn test_i128() {
195 let deserializer = <i128 as IntoDeserializer>::into_deserializer(1);
196 let error = <&str>::deserialize(deserializer).unwrap_err();
197 assert_eq!(
198 error.to_string(),
199 "invalid type: integer `1` as i128, expected a borrowed string",
200 );
201 }
202
203 #[test]
test_u8()204 fn test_u8() {
205 let test = assert_de_tokens_error::<u8>;
206
207 // from signed
208 test(&[Token::I8(-1)], "invalid value: integer `-1`, expected u8");
209 test(
210 &[Token::I16(-1)],
211 "invalid value: integer `-1`, expected u8",
212 );
213 test(
214 &[Token::I32(-1)],
215 "invalid value: integer `-1`, expected u8",
216 );
217 test(
218 &[Token::I64(-1)],
219 "invalid value: integer `-1`, expected u8",
220 );
221 test(
222 &[Token::I16(256)],
223 "invalid value: integer `256`, expected u8",
224 );
225 test(
226 &[Token::I32(256)],
227 "invalid value: integer `256`, expected u8",
228 );
229 test(
230 &[Token::I64(256)],
231 "invalid value: integer `256`, expected u8",
232 );
233
234 // from unsigned
235 test(
236 &[Token::U16(256)],
237 "invalid value: integer `256`, expected u8",
238 );
239 test(
240 &[Token::U32(256)],
241 "invalid value: integer `256`, expected u8",
242 );
243 test(
244 &[Token::U64(256)],
245 "invalid value: integer `256`, expected u8",
246 );
247 }
248
249 #[test]
test_u16()250 fn test_u16() {
251 let test = assert_de_tokens_error::<u16>;
252
253 // from signed
254 test(
255 &[Token::I8(-1)],
256 "invalid value: integer `-1`, expected u16",
257 );
258 test(
259 &[Token::I16(-1)],
260 "invalid value: integer `-1`, expected u16",
261 );
262 test(
263 &[Token::I32(-1)],
264 "invalid value: integer `-1`, expected u16",
265 );
266 test(
267 &[Token::I64(-1)],
268 "invalid value: integer `-1`, expected u16",
269 );
270 test(
271 &[Token::I32(65536)],
272 "invalid value: integer `65536`, expected u16",
273 );
274 test(
275 &[Token::I64(65536)],
276 "invalid value: integer `65536`, expected u16",
277 );
278
279 // from unsigned
280 test(
281 &[Token::U32(65536)],
282 "invalid value: integer `65536`, expected u16",
283 );
284 test(
285 &[Token::U64(65536)],
286 "invalid value: integer `65536`, expected u16",
287 );
288 }
289
290 #[test]
test_u32()291 fn test_u32() {
292 let test = assert_de_tokens_error::<u32>;
293
294 // from signed
295 test(
296 &[Token::I8(-1)],
297 "invalid value: integer `-1`, expected u32",
298 );
299 test(
300 &[Token::I16(-1)],
301 "invalid value: integer `-1`, expected u32",
302 );
303 test(
304 &[Token::I32(-1)],
305 "invalid value: integer `-1`, expected u32",
306 );
307 test(
308 &[Token::I64(-1)],
309 "invalid value: integer `-1`, expected u32",
310 );
311 test(
312 &[Token::I64(4294967296)],
313 "invalid value: integer `4294967296`, expected u32",
314 );
315
316 // from unsigned
317 test(
318 &[Token::U64(4294967296)],
319 "invalid value: integer `4294967296`, expected u32",
320 );
321 }
322
323 #[test]
test_u64()324 fn test_u64() {
325 let test = assert_de_tokens_error::<u64>;
326
327 // from signed
328 test(
329 &[Token::I8(-1)],
330 "invalid value: integer `-1`, expected u64",
331 );
332 test(
333 &[Token::I16(-1)],
334 "invalid value: integer `-1`, expected u64",
335 );
336 test(
337 &[Token::I32(-1)],
338 "invalid value: integer `-1`, expected u64",
339 );
340 test(
341 &[Token::I64(-1)],
342 "invalid value: integer `-1`, expected u64",
343 );
344
345 let deserializer = <u64 as IntoDeserializer>::into_deserializer(1);
346 let error = <&str>::deserialize(deserializer).unwrap_err();
347 assert_eq!(
348 error.to_string(),
349 "invalid type: integer `1`, expected a borrowed string",
350 );
351 }
352
353 #[test]
test_u128()354 fn test_u128() {
355 let test = assert_de_tokens_error::<u128>;
356
357 // from signed
358 test(
359 &[Token::I8(-1)],
360 "invalid value: integer `-1`, expected u128",
361 );
362 test(
363 &[Token::I16(-1)],
364 "invalid value: integer `-1`, expected u128",
365 );
366 test(
367 &[Token::I32(-1)],
368 "invalid value: integer `-1`, expected u128",
369 );
370 test(
371 &[Token::I64(-1)],
372 "invalid value: integer `-1`, expected u128",
373 );
374
375 let deserializer = <u128 as IntoDeserializer>::into_deserializer(1);
376 let error = <&str>::deserialize(deserializer).unwrap_err();
377 assert_eq!(
378 error.to_string(),
379 "invalid type: integer `1` as u128, expected a borrowed string",
380 );
381 }
382
383 #[test]
test_usize()384 fn test_usize() {
385 let test = assert_de_tokens_error::<usize>;
386
387 // from signed
388 test(
389 &[Token::I8(-1)],
390 "invalid value: integer `-1`, expected usize",
391 );
392 test(
393 &[Token::I16(-1)],
394 "invalid value: integer `-1`, expected usize",
395 );
396 test(
397 &[Token::I32(-1)],
398 "invalid value: integer `-1`, expected usize",
399 );
400 test(
401 &[Token::I64(-1)],
402 "invalid value: integer `-1`, expected usize",
403 );
404 }
405
406 #[test]
test_nonzero_i8()407 fn test_nonzero_i8() {
408 let test = assert_de_tokens_error::<NonZeroI8>;
409
410 // from zero
411 test(
412 &[Token::I8(0)],
413 "invalid value: integer `0`, expected a nonzero i8",
414 );
415 test(
416 &[Token::I16(0)],
417 "invalid value: integer `0`, expected a nonzero i8",
418 );
419 test(
420 &[Token::I32(0)],
421 "invalid value: integer `0`, expected a nonzero i8",
422 );
423 test(
424 &[Token::I64(0)],
425 "invalid value: integer `0`, expected a nonzero i8",
426 );
427 test(
428 &[Token::U8(0)],
429 "invalid value: integer `0`, expected a nonzero i8",
430 );
431 test(
432 &[Token::U16(0)],
433 "invalid value: integer `0`, expected a nonzero i8",
434 );
435 test(
436 &[Token::U32(0)],
437 "invalid value: integer `0`, expected a nonzero i8",
438 );
439 test(
440 &[Token::U64(0)],
441 "invalid value: integer `0`, expected a nonzero i8",
442 );
443
444 // from signed
445 test(
446 &[Token::I16(-129)],
447 "invalid value: integer `-129`, expected a nonzero i8",
448 );
449 test(
450 &[Token::I32(-129)],
451 "invalid value: integer `-129`, expected a nonzero i8",
452 );
453 test(
454 &[Token::I64(-129)],
455 "invalid value: integer `-129`, expected a nonzero i8",
456 );
457 test(
458 &[Token::I16(128)],
459 "invalid value: integer `128`, expected a nonzero i8",
460 );
461 test(
462 &[Token::I32(128)],
463 "invalid value: integer `128`, expected a nonzero i8",
464 );
465 test(
466 &[Token::I64(128)],
467 "invalid value: integer `128`, expected a nonzero i8",
468 );
469
470 // from unsigned
471 test(
472 &[Token::U8(128)],
473 "invalid value: integer `128`, expected a nonzero i8",
474 );
475 test(
476 &[Token::U16(128)],
477 "invalid value: integer `128`, expected a nonzero i8",
478 );
479 test(
480 &[Token::U32(128)],
481 "invalid value: integer `128`, expected a nonzero i8",
482 );
483 test(
484 &[Token::U64(128)],
485 "invalid value: integer `128`, expected a nonzero i8",
486 );
487 }
488
489 #[test]
test_nonzero_i16()490 fn test_nonzero_i16() {
491 let test = assert_de_tokens_error::<NonZeroI16>;
492
493 // from zero
494 test(
495 &[Token::I8(0)],
496 "invalid value: integer `0`, expected a nonzero i16",
497 );
498 test(
499 &[Token::I16(0)],
500 "invalid value: integer `0`, expected a nonzero i16",
501 );
502 test(
503 &[Token::I32(0)],
504 "invalid value: integer `0`, expected a nonzero i16",
505 );
506 test(
507 &[Token::I64(0)],
508 "invalid value: integer `0`, expected a nonzero i16",
509 );
510 test(
511 &[Token::U8(0)],
512 "invalid value: integer `0`, expected a nonzero i16",
513 );
514 test(
515 &[Token::U16(0)],
516 "invalid value: integer `0`, expected a nonzero i16",
517 );
518 test(
519 &[Token::U32(0)],
520 "invalid value: integer `0`, expected a nonzero i16",
521 );
522 test(
523 &[Token::U64(0)],
524 "invalid value: integer `0`, expected a nonzero i16",
525 );
526
527 // from signed
528 test(
529 &[Token::I32(-32769)],
530 "invalid value: integer `-32769`, expected a nonzero i16",
531 );
532 test(
533 &[Token::I64(-32769)],
534 "invalid value: integer `-32769`, expected a nonzero i16",
535 );
536 test(
537 &[Token::I32(32768)],
538 "invalid value: integer `32768`, expected a nonzero i16",
539 );
540 test(
541 &[Token::I64(32768)],
542 "invalid value: integer `32768`, expected a nonzero i16",
543 );
544
545 // from unsigned
546 test(
547 &[Token::U16(32768)],
548 "invalid value: integer `32768`, expected a nonzero i16",
549 );
550 test(
551 &[Token::U32(32768)],
552 "invalid value: integer `32768`, expected a nonzero i16",
553 );
554 test(
555 &[Token::U64(32768)],
556 "invalid value: integer `32768`, expected a nonzero i16",
557 );
558 }
559
560 #[test]
test_nonzero_i32()561 fn test_nonzero_i32() {
562 let test = assert_de_tokens_error::<NonZeroI32>;
563
564 // from zero
565 test(
566 &[Token::I8(0)],
567 "invalid value: integer `0`, expected a nonzero i32",
568 );
569 test(
570 &[Token::I16(0)],
571 "invalid value: integer `0`, expected a nonzero i32",
572 );
573 test(
574 &[Token::I32(0)],
575 "invalid value: integer `0`, expected a nonzero i32",
576 );
577 test(
578 &[Token::I64(0)],
579 "invalid value: integer `0`, expected a nonzero i32",
580 );
581 test(
582 &[Token::U8(0)],
583 "invalid value: integer `0`, expected a nonzero i32",
584 );
585 test(
586 &[Token::U16(0)],
587 "invalid value: integer `0`, expected a nonzero i32",
588 );
589 test(
590 &[Token::U32(0)],
591 "invalid value: integer `0`, expected a nonzero i32",
592 );
593 test(
594 &[Token::U64(0)],
595 "invalid value: integer `0`, expected a nonzero i32",
596 );
597
598 // from signed
599 test(
600 &[Token::I64(-2147483649)],
601 "invalid value: integer `-2147483649`, expected a nonzero i32",
602 );
603 test(
604 &[Token::I64(2147483648)],
605 "invalid value: integer `2147483648`, expected a nonzero i32",
606 );
607
608 // from unsigned
609 test(
610 &[Token::U32(2147483648)],
611 "invalid value: integer `2147483648`, expected a nonzero i32",
612 );
613 test(
614 &[Token::U64(2147483648)],
615 "invalid value: integer `2147483648`, expected a nonzero i32",
616 );
617 }
618
619 #[test]
test_nonzero_i64()620 fn test_nonzero_i64() {
621 let test = assert_de_tokens_error::<NonZeroI64>;
622
623 // from zero
624 test(
625 &[Token::I8(0)],
626 "invalid value: integer `0`, expected a nonzero i64",
627 );
628 test(
629 &[Token::I16(0)],
630 "invalid value: integer `0`, expected a nonzero i64",
631 );
632 test(
633 &[Token::I32(0)],
634 "invalid value: integer `0`, expected a nonzero i64",
635 );
636 test(
637 &[Token::I64(0)],
638 "invalid value: integer `0`, expected a nonzero i64",
639 );
640 test(
641 &[Token::U8(0)],
642 "invalid value: integer `0`, expected a nonzero i64",
643 );
644 test(
645 &[Token::U16(0)],
646 "invalid value: integer `0`, expected a nonzero i64",
647 );
648 test(
649 &[Token::U32(0)],
650 "invalid value: integer `0`, expected a nonzero i64",
651 );
652 test(
653 &[Token::U64(0)],
654 "invalid value: integer `0`, expected a nonzero i64",
655 );
656
657 // from unsigned
658 test(
659 &[Token::U64(9223372036854775808)],
660 "invalid value: integer `9223372036854775808`, expected a nonzero i64",
661 );
662 }
663
664 #[test]
test_nonzero_i128()665 fn test_nonzero_i128() {
666 let test = assert_de_tokens_error::<NonZeroI128>;
667
668 // from zero
669 test(
670 &[Token::I8(0)],
671 "invalid value: integer `0`, expected a nonzero i128",
672 );
673 test(
674 &[Token::I16(0)],
675 "invalid value: integer `0`, expected a nonzero i128",
676 );
677 test(
678 &[Token::I32(0)],
679 "invalid value: integer `0`, expected a nonzero i128",
680 );
681 test(
682 &[Token::I64(0)],
683 "invalid value: integer `0`, expected a nonzero i128",
684 );
685 test(
686 &[Token::U8(0)],
687 "invalid value: integer `0`, expected a nonzero i128",
688 );
689 test(
690 &[Token::U16(0)],
691 "invalid value: integer `0`, expected a nonzero i128",
692 );
693 test(
694 &[Token::U32(0)],
695 "invalid value: integer `0`, expected a nonzero i128",
696 );
697 test(
698 &[Token::U64(0)],
699 "invalid value: integer `0`, expected a nonzero i128",
700 );
701 }
702
703 #[test]
test_nonzero_isize()704 fn test_nonzero_isize() {
705 let test = assert_de_tokens_error::<NonZeroIsize>;
706
707 // from zero
708 test(
709 &[Token::I8(0)],
710 "invalid value: integer `0`, expected a nonzero isize",
711 );
712 test(
713 &[Token::I16(0)],
714 "invalid value: integer `0`, expected a nonzero isize",
715 );
716 test(
717 &[Token::I32(0)],
718 "invalid value: integer `0`, expected a nonzero isize",
719 );
720 test(
721 &[Token::I64(0)],
722 "invalid value: integer `0`, expected a nonzero isize",
723 );
724 test(
725 &[Token::U8(0)],
726 "invalid value: integer `0`, expected a nonzero isize",
727 );
728 test(
729 &[Token::U16(0)],
730 "invalid value: integer `0`, expected a nonzero isize",
731 );
732 test(
733 &[Token::U32(0)],
734 "invalid value: integer `0`, expected a nonzero isize",
735 );
736 test(
737 &[Token::U64(0)],
738 "invalid value: integer `0`, expected a nonzero isize",
739 );
740 }
741
742 #[test]
test_nonzero_u8()743 fn test_nonzero_u8() {
744 let test = assert_de_tokens_error::<NonZeroU8>;
745
746 // from zero
747 test(
748 &[Token::I8(0)],
749 "invalid value: integer `0`, expected a nonzero u8",
750 );
751 test(
752 &[Token::I16(0)],
753 "invalid value: integer `0`, expected a nonzero u8",
754 );
755 test(
756 &[Token::I32(0)],
757 "invalid value: integer `0`, expected a nonzero u8",
758 );
759 test(
760 &[Token::I64(0)],
761 "invalid value: integer `0`, expected a nonzero u8",
762 );
763 test(
764 &[Token::U8(0)],
765 "invalid value: integer `0`, expected a nonzero u8",
766 );
767 test(
768 &[Token::U16(0)],
769 "invalid value: integer `0`, expected a nonzero u8",
770 );
771 test(
772 &[Token::U32(0)],
773 "invalid value: integer `0`, expected a nonzero u8",
774 );
775 test(
776 &[Token::U64(0)],
777 "invalid value: integer `0`, expected a nonzero u8",
778 );
779
780 // from signed
781 test(
782 &[Token::I8(-1)],
783 "invalid value: integer `-1`, expected a nonzero u8",
784 );
785 test(
786 &[Token::I16(-1)],
787 "invalid value: integer `-1`, expected a nonzero u8",
788 );
789 test(
790 &[Token::I32(-1)],
791 "invalid value: integer `-1`, expected a nonzero u8",
792 );
793 test(
794 &[Token::I64(-1)],
795 "invalid value: integer `-1`, expected a nonzero u8",
796 );
797 test(
798 &[Token::I16(256)],
799 "invalid value: integer `256`, expected a nonzero u8",
800 );
801 test(
802 &[Token::I32(256)],
803 "invalid value: integer `256`, expected a nonzero u8",
804 );
805 test(
806 &[Token::I64(256)],
807 "invalid value: integer `256`, expected a nonzero u8",
808 );
809
810 // from unsigned
811 test(
812 &[Token::U16(256)],
813 "invalid value: integer `256`, expected a nonzero u8",
814 );
815 test(
816 &[Token::U32(256)],
817 "invalid value: integer `256`, expected a nonzero u8",
818 );
819 test(
820 &[Token::U64(256)],
821 "invalid value: integer `256`, expected a nonzero u8",
822 );
823 }
824
825 #[test]
test_nonzero_u16()826 fn test_nonzero_u16() {
827 let test = assert_de_tokens_error::<NonZeroU16>;
828
829 // from zero
830 test(
831 &[Token::I8(0)],
832 "invalid value: integer `0`, expected a nonzero u16",
833 );
834 test(
835 &[Token::I16(0)],
836 "invalid value: integer `0`, expected a nonzero u16",
837 );
838 test(
839 &[Token::I32(0)],
840 "invalid value: integer `0`, expected a nonzero u16",
841 );
842 test(
843 &[Token::I64(0)],
844 "invalid value: integer `0`, expected a nonzero u16",
845 );
846 test(
847 &[Token::U8(0)],
848 "invalid value: integer `0`, expected a nonzero u16",
849 );
850 test(
851 &[Token::U16(0)],
852 "invalid value: integer `0`, expected a nonzero u16",
853 );
854 test(
855 &[Token::U32(0)],
856 "invalid value: integer `0`, expected a nonzero u16",
857 );
858 test(
859 &[Token::U64(0)],
860 "invalid value: integer `0`, expected a nonzero u16",
861 );
862
863 // from signed
864 test(
865 &[Token::I8(-1)],
866 "invalid value: integer `-1`, expected a nonzero u16",
867 );
868 test(
869 &[Token::I16(-1)],
870 "invalid value: integer `-1`, expected a nonzero u16",
871 );
872 test(
873 &[Token::I32(-1)],
874 "invalid value: integer `-1`, expected a nonzero u16",
875 );
876 test(
877 &[Token::I64(-1)],
878 "invalid value: integer `-1`, expected a nonzero u16",
879 );
880 test(
881 &[Token::I32(65536)],
882 "invalid value: integer `65536`, expected a nonzero u16",
883 );
884 test(
885 &[Token::I64(65536)],
886 "invalid value: integer `65536`, expected a nonzero u16",
887 );
888
889 // from unsigned
890 test(
891 &[Token::U32(65536)],
892 "invalid value: integer `65536`, expected a nonzero u16",
893 );
894 test(
895 &[Token::U64(65536)],
896 "invalid value: integer `65536`, expected a nonzero u16",
897 );
898 }
899
900 #[test]
test_nonzero_u32()901 fn test_nonzero_u32() {
902 let test = assert_de_tokens_error::<NonZeroU32>;
903
904 // from zero
905 test(
906 &[Token::I8(0)],
907 "invalid value: integer `0`, expected a nonzero u32",
908 );
909 test(
910 &[Token::I16(0)],
911 "invalid value: integer `0`, expected a nonzero u32",
912 );
913 test(
914 &[Token::I32(0)],
915 "invalid value: integer `0`, expected a nonzero u32",
916 );
917 test(
918 &[Token::I64(0)],
919 "invalid value: integer `0`, expected a nonzero u32",
920 );
921 test(
922 &[Token::U8(0)],
923 "invalid value: integer `0`, expected a nonzero u32",
924 );
925 test(
926 &[Token::U16(0)],
927 "invalid value: integer `0`, expected a nonzero u32",
928 );
929 test(
930 &[Token::U32(0)],
931 "invalid value: integer `0`, expected a nonzero u32",
932 );
933 test(
934 &[Token::U64(0)],
935 "invalid value: integer `0`, expected a nonzero u32",
936 );
937
938 // from signed
939 test(
940 &[Token::I8(-1)],
941 "invalid value: integer `-1`, expected a nonzero u32",
942 );
943 test(
944 &[Token::I16(-1)],
945 "invalid value: integer `-1`, expected a nonzero u32",
946 );
947 test(
948 &[Token::I32(-1)],
949 "invalid value: integer `-1`, expected a nonzero u32",
950 );
951 test(
952 &[Token::I64(-1)],
953 "invalid value: integer `-1`, expected a nonzero u32",
954 );
955 test(
956 &[Token::I64(4294967296)],
957 "invalid value: integer `4294967296`, expected a nonzero u32",
958 );
959
960 // from unsigned
961 test(
962 &[Token::U64(4294967296)],
963 "invalid value: integer `4294967296`, expected a nonzero u32",
964 );
965 }
966
967 #[test]
test_nonzero_u64()968 fn test_nonzero_u64() {
969 let test = assert_de_tokens_error::<NonZeroU64>;
970
971 // from zero
972 test(
973 &[Token::I8(0)],
974 "invalid value: integer `0`, expected a nonzero u64",
975 );
976 test(
977 &[Token::I16(0)],
978 "invalid value: integer `0`, expected a nonzero u64",
979 );
980 test(
981 &[Token::I32(0)],
982 "invalid value: integer `0`, expected a nonzero u64",
983 );
984 test(
985 &[Token::I64(0)],
986 "invalid value: integer `0`, expected a nonzero u64",
987 );
988 test(
989 &[Token::U8(0)],
990 "invalid value: integer `0`, expected a nonzero u64",
991 );
992 test(
993 &[Token::U16(0)],
994 "invalid value: integer `0`, expected a nonzero u64",
995 );
996 test(
997 &[Token::U32(0)],
998 "invalid value: integer `0`, expected a nonzero u64",
999 );
1000 test(
1001 &[Token::U64(0)],
1002 "invalid value: integer `0`, expected a nonzero u64",
1003 );
1004
1005 // from signed
1006 test(
1007 &[Token::I8(-1)],
1008 "invalid value: integer `-1`, expected a nonzero u64",
1009 );
1010 test(
1011 &[Token::I16(-1)],
1012 "invalid value: integer `-1`, expected a nonzero u64",
1013 );
1014 test(
1015 &[Token::I32(-1)],
1016 "invalid value: integer `-1`, expected a nonzero u64",
1017 );
1018 test(
1019 &[Token::I64(-1)],
1020 "invalid value: integer `-1`, expected a nonzero u64",
1021 );
1022 }
1023
1024 #[test]
test_nonzero_u128()1025 fn test_nonzero_u128() {
1026 let test = assert_de_tokens_error::<NonZeroU128>;
1027
1028 // from zero
1029 test(
1030 &[Token::I8(0)],
1031 "invalid value: integer `0`, expected a nonzero u128",
1032 );
1033 test(
1034 &[Token::I16(0)],
1035 "invalid value: integer `0`, expected a nonzero u128",
1036 );
1037 test(
1038 &[Token::I32(0)],
1039 "invalid value: integer `0`, expected a nonzero u128",
1040 );
1041 test(
1042 &[Token::I64(0)],
1043 "invalid value: integer `0`, expected a nonzero u128",
1044 );
1045 test(
1046 &[Token::U8(0)],
1047 "invalid value: integer `0`, expected a nonzero u128",
1048 );
1049 test(
1050 &[Token::U16(0)],
1051 "invalid value: integer `0`, expected a nonzero u128",
1052 );
1053 test(
1054 &[Token::U32(0)],
1055 "invalid value: integer `0`, expected a nonzero u128",
1056 );
1057 test(
1058 &[Token::U64(0)],
1059 "invalid value: integer `0`, expected a nonzero u128",
1060 );
1061
1062 // from signed
1063 test(
1064 &[Token::I8(-1)],
1065 "invalid value: integer `-1`, expected a nonzero u128",
1066 );
1067 test(
1068 &[Token::I16(-1)],
1069 "invalid value: integer `-1`, expected a nonzero u128",
1070 );
1071 test(
1072 &[Token::I32(-1)],
1073 "invalid value: integer `-1`, expected a nonzero u128",
1074 );
1075 test(
1076 &[Token::I64(-1)],
1077 "invalid value: integer `-1`, expected a nonzero u128",
1078 );
1079 }
1080
1081 #[test]
test_nonzero_usize()1082 fn test_nonzero_usize() {
1083 let test = assert_de_tokens_error::<NonZeroUsize>;
1084
1085 // from zero
1086 test(
1087 &[Token::I8(0)],
1088 "invalid value: integer `0`, expected a nonzero usize",
1089 );
1090 test(
1091 &[Token::I16(0)],
1092 "invalid value: integer `0`, expected a nonzero usize",
1093 );
1094 test(
1095 &[Token::I32(0)],
1096 "invalid value: integer `0`, expected a nonzero usize",
1097 );
1098 test(
1099 &[Token::I64(0)],
1100 "invalid value: integer `0`, expected a nonzero usize",
1101 );
1102 test(
1103 &[Token::U8(0)],
1104 "invalid value: integer `0`, expected a nonzero usize",
1105 );
1106 test(
1107 &[Token::U16(0)],
1108 "invalid value: integer `0`, expected a nonzero usize",
1109 );
1110 test(
1111 &[Token::U32(0)],
1112 "invalid value: integer `0`, expected a nonzero usize",
1113 );
1114 test(
1115 &[Token::U64(0)],
1116 "invalid value: integer `0`, expected a nonzero usize",
1117 );
1118
1119 // from signed
1120 test(
1121 &[Token::I8(-1)],
1122 "invalid value: integer `-1`, expected a nonzero usize",
1123 );
1124 test(
1125 &[Token::I16(-1)],
1126 "invalid value: integer `-1`, expected a nonzero usize",
1127 );
1128 test(
1129 &[Token::I32(-1)],
1130 "invalid value: integer `-1`, expected a nonzero usize",
1131 );
1132 test(
1133 &[Token::I64(-1)],
1134 "invalid value: integer `-1`, expected a nonzero usize",
1135 );
1136 }
1137
1138 #[test]
test_unknown_field()1139 fn test_unknown_field() {
1140 assert_de_tokens_error::<StructDenyUnknown>(
1141 &[
1142 Token::Struct {
1143 name: "StructDenyUnknown",
1144 len: 1,
1145 },
1146 Token::Str("a"),
1147 Token::I32(0),
1148 Token::Str("d"),
1149 ],
1150 "unknown field `d`, expected `a`",
1151 );
1152 }
1153
1154 #[test]
test_skipped_field_is_unknown()1155 fn test_skipped_field_is_unknown() {
1156 assert_de_tokens_error::<StructDenyUnknown>(
1157 &[
1158 Token::Struct {
1159 name: "StructDenyUnknown",
1160 len: 1,
1161 },
1162 Token::Str("b"),
1163 ],
1164 "unknown field `b`, expected `a`",
1165 );
1166 }
1167
1168 #[test]
test_skip_all_deny_unknown()1169 fn test_skip_all_deny_unknown() {
1170 assert_de_tokens_error::<StructSkipAllDenyUnknown>(
1171 &[
1172 Token::Struct {
1173 name: "StructSkipAllDenyUnknown",
1174 len: 0,
1175 },
1176 Token::Str("a"),
1177 ],
1178 "unknown field `a`, there are no fields",
1179 );
1180 }
1181
1182 #[test]
test_unknown_variant()1183 fn test_unknown_variant() {
1184 assert_de_tokens_error::<Enum>(
1185 &[
1186 Token::UnitVariant { name: "Enum", variant: "Foo" },
1187 ],
1188 "unknown variant `Foo`, expected one of `Unit`, `Simple`, `Seq`, `Map`, `SimpleWithSkipped`",
1189 );
1190 }
1191
1192 #[test]
test_enum_skipped_variant()1193 fn test_enum_skipped_variant() {
1194 assert_de_tokens_error::<Enum>(
1195 &[
1196 Token::UnitVariant { name: "Enum", variant: "Skipped" },
1197 ],
1198 "unknown variant `Skipped`, expected one of `Unit`, `Simple`, `Seq`, `Map`, `SimpleWithSkipped`",
1199 );
1200 }
1201
1202 #[test]
test_enum_skip_all()1203 fn test_enum_skip_all() {
1204 assert_de_tokens_error::<EnumSkipAll>(
1205 &[Token::UnitVariant {
1206 name: "EnumSkipAll",
1207 variant: "Skipped",
1208 }],
1209 "unknown variant `Skipped`, there are no variants",
1210 );
1211 }
1212
1213 #[test]
test_duplicate_field_struct()1214 fn test_duplicate_field_struct() {
1215 assert_de_tokens_error::<Struct>(
1216 &[
1217 Token::Map { len: Some(3) },
1218 Token::Str("a"),
1219 Token::I32(1),
1220 Token::Str("a"),
1221 ],
1222 "duplicate field `a`",
1223 );
1224 }
1225
1226 #[test]
test_duplicate_field_enum()1227 fn test_duplicate_field_enum() {
1228 assert_de_tokens_error::<Enum>(
1229 &[
1230 Token::StructVariant {
1231 name: "Enum",
1232 variant: "Map",
1233 len: 3,
1234 },
1235 Token::Str("a"),
1236 Token::I32(1),
1237 Token::Str("a"),
1238 ],
1239 "duplicate field `a`",
1240 );
1241 }
1242
1243 #[test]
test_enum_out_of_range()1244 fn test_enum_out_of_range() {
1245 assert_de_tokens_error::<Enum>(
1246 &[Token::Enum { name: "Enum" }, Token::U32(5), Token::Unit],
1247 "invalid value: integer `5`, expected variant index 0 <= i < 5",
1248 );
1249 }
1250
1251 #[test]
test_short_tuple()1252 fn test_short_tuple() {
1253 assert_de_tokens_error::<(u8, u8, u8)>(
1254 &[Token::Tuple { len: 1 }, Token::U8(1), Token::TupleEnd],
1255 "invalid length 1, expected a tuple of size 3",
1256 );
1257 }
1258
1259 #[test]
test_short_array()1260 fn test_short_array() {
1261 assert_de_tokens_error::<[u8; 3]>(
1262 &[Token::Seq { len: Some(1) }, Token::U8(1), Token::SeqEnd],
1263 "invalid length 1, expected an array of length 3",
1264 );
1265 }
1266
1267 #[test]
test_cstring_internal_null()1268 fn test_cstring_internal_null() {
1269 assert_de_tokens_error::<CString>(
1270 &[Token::Bytes(b"a\0c")],
1271 "nul byte found in provided data at position: 1",
1272 );
1273 }
1274
1275 #[test]
test_cstring_internal_null_end()1276 fn test_cstring_internal_null_end() {
1277 assert_de_tokens_error::<CString>(
1278 &[Token::Bytes(b"ac\0")],
1279 "nul byte found in provided data at position: 2",
1280 );
1281 }
1282
1283 #[test]
test_unit_from_empty_seq()1284 fn test_unit_from_empty_seq() {
1285 assert_de_tokens_error::<()>(
1286 &[Token::Seq { len: Some(0) }, Token::SeqEnd],
1287 "invalid type: sequence, expected unit",
1288 );
1289 }
1290
1291 #[test]
test_unit_from_empty_seq_without_len()1292 fn test_unit_from_empty_seq_without_len() {
1293 assert_de_tokens_error::<()>(
1294 &[Token::Seq { len: None }, Token::SeqEnd],
1295 "invalid type: sequence, expected unit",
1296 );
1297 }
1298
1299 #[test]
test_unit_from_tuple_struct()1300 fn test_unit_from_tuple_struct() {
1301 assert_de_tokens_error::<()>(
1302 &[
1303 Token::TupleStruct {
1304 name: "Anything",
1305 len: 0,
1306 },
1307 Token::TupleStructEnd,
1308 ],
1309 "invalid type: sequence, expected unit",
1310 );
1311 }
1312
1313 #[test]
test_string_from_unit()1314 fn test_string_from_unit() {
1315 assert_de_tokens_error::<String>(
1316 &[Token::Unit],
1317 "invalid type: unit value, expected a string",
1318 );
1319 }
1320
1321 #[test]
test_btreeset_from_unit()1322 fn test_btreeset_from_unit() {
1323 assert_de_tokens_error::<BTreeSet<isize>>(
1324 &[Token::Unit],
1325 "invalid type: unit value, expected a sequence",
1326 );
1327 }
1328
1329 #[test]
test_btreeset_from_unit_struct()1330 fn test_btreeset_from_unit_struct() {
1331 assert_de_tokens_error::<BTreeSet<isize>>(
1332 &[Token::UnitStruct { name: "Anything" }],
1333 "invalid type: unit value, expected a sequence",
1334 );
1335 }
1336
1337 #[test]
test_hashset_from_unit()1338 fn test_hashset_from_unit() {
1339 assert_de_tokens_error::<HashSet<isize>>(
1340 &[Token::Unit],
1341 "invalid type: unit value, expected a sequence",
1342 );
1343 }
1344
1345 #[test]
test_hashset_from_unit_struct()1346 fn test_hashset_from_unit_struct() {
1347 assert_de_tokens_error::<HashSet<isize>>(
1348 &[Token::UnitStruct { name: "Anything" }],
1349 "invalid type: unit value, expected a sequence",
1350 );
1351 }
1352
1353 #[test]
test_vec_from_unit()1354 fn test_vec_from_unit() {
1355 assert_de_tokens_error::<Vec<isize>>(
1356 &[Token::Unit],
1357 "invalid type: unit value, expected a sequence",
1358 );
1359 }
1360
1361 #[test]
test_vec_from_unit_struct()1362 fn test_vec_from_unit_struct() {
1363 assert_de_tokens_error::<Vec<isize>>(
1364 &[Token::UnitStruct { name: "Anything" }],
1365 "invalid type: unit value, expected a sequence",
1366 );
1367 }
1368
1369 #[test]
test_zero_array_from_unit()1370 fn test_zero_array_from_unit() {
1371 assert_de_tokens_error::<[isize; 0]>(
1372 &[Token::Unit],
1373 "invalid type: unit value, expected an empty array",
1374 );
1375 }
1376
1377 #[test]
test_zero_array_from_unit_struct()1378 fn test_zero_array_from_unit_struct() {
1379 assert_de_tokens_error::<[isize; 0]>(
1380 &[Token::UnitStruct { name: "Anything" }],
1381 "invalid type: unit value, expected an empty array",
1382 );
1383 }
1384
1385 #[test]
test_btreemap_from_unit()1386 fn test_btreemap_from_unit() {
1387 assert_de_tokens_error::<BTreeMap<isize, isize>>(
1388 &[Token::Unit],
1389 "invalid type: unit value, expected a map",
1390 );
1391 }
1392
1393 #[test]
test_btreemap_from_unit_struct()1394 fn test_btreemap_from_unit_struct() {
1395 assert_de_tokens_error::<BTreeMap<isize, isize>>(
1396 &[Token::UnitStruct { name: "Anything" }],
1397 "invalid type: unit value, expected a map",
1398 );
1399 }
1400
1401 #[test]
test_hashmap_from_unit()1402 fn test_hashmap_from_unit() {
1403 assert_de_tokens_error::<HashMap<isize, isize>>(
1404 &[Token::Unit],
1405 "invalid type: unit value, expected a map",
1406 );
1407 }
1408
1409 #[test]
test_hashmap_from_unit_struct()1410 fn test_hashmap_from_unit_struct() {
1411 assert_de_tokens_error::<HashMap<isize, isize>>(
1412 &[Token::UnitStruct { name: "Anything" }],
1413 "invalid type: unit value, expected a map",
1414 );
1415 }
1416
1417 #[test]
test_bool_from_string()1418 fn test_bool_from_string() {
1419 assert_de_tokens_error::<bool>(
1420 &[Token::Str("false")],
1421 "invalid type: string \"false\", expected a boolean",
1422 );
1423 }
1424
1425 #[test]
test_number_from_string()1426 fn test_number_from_string() {
1427 assert_de_tokens_error::<isize>(
1428 &[Token::Str("1")],
1429 "invalid type: string \"1\", expected isize",
1430 );
1431 }
1432
1433 #[test]
test_integer_from_float()1434 fn test_integer_from_float() {
1435 assert_de_tokens_error::<isize>(
1436 &[Token::F32(0.0)],
1437 "invalid type: floating point `0.0`, expected isize",
1438 );
1439 }
1440
1441 #[test]
test_unit_struct_from_seq()1442 fn test_unit_struct_from_seq() {
1443 assert_de_tokens_error::<UnitStruct>(
1444 &[Token::Seq { len: Some(0) }, Token::SeqEnd],
1445 "invalid type: sequence, expected unit struct UnitStruct",
1446 );
1447 }
1448
1449 #[test]
test_wrapping_overflow()1450 fn test_wrapping_overflow() {
1451 assert_de_tokens_error::<Wrapping<u16>>(
1452 &[Token::U32(65_536)],
1453 "invalid value: integer `65536`, expected u16",
1454 );
1455 }
1456
1457 #[test]
test_duration_overflow_seq()1458 fn test_duration_overflow_seq() {
1459 assert_de_tokens_error::<Duration>(
1460 &[
1461 Token::Seq { len: Some(2) },
1462 Token::U64(u64::max_value()),
1463 Token::U32(1_000_000_000),
1464 Token::SeqEnd,
1465 ],
1466 "overflow deserializing Duration",
1467 );
1468 }
1469
1470 #[test]
test_duration_overflow_struct()1471 fn test_duration_overflow_struct() {
1472 assert_de_tokens_error::<Duration>(
1473 &[
1474 Token::Struct {
1475 name: "Duration",
1476 len: 2,
1477 },
1478 Token::Str("secs"),
1479 Token::U64(u64::max_value()),
1480 Token::Str("nanos"),
1481 Token::U32(1_000_000_000),
1482 Token::StructEnd,
1483 ],
1484 "overflow deserializing Duration",
1485 );
1486 }
1487
1488 #[test]
test_systemtime_overflow_seq()1489 fn test_systemtime_overflow_seq() {
1490 assert_de_tokens_error::<SystemTime>(
1491 &[
1492 Token::Seq { len: Some(2) },
1493 Token::U64(u64::max_value()),
1494 Token::U32(1_000_000_000),
1495 Token::SeqEnd,
1496 ],
1497 "overflow deserializing SystemTime epoch offset",
1498 );
1499 }
1500
1501 #[test]
test_systemtime_overflow_struct()1502 fn test_systemtime_overflow_struct() {
1503 assert_de_tokens_error::<SystemTime>(
1504 &[
1505 Token::Struct {
1506 name: "SystemTime",
1507 len: 2,
1508 },
1509 Token::Str("secs_since_epoch"),
1510 Token::U64(u64::max_value()),
1511 Token::Str("nanos_since_epoch"),
1512 Token::U32(1_000_000_000),
1513 Token::StructEnd,
1514 ],
1515 "overflow deserializing SystemTime epoch offset",
1516 );
1517 }
1518
1519 #[cfg(systemtime_checked_add)]
1520 #[test]
test_systemtime_overflow()1521 fn test_systemtime_overflow() {
1522 assert_de_tokens_error::<SystemTime>(
1523 &[
1524 Token::Seq { len: Some(2) },
1525 Token::U64(u64::max_value()),
1526 Token::U32(0),
1527 Token::SeqEnd,
1528 ],
1529 "overflow deserializing SystemTime",
1530 );
1531 }
1532
1533 #[test]
test_cstr_internal_null()1534 fn test_cstr_internal_null() {
1535 assert_de_tokens_error::<Box<CStr>>(
1536 &[Token::Bytes(b"a\0c")],
1537 "nul byte found in provided data at position: 1",
1538 );
1539 }
1540
1541 #[test]
test_cstr_internal_null_end()1542 fn test_cstr_internal_null_end() {
1543 assert_de_tokens_error::<Box<CStr>>(
1544 &[Token::Bytes(b"ac\0")],
1545 "nul byte found in provided data at position: 2",
1546 );
1547 }
1548
1549 #[cfg(feature = "unstable")]
1550 #[test]
test_never_type()1551 fn test_never_type() {
1552 assert_de_tokens_error::<!>(&[], "cannot deserialize `!`");
1553
1554 assert_de_tokens_error::<Result<u8, !>>(
1555 &[Token::NewtypeVariant {
1556 name: "Result",
1557 variant: "Err",
1558 }],
1559 "cannot deserialize `!`",
1560 );
1561 }
1562