• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #![allow(clippy::derive_partial_eq_without_eq, clippy::similar_names)]
2 
3 use serde::de::value::{self, MapAccessDeserializer};
4 use serde::de::{Deserialize, Deserializer, IntoDeserializer, MapAccess, Visitor};
5 use serde_derive::Deserialize;
6 use serde_test::{assert_de_tokens, Token};
7 use std::fmt;
8 
9 #[test]
test_u32_to_enum()10 fn test_u32_to_enum() {
11     #[derive(Deserialize, Debug, PartialEq)]
12     enum E {
13         A,
14         B,
15     }
16 
17     let deserializer = IntoDeserializer::<value::Error>::into_deserializer(1u32);
18     let e: E = E::deserialize(deserializer).unwrap();
19     assert_eq!(E::B, e);
20 }
21 
22 #[test]
test_integer128()23 fn test_integer128() {
24     let de_u128 = IntoDeserializer::<value::Error>::into_deserializer(1u128);
25     let de_i128 = IntoDeserializer::<value::Error>::into_deserializer(1i128);
26 
27     // u128 to u128
28     assert_eq!(1u128, u128::deserialize(de_u128).unwrap());
29 
30     // u128 to i128
31     assert_eq!(1i128, i128::deserialize(de_u128).unwrap());
32 
33     // i128 to u128
34     assert_eq!(1u128, u128::deserialize(de_i128).unwrap());
35 
36     // i128 to i128
37     assert_eq!(1i128, i128::deserialize(de_i128).unwrap());
38 }
39 
40 #[test]
test_map_access_to_enum()41 fn test_map_access_to_enum() {
42     #[derive(PartialEq, Debug)]
43     struct Potential(PotentialKind);
44 
45     #[derive(PartialEq, Debug, Deserialize)]
46     enum PotentialKind {
47         Airebo(Airebo),
48     }
49 
50     #[derive(PartialEq, Debug, Deserialize)]
51     struct Airebo {
52         lj_sigma: f64,
53     }
54 
55     impl<'de> Deserialize<'de> for Potential {
56         fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
57         where
58             D: Deserializer<'de>,
59         {
60             struct PotentialVisitor;
61 
62             impl<'de> Visitor<'de> for PotentialVisitor {
63                 type Value = Potential;
64 
65                 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
66                     formatter.write_str("a map")
67                 }
68 
69                 fn visit_map<A>(self, map: A) -> Result<Self::Value, A::Error>
70                 where
71                     A: MapAccess<'de>,
72                 {
73                     Deserialize::deserialize(MapAccessDeserializer::new(map)).map(Potential)
74                 }
75             }
76 
77             deserializer.deserialize_any(PotentialVisitor)
78         }
79     }
80 
81     let expected = Potential(PotentialKind::Airebo(Airebo { lj_sigma: 14.0 }));
82 
83     assert_de_tokens(
84         &expected,
85         &[
86             Token::Map { len: Some(1) },
87             Token::Str("Airebo"),
88             Token::Map { len: Some(1) },
89             Token::Str("lj_sigma"),
90             Token::F64(14.0),
91             Token::MapEnd,
92             Token::MapEnd,
93         ],
94     );
95 }
96