Merge pull request #1086 from Marwes/better_errors

Print the contents of the expected token when a serialize assert fails
This commit is contained in:
David Tolnay
2017-11-07 09:53:58 -08:00
committed by GitHub
+24 -6
View File
@@ -40,25 +40,43 @@ impl<'a> Serializer<'a> {
macro_rules! assert_next_token { macro_rules! assert_next_token {
($ser:expr, $expected:ident) => { ($ser:expr, $expected:ident) => {
assert_next_token!($ser, $expected, Token::$expected, true); assert_next_token!($ser, stringify!($expected), Token::$expected, true);
}; };
($ser:expr, $expected:ident($v:expr)) => { ($ser:expr, $expected:ident($v:expr)) => {
assert_next_token!($ser, $expected, Token::$expected(v), v == $v); assert_next_token!(
$ser,
format_args!("{}({:?})", stringify!($expected), $v),
Token::$expected(v),
v == $v
);
}; };
($ser:expr, $expected:ident { $($k:ident),* }) => { ($ser:expr, $expected:ident { $($k:ident),* }) => {
let compare = ($($k,)*); let compare = ($($k,)*);
assert_next_token!($ser, $expected, Token::$expected { $($k),* }, ($($k,)*) == compare); let field_format = || {
use std::fmt::Write;
let mut buffer = String::new();
$(
write!(&mut buffer, "{}: {:?}, ", stringify!($k), $k).unwrap();
)*
buffer
};
assert_next_token!(
$ser,
format_args!("{} {{ {}}}", stringify!($expected), field_format()),
Token::$expected { $($k),* },
($($k,)*) == compare
);
}; };
($ser:expr, $expected:ident, $pat:pat, $guard:expr) => { ($ser:expr, $expected:expr, $pat:pat, $guard:expr) => {
match $ser.next_token() { match $ser.next_token() {
Some($pat) if $guard => {} Some($pat) if $guard => {}
Some(other) => { Some(other) => {
panic!("expected Token::{} but serialized as {}", panic!("expected Token::{} but serialized as {}",
stringify!($expected), other); $expected, other);
} }
None => { None => {
panic!("expected Token::{} after end of serialized tokens", panic!("expected Token::{} after end of serialized tokens",
stringify!($expected)); $expected);
} }
} }
}; };