17e2e9c0cSopenharmony_ci#![allow(clippy::derive_partial_eq_without_eq, clippy::similar_names)]
27e2e9c0cSopenharmony_ci
37e2e9c0cSopenharmony_ciuse serde::de::value::{self, MapAccessDeserializer};
47e2e9c0cSopenharmony_ciuse serde::de::{Deserialize, Deserializer, IntoDeserializer, MapAccess, Visitor};
57e2e9c0cSopenharmony_ciuse serde_derive::Deserialize;
67e2e9c0cSopenharmony_ciuse serde_test::{assert_de_tokens, Token};
77e2e9c0cSopenharmony_ciuse std::fmt;
87e2e9c0cSopenharmony_ci
97e2e9c0cSopenharmony_ci#[test]
107e2e9c0cSopenharmony_cifn test_u32_to_enum() {
117e2e9c0cSopenharmony_ci    #[derive(Deserialize, Debug, PartialEq)]
127e2e9c0cSopenharmony_ci    enum E {
137e2e9c0cSopenharmony_ci        A,
147e2e9c0cSopenharmony_ci        B,
157e2e9c0cSopenharmony_ci    }
167e2e9c0cSopenharmony_ci
177e2e9c0cSopenharmony_ci    let deserializer = IntoDeserializer::<value::Error>::into_deserializer(1u32);
187e2e9c0cSopenharmony_ci    let e: E = E::deserialize(deserializer).unwrap();
197e2e9c0cSopenharmony_ci    assert_eq!(E::B, e);
207e2e9c0cSopenharmony_ci}
217e2e9c0cSopenharmony_ci
227e2e9c0cSopenharmony_ci#[test]
237e2e9c0cSopenharmony_cifn test_integer128() {
247e2e9c0cSopenharmony_ci    let de_u128 = IntoDeserializer::<value::Error>::into_deserializer(1u128);
257e2e9c0cSopenharmony_ci    let de_i128 = IntoDeserializer::<value::Error>::into_deserializer(1i128);
267e2e9c0cSopenharmony_ci
277e2e9c0cSopenharmony_ci    // u128 to u128
287e2e9c0cSopenharmony_ci    assert_eq!(1u128, u128::deserialize(de_u128).unwrap());
297e2e9c0cSopenharmony_ci
307e2e9c0cSopenharmony_ci    // u128 to i128
317e2e9c0cSopenharmony_ci    assert_eq!(1i128, i128::deserialize(de_u128).unwrap());
327e2e9c0cSopenharmony_ci
337e2e9c0cSopenharmony_ci    // i128 to u128
347e2e9c0cSopenharmony_ci    assert_eq!(1u128, u128::deserialize(de_i128).unwrap());
357e2e9c0cSopenharmony_ci
367e2e9c0cSopenharmony_ci    // i128 to i128
377e2e9c0cSopenharmony_ci    assert_eq!(1i128, i128::deserialize(de_i128).unwrap());
387e2e9c0cSopenharmony_ci}
397e2e9c0cSopenharmony_ci
407e2e9c0cSopenharmony_ci#[test]
417e2e9c0cSopenharmony_cifn test_map_access_to_enum() {
427e2e9c0cSopenharmony_ci    #[derive(PartialEq, Debug)]
437e2e9c0cSopenharmony_ci    struct Potential(PotentialKind);
447e2e9c0cSopenharmony_ci
457e2e9c0cSopenharmony_ci    #[derive(PartialEq, Debug, Deserialize)]
467e2e9c0cSopenharmony_ci    enum PotentialKind {
477e2e9c0cSopenharmony_ci        Airebo(Airebo),
487e2e9c0cSopenharmony_ci    }
497e2e9c0cSopenharmony_ci
507e2e9c0cSopenharmony_ci    #[derive(PartialEq, Debug, Deserialize)]
517e2e9c0cSopenharmony_ci    struct Airebo {
527e2e9c0cSopenharmony_ci        lj_sigma: f64,
537e2e9c0cSopenharmony_ci    }
547e2e9c0cSopenharmony_ci
557e2e9c0cSopenharmony_ci    impl<'de> Deserialize<'de> for Potential {
567e2e9c0cSopenharmony_ci        fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
577e2e9c0cSopenharmony_ci        where
587e2e9c0cSopenharmony_ci            D: Deserializer<'de>,
597e2e9c0cSopenharmony_ci        {
607e2e9c0cSopenharmony_ci            struct PotentialVisitor;
617e2e9c0cSopenharmony_ci
627e2e9c0cSopenharmony_ci            impl<'de> Visitor<'de> for PotentialVisitor {
637e2e9c0cSopenharmony_ci                type Value = Potential;
647e2e9c0cSopenharmony_ci
657e2e9c0cSopenharmony_ci                fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
667e2e9c0cSopenharmony_ci                    formatter.write_str("a map")
677e2e9c0cSopenharmony_ci                }
687e2e9c0cSopenharmony_ci
697e2e9c0cSopenharmony_ci                fn visit_map<A>(self, map: A) -> Result<Self::Value, A::Error>
707e2e9c0cSopenharmony_ci                where
717e2e9c0cSopenharmony_ci                    A: MapAccess<'de>,
727e2e9c0cSopenharmony_ci                {
737e2e9c0cSopenharmony_ci                    Deserialize::deserialize(MapAccessDeserializer::new(map)).map(Potential)
747e2e9c0cSopenharmony_ci                }
757e2e9c0cSopenharmony_ci            }
767e2e9c0cSopenharmony_ci
777e2e9c0cSopenharmony_ci            deserializer.deserialize_any(PotentialVisitor)
787e2e9c0cSopenharmony_ci        }
797e2e9c0cSopenharmony_ci    }
807e2e9c0cSopenharmony_ci
817e2e9c0cSopenharmony_ci    let expected = Potential(PotentialKind::Airebo(Airebo { lj_sigma: 14.0 }));
827e2e9c0cSopenharmony_ci
837e2e9c0cSopenharmony_ci    assert_de_tokens(
847e2e9c0cSopenharmony_ci        &expected,
857e2e9c0cSopenharmony_ci        &[
867e2e9c0cSopenharmony_ci            Token::Map { len: Some(1) },
877e2e9c0cSopenharmony_ci            Token::Str("Airebo"),
887e2e9c0cSopenharmony_ci            Token::Map { len: Some(1) },
897e2e9c0cSopenharmony_ci            Token::Str("lj_sigma"),
907e2e9c0cSopenharmony_ci            Token::F64(14.0),
917e2e9c0cSopenharmony_ci            Token::MapEnd,
927e2e9c0cSopenharmony_ci            Token::MapEnd,
937e2e9c0cSopenharmony_ci        ],
947e2e9c0cSopenharmony_ci    );
957e2e9c0cSopenharmony_ci}
96