1 //! Tests for `#[serde(field_identifier)]` and `#[serde(variant_identifier)]` 2 3 #![allow(clippy::derive_partial_eq_without_eq)] 4 5 use serde_derive::Deserialize; 6 use serde_test::{assert_de_tokens, assert_de_tokens_error, Token}; 7 8 mod variant_identifier { 9 use super::*; 10 11 #[derive(Deserialize, Debug, PartialEq)] 12 #[serde(variant_identifier)] 13 enum V { 14 Aaa, 15 #[serde(alias = "Ccc", alias = "Ddd")] 16 Bbb, 17 } 18 19 #[test] variant1()20 fn variant1() { 21 assert_de_tokens(&V::Aaa, &[Token::U8(0)]); 22 assert_de_tokens(&V::Aaa, &[Token::U16(0)]); 23 assert_de_tokens(&V::Aaa, &[Token::U32(0)]); 24 assert_de_tokens(&V::Aaa, &[Token::U64(0)]); 25 assert_de_tokens(&V::Aaa, &[Token::Str("Aaa")]); 26 assert_de_tokens(&V::Aaa, &[Token::Bytes(b"Aaa")]); 27 } 28 29 #[test] aliases()30 fn aliases() { 31 assert_de_tokens(&V::Bbb, &[Token::U8(1)]); 32 assert_de_tokens(&V::Bbb, &[Token::U16(1)]); 33 assert_de_tokens(&V::Bbb, &[Token::U32(1)]); 34 assert_de_tokens(&V::Bbb, &[Token::U64(1)]); 35 36 assert_de_tokens(&V::Bbb, &[Token::Str("Bbb")]); 37 assert_de_tokens(&V::Bbb, &[Token::Bytes(b"Bbb")]); 38 39 assert_de_tokens(&V::Bbb, &[Token::Str("Ccc")]); 40 assert_de_tokens(&V::Bbb, &[Token::Bytes(b"Ccc")]); 41 42 assert_de_tokens(&V::Bbb, &[Token::Str("Ddd")]); 43 assert_de_tokens(&V::Bbb, &[Token::Bytes(b"Ddd")]); 44 } 45 46 #[test] unknown()47 fn unknown() { 48 assert_de_tokens_error::<V>( 49 &[Token::U8(42)], 50 "invalid value: integer `42`, expected variant index 0 <= i < 2", 51 ); 52 assert_de_tokens_error::<V>( 53 &[Token::U16(42)], 54 "invalid value: integer `42`, expected variant index 0 <= i < 2", 55 ); 56 assert_de_tokens_error::<V>( 57 &[Token::U32(42)], 58 "invalid value: integer `42`, expected variant index 0 <= i < 2", 59 ); 60 assert_de_tokens_error::<V>( 61 &[Token::U64(42)], 62 "invalid value: integer `42`, expected variant index 0 <= i < 2", 63 ); 64 assert_de_tokens_error::<V>( 65 &[Token::Str("Unknown")], 66 "unknown variant `Unknown`, expected one of `Aaa`, `Bbb`, `Ccc`, `Ddd`", 67 ); 68 assert_de_tokens_error::<V>( 69 &[Token::Bytes(b"Unknown")], 70 "unknown variant `Unknown`, expected one of `Aaa`, `Bbb`, `Ccc`, `Ddd`", 71 ); 72 } 73 } 74 75 mod field_identifier { 76 use super::*; 77 78 #[derive(Deserialize, Debug, PartialEq)] 79 #[serde(field_identifier, rename_all = "snake_case")] 80 enum F { 81 Aaa, 82 #[serde(alias = "ccc", alias = "ddd")] 83 Bbb, 84 } 85 86 #[test] field1()87 fn field1() { 88 assert_de_tokens(&F::Aaa, &[Token::U8(0)]); 89 assert_de_tokens(&F::Aaa, &[Token::U16(0)]); 90 assert_de_tokens(&F::Aaa, &[Token::U32(0)]); 91 assert_de_tokens(&F::Aaa, &[Token::U64(0)]); 92 assert_de_tokens(&F::Aaa, &[Token::Str("aaa")]); 93 assert_de_tokens(&F::Aaa, &[Token::Bytes(b"aaa")]); 94 } 95 96 #[test] aliases()97 fn aliases() { 98 assert_de_tokens(&F::Bbb, &[Token::U8(1)]); 99 assert_de_tokens(&F::Bbb, &[Token::U16(1)]); 100 assert_de_tokens(&F::Bbb, &[Token::U32(1)]); 101 assert_de_tokens(&F::Bbb, &[Token::U64(1)]); 102 103 assert_de_tokens(&F::Bbb, &[Token::Str("bbb")]); 104 assert_de_tokens(&F::Bbb, &[Token::Bytes(b"bbb")]); 105 106 assert_de_tokens(&F::Bbb, &[Token::Str("ccc")]); 107 assert_de_tokens(&F::Bbb, &[Token::Bytes(b"ccc")]); 108 109 assert_de_tokens(&F::Bbb, &[Token::Str("ddd")]); 110 assert_de_tokens(&F::Bbb, &[Token::Bytes(b"ddd")]); 111 } 112 113 #[test] unknown()114 fn unknown() { 115 assert_de_tokens_error::<F>( 116 &[Token::U8(42)], 117 "invalid value: integer `42`, expected field index 0 <= i < 2", 118 ); 119 assert_de_tokens_error::<F>( 120 &[Token::U16(42)], 121 "invalid value: integer `42`, expected field index 0 <= i < 2", 122 ); 123 assert_de_tokens_error::<F>( 124 &[Token::U32(42)], 125 "invalid value: integer `42`, expected field index 0 <= i < 2", 126 ); 127 assert_de_tokens_error::<F>( 128 &[Token::U64(42)], 129 "invalid value: integer `42`, expected field index 0 <= i < 2", 130 ); 131 assert_de_tokens_error::<F>( 132 &[Token::Str("unknown")], 133 "unknown field `unknown`, expected one of `aaa`, `bbb`, `ccc`, `ddd`", 134 ); 135 assert_de_tokens_error::<F>( 136 &[Token::Bytes(b"unknown")], 137 "unknown field `unknown`, expected one of `aaa`, `bbb`, `ccc`, `ddd`", 138 ); 139 } 140 141 #[test] unit_fallthrough()142 fn unit_fallthrough() { 143 #[derive(Deserialize, Debug, PartialEq)] 144 #[serde(field_identifier, rename_all = "snake_case")] 145 enum F { 146 Aaa, 147 Bbb, 148 #[serde(other)] 149 Other, 150 } 151 152 assert_de_tokens(&F::Other, &[Token::U8(42)]); 153 assert_de_tokens(&F::Other, &[Token::U16(42)]); 154 assert_de_tokens(&F::Other, &[Token::U32(42)]); 155 assert_de_tokens(&F::Other, &[Token::U64(42)]); 156 assert_de_tokens(&F::Other, &[Token::Str("x")]); 157 } 158 159 #[test] newtype_fallthrough()160 fn newtype_fallthrough() { 161 #[derive(Deserialize, Debug, PartialEq)] 162 #[serde(field_identifier, rename_all = "snake_case")] 163 enum F { 164 Aaa, 165 Bbb, 166 Other(String), 167 } 168 169 assert_de_tokens(&F::Other("x".to_owned()), &[Token::Str("x")]); 170 } 171 172 #[test] newtype_fallthrough_generic()173 fn newtype_fallthrough_generic() { 174 #[derive(Deserialize, Debug, PartialEq)] 175 #[serde(field_identifier, rename_all = "snake_case")] 176 enum F<T> { 177 Aaa, 178 Bbb, 179 Other(T), 180 } 181 182 assert_de_tokens(&F::Other(42u8), &[Token::U8(42)]); 183 assert_de_tokens(&F::Other(42u16), &[Token::U16(42)]); 184 assert_de_tokens(&F::Other(42u32), &[Token::U32(42)]); 185 assert_de_tokens(&F::Other(42u64), &[Token::U64(42)]); 186 assert_de_tokens(&F::Other("x".to_owned()), &[Token::Str("x")]); 187 } 188 } 189