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