From 634dd8040c065fb0c3120ae79dc50289af7b4f9c Mon Sep 17 00:00:00 2001 From: Aleksander Date: Sun, 25 Dec 2022 14:13:41 +0100 Subject: [PATCH] Use serde_test for unit test instead of serde_json. (#67) --- Cargo.lock | 11 +++- Cargo.toml | 2 +- src/serde.rs | 167 +++++++++++++++++++++++++-------------------------- 3 files changed, 93 insertions(+), 87 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0e69008..827d051 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -28,7 +28,7 @@ dependencies = [ "proptest", "serde", "serde_derive", - "serde_json", + "serde_test", ] [[package]] @@ -667,6 +667,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_test" +version = "1.0.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d82178225dbdeae2d5d190e8649287db6a3a32c6d24da22ae3146325aa353e4c" +dependencies = [ + "serde", +] + [[package]] name = "smallvec" version = "1.10.0" diff --git a/Cargo.toml b/Cargo.toml index 3e341ad..417806b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ once_cell = "~1" parking_lot = "~0.12" proptest = "1" serde_derive = "1.0.130" -serde_json = "1.0.69" +serde_test = "1.0.130" [profile.bench] debug = true diff --git a/src/serde.rs b/src/serde.rs index e993fa1..95ecf3f 100644 --- a/src/serde.rs +++ b/src/serde.rs @@ -23,113 +23,110 @@ where #[cfg(test)] mod tests { - use crate::{ArcSwap, ArcSwapOption}; + use crate::{ArcSwap, ArcSwapAny, ArcSwapOption, RefCnt}; use serde_derive::{Deserialize, Serialize}; + use serde_test::{assert_tokens, Token}; + use std::sync::Arc; - #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] + #[derive(Debug, Serialize, Deserialize)] + #[serde(transparent)] + struct ArcSwapAnyEq(ArcSwapAny); + impl PartialEq for ArcSwapAnyEq { + fn eq(&self, other: &Self) -> bool { + self.0.load().eq(&other.0.load()) + } + } + impl Eq for ArcSwapAnyEq {} + + #[derive(Debug, PartialEq, Eq, Serialize, Deserialize)] struct Foo { - field0: usize, + field0: u64, field1: String, } - #[derive(Debug, Serialize, Deserialize)] + #[derive(Debug, PartialEq, Eq, Serialize, Deserialize)] struct Bar { - field0: ArcSwap, - field1: ArcSwapOption, + field0: ArcSwapAnyEq>, + field1: ArcSwapAnyEq>>, } #[test] - fn test_serialize() { + fn test_serialize_deserialize() { + let field0 = u64::MAX; + let field1 = "FOO_-0123456789"; + let data_orig = Foo { - field0: usize::MAX, - field1: format!("FOO_{}", i128::MIN), + field0, + field1: field1.to_string(), }; - let data = ArcSwap::from_pointee(data_orig.clone()); - let data_str = serde_json::to_string(&data).unwrap(); - let data_deser = serde_json::from_str::(&data_str).unwrap(); - assert_eq!(data_deser, data_orig); - - let data_orig = Bar { - field0: ArcSwap::from_pointee(usize::MAX), - field1: ArcSwapOption::from_pointee(format!("FOO_{}", i128::MIN)), + let data = ArcSwapAnyEq(ArcSwap::from_pointee(data_orig)); + assert_tokens( + &data, + &[ + Token::Struct { + name: "Foo", + len: 2, + }, + Token::Str("field0"), + Token::U64(u64::MAX), + Token::Str("field1"), + Token::String(field1), + Token::StructEnd, + ], + ); + + let data = Bar { + field0: ArcSwapAnyEq(ArcSwap::from_pointee(field0)), + field1: ArcSwapAnyEq(ArcSwapOption::from_pointee(field1.to_string())), }; - let data_str = serde_json::to_string(&data_orig).unwrap(); - let data_deser = serde_json::from_str::(&data_str).unwrap(); - assert_eq!(data_deser.field0.load_full(), data_orig.field0.load_full()); - assert_eq!(data_deser.field1.load_full(), data_orig.field1.load_full()); - - let data_orig = Bar { - field0: ArcSwap::from_pointee(usize::MAX), - field1: ArcSwapOption::from_pointee(None), - }; - let data_str = serde_json::to_string(&data_orig).unwrap(); - let data_deser = serde_json::from_str::(&data_str).unwrap(); - assert_eq!(data_deser.field0.load_full(), data_orig.field0.load_full()); - assert_eq!(data_deser.field1.load_full(), data_orig.field1.load_full()); + assert_tokens( + &data, + &[ + Token::Struct { + name: "Bar", + len: 2, + }, + Token::Str("field0"), + Token::U64(u64::MAX), + Token::Str("field1"), + Token::Some, + Token::String(field1), + Token::StructEnd, + ], + ); } #[test] - fn test_deserialize() { - let field0 = usize::MAX; - let field1 = format!("FOO_{}", usize::MIN); - - let str = format!(r#"{{"field0":{},"field1":"{}"}}"#, field0, field1); - let data = serde_json::from_str::>(&str).unwrap(); - assert_eq!(data.load().field0, field0); - assert_eq!(data.load().field1, field1); - - let str = format!(r#"{{"field0":{},"field1":"{}"}}"#, field0, field1); - let data = serde_json::from_str::(&str).unwrap(); - assert_eq!(data.field0.load_full().as_ref(), &field0); - assert_eq!(data.field1.load_full().as_deref(), Some(&field1)); + fn test_serialize_deserialize_option() { + let field0 = u64::MAX; + let field1 = "FOO_-0123456789"; - let str = format!(r#"{{"field0":{}}}"#, field0); - let data = serde_json::from_str::(&str).unwrap(); - assert_eq!(data.field0.load_full().as_ref(), &field0); - assert_eq!(data.field1.load_full().as_deref(), None); - } - - #[test] - fn test_serialize_option() { let data_orig = Foo { - field0: usize::MAX, - field1: format!("FOO_{}", i128::MIN), + field0, + field1: field1.to_string(), }; - let data = ArcSwapOption::from_pointee(data_orig.clone()); - - let data_str = serde_json::to_string(&data).unwrap(); - let data_deser = serde_json::from_str::(&data_str).unwrap(); - - assert_eq!(data_deser, data_orig); - } - - #[test] - fn test_deserialize_option() { - let field0 = usize::MAX; - let field1 = format!("FOO_{}", usize::MIN); - - let str = format!(r#"{{"field0":{},"field1":"{}"}}"#, field0, field1); - let data = serde_json::from_str::>(&str).unwrap(); - - assert_eq!(data.load_full().unwrap().field0, field0); - assert_eq!(data.load_full().unwrap().field1, field1); - } - - #[test] - fn test_serialize_option_none() { - let data = ArcSwapOption::::from_pointee(None); - - let data_str = serde_json::to_string(&data).unwrap(); - let data_deser = serde_json::from_str::>(&data_str).unwrap(); - - assert_eq!(data_deser, None); + let data = ArcSwapAnyEq(ArcSwapOption::from_pointee(data_orig)); + assert_tokens( + &data, + &[ + Token::Some, + Token::Struct { + name: "Foo", + len: 2, + }, + Token::Str("field0"), + Token::U64(u64::MAX), + Token::Str("field1"), + Token::String(field1), + Token::StructEnd, + ], + ); } #[test] - fn test_deserialize_option_none() { - let str = "null"; - let data = serde_json::from_str::>(str).unwrap(); + fn test_serialize_deserialize_option_none() { + let data = ArcSwapAnyEq(ArcSwapOption::::from_pointee(None)); - assert_eq!(data.load_full(), None); + assert_tokens(&data, &[Token::None]); } }