You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
let v:AnyOf2<u32,String> = serde_json::from_str(json).unwrap();
191
+
match v {
192
+
AnyOf2::A(n) => assert_eq!(n,123),
193
+
AnyOf2::B(_) => panic!("expected A variant"),
194
+
}
195
+
}
196
+
197
+
#[test]
198
+
fnanyof_prefers_first_matching_fromstr_number(){
199
+
let v = AnyOf2::<u8,String>::from_str("123").unwrap();
200
+
match v {
201
+
AnyOf2::A(n) => assert_eq!(n,123),
202
+
AnyOf2::B(_) => panic!("expected A variant"),
203
+
}
204
+
}
205
+
206
+
#[test]
207
+
fnanyof_deserialize_string_to_second_variant(){
208
+
let json = "\"hello\"";
209
+
let v:AnyOf2<u32,String> = serde_json::from_str(json).unwrap();
210
+
match v {
211
+
AnyOf2::B(s) => assert_eq!(s,"hello"),
212
+
AnyOf2::A(_) => panic!("expected B variant"),
213
+
}
214
+
}
215
+
216
+
#[test]
217
+
fnoneof_deserialize_single_match(){
218
+
let json = "\"hi\"";
219
+
let v:OneOf2<u32,String> = serde_json::from_str(json).unwrap();
220
+
match v {
221
+
OneOf2::B(s) => assert_eq!(s,"hi"),
222
+
OneOf2::A(_) => panic!("expected B variant"),
223
+
}
224
+
}
225
+
226
+
#[test]
227
+
fnoneof_deserialize_error_on_multiple_matches(){
228
+
// both u32 and u64 will deserialize from "123" -> ambiguity -> error
229
+
let json = "123";
230
+
let res:Result<OneOf2<u32,u64>,_> = serde_json::from_str(json);
231
+
assert!(res.is_err(),"expected error when multiple variants match");
232
+
}
233
+
234
+
#[test]
235
+
fnoneof_fromstr_error_on_multiple_matches(){
236
+
// String::from_str always succeeds and u8::from_str also succeeds here -> multiple matches
237
+
let res = OneOf2::<u8,String>::from_str("123");
238
+
assert!(res.is_err(),"expected error when multiple FromStr matches");
239
+
}
240
+
241
+
#[test]
242
+
fndisplay_and_serialize_roundtrip(){
243
+
let a:OneOf2<u32,String> = OneOf2::A(7u32);
244
+
assert_eq!(a.to_string(),"7");
245
+
let ser = serde_json::to_string(&a).unwrap();
246
+
assert_eq!(ser,"7");
247
+
248
+
let b:OneOf2<u32,String> = OneOf2::B(String::from("abc"));
249
+
assert_eq!(b.to_string(),"abc");
250
+
let ser_b = serde_json::to_string(&b).unwrap();
251
+
assert_eq!(ser_b,"\"abc\"");
252
+
}
253
+
254
+
#[test]
255
+
fnmap_ambiguity_oneof(){
256
+
#[derive(Debug,PartialEq,Deserialize)]
257
+
structS1{x:u32}
258
+
#[derive(Debug,PartialEq,Deserialize)]
259
+
structS2{x:u64}
260
+
let json = "{\"x\":123}";
261
+
let res:Result<OneOf2<S1,S2>,_> = serde_json::from_str(json);
262
+
assert!(res.is_err(),"expected ambiguity error for map matching two structs");
263
+
}
264
+
265
+
#[test]
266
+
fnmap_first_match_anyof(){
267
+
#[derive(Debug,PartialEq,Deserialize)]
268
+
structS1{x:u32}
269
+
#[derive(Debug,PartialEq,Deserialize)]
270
+
structS2{x:u64}
271
+
let json = "{\"x\":123}";
272
+
let v:AnyOf2<S1,S2> = serde_json::from_str(json).unwrap();
273
+
match v {AnyOf2::A(s) => assert_eq!(s.x,123),AnyOf2::B(_) => panic!("expected first struct")}
274
+
}
275
+
276
+
#[test]
277
+
fnnull_ambiguity_oneof(){
278
+
#[derive(Debug,PartialEq,Deserialize)]
279
+
structUnit;
280
+
let json = "null";
281
+
// Option<Unit> deserializes to None from null; Unit also deserializes from null? (No, unit struct expects object usually) -> To create ambiguity, use Option<String> and Option<u32> both None
282
+
let res:Result<OneOf2<Option<u32>,Option<String>>,_> = serde_json::from_str(json);
283
+
assert!(res.is_err(),"expected ambiguity with null across two Option types");
284
+
}
285
+
286
+
#[test]
287
+
fnnull_preference_anyof(){
288
+
let json = "null";
289
+
let v:AnyOf2<Option<u32>,Option<String>> = serde_json::from_str(json).unwrap();
290
+
match v {AnyOf2::A(opt) => assert!(opt.is_none()),AnyOf2::B(_) => panic!("expected first Option variant")}
291
+
}
292
+
293
+
#[test]
294
+
fnsequence_ambiguity_oneof(){
295
+
let json = "[1,2]";
296
+
let res:Result<OneOf2<Vec<u8>,Vec<u16>>,_> = serde_json::from_str(json);
297
+
assert!(res.is_err(),"expected ambiguity for two vector numeric element types fitting both");
298
+
}
299
+
300
+
#[test]
301
+
fnsequence_first_match_anyof(){
302
+
let json = "[1,2]";
303
+
let v:AnyOf2<Vec<u8>,Vec<u16>> = serde_json::from_str(json).unwrap();
304
+
match v {AnyOf2::A(v1) => assert_eq!(v1, vec![1,2]),AnyOf2::B(_) => panic!("expected first vector variant")}
305
+
}
306
+
307
+
#[test]
308
+
fnlarge_number_anyof_prefers_second(){
309
+
let json = "5000000000";// > u32::MAX
310
+
let v:AnyOf2<u32,u64> = serde_json::from_str(json).unwrap();
311
+
match v {AnyOf2::B(n) => assert_eq!(n,5_000_000_000u64),AnyOf2::A(_) => panic!("expected second variant since first fails")}
312
+
}
313
+
314
+
#[test]
315
+
fnoneof_deserialize_no_match_error(){
316
+
// bool doesn't match u32 or String (needs quotes for string)
317
+
let json = "true";
318
+
let res:Result<OneOf2<u32,String>,_> = serde_json::from_str(json);
319
+
assert!(res.is_err());
320
+
let msg = format!("{}", res.unwrap_err());
321
+
assert!(msg.contains("did not match any within oneOf"),"unexpected error message: {msg}");
322
+
}
323
+
324
+
#[test]
325
+
fnanyof_deserialize_no_match_error(){
326
+
let json = "false";// neither u32 nor String
327
+
let res:Result<AnyOf2<u32,String>,_> = serde_json::from_str(json);
328
+
assert!(res.is_err());
329
+
let msg = format!("{}", res.unwrap_err());
330
+
assert!(msg.contains("did not match any within anyOf"),"unexpected error message: {msg}");
331
+
}
332
+
333
+
#[test]
334
+
fnoneof_fromstr_single_match(){
335
+
let v = OneOf2::<bool,u8>::from_str("true").expect("bool should parse");
336
+
match v {OneOf2::A(b) => assert!(b), _ => panic!("expected bool variant")}
337
+
}
338
+
339
+
#[test]
340
+
fnoneof_fromstr_no_match(){
341
+
let res = OneOf2::<u32,u16>::from_str("abc");
342
+
assert!(res.is_err());
343
+
}
344
+
345
+
#[test]
346
+
fnanyof_fromstr_later_match(){
347
+
let v = AnyOf2::<u32,bool>::from_str("true").expect("bool should parse");
348
+
match v {AnyOf2::B(b) => assert!(b), _ => panic!("expected second bool variant")}
0 commit comments