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