• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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