Don't panic in serde_test

Panics lead to reporting errors in tests inside of serde_test internals,
returning errors moves the report location to the corresponding assert_tokens
expression
This commit is contained in:
Mingun
2023-04-30 00:06:00 +05:00
parent f583401284
commit ac8ea72d88
2 changed files with 27 additions and 22 deletions
+21 -14
View File
@@ -16,21 +16,28 @@ macro_rules! assert_next_token {
($de:expr, $expected:expr) => { ($de:expr, $expected:expr) => {
match $de.next_token_opt() { match $de.next_token_opt() {
Some(token) if token == $expected => {} Some(token) if token == $expected => {}
Some(other) => panic!( Some(other) => {
"expected Token::{} but deserialization wants Token::{}", return Err(de::Error::custom(format!(
other, $expected "expected Token::{} but deserialization wants Token::{}",
), other, $expected
None => panic!( )))
"end of tokens but deserialization wants Token::{}", }
$expected None => {
), return Err(de::Error::custom(format!(
"end of tokens but deserialization wants Token::{}",
$expected
)))
}
} }
}; };
} }
macro_rules! unexpected { macro_rules! unexpected {
($token:expr) => { ($token:expr) => {
panic!("deserialization did not expect this token: {}", $token) Err(de::Error::custom(format!(
"deserialization did not expect this token: {}",
$token
)))
}; };
} }
@@ -233,7 +240,7 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
| Token::StructEnd | Token::StructEnd
| Token::TupleVariantEnd | Token::TupleVariantEnd
| Token::StructVariantEnd => { | Token::StructVariantEnd => {
unexpected!(token); unexpected!(token)
} }
} }
} }
@@ -531,7 +538,7 @@ impl<'de, 'a> VariantAccess<'de> for DeserializerEnumVisitor<'a, 'de> {
self.de self.de
.visit_seq(Some(len), Token::TupleVariantEnd, visitor) .visit_seq(Some(len), Token::TupleVariantEnd, visitor)
} else { } else {
unexpected!(token); unexpected!(token)
} }
} }
Token::Seq { Token::Seq {
@@ -542,7 +549,7 @@ impl<'de, 'a> VariantAccess<'de> for DeserializerEnumVisitor<'a, 'de> {
if len == enum_len { if len == enum_len {
self.de.visit_seq(Some(len), Token::SeqEnd, visitor) self.de.visit_seq(Some(len), Token::SeqEnd, visitor)
} else { } else {
unexpected!(token); unexpected!(token)
} }
} }
_ => de::Deserializer::deserialize_any(self.de, visitor), _ => de::Deserializer::deserialize_any(self.de, visitor),
@@ -565,7 +572,7 @@ impl<'de, 'a> VariantAccess<'de> for DeserializerEnumVisitor<'a, 'de> {
self.de self.de
.visit_map(Some(fields.len()), Token::StructVariantEnd, visitor) .visit_map(Some(fields.len()), Token::StructVariantEnd, visitor)
} else { } else {
unexpected!(token); unexpected!(token)
} }
} }
Token::Map { Token::Map {
@@ -577,7 +584,7 @@ impl<'de, 'a> VariantAccess<'de> for DeserializerEnumVisitor<'a, 'de> {
self.de self.de
.visit_map(Some(fields.len()), Token::MapEnd, visitor) .visit_map(Some(fields.len()), Token::MapEnd, visitor)
} else { } else {
unexpected!(token); unexpected!(token)
} }
} }
_ => de::Deserializer::deserialize_any(self.de, visitor), _ => de::Deserializer::deserialize_any(self.de, visitor),
+6 -8
View File
@@ -63,14 +63,12 @@ macro_rules! assert_next_token {
($ser:expr, $actual:expr, $pat:pat, $guard:expr) => { ($ser:expr, $actual:expr, $pat:pat, $guard:expr) => {
match $ser.next_token() { match $ser.next_token() {
Some($pat) if $guard => {} Some($pat) if $guard => {}
Some(expected) => { Some(expected) => return Err(ser::Error::custom(
panic!("expected Token::{} but serialized as {}", format!("expected Token::{} but serialized as {}", expected, $actual)
expected, $actual); )),
} None => return Err(ser::Error::custom(
None => { format!("expected end of tokens, but {} was serialized", $actual)
panic!("expected end of tokens, but {} was serialized", )),
$actual);
}
} }
}; };
} }