17e2e9c0cSopenharmony_ci//! Tests for `#[serde(field_identifier)]` and `#[serde(variant_identifier)]` 27e2e9c0cSopenharmony_ci 37e2e9c0cSopenharmony_ci#![allow(clippy::derive_partial_eq_without_eq)] 47e2e9c0cSopenharmony_ci 57e2e9c0cSopenharmony_ciuse serde_derive::Deserialize; 67e2e9c0cSopenharmony_ciuse serde_test::{assert_de_tokens, assert_de_tokens_error, Token}; 77e2e9c0cSopenharmony_ci 87e2e9c0cSopenharmony_cimod variant_identifier { 97e2e9c0cSopenharmony_ci use super::*; 107e2e9c0cSopenharmony_ci 117e2e9c0cSopenharmony_ci #[derive(Deserialize, Debug, PartialEq)] 127e2e9c0cSopenharmony_ci #[serde(variant_identifier)] 137e2e9c0cSopenharmony_ci enum V { 147e2e9c0cSopenharmony_ci Aaa, 157e2e9c0cSopenharmony_ci #[serde(alias = "Ccc", alias = "Ddd")] 167e2e9c0cSopenharmony_ci Bbb, 177e2e9c0cSopenharmony_ci } 187e2e9c0cSopenharmony_ci 197e2e9c0cSopenharmony_ci #[test] 207e2e9c0cSopenharmony_ci fn variant1() { 217e2e9c0cSopenharmony_ci assert_de_tokens(&V::Aaa, &[Token::U8(0)]); 227e2e9c0cSopenharmony_ci assert_de_tokens(&V::Aaa, &[Token::U16(0)]); 237e2e9c0cSopenharmony_ci assert_de_tokens(&V::Aaa, &[Token::U32(0)]); 247e2e9c0cSopenharmony_ci assert_de_tokens(&V::Aaa, &[Token::U64(0)]); 257e2e9c0cSopenharmony_ci assert_de_tokens(&V::Aaa, &[Token::Str("Aaa")]); 267e2e9c0cSopenharmony_ci assert_de_tokens(&V::Aaa, &[Token::Bytes(b"Aaa")]); 277e2e9c0cSopenharmony_ci } 287e2e9c0cSopenharmony_ci 297e2e9c0cSopenharmony_ci #[test] 307e2e9c0cSopenharmony_ci fn aliases() { 317e2e9c0cSopenharmony_ci assert_de_tokens(&V::Bbb, &[Token::U8(1)]); 327e2e9c0cSopenharmony_ci assert_de_tokens(&V::Bbb, &[Token::U16(1)]); 337e2e9c0cSopenharmony_ci assert_de_tokens(&V::Bbb, &[Token::U32(1)]); 347e2e9c0cSopenharmony_ci assert_de_tokens(&V::Bbb, &[Token::U64(1)]); 357e2e9c0cSopenharmony_ci 367e2e9c0cSopenharmony_ci assert_de_tokens(&V::Bbb, &[Token::Str("Bbb")]); 377e2e9c0cSopenharmony_ci assert_de_tokens(&V::Bbb, &[Token::Bytes(b"Bbb")]); 387e2e9c0cSopenharmony_ci 397e2e9c0cSopenharmony_ci assert_de_tokens(&V::Bbb, &[Token::Str("Ccc")]); 407e2e9c0cSopenharmony_ci assert_de_tokens(&V::Bbb, &[Token::Bytes(b"Ccc")]); 417e2e9c0cSopenharmony_ci 427e2e9c0cSopenharmony_ci assert_de_tokens(&V::Bbb, &[Token::Str("Ddd")]); 437e2e9c0cSopenharmony_ci assert_de_tokens(&V::Bbb, &[Token::Bytes(b"Ddd")]); 447e2e9c0cSopenharmony_ci } 457e2e9c0cSopenharmony_ci 467e2e9c0cSopenharmony_ci #[test] 477e2e9c0cSopenharmony_ci fn unknown() { 487e2e9c0cSopenharmony_ci assert_de_tokens_error::<V>( 497e2e9c0cSopenharmony_ci &[Token::U8(42)], 507e2e9c0cSopenharmony_ci "invalid value: integer `42`, expected variant index 0 <= i < 2", 517e2e9c0cSopenharmony_ci ); 527e2e9c0cSopenharmony_ci assert_de_tokens_error::<V>( 537e2e9c0cSopenharmony_ci &[Token::U16(42)], 547e2e9c0cSopenharmony_ci "invalid value: integer `42`, expected variant index 0 <= i < 2", 557e2e9c0cSopenharmony_ci ); 567e2e9c0cSopenharmony_ci assert_de_tokens_error::<V>( 577e2e9c0cSopenharmony_ci &[Token::U32(42)], 587e2e9c0cSopenharmony_ci "invalid value: integer `42`, expected variant index 0 <= i < 2", 597e2e9c0cSopenharmony_ci ); 607e2e9c0cSopenharmony_ci assert_de_tokens_error::<V>( 617e2e9c0cSopenharmony_ci &[Token::U64(42)], 627e2e9c0cSopenharmony_ci "invalid value: integer `42`, expected variant index 0 <= i < 2", 637e2e9c0cSopenharmony_ci ); 647e2e9c0cSopenharmony_ci assert_de_tokens_error::<V>( 657e2e9c0cSopenharmony_ci &[Token::Str("Unknown")], 667e2e9c0cSopenharmony_ci "unknown variant `Unknown`, expected one of `Aaa`, `Bbb`, `Ccc`, `Ddd`", 677e2e9c0cSopenharmony_ci ); 687e2e9c0cSopenharmony_ci assert_de_tokens_error::<V>( 697e2e9c0cSopenharmony_ci &[Token::Bytes(b"Unknown")], 707e2e9c0cSopenharmony_ci "unknown variant `Unknown`, expected one of `Aaa`, `Bbb`, `Ccc`, `Ddd`", 717e2e9c0cSopenharmony_ci ); 727e2e9c0cSopenharmony_ci } 737e2e9c0cSopenharmony_ci} 747e2e9c0cSopenharmony_ci 757e2e9c0cSopenharmony_cimod field_identifier { 767e2e9c0cSopenharmony_ci use super::*; 777e2e9c0cSopenharmony_ci 787e2e9c0cSopenharmony_ci #[derive(Deserialize, Debug, PartialEq)] 797e2e9c0cSopenharmony_ci #[serde(field_identifier, rename_all = "snake_case")] 807e2e9c0cSopenharmony_ci enum F { 817e2e9c0cSopenharmony_ci Aaa, 827e2e9c0cSopenharmony_ci #[serde(alias = "ccc", alias = "ddd")] 837e2e9c0cSopenharmony_ci Bbb, 847e2e9c0cSopenharmony_ci } 857e2e9c0cSopenharmony_ci 867e2e9c0cSopenharmony_ci #[test] 877e2e9c0cSopenharmony_ci fn field1() { 887e2e9c0cSopenharmony_ci assert_de_tokens(&F::Aaa, &[Token::U8(0)]); 897e2e9c0cSopenharmony_ci assert_de_tokens(&F::Aaa, &[Token::U16(0)]); 907e2e9c0cSopenharmony_ci assert_de_tokens(&F::Aaa, &[Token::U32(0)]); 917e2e9c0cSopenharmony_ci assert_de_tokens(&F::Aaa, &[Token::U64(0)]); 927e2e9c0cSopenharmony_ci assert_de_tokens(&F::Aaa, &[Token::Str("aaa")]); 937e2e9c0cSopenharmony_ci assert_de_tokens(&F::Aaa, &[Token::Bytes(b"aaa")]); 947e2e9c0cSopenharmony_ci } 957e2e9c0cSopenharmony_ci 967e2e9c0cSopenharmony_ci #[test] 977e2e9c0cSopenharmony_ci fn aliases() { 987e2e9c0cSopenharmony_ci assert_de_tokens(&F::Bbb, &[Token::U8(1)]); 997e2e9c0cSopenharmony_ci assert_de_tokens(&F::Bbb, &[Token::U16(1)]); 1007e2e9c0cSopenharmony_ci assert_de_tokens(&F::Bbb, &[Token::U32(1)]); 1017e2e9c0cSopenharmony_ci assert_de_tokens(&F::Bbb, &[Token::U64(1)]); 1027e2e9c0cSopenharmony_ci 1037e2e9c0cSopenharmony_ci assert_de_tokens(&F::Bbb, &[Token::Str("bbb")]); 1047e2e9c0cSopenharmony_ci assert_de_tokens(&F::Bbb, &[Token::Bytes(b"bbb")]); 1057e2e9c0cSopenharmony_ci 1067e2e9c0cSopenharmony_ci assert_de_tokens(&F::Bbb, &[Token::Str("ccc")]); 1077e2e9c0cSopenharmony_ci assert_de_tokens(&F::Bbb, &[Token::Bytes(b"ccc")]); 1087e2e9c0cSopenharmony_ci 1097e2e9c0cSopenharmony_ci assert_de_tokens(&F::Bbb, &[Token::Str("ddd")]); 1107e2e9c0cSopenharmony_ci assert_de_tokens(&F::Bbb, &[Token::Bytes(b"ddd")]); 1117e2e9c0cSopenharmony_ci } 1127e2e9c0cSopenharmony_ci 1137e2e9c0cSopenharmony_ci #[test] 1147e2e9c0cSopenharmony_ci fn unknown() { 1157e2e9c0cSopenharmony_ci assert_de_tokens_error::<F>( 1167e2e9c0cSopenharmony_ci &[Token::U8(42)], 1177e2e9c0cSopenharmony_ci "invalid value: integer `42`, expected field index 0 <= i < 2", 1187e2e9c0cSopenharmony_ci ); 1197e2e9c0cSopenharmony_ci assert_de_tokens_error::<F>( 1207e2e9c0cSopenharmony_ci &[Token::U16(42)], 1217e2e9c0cSopenharmony_ci "invalid value: integer `42`, expected field index 0 <= i < 2", 1227e2e9c0cSopenharmony_ci ); 1237e2e9c0cSopenharmony_ci assert_de_tokens_error::<F>( 1247e2e9c0cSopenharmony_ci &[Token::U32(42)], 1257e2e9c0cSopenharmony_ci "invalid value: integer `42`, expected field index 0 <= i < 2", 1267e2e9c0cSopenharmony_ci ); 1277e2e9c0cSopenharmony_ci assert_de_tokens_error::<F>( 1287e2e9c0cSopenharmony_ci &[Token::U64(42)], 1297e2e9c0cSopenharmony_ci "invalid value: integer `42`, expected field index 0 <= i < 2", 1307e2e9c0cSopenharmony_ci ); 1317e2e9c0cSopenharmony_ci assert_de_tokens_error::<F>( 1327e2e9c0cSopenharmony_ci &[Token::Str("unknown")], 1337e2e9c0cSopenharmony_ci "unknown field `unknown`, expected one of `aaa`, `bbb`, `ccc`, `ddd`", 1347e2e9c0cSopenharmony_ci ); 1357e2e9c0cSopenharmony_ci assert_de_tokens_error::<F>( 1367e2e9c0cSopenharmony_ci &[Token::Bytes(b"unknown")], 1377e2e9c0cSopenharmony_ci "unknown field `unknown`, expected one of `aaa`, `bbb`, `ccc`, `ddd`", 1387e2e9c0cSopenharmony_ci ); 1397e2e9c0cSopenharmony_ci } 1407e2e9c0cSopenharmony_ci 1417e2e9c0cSopenharmony_ci #[test] 1427e2e9c0cSopenharmony_ci fn unit_fallthrough() { 1437e2e9c0cSopenharmony_ci #[derive(Deserialize, Debug, PartialEq)] 1447e2e9c0cSopenharmony_ci #[serde(field_identifier, rename_all = "snake_case")] 1457e2e9c0cSopenharmony_ci enum F { 1467e2e9c0cSopenharmony_ci Aaa, 1477e2e9c0cSopenharmony_ci Bbb, 1487e2e9c0cSopenharmony_ci #[serde(other)] 1497e2e9c0cSopenharmony_ci Other, 1507e2e9c0cSopenharmony_ci } 1517e2e9c0cSopenharmony_ci 1527e2e9c0cSopenharmony_ci assert_de_tokens(&F::Other, &[Token::U8(42)]); 1537e2e9c0cSopenharmony_ci assert_de_tokens(&F::Other, &[Token::U16(42)]); 1547e2e9c0cSopenharmony_ci assert_de_tokens(&F::Other, &[Token::U32(42)]); 1557e2e9c0cSopenharmony_ci assert_de_tokens(&F::Other, &[Token::U64(42)]); 1567e2e9c0cSopenharmony_ci assert_de_tokens(&F::Other, &[Token::Str("x")]); 1577e2e9c0cSopenharmony_ci } 1587e2e9c0cSopenharmony_ci 1597e2e9c0cSopenharmony_ci #[test] 1607e2e9c0cSopenharmony_ci fn newtype_fallthrough() { 1617e2e9c0cSopenharmony_ci #[derive(Deserialize, Debug, PartialEq)] 1627e2e9c0cSopenharmony_ci #[serde(field_identifier, rename_all = "snake_case")] 1637e2e9c0cSopenharmony_ci enum F { 1647e2e9c0cSopenharmony_ci Aaa, 1657e2e9c0cSopenharmony_ci Bbb, 1667e2e9c0cSopenharmony_ci Other(String), 1677e2e9c0cSopenharmony_ci } 1687e2e9c0cSopenharmony_ci 1697e2e9c0cSopenharmony_ci assert_de_tokens(&F::Other("x".to_owned()), &[Token::Str("x")]); 1707e2e9c0cSopenharmony_ci } 1717e2e9c0cSopenharmony_ci 1727e2e9c0cSopenharmony_ci #[test] 1737e2e9c0cSopenharmony_ci fn newtype_fallthrough_generic() { 1747e2e9c0cSopenharmony_ci #[derive(Deserialize, Debug, PartialEq)] 1757e2e9c0cSopenharmony_ci #[serde(field_identifier, rename_all = "snake_case")] 1767e2e9c0cSopenharmony_ci enum F<T> { 1777e2e9c0cSopenharmony_ci Aaa, 1787e2e9c0cSopenharmony_ci Bbb, 1797e2e9c0cSopenharmony_ci Other(T), 1807e2e9c0cSopenharmony_ci } 1817e2e9c0cSopenharmony_ci 1827e2e9c0cSopenharmony_ci assert_de_tokens(&F::Other(42u8), &[Token::U8(42)]); 1837e2e9c0cSopenharmony_ci assert_de_tokens(&F::Other(42u16), &[Token::U16(42)]); 1847e2e9c0cSopenharmony_ci assert_de_tokens(&F::Other(42u32), &[Token::U32(42)]); 1857e2e9c0cSopenharmony_ci assert_de_tokens(&F::Other(42u64), &[Token::U64(42)]); 1867e2e9c0cSopenharmony_ci assert_de_tokens(&F::Other("x".to_owned()), &[Token::Str("x")]); 1877e2e9c0cSopenharmony_ci } 1887e2e9c0cSopenharmony_ci} 189