Add test for deserializing a simple enum

This commit is contained in:
Erick Tryzelaar
2015-07-30 07:54:55 -07:00
parent 49fa208242
commit 2cb7d66767
+58 -3
View File
@@ -38,6 +38,10 @@ enum Token {
MapEnd, MapEnd,
EnumStart(&'static str), EnumStart(&'static str),
EnumUnit,
EnumSimple,
EnumSeq,
EnumMap,
EnumEnd, EnumEnd,
} }
@@ -324,7 +328,25 @@ impl<'a> de::VariantVisitor for TokenDeserializerVariantVisitor<'a> {
} }
fn visit_unit(&mut self) -> Result<(), Error> { fn visit_unit(&mut self) -> Result<(), Error> {
de::Deserialize::deserialize(self.de) match self.de.tokens.next() {
Some(Token::EnumUnit) => {
de::Deserialize::deserialize(self.de)
}
Some(_) => Err(Error::SyntaxError),
None => Err(Error::EndOfStreamError),
}
}
fn visit_simple<T>(&mut self) -> Result<T, Self::Error>
where T: de::Deserialize,
{
match self.de.tokens.next() {
Some(Token::EnumSimple) => {
de::Deserialize::deserialize(self.de)
}
Some(_) => Err(Error::SyntaxError),
None => Err(Error::EndOfStreamError),
}
} }
fn visit_tuple<V>(&mut self, fn visit_tuple<V>(&mut self,
@@ -332,7 +354,13 @@ impl<'a> de::VariantVisitor for TokenDeserializerVariantVisitor<'a> {
visitor: V) -> Result<V::Value, Error> visitor: V) -> Result<V::Value, Error>
where V: de::Visitor, where V: de::Visitor,
{ {
de::Deserializer::visit(self.de, visitor) match self.de.tokens.next() {
Some(Token::EnumSeq) => {
de::Deserializer::visit(self.de, visitor)
}
Some(_) => Err(Error::SyntaxError),
None => Err(Error::EndOfStreamError),
}
} }
fn visit_struct<V>(&mut self, fn visit_struct<V>(&mut self,
@@ -340,7 +368,13 @@ impl<'a> de::VariantVisitor for TokenDeserializerVariantVisitor<'a> {
visitor: V) -> Result<V::Value, Error> visitor: V) -> Result<V::Value, Error>
where V: de::Visitor, where V: de::Visitor,
{ {
de::Deserializer::visit(self.de, visitor) match self.de.tokens.next() {
Some(Token::EnumMap) => {
de::Deserializer::visit(self.de, visitor)
}
Some(_) => Err(Error::SyntaxError),
None => Err(Error::EndOfStreamError),
}
} }
} }
@@ -362,6 +396,7 @@ struct Struct {
#[derive(PartialEq, Debug, Deserialize)] #[derive(PartialEq, Debug, Deserialize)]
enum Enum { enum Enum {
Unit, Unit,
Simple(i32),
Seq(i32, i32, i32), Seq(i32, i32, i32),
Map { a: i32, b: i32, c: i32 } Map { a: i32, b: i32, c: i32 }
} }
@@ -503,6 +538,8 @@ declare_tests! {
Ok::<i32, i32>(0) => vec![ Ok::<i32, i32>(0) => vec![
Token::EnumStart("Result"), Token::EnumStart("Result"),
Token::Str("Ok"), Token::Str("Ok"),
Token::EnumSeq,
Token::SeqStart(1), Token::SeqStart(1),
Token::SeqSep, Token::SeqSep,
Token::I32(0), Token::I32(0),
@@ -512,6 +549,8 @@ declare_tests! {
Err::<i32, i32>(1) => vec![ Err::<i32, i32>(1) => vec![
Token::EnumStart("Result"), Token::EnumStart("Result"),
Token::Str("Err"), Token::Str("Err"),
Token::EnumSeq,
Token::SeqStart(1), Token::SeqStart(1),
Token::SeqSep, Token::SeqSep,
Token::I32(1), Token::I32(1),
@@ -888,14 +927,28 @@ declare_tests! {
Enum::Unit => vec![ Enum::Unit => vec![
Token::EnumStart("Enum"), Token::EnumStart("Enum"),
Token::Str("Unit"), Token::Str("Unit"),
Token::EnumUnit,
Token::Unit, Token::Unit,
Token::EnumEnd, Token::EnumEnd,
], ],
} }
test_enum_simple {
Enum::Simple(1) => vec![
Token::EnumStart("Enum"),
Token::Str("Simple"),
Token::EnumSimple,
Token::I32(1),
Token::EnumEnd,
],
}
test_enum_seq { test_enum_seq {
Enum::Seq(1, 2, 3) => vec![ Enum::Seq(1, 2, 3) => vec![
Token::EnumStart("Enum"), Token::EnumStart("Enum"),
Token::Str("Seq"), Token::Str("Seq"),
Token::EnumSeq,
Token::SeqStart(3), Token::SeqStart(3),
Token::SeqSep, Token::SeqSep,
Token::I32(1), Token::I32(1),
@@ -913,6 +966,8 @@ declare_tests! {
Enum::Map { a: 1, b: 2, c: 3 } => vec![ Enum::Map { a: 1, b: 2, c: 3 } => vec![
Token::EnumStart("Enum"), Token::EnumStart("Enum"),
Token::Str("Map"), Token::Str("Map"),
Token::EnumMap,
Token::MapStart(3), Token::MapStart(3),
Token::MapSep, Token::MapSep,
Token::Str("a"), Token::Str("a"),