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