// Copyright 2017 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. use serde::{Serialize, Deserialize}; use de::Deserializer; use error::Error; use ser::Serializer; use token::Token; use std::fmt::Debug; /// Runs both `assert_ser_tokens` and `assert_de_tokens`. pub fn assert_tokens<'de, T>(value: &T, tokens: &'de [Token]) where T: Serialize + Deserialize<'de> + PartialEq + Debug, { assert_ser_tokens(value, tokens); assert_de_tokens(value, tokens); } /// Asserts that `value` serializes to the given `tokens`. pub fn assert_ser_tokens(value: &T, tokens: &[Token]) where T: Serialize, { let mut ser = Serializer::new(tokens); match value.serialize(&mut ser) { Ok(_) => {} Err(err) => panic!("value failed to serialize: {}", err), } if ser.remaining() > 0 { panic!("{} remaining tokens", ser.remaining()); } } /// Asserts that `value` serializes to the given `tokens`, and then yields `error`. pub fn assert_ser_tokens_error(value: &T, tokens: &[Token], expected: Error) where T: Serialize, { let mut ser = Serializer::new(tokens); match value.serialize(&mut ser) { Ok(_) => panic!("value serialized successfully"), Err(err) => assert_eq!(err, expected), } if ser.remaining() > 0 { panic!("{} remaining tokens", ser.remaining()); } } /// Asserts that the given `tokens` deserialize into `value`. pub fn assert_de_tokens<'de, T>(value: &T, tokens: &'de [Token]) where T: Deserialize<'de> + PartialEq + Debug, { let mut de = Deserializer::new(tokens); match T::deserialize(&mut de) { Ok(v) => assert_eq!(v, *value), Err(err) => panic!("tokens failed to deserialize: {}", err), } if de.remaining() > 0 { panic!("{} remaining tokens", de.remaining()); } } /// Asserts that the given `tokens` yield `expected` error when deserializing. pub fn assert_de_tokens_error<'de, T>(tokens: &'de [Token], expected: Error) where T: Deserialize<'de>, { let mut de = Deserializer::new(tokens); match T::deserialize(&mut de) { Ok(_) => panic!("tokens deserialized successfully"), Err(err) => assert_eq!(err, expected), } // There may be one token left if a peek caused the error de.next_token(); if de.remaining() > 0 { panic!("{} remaining tokens", de.remaining()); } }