From 9443e998350bbd8c5e04ba146473a910bb570437 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Thu, 28 Jul 2022 10:05:31 -0700 Subject: [PATCH 1/3] Add test of Value debug representation --- tests/test_value.rs | 95 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/tests/test_value.rs b/tests/test_value.rs index 96448e84..2f383dd1 100644 --- a/tests/test_value.rs +++ b/tests/test_value.rs @@ -93,3 +93,98 @@ fn test_merge() { assert_eq!(value[4], value[i]); } } + +#[test] +fn test_debug() { + let yaml = indoc! {" + Null: ~ + Bool: true + Number: 1 + String: ... + Sequence: + - true + EmptySequence: [] + Mapping: + k: v + EmptyMapping: {} + Tagged: !tag true + "}; + + let value: Value = serde_yaml::from_str(yaml).unwrap(); + let debug = format!("{:#?}", value); + + let expected = indoc! {" + Mapping( + Mapping { + map: { + String( + \"Null\", + ): Null, + String( + \"Bool\", + ): Bool( + true, + ), + String( + \"Number\", + ): Number( + PosInt( + 1, + ), + ), + String( + \"String\", + ): String( + \"...\", + ), + String( + \"Sequence\", + ): Sequence( + [ + Bool( + true, + ), + ], + ), + String( + \"EmptySequence\", + ): Sequence( + [], + ), + String( + \"Mapping\", + ): Mapping( + Mapping { + map: { + String( + \"k\", + ): String( + \"v\", + ), + }, + }, + ), + String( + \"EmptyMapping\", + ): Mapping( + Mapping { + map: {}, + }, + ), + String( + \"Tagged\", + ): Tagged( + TaggedValue { + tag: !tag, + value: Bool( + true, + ), + }, + ), + }, + }, + )\ + "}; + + assert_eq!(debug, expected); +} From b0d9021d936ebdfc94b0d65f7325fe315d8efe52 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Thu, 28 Jul 2022 10:11:03 -0700 Subject: [PATCH 2/3] Format debug test with raw string --- tests/test_value.rs | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/tests/test_value.rs b/tests/test_value.rs index 2f383dd1..9b83b0f3 100644 --- a/tests/test_value.rs +++ b/tests/test_value.rs @@ -113,32 +113,32 @@ fn test_debug() { let value: Value = serde_yaml::from_str(yaml).unwrap(); let debug = format!("{:#?}", value); - let expected = indoc! {" + let expected = indoc! {r#" Mapping( Mapping { map: { String( - \"Null\", + "Null", ): Null, String( - \"Bool\", + "Bool", ): Bool( true, ), String( - \"Number\", + "Number", ): Number( PosInt( 1, ), ), String( - \"String\", + "String", ): String( - \"...\", + "...", ), String( - \"Sequence\", + "Sequence", ): Sequence( [ Bool( @@ -147,32 +147,32 @@ fn test_debug() { ], ), String( - \"EmptySequence\", + "EmptySequence", ): Sequence( [], ), String( - \"Mapping\", + "Mapping", ): Mapping( Mapping { map: { String( - \"k\", + "k", ): String( - \"v\", + "v", ), }, }, ), String( - \"EmptyMapping\", + "EmptyMapping", ): Mapping( Mapping { map: {}, }, ), String( - \"Tagged\", + "Tagged", ): Tagged( TaggedValue { tag: !tag, @@ -183,8 +183,8 @@ fn test_debug() { ), }, }, - )\ - "}; + )"# + }; assert_eq!(debug, expected); } From cdb50360688f1560a49d838c4f46cc5055b8f3c5 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Thu, 28 Jul 2022 10:08:02 -0700 Subject: [PATCH 3/3] Handwrite a better Debug for Value --- src/value/debug.rs | 46 ++++++++++++++++++++++++ src/value/mod.rs | 3 +- tests/test_value.rs | 85 ++++++++------------------------------------- 3 files changed, 62 insertions(+), 72 deletions(-) create mode 100644 src/value/debug.rs diff --git a/src/value/debug.rs b/src/value/debug.rs new file mode 100644 index 00000000..fa2dda60 --- /dev/null +++ b/src/value/debug.rs @@ -0,0 +1,46 @@ +use crate::value::{Number, Value}; +use std::fmt::{self, Debug, Display}; + +impl Debug for Value { + fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + match self { + Value::Null => formatter.write_str("Null"), + Value::Bool(boolean) => write!(formatter, "Bool({})", boolean), + Value::Number(number) => write!(formatter, "Number({})", number), + Value::String(string) => write!(formatter, "String({:?})", string), + Value::Sequence(sequence) => { + formatter.write_str("Sequence ")?; + formatter.debug_list().entries(sequence).finish() + } + Value::Mapping(mapping) => { + formatter.write_str("Mapping ")?; + let mut debug = formatter.debug_map(); + for (k, v) in mapping { + let tmp; + debug.entry( + match k { + Value::Bool(boolean) => boolean, + Value::Number(number) => { + tmp = DisplayNumber(number); + &tmp + } + Value::String(string) => string, + _ => k, + }, + v, + ); + } + debug.finish() + } + Value::Tagged(tagged) => Debug::fmt(tagged, formatter), + } + } +} + +struct DisplayNumber<'a>(&'a Number); + +impl<'a> Debug for DisplayNumber<'a> { + fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + Display::fmt(self.0, formatter) + } +} diff --git a/src/value/mod.rs b/src/value/mod.rs index 98b89762..e2e8b678 100644 --- a/src/value/mod.rs +++ b/src/value/mod.rs @@ -1,6 +1,7 @@ //! The Value enum, a loosely typed way of representing any valid YAML value. mod de; +mod debug; mod from; mod index; mod partial_eq; @@ -20,7 +21,7 @@ pub use self::tagged::{Tag, TaggedValue}; pub use crate::number::Number; /// Represents any valid YAML value. -#[derive(Clone, PartialEq, PartialOrd, Debug)] +#[derive(Clone, PartialEq, PartialOrd)] pub enum Value { /// Represents a YAML null value. Null, diff --git a/tests/test_value.rs b/tests/test_value.rs index 9b83b0f3..391cdd10 100644 --- a/tests/test_value.rs +++ b/tests/test_value.rs @@ -104,8 +104,6 @@ fn test_debug() { Sequence: - true EmptySequence: [] - Mapping: - k: v EmptyMapping: {} Tagged: !tag true "}; @@ -114,76 +112,21 @@ fn test_debug() { let debug = format!("{:#?}", value); let expected = indoc! {r#" - Mapping( - Mapping { - map: { - String( - "Null", - ): Null, - String( - "Bool", - ): Bool( - true, - ), - String( - "Number", - ): Number( - PosInt( - 1, - ), - ), - String( - "String", - ): String( - "...", - ), - String( - "Sequence", - ): Sequence( - [ - Bool( - true, - ), - ], - ), - String( - "EmptySequence", - ): Sequence( - [], - ), - String( - "Mapping", - ): Mapping( - Mapping { - map: { - String( - "k", - ): String( - "v", - ), - }, - }, - ), - String( - "EmptyMapping", - ): Mapping( - Mapping { - map: {}, - }, - ), - String( - "Tagged", - ): Tagged( - TaggedValue { - tag: !tag, - value: Bool( - true, - ), - }, - ), - }, + Mapping { + "Null": Null, + "Bool": Bool(true), + "Number": Number(1), + "String": String("..."), + "Sequence": Sequence [ + Bool(true), + ], + "EmptySequence": Sequence [], + "EmptyMapping": Mapping {}, + "Tagged": TaggedValue { + tag: !tag, + value: Bool(true), }, - )"# + }"# }; assert_eq!(debug, expected);