From 77b07f3fbf973c7292a391fa9eb07494baeede55 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Wed, 14 Mar 2018 18:46:47 +0100 Subject: [PATCH] Added tests for unknown_fields_into --- .../conflict/collect-into-wrong-type.rs | 19 +++++++++ .../conflict/repr-collect-struct.rs | 20 +++++++++ test_suite/tests/test_annotations.rs | 41 +++++++++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 test_suite/tests/compile-fail/conflict/collect-into-wrong-type.rs create mode 100644 test_suite/tests/compile-fail/conflict/repr-collect-struct.rs diff --git a/test_suite/tests/compile-fail/conflict/collect-into-wrong-type.rs b/test_suite/tests/compile-fail/conflict/collect-into-wrong-type.rs new file mode 100644 index 00000000..4f55cb32 --- /dev/null +++ b/test_suite/tests/compile-fail/conflict/collect-into-wrong-type.rs @@ -0,0 +1,19 @@ +// Copyright 2018 Serde Developers +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#[macro_use] +extern crate serde_derive; + +#[derive(Serialize)] //~ ERROR: the trait bound `&std::string::String: std::iter::Iterator` is not satisfied +#[serde(repr = "map", unknown_fields_into="other")] +struct X { + a: u32, + other: String, +} + +fn main() {} diff --git a/test_suite/tests/compile-fail/conflict/repr-collect-struct.rs b/test_suite/tests/compile-fail/conflict/repr-collect-struct.rs new file mode 100644 index 00000000..6396d32f --- /dev/null +++ b/test_suite/tests/compile-fail/conflict/repr-collect-struct.rs @@ -0,0 +1,20 @@ +// Copyright 2018 Serde Developers +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#[macro_use] +extern crate serde_derive; + +#[derive(Serialize)] //~ ERROR: proc-macro derive panicked +#[serde(repr = "struct", unknown_fields_into="other")] +//~^^ HELP: #[serde(unknown_fields_into)] requires repr="map" +struct X { + a: u32, + other: HashMap, +} + +fn main() {} diff --git a/test_suite/tests/test_annotations.rs b/test_suite/tests/test_annotations.rs index 48a09a1a..a74ca55c 100644 --- a/test_suite/tests/test_annotations.rs +++ b/test_suite/tests/test_annotations.rs @@ -12,6 +12,7 @@ extern crate serde_derive; extern crate serde; +use std::collections::HashMap; use self::serde::{Deserialize, Deserializer, Serialize, Serializer}; use self::serde::de::{self, Unexpected}; @@ -94,6 +95,14 @@ where a5: E, } +#[derive(Debug, PartialEq, Serialize, Deserialize)] +#[serde(repr="map", unknown_fields_into="extra")] +struct CollectOther { + a: u32, + b: u32, + extra: HashMap, +} + #[test] fn test_default_struct() { assert_de_tokens( @@ -1267,3 +1276,35 @@ fn test_from_into_traits() { assert_ser_tokens::(&StructFromEnum(None), &[Token::None]); assert_de_tokens::(&StructFromEnum(Some(2)), &[Token::Some, Token::U32(2)]); } + +#[test] +fn test_collect_other() { + let mut extra = HashMap::new(); + extra.insert("c".into(), 3); + assert_de_tokens( + &CollectOther { a: 1, b: 2, extra: extra.clone() }, + &[ + Token::Map { len: None }, + Token::Str("a"), + Token::U32(1), + Token::Str("b"), + Token::U32(2), + Token::Str("c"), + Token::U32(3), + Token::MapEnd, + ], + ); + assert_ser_tokens( + &CollectOther { a: 1, b: 2, extra: extra }, + &[ + Token::Map { len: None }, + Token::Str("a"), + Token::U32(1), + Token::Str("b"), + Token::U32(2), + Token::Str("c"), + Token::U32(3), + Token::MapEnd, + ], + ); +}