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