From 29dad7fa5221440429380ad6a2ac90a58c93d2ee Mon Sep 17 00:00:00 2001 From: Ruslan Date: Sat, 22 Nov 2025 02:55:08 +0500 Subject: [PATCH 1/5] Tests --- ...sString_WhenExcludingProperty.approved.txt | 11 ++ ...turnsString_WhenExcludingType.approved.txt | 10 ++ ..._ReturnsString_WhenLotOfRules.approved.txt | 11 ++ ...sString_WhenNoAdditionalRules.approved.txt | 12 ++ ..._WhenSerializationsProperties.approved.txt | 12 ++ ...ng_WhenSerializationsProperty.approved.txt | 12 ++ ...String_WhenTrimmingProperties.approved.txt | 12 ++ ...nsString_WhenTrimmingProperty.approved.txt | 12 ++ ...urnsString_WhenUsingExtension.approved.txt | 12 ++ ..._WhenUsingExtensionWithConfig.approved.txt | 8 ++ ...String_WhenWhenSettingCulture.approved.txt | 12 ++ ObjectPrinting/Tests/Family.cs | 8 ++ .../Tests/ObjectPrinterAcceptanceTests.cs | 133 +++++++++++++++--- ObjectPrinting/Tests/Person.cs | 17 ++- 14 files changed, 257 insertions(+), 25 deletions(-) create mode 100644 ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenExcludingProperty.approved.txt create mode 100644 ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenExcludingType.approved.txt create mode 100644 ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenLotOfRules.approved.txt create mode 100644 ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenNoAdditionalRules.approved.txt create mode 100644 ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenSerializationsProperties.approved.txt create mode 100644 ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenSerializationsProperty.approved.txt create mode 100644 ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenTrimmingProperties.approved.txt create mode 100644 ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenTrimmingProperty.approved.txt create mode 100644 ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenUsingExtension.approved.txt create mode 100644 ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenUsingExtensionWithConfig.approved.txt create mode 100644 ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenWhenSettingCulture.approved.txt create mode 100644 ObjectPrinting/Tests/Family.cs diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenExcludingProperty.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenExcludingProperty.approved.txt new file mode 100644 index 000000000..95921e13d --- /dev/null +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenExcludingProperty.approved.txt @@ -0,0 +1,11 @@ +Family + Father = Person + Id = Guid + Name = Alex + Height = 0 + Mother = Person + Id = Guid + Name = Kate + Height = 0 + Age = 21 + Age = 55335,57 diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenExcludingType.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenExcludingType.approved.txt new file mode 100644 index 000000000..43c618753 --- /dev/null +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenExcludingType.approved.txt @@ -0,0 +1,10 @@ +Family + Father = Person + Id = Guid + Name = Alex + Height = 0 + Mother = Person + Id = Guid + Name = Kate + Height = 0 + Age = 55335,57 diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenLotOfRules.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenLotOfRules.approved.txt new file mode 100644 index 000000000..74e745ea8 --- /dev/null +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenLotOfRules.approved.txt @@ -0,0 +1,11 @@ +Family + Father = Person + Id = Guid + Name = Al + Height = 0 + Mother = Person + Id = Guid + Name = Ka + Height = 0 + Age = 21INT: + Age = A55335,57: diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenNoAdditionalRules.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenNoAdditionalRules.approved.txt new file mode 100644 index 000000000..85b6e738f --- /dev/null +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenNoAdditionalRules.approved.txt @@ -0,0 +1,12 @@ +Family + Father = Person + Id = Guid + Name = Alex + Height = 0 + Age = 19 + Mother = Person + Id = Guid + Name = Kate + Height = 0 + Age = 21 + Age = 55335,57 diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenSerializationsProperties.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenSerializationsProperties.approved.txt new file mode 100644 index 000000000..02582b740 --- /dev/null +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenSerializationsProperties.approved.txt @@ -0,0 +1,12 @@ +Family + Father = Person + Id = Guid + Name = Alex + Height = 0 + Age = NUMBER 19 + Mother = Person + Id = Guid + Name = Kate + Height = 0 + Age = NUMBER 21 + Age = 55335,57 diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenSerializationsProperty.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenSerializationsProperty.approved.txt new file mode 100644 index 000000000..5be0f83ac --- /dev/null +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenSerializationsProperty.approved.txt @@ -0,0 +1,12 @@ +Family + Father = Person + Id = Guid + Name = PROPERTY Alex + Height = 0 + Age = 19 + Mother = Person + Id = Guid + Name = Kate + Height = 0 + Age = 21 + Age = 55335,57 diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenTrimmingProperties.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenTrimmingProperties.approved.txt new file mode 100644 index 000000000..39ea9a127 --- /dev/null +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenTrimmingProperties.approved.txt @@ -0,0 +1,12 @@ +Family + Father = Person + Id = Guid + Name = Ale + Height = 0 + Age = 19 + Mother = Person + Id = Guid + Name = Kat + Height = 0 + Age = 21 + Age = 55335,57 diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenTrimmingProperty.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenTrimmingProperty.approved.txt new file mode 100644 index 000000000..69a2e0179 --- /dev/null +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenTrimmingProperty.approved.txt @@ -0,0 +1,12 @@ +Family + Father = Person + Id = Guid + Name = Ale + Height = 0 + Age = 19 + Mother = Person + Id = Guid + Name = Kate + Height = 0 + Age = 21 + Age = 55335,57 diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenUsingExtension.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenUsingExtension.approved.txt new file mode 100644 index 000000000..85b6e738f --- /dev/null +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenUsingExtension.approved.txt @@ -0,0 +1,12 @@ +Family + Father = Person + Id = Guid + Name = Alex + Height = 0 + Age = 19 + Mother = Person + Id = Guid + Name = Kate + Height = 0 + Age = 21 + Age = 55335,57 diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenUsingExtensionWithConfig.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenUsingExtensionWithConfig.approved.txt new file mode 100644 index 000000000..deb53a991 --- /dev/null +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenUsingExtensionWithConfig.approved.txt @@ -0,0 +1,8 @@ +Family + Father = Person + Id = Guid + Height = 0 + Mother = Person + Id = Guid + Height = 0 + Age = 55335,57 diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenWhenSettingCulture.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenWhenSettingCulture.approved.txt new file mode 100644 index 000000000..85b6e738f --- /dev/null +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenWhenSettingCulture.approved.txt @@ -0,0 +1,12 @@ +Family + Father = Person + Id = Guid + Name = Alex + Height = 0 + Age = 19 + Mother = Person + Id = Guid + Name = Kate + Height = 0 + Age = 21 + Age = 55335,57 diff --git a/ObjectPrinting/Tests/Family.cs b/ObjectPrinting/Tests/Family.cs new file mode 100644 index 000000000..35630b999 --- /dev/null +++ b/ObjectPrinting/Tests/Family.cs @@ -0,0 +1,8 @@ +namespace ObjectPrinting.Tests; + +public class Family +{ + public Person Father { get; set; } + public Person Mother { get; set; } + public double Age { get; set; } +} \ No newline at end of file diff --git a/ObjectPrinting/Tests/ObjectPrinterAcceptanceTests.cs b/ObjectPrinting/Tests/ObjectPrinterAcceptanceTests.cs index 4c8b2445c..9ccfdd257 100644 --- a/ObjectPrinting/Tests/ObjectPrinterAcceptanceTests.cs +++ b/ObjectPrinting/Tests/ObjectPrinterAcceptanceTests.cs @@ -1,27 +1,128 @@ -using NUnit.Framework; +using System.Globalization; +using ApprovalTests; +using ApprovalTests.Namers; +using ApprovalTests.Reporters; +using NUnit.Framework; namespace ObjectPrinting.Tests { [TestFixture] + [UseReporter(typeof(DiffReporter))] + [UseApprovalSubdirectory("ApprovalTests")] public class ObjectPrinterAcceptanceTests { + private Family family; + + [SetUp] + public void SetUp() + { + family = new Family + { + Father = new Person { Name = "Alex", Age = 19 }, + Mother = new Person { Name = "Kate", Age = 21 }, + Age = 55335.57d + }; + } + [Test] - public void Demo() + public void PrintToString_ReturnsString_WhenLotOfRules() { - var person = new Person { Name = "Alex", Age = 19 }; - - var printer = ObjectPrinter.For(); - //1. Исключить из сериализации свойства определенного типа - //2. Указать альтернативный способ сериализации для определенного типа - //3. Для числовых типов указать культуру - //4. Настроить сериализацию конкретного свойства - //5. Настроить обрезание строковых свойств (метод должен быть виден только для строковых свойств) - //6. Исключить из сериализации конкретного свойства - - string s1 = printer.PrintToString(person); - - //7. Синтаксический сахар в виде метода расширения, сериализующего по-умолчанию - //8. ...с конфигурированием + var printer = ObjectPrinter.For() + .Serialize(x => $"{x}INT:") + .Using(x => x.Age).Serialize(x => $"A{x}:") + .Using().Trim(2) + .Exclude(x => x.Father.Age); + var result = printer.PrintToString(family); + + Approvals.Verify(result); + } + + [Test] + public void PrintToString_ReturnsString_WhenNoAdditionalRules() + { + var printer = ObjectPrinter.For(); + var result = printer.PrintToString(family); + + Approvals.Verify(result); + } + + [Test] + public void PrintToString_ReturnsString_WhenExcludingType() + { + var printer = ObjectPrinter.For().Exclude(); + var result = printer.PrintToString(family); + + Approvals.Verify(result); + } + + [Test] + public void PrintToString_ReturnsString_WhenSerializationsProperties() + { + var printer = ObjectPrinter.For().Serialize(x => $"NUMBER {x}"); + var result = printer.PrintToString(family); + + Approvals.Verify(result); + } + + [Test] + public void PrintToString_ReturnsString_WhenExcludingProperty() + { + var printer = ObjectPrinter.For().Exclude(x => x.Father.Age); + var result = printer.PrintToString(family); + + Approvals.Verify(result); + } + + [Test] + public void PrintToString_ReturnsString_WhenWhenSettingCulture() + { + var printer = ObjectPrinter.For().Using().SetCulture(CultureInfo.CurrentCulture); + var result = printer.PrintToString(family); + + Approvals.Verify(result); + } + + [Test] + public void PrintToString_ReturnsString_WhenTrimmingProperties() + { + var printer = ObjectPrinter.For().Using().Trim(3); + var result = printer.PrintToString(family); + + Approvals.Verify(result); + } + + [Test] + public void PrintToString_ReturnsString_WhenSerializationsProperty() + { + var printer = ObjectPrinter.For().Using(x => x.Father.Name).Serialize(x => $"PROPERTY {x}"); + var result = printer.PrintToString(family); + + Approvals.Verify(result); + } + + [Test] + public void PrintToString_ReturnsString_WhenUsingExtension() + { + var result = family.PrintToString(); + + Approvals.Verify(result); + } + + [Test] + public void PrintToString_ReturnsString_WhenUsingExtensionWithConfig() + { + var result = family.PrintToString(x => x.Exclude().Exclude()); + + Approvals.Verify(result); + } + + [Test] + public void PrintToString_ReturnsString_WhenTrimmingProperty() + { + var printer = ObjectPrinter.For().Using(x => x.Father.Name).Trim(3); + var result = printer.PrintToString(family); + + Approvals.Verify(result); } } } \ No newline at end of file diff --git a/ObjectPrinting/Tests/Person.cs b/ObjectPrinting/Tests/Person.cs index f95559554..d246884a4 100644 --- a/ObjectPrinting/Tests/Person.cs +++ b/ObjectPrinting/Tests/Person.cs @@ -1,12 +1,11 @@ using System; -namespace ObjectPrinting.Tests +namespace ObjectPrinting.Tests; + +public class Person { - public class Person - { - public Guid Id { get; set; } - public string Name { get; set; } - public double Height { get; set; } - public int Age { get; set; } - } -} \ No newline at end of file + public Guid Id { get; set; } + public string Name { get; set; } + public double Height { get; set; } + public int Age { get; set; } +} From 6f7e4047ca9fffbb2e57dde6e391f3a104ef383d Mon Sep 17 00:00:00 2001 From: Ruslan Date: Sat, 22 Nov 2025 02:55:34 +0500 Subject: [PATCH 2/5] Printing --- ObjectPrinting/ObjectExtensions.cs | 16 ++++ .../ObjectPrinterUsingProperties.cs | 13 +++ .../ObjectPrinterUsingPropertiesExtensions.cs | 31 +++++++ ObjectPrinting/ObjectPrinterUsingProperty.cs | 25 ++++++ .../ObjectPrinterUsingPropertyExtensions.cs | 12 +++ ObjectPrinting/ObjectPrinting.csproj | 6 ++ ObjectPrinting/PrintingConfig.cs | 82 ++++++++++++++++++- 7 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 ObjectPrinting/ObjectExtensions.cs create mode 100644 ObjectPrinting/ObjectPrinterUsingProperties.cs create mode 100644 ObjectPrinting/ObjectPrinterUsingPropertiesExtensions.cs create mode 100644 ObjectPrinting/ObjectPrinterUsingProperty.cs create mode 100644 ObjectPrinting/ObjectPrinterUsingPropertyExtensions.cs diff --git a/ObjectPrinting/ObjectExtensions.cs b/ObjectPrinting/ObjectExtensions.cs new file mode 100644 index 000000000..ed99d9bcb --- /dev/null +++ b/ObjectPrinting/ObjectExtensions.cs @@ -0,0 +1,16 @@ +using System; + +namespace ObjectPrinting; + +public static class ObjectExtensions +{ + public static string PrintToString(this T obj) + { + return ObjectPrinter.For().PrintToString(obj); + } + + public static string PrintToString(this T obj, Func, PrintingConfig> config) + { + return config(ObjectPrinter.For()).PrintToString(obj); + } +} \ No newline at end of file diff --git a/ObjectPrinting/ObjectPrinterUsingProperties.cs b/ObjectPrinting/ObjectPrinterUsingProperties.cs new file mode 100644 index 000000000..2afaeb8ee --- /dev/null +++ b/ObjectPrinting/ObjectPrinterUsingProperties.cs @@ -0,0 +1,13 @@ +namespace ObjectPrinting; + +public class ObjectPrinterUsingProperties +{ + private PrintingConfig printingConfig; + + public PrintingConfig PrintingConfig => printingConfig; + + public ObjectPrinterUsingProperties(PrintingConfig printingConfig) + { + this.printingConfig = printingConfig; + } +} \ No newline at end of file diff --git a/ObjectPrinting/ObjectPrinterUsingPropertiesExtensions.cs b/ObjectPrinting/ObjectPrinterUsingPropertiesExtensions.cs new file mode 100644 index 000000000..cddb7622d --- /dev/null +++ b/ObjectPrinting/ObjectPrinterUsingPropertiesExtensions.cs @@ -0,0 +1,31 @@ +using System; +using System.Globalization; + +namespace ObjectPrinting; + +public static class ObjectPrinterUsingPropertiesExtensions +{ + public static PrintingConfig SetCulture(this ObjectPrinterUsingProperties properties, CultureInfo cultureInfo) + { + properties.PrintingConfig.SerializationsByType[typeof(int)] = obj => ((int)obj).ToString(cultureInfo); + return properties.PrintingConfig; + } + + public static PrintingConfig SetCulture(this ObjectPrinterUsingProperties properties, CultureInfo cultureInfo) + { + properties.PrintingConfig.SerializationsByType[typeof(double)] = obj => ((double)obj).ToString(cultureInfo); + return properties.PrintingConfig; + } + + public static PrintingConfig SetCulture(this ObjectPrinterUsingProperties properties, CultureInfo cultureInfo) + { + properties.PrintingConfig.SerializationsByType[typeof(decimal)] = obj => ((decimal)obj).ToString(cultureInfo); + return properties.PrintingConfig; + } + + public static PrintingConfig Trim(this ObjectPrinterUsingProperties properties, int length) + { + properties.PrintingConfig.SerializationsByType[typeof(string)] = obj => ((string)obj).Substring(0, Math.Min(length, ((string)obj).Length)); + return properties.PrintingConfig; + } +} \ No newline at end of file diff --git a/ObjectPrinting/ObjectPrinterUsingProperty.cs b/ObjectPrinting/ObjectPrinterUsingProperty.cs new file mode 100644 index 000000000..7ef686cfe --- /dev/null +++ b/ObjectPrinting/ObjectPrinterUsingProperty.cs @@ -0,0 +1,25 @@ +using System; + +namespace ObjectPrinting; + +public class ObjectPrinterUsingProperty +{ + private PrintingConfig printingConfig; + private string propertyFullName; + + public PrintingConfig PrintingConfig => printingConfig; + + public string PropertyFullName => propertyFullName; + + public ObjectPrinterUsingProperty(PrintingConfig printingConfig, string propertyFullName) + { + this.printingConfig = printingConfig; + this.propertyFullName = propertyFullName; + } + + public PrintingConfig Serialize(Func func) + { + printingConfig.SerializationsByPropertyFullName[propertyFullName] = func; + return printingConfig; + } +} \ No newline at end of file diff --git a/ObjectPrinting/ObjectPrinterUsingPropertyExtensions.cs b/ObjectPrinting/ObjectPrinterUsingPropertyExtensions.cs new file mode 100644 index 000000000..ef2f4d365 --- /dev/null +++ b/ObjectPrinting/ObjectPrinterUsingPropertyExtensions.cs @@ -0,0 +1,12 @@ +using System; + +namespace ObjectPrinting.Tests; + +public static class ObjectPrinterUsingPropertyExtensions +{ + public static PrintingConfig Trim(this ObjectPrinterUsingProperty property, int length) + { + property.PrintingConfig.SerializationsByPropertyFullName[property.PropertyFullName] = obj => ((string)obj).Substring(0, Math.Min(length, ((string)obj).Length)); + return property.PrintingConfig; + } +} \ No newline at end of file diff --git a/ObjectPrinting/ObjectPrinting.csproj b/ObjectPrinting/ObjectPrinting.csproj index c5db392ff..e02f71346 100644 --- a/ObjectPrinting/ObjectPrinting.csproj +++ b/ObjectPrinting/ObjectPrinting.csproj @@ -5,8 +5,14 @@ + + + + + + diff --git a/ObjectPrinting/PrintingConfig.cs b/ObjectPrinting/PrintingConfig.cs index a9e082117..f055f4628 100644 --- a/ObjectPrinting/PrintingConfig.cs +++ b/ObjectPrinting/PrintingConfig.cs @@ -1,19 +1,28 @@ using System; +using System.Collections.Generic; using System.Linq; +using System.Linq.Expressions; using System.Text; namespace ObjectPrinting { public class PrintingConfig { + public readonly Dictionary> SerializationsByType = []; + public readonly Dictionary> SerializationsByPropertyFullName = []; + private readonly HashSet excludedProperties = []; + private readonly HashSet excludedTypes = []; + + private readonly Stack currentPropertyFullName = new(); + public string PrintToString(TOwner obj) { + currentPropertyFullName.Clear(); return PrintToString(obj, 0); } private string PrintToString(object obj, int nestingLevel) { - //TODO apply configurations if (obj == null) return "null" + Environment.NewLine; @@ -22,6 +31,14 @@ private string PrintToString(object obj, int nestingLevel) typeof(int), typeof(double), typeof(float), typeof(string), typeof(DateTime), typeof(TimeSpan) }; + + var propertyFullName = string.Join(".", currentPropertyFullName.Reverse()); + if (SerializationsByPropertyFullName.TryGetValue(propertyFullName, out var value)) + return value(obj) + Environment.NewLine; + + if (SerializationsByType.ContainsKey(obj.GetType())) + return SerializationsByType[obj.GetType()](obj) + Environment.NewLine; + if (finalTypes.Contains(obj.GetType())) return obj + Environment.NewLine; @@ -31,11 +48,74 @@ private string PrintToString(object obj, int nestingLevel) sb.AppendLine(type.Name); foreach (var propertyInfo in type.GetProperties()) { + currentPropertyFullName.Push(propertyInfo.Name); + var newPropertyFullName = string.Join(".", currentPropertyFullName.Reverse()); + + if (excludedProperties.Contains(newPropertyFullName)) + { + currentPropertyFullName.Pop(); + continue; + } + + if (excludedTypes.Contains(propertyInfo.PropertyType)) + continue; + sb.Append(identation + propertyInfo.Name + " = " + PrintToString(propertyInfo.GetValue(obj), nestingLevel + 1)); + + currentPropertyFullName.Pop(); } return sb.ToString(); } + + public PrintingConfig Exclude() + { + excludedTypes.Add(typeof(T)); + return this; + } + + public PrintingConfig Exclude(Expression> func) + { + var fullPropertyName = GetPropertyFullName(func.Body); + excludedProperties.Add(fullPropertyName); + return this; + } + + public PrintingConfig Serialize(Func func) + { + SerializationsByType[typeof(T)] = obj => func((T)obj); + return this; + } + + public ObjectPrinterUsingProperties Using() + { + return new ObjectPrinterUsingProperties(this); + } + + public ObjectPrinterUsingProperty Using(Expression> func) + { + return new ObjectPrinterUsingProperty(this, GetPropertyFullName(func.Body)); + } + + private string GetPropertyFullName(Expression expression) + { + if (expression is MemberExpression memberExpression) + { + var parent = GetPropertyFullName(memberExpression.Expression!); + return string.IsNullOrEmpty(parent) ? memberExpression.Member.Name : parent + "." + memberExpression.Member.Name; + } + + if (expression is UnaryExpression unaryExpression) + { + return GetPropertyFullName(unaryExpression.Operand); + } + + if (expression is ParameterExpression) + { + return string.Empty; + } + throw new InvalidOperationException("Unsupported expression type"); + } } } \ No newline at end of file From 88b5ed4ca9012cdd35929e95b768e7b5942c0f30 Mon Sep 17 00:00:00 2001 From: Ruslan Date: Sat, 22 Nov 2025 16:16:56 +0500 Subject: [PATCH 3/5] Added Procces IEnumerable --- ObjectPrinting/PrintingConfig.cs | 31 +++++++++++++++++-- ...sString_WhenExcludingProperty.approved.txt | 22 +++++++++++++ ...turnsString_WhenExcludingType.approved.txt | 18 +++++++++++ ..._ReturnsString_WhenLotOfRules.approved.txt | 22 +++++++++++++ ...sString_WhenNoAdditionalRules.approved.txt | 22 +++++++++++++ ..._WhenSerializationsProperties.approved.txt | 22 +++++++++++++ ...ng_WhenSerializationsProperty.approved.txt | 22 +++++++++++++ ...String_WhenTrimmingProperties.approved.txt | 22 +++++++++++++ ...nsString_WhenTrimmingProperty.approved.txt | 22 +++++++++++++ ...urnsString_WhenUsingExtension.approved.txt | 22 +++++++++++++ ..._WhenUsingExtensionWithConfig.approved.txt | 14 +++++++++ ...String_WhenWhenSettingCulture.approved.txt | 22 +++++++++++++ ObjectPrinting/Tests/Family.cs | 6 +++- .../Tests/ObjectPrinterAcceptanceTests.cs | 4 ++- 14 files changed, 267 insertions(+), 4 deletions(-) diff --git a/ObjectPrinting/PrintingConfig.cs b/ObjectPrinting/PrintingConfig.cs index f055f4628..38f6e401e 100644 --- a/ObjectPrinting/PrintingConfig.cs +++ b/ObjectPrinting/PrintingConfig.cs @@ -41,8 +41,13 @@ private string PrintToString(object obj, int nestingLevel) if (finalTypes.Contains(obj.GetType())) return obj + Environment.NewLine; + + if (obj is System.Collections.IEnumerable and not string) + { + return ProcessIEnumerable(obj, nestingLevel); + } - var identation = new string('\t', nestingLevel + 1); + var indentation = new string('\t', nestingLevel + 1); var sb = new StringBuilder(); var type = obj.GetType(); sb.AppendLine(type.Name); @@ -60,7 +65,7 @@ private string PrintToString(object obj, int nestingLevel) if (excludedTypes.Contains(propertyInfo.PropertyType)) continue; - sb.Append(identation + propertyInfo.Name + " = " + + sb.Append(indentation + propertyInfo.Name + " = " + PrintToString(propertyInfo.GetValue(obj), nestingLevel + 1)); @@ -69,6 +74,28 @@ private string PrintToString(object obj, int nestingLevel) return sb.ToString(); } + private string ProcessIEnumerable(object obj, int nestingLevel) + { + var indentation = new string('\t', nestingLevel + 1); + var sb = new StringBuilder(); + sb.AppendLine(obj.GetType().Name); + + var enumerable = (System.Collections.IEnumerable)obj; + var index = 0; + + foreach (var item in enumerable) + { + currentPropertyFullName.Push($"[{index}]"); + sb.Append(indentation + $"[{index}] = " + + PrintToString(item, nestingLevel + 1)); + currentPropertyFullName.Pop(); + index++; + } + + return sb.ToString(); + } + + public PrintingConfig Exclude() { excludedTypes.Add(typeof(T)); diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenExcludingProperty.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenExcludingProperty.approved.txt index 95921e13d..a8434880c 100644 --- a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenExcludingProperty.approved.txt +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenExcludingProperty.approved.txt @@ -1,4 +1,26 @@ Family + Parents = List`1 + [0] = Person + Id = Guid + Name = Alex + Height = 0 + Age = 19 + [1] = Person + Id = Guid + Name = Kate + Height = 0 + Age = 21 + Children = Person[] + [0] = Person + Id = Guid + Name = Alex + Height = 0 + Age = 19 + [1] = Person + Id = Guid + Name = Kate + Height = 0 + Age = 21 Father = Person Id = Guid Name = Alex diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenExcludingType.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenExcludingType.approved.txt index 43c618753..fcfcf2356 100644 --- a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenExcludingType.approved.txt +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenExcludingType.approved.txt @@ -1,4 +1,22 @@ Family + Parents = List`1 + [0] = Person + Id = Guid + Name = Alex + Height = 0 + [1] = Person + Id = Guid + Name = Kate + Height = 0 + Children = Person[] + [0] = Person + Id = Guid + Name = Alex + Height = 0 + [1] = Person + Id = Guid + Name = Kate + Height = 0 Father = Person Id = Guid Name = Alex diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenLotOfRules.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenLotOfRules.approved.txt index 74e745ea8..3590c83b3 100644 --- a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenLotOfRules.approved.txt +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenLotOfRules.approved.txt @@ -1,4 +1,26 @@ Family + Parents = List`1 + [0] = Person + Id = Guid + Name = Al + Height = 0 + Age = 19INT: + [1] = Person + Id = Guid + Name = Ka + Height = 0 + Age = 21INT: + Children = Person[] + [0] = Person + Id = Guid + Name = Al + Height = 0 + Age = 19INT: + [1] = Person + Id = Guid + Name = Ka + Height = 0 + Age = 21INT: Father = Person Id = Guid Name = Al diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenNoAdditionalRules.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenNoAdditionalRules.approved.txt index 85b6e738f..f80071ab4 100644 --- a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenNoAdditionalRules.approved.txt +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenNoAdditionalRules.approved.txt @@ -1,4 +1,26 @@ Family + Parents = List`1 + [0] = Person + Id = Guid + Name = Alex + Height = 0 + Age = 19 + [1] = Person + Id = Guid + Name = Kate + Height = 0 + Age = 21 + Children = Person[] + [0] = Person + Id = Guid + Name = Alex + Height = 0 + Age = 19 + [1] = Person + Id = Guid + Name = Kate + Height = 0 + Age = 21 Father = Person Id = Guid Name = Alex diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenSerializationsProperties.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenSerializationsProperties.approved.txt index 02582b740..75b5f96bb 100644 --- a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenSerializationsProperties.approved.txt +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenSerializationsProperties.approved.txt @@ -1,4 +1,26 @@ Family + Parents = List`1 + [0] = Person + Id = Guid + Name = Alex + Height = 0 + Age = NUMBER 19 + [1] = Person + Id = Guid + Name = Kate + Height = 0 + Age = NUMBER 21 + Children = Person[] + [0] = Person + Id = Guid + Name = Alex + Height = 0 + Age = NUMBER 19 + [1] = Person + Id = Guid + Name = Kate + Height = 0 + Age = NUMBER 21 Father = Person Id = Guid Name = Alex diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenSerializationsProperty.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenSerializationsProperty.approved.txt index 5be0f83ac..3836ffd78 100644 --- a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenSerializationsProperty.approved.txt +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenSerializationsProperty.approved.txt @@ -1,4 +1,26 @@ Family + Parents = List`1 + [0] = Person + Id = Guid + Name = Alex + Height = 0 + Age = 19 + [1] = Person + Id = Guid + Name = Kate + Height = 0 + Age = 21 + Children = Person[] + [0] = Person + Id = Guid + Name = Alex + Height = 0 + Age = 19 + [1] = Person + Id = Guid + Name = Kate + Height = 0 + Age = 21 Father = Person Id = Guid Name = PROPERTY Alex diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenTrimmingProperties.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenTrimmingProperties.approved.txt index 39ea9a127..9ae84c5bf 100644 --- a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenTrimmingProperties.approved.txt +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenTrimmingProperties.approved.txt @@ -1,4 +1,26 @@ Family + Parents = List`1 + [0] = Person + Id = Guid + Name = Ale + Height = 0 + Age = 19 + [1] = Person + Id = Guid + Name = Kat + Height = 0 + Age = 21 + Children = Person[] + [0] = Person + Id = Guid + Name = Ale + Height = 0 + Age = 19 + [1] = Person + Id = Guid + Name = Kat + Height = 0 + Age = 21 Father = Person Id = Guid Name = Ale diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenTrimmingProperty.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenTrimmingProperty.approved.txt index 69a2e0179..181d8dae3 100644 --- a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenTrimmingProperty.approved.txt +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenTrimmingProperty.approved.txt @@ -1,4 +1,26 @@ Family + Parents = List`1 + [0] = Person + Id = Guid + Name = Alex + Height = 0 + Age = 19 + [1] = Person + Id = Guid + Name = Kate + Height = 0 + Age = 21 + Children = Person[] + [0] = Person + Id = Guid + Name = Alex + Height = 0 + Age = 19 + [1] = Person + Id = Guid + Name = Kate + Height = 0 + Age = 21 Father = Person Id = Guid Name = Ale diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenUsingExtension.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenUsingExtension.approved.txt index 85b6e738f..f80071ab4 100644 --- a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenUsingExtension.approved.txt +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenUsingExtension.approved.txt @@ -1,4 +1,26 @@ Family + Parents = List`1 + [0] = Person + Id = Guid + Name = Alex + Height = 0 + Age = 19 + [1] = Person + Id = Guid + Name = Kate + Height = 0 + Age = 21 + Children = Person[] + [0] = Person + Id = Guid + Name = Alex + Height = 0 + Age = 19 + [1] = Person + Id = Guid + Name = Kate + Height = 0 + Age = 21 Father = Person Id = Guid Name = Alex diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenUsingExtensionWithConfig.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenUsingExtensionWithConfig.approved.txt index deb53a991..cfb33d2fe 100644 --- a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenUsingExtensionWithConfig.approved.txt +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenUsingExtensionWithConfig.approved.txt @@ -1,4 +1,18 @@ Family + Parents = List`1 + [0] = Person + Id = Guid + Height = 0 + [1] = Person + Id = Guid + Height = 0 + Children = Person[] + [0] = Person + Id = Guid + Height = 0 + [1] = Person + Id = Guid + Height = 0 Father = Person Id = Guid Height = 0 diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenWhenSettingCulture.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenWhenSettingCulture.approved.txt index 85b6e738f..f80071ab4 100644 --- a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenWhenSettingCulture.approved.txt +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenWhenSettingCulture.approved.txt @@ -1,4 +1,26 @@ Family + Parents = List`1 + [0] = Person + Id = Guid + Name = Alex + Height = 0 + Age = 19 + [1] = Person + Id = Guid + Name = Kate + Height = 0 + Age = 21 + Children = Person[] + [0] = Person + Id = Guid + Name = Alex + Height = 0 + Age = 19 + [1] = Person + Id = Guid + Name = Kate + Height = 0 + Age = 21 Father = Person Id = Guid Name = Alex diff --git a/ObjectPrinting/Tests/Family.cs b/ObjectPrinting/Tests/Family.cs index 35630b999..7f31ca1f0 100644 --- a/ObjectPrinting/Tests/Family.cs +++ b/ObjectPrinting/Tests/Family.cs @@ -1,7 +1,11 @@ -namespace ObjectPrinting.Tests; +using System.Collections.Generic; + +namespace ObjectPrinting.Tests; public class Family { + public List Parents { get; set; } + public Person[] Children { get; set; } public Person Father { get; set; } public Person Mother { get; set; } public double Age { get; set; } diff --git a/ObjectPrinting/Tests/ObjectPrinterAcceptanceTests.cs b/ObjectPrinting/Tests/ObjectPrinterAcceptanceTests.cs index 9ccfdd257..ce13bae77 100644 --- a/ObjectPrinting/Tests/ObjectPrinterAcceptanceTests.cs +++ b/ObjectPrinting/Tests/ObjectPrinterAcceptanceTests.cs @@ -20,7 +20,9 @@ public void SetUp() { Father = new Person { Name = "Alex", Age = 19 }, Mother = new Person { Name = "Kate", Age = 21 }, - Age = 55335.57d + Age = 55335.57d, + Parents = [new Person { Name = "Alex", Age = 19 }, new Person { Name = "Kate", Age = 21 }], + Children = [new Person { Name = "Alex", Age = 19 }, new Person { Name = "Kate", Age = 21 }] }; } From 0e5b059d98f725b4acdefd234aa9d52a0decb65a Mon Sep 17 00:00:00 2001 From: Ruslan Date: Sat, 22 Nov 2025 16:27:04 +0500 Subject: [PATCH 4/5] Refactoring --- ...sString_WhenExcludingProperty.approved.txt | 19 +++++++++++++++++-- ...turnsString_WhenExcludingType.approved.txt | 15 +++++++++++++-- ..._ReturnsString_WhenLotOfRules.approved.txt | 19 +++++++++++++++++-- ...sString_WhenNoAdditionalRules.approved.txt | 19 +++++++++++++++++-- ..._WhenSerializationsProperties.approved.txt | 19 +++++++++++++++++-- ...ng_WhenSerializationsProperty.approved.txt | 19 +++++++++++++++++-- ...String_WhenTrimmingProperties.approved.txt | 19 +++++++++++++++++-- ...nsString_WhenTrimmingProperty.approved.txt | 19 +++++++++++++++++-- ...urnsString_WhenUsingExtension.approved.txt | 19 +++++++++++++++++-- ..._WhenUsingExtensionWithConfig.approved.txt | 13 +++++++++++-- ...String_WhenWhenSettingCulture.approved.txt | 19 +++++++++++++++++-- ObjectPrinting/Tests/Family.cs | 3 ++- .../Tests/ObjectPrinterAcceptanceTests.cs | 10 ++++++++-- 13 files changed, 187 insertions(+), 25 deletions(-) diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenExcludingProperty.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenExcludingProperty.approved.txt index a8434880c..1d44b8291 100644 --- a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenExcludingProperty.approved.txt +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenExcludingProperty.approved.txt @@ -1,5 +1,5 @@ Family - Parents = List`1 + GrandParents = Person[] [0] = Person Id = Guid Name = Alex @@ -10,7 +10,7 @@ Name = Kate Height = 0 Age = 21 - Children = Person[] + Parents = List`1 [0] = Person Id = Guid Name = Alex @@ -21,6 +21,21 @@ Name = Kate Height = 0 Age = 21 + Children = Dictionary`2 + [0] = KeyValuePair`2 + Key = 1 + Value = Person + Id = Guid + Name = Alex + Height = 0 + Age = 19 + [1] = KeyValuePair`2 + Key = 2 + Value = Person + Id = Guid + Name = Kate + Height = 0 + Age = 21 Father = Person Id = Guid Name = Alex diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenExcludingType.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenExcludingType.approved.txt index fcfcf2356..0ec7ca9d1 100644 --- a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenExcludingType.approved.txt +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenExcludingType.approved.txt @@ -1,5 +1,5 @@ Family - Parents = List`1 + GrandParents = Person[] [0] = Person Id = Guid Name = Alex @@ -8,7 +8,7 @@ Id = Guid Name = Kate Height = 0 - Children = Person[] + Parents = List`1 [0] = Person Id = Guid Name = Alex @@ -17,6 +17,17 @@ Id = Guid Name = Kate Height = 0 + Children = Dictionary`2 + [0] = KeyValuePair`2 + Value = Person + Id = Guid + Name = Alex + Height = 0 + [1] = KeyValuePair`2 + Value = Person + Id = Guid + Name = Kate + Height = 0 Father = Person Id = Guid Name = Alex diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenLotOfRules.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenLotOfRules.approved.txt index 3590c83b3..e0b4d6167 100644 --- a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenLotOfRules.approved.txt +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenLotOfRules.approved.txt @@ -1,5 +1,5 @@ Family - Parents = List`1 + GrandParents = Person[] [0] = Person Id = Guid Name = Al @@ -10,7 +10,7 @@ Name = Ka Height = 0 Age = 21INT: - Children = Person[] + Parents = List`1 [0] = Person Id = Guid Name = Al @@ -21,6 +21,21 @@ Name = Ka Height = 0 Age = 21INT: + Children = Dictionary`2 + [0] = KeyValuePair`2 + Key = 1INT: + Value = Person + Id = Guid + Name = Al + Height = 0 + Age = 19INT: + [1] = KeyValuePair`2 + Key = 2INT: + Value = Person + Id = Guid + Name = Ka + Height = 0 + Age = 21INT: Father = Person Id = Guid Name = Al diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenNoAdditionalRules.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenNoAdditionalRules.approved.txt index f80071ab4..ce7128252 100644 --- a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenNoAdditionalRules.approved.txt +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenNoAdditionalRules.approved.txt @@ -1,5 +1,5 @@ Family - Parents = List`1 + GrandParents = Person[] [0] = Person Id = Guid Name = Alex @@ -10,7 +10,7 @@ Name = Kate Height = 0 Age = 21 - Children = Person[] + Parents = List`1 [0] = Person Id = Guid Name = Alex @@ -21,6 +21,21 @@ Name = Kate Height = 0 Age = 21 + Children = Dictionary`2 + [0] = KeyValuePair`2 + Key = 1 + Value = Person + Id = Guid + Name = Alex + Height = 0 + Age = 19 + [1] = KeyValuePair`2 + Key = 2 + Value = Person + Id = Guid + Name = Kate + Height = 0 + Age = 21 Father = Person Id = Guid Name = Alex diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenSerializationsProperties.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenSerializationsProperties.approved.txt index 75b5f96bb..3b5e63fbe 100644 --- a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenSerializationsProperties.approved.txt +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenSerializationsProperties.approved.txt @@ -1,5 +1,5 @@ Family - Parents = List`1 + GrandParents = Person[] [0] = Person Id = Guid Name = Alex @@ -10,7 +10,7 @@ Name = Kate Height = 0 Age = NUMBER 21 - Children = Person[] + Parents = List`1 [0] = Person Id = Guid Name = Alex @@ -21,6 +21,21 @@ Name = Kate Height = 0 Age = NUMBER 21 + Children = Dictionary`2 + [0] = KeyValuePair`2 + Key = NUMBER 1 + Value = Person + Id = Guid + Name = Alex + Height = 0 + Age = NUMBER 19 + [1] = KeyValuePair`2 + Key = NUMBER 2 + Value = Person + Id = Guid + Name = Kate + Height = 0 + Age = NUMBER 21 Father = Person Id = Guid Name = Alex diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenSerializationsProperty.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenSerializationsProperty.approved.txt index 3836ffd78..a8fc430fe 100644 --- a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenSerializationsProperty.approved.txt +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenSerializationsProperty.approved.txt @@ -1,5 +1,5 @@ Family - Parents = List`1 + GrandParents = Person[] [0] = Person Id = Guid Name = Alex @@ -10,7 +10,7 @@ Name = Kate Height = 0 Age = 21 - Children = Person[] + Parents = List`1 [0] = Person Id = Guid Name = Alex @@ -21,6 +21,21 @@ Name = Kate Height = 0 Age = 21 + Children = Dictionary`2 + [0] = KeyValuePair`2 + Key = 1 + Value = Person + Id = Guid + Name = Alex + Height = 0 + Age = 19 + [1] = KeyValuePair`2 + Key = 2 + Value = Person + Id = Guid + Name = Kate + Height = 0 + Age = 21 Father = Person Id = Guid Name = PROPERTY Alex diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenTrimmingProperties.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenTrimmingProperties.approved.txt index 9ae84c5bf..5ef09c0e5 100644 --- a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenTrimmingProperties.approved.txt +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenTrimmingProperties.approved.txt @@ -1,5 +1,5 @@ Family - Parents = List`1 + GrandParents = Person[] [0] = Person Id = Guid Name = Ale @@ -10,7 +10,7 @@ Name = Kat Height = 0 Age = 21 - Children = Person[] + Parents = List`1 [0] = Person Id = Guid Name = Ale @@ -21,6 +21,21 @@ Name = Kat Height = 0 Age = 21 + Children = Dictionary`2 + [0] = KeyValuePair`2 + Key = 1 + Value = Person + Id = Guid + Name = Ale + Height = 0 + Age = 19 + [1] = KeyValuePair`2 + Key = 2 + Value = Person + Id = Guid + Name = Kat + Height = 0 + Age = 21 Father = Person Id = Guid Name = Ale diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenTrimmingProperty.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenTrimmingProperty.approved.txt index 181d8dae3..c5ffcb72c 100644 --- a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenTrimmingProperty.approved.txt +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenTrimmingProperty.approved.txt @@ -1,5 +1,5 @@ Family - Parents = List`1 + GrandParents = Person[] [0] = Person Id = Guid Name = Alex @@ -10,7 +10,7 @@ Name = Kate Height = 0 Age = 21 - Children = Person[] + Parents = List`1 [0] = Person Id = Guid Name = Alex @@ -21,6 +21,21 @@ Name = Kate Height = 0 Age = 21 + Children = Dictionary`2 + [0] = KeyValuePair`2 + Key = 1 + Value = Person + Id = Guid + Name = Alex + Height = 0 + Age = 19 + [1] = KeyValuePair`2 + Key = 2 + Value = Person + Id = Guid + Name = Kate + Height = 0 + Age = 21 Father = Person Id = Guid Name = Ale diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenUsingExtension.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenUsingExtension.approved.txt index f80071ab4..ce7128252 100644 --- a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenUsingExtension.approved.txt +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenUsingExtension.approved.txt @@ -1,5 +1,5 @@ Family - Parents = List`1 + GrandParents = Person[] [0] = Person Id = Guid Name = Alex @@ -10,7 +10,7 @@ Name = Kate Height = 0 Age = 21 - Children = Person[] + Parents = List`1 [0] = Person Id = Guid Name = Alex @@ -21,6 +21,21 @@ Name = Kate Height = 0 Age = 21 + Children = Dictionary`2 + [0] = KeyValuePair`2 + Key = 1 + Value = Person + Id = Guid + Name = Alex + Height = 0 + Age = 19 + [1] = KeyValuePair`2 + Key = 2 + Value = Person + Id = Guid + Name = Kate + Height = 0 + Age = 21 Father = Person Id = Guid Name = Alex diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenUsingExtensionWithConfig.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenUsingExtensionWithConfig.approved.txt index cfb33d2fe..c23bcfc92 100644 --- a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenUsingExtensionWithConfig.approved.txt +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenUsingExtensionWithConfig.approved.txt @@ -1,18 +1,27 @@ Family - Parents = List`1 + GrandParents = Person[] [0] = Person Id = Guid Height = 0 [1] = Person Id = Guid Height = 0 - Children = Person[] + Parents = List`1 [0] = Person Id = Guid Height = 0 [1] = Person Id = Guid Height = 0 + Children = Dictionary`2 + [0] = KeyValuePair`2 + Value = Person + Id = Guid + Height = 0 + [1] = KeyValuePair`2 + Value = Person + Id = Guid + Height = 0 Father = Person Id = Guid Height = 0 diff --git a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenWhenSettingCulture.approved.txt b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenWhenSettingCulture.approved.txt index f80071ab4..ce7128252 100644 --- a/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenWhenSettingCulture.approved.txt +++ b/ObjectPrinting/Tests/ApprovalTests/ObjectPrinterAcceptanceTests.PrintToString_ReturnsString_WhenWhenSettingCulture.approved.txt @@ -1,5 +1,5 @@ Family - Parents = List`1 + GrandParents = Person[] [0] = Person Id = Guid Name = Alex @@ -10,7 +10,7 @@ Name = Kate Height = 0 Age = 21 - Children = Person[] + Parents = List`1 [0] = Person Id = Guid Name = Alex @@ -21,6 +21,21 @@ Name = Kate Height = 0 Age = 21 + Children = Dictionary`2 + [0] = KeyValuePair`2 + Key = 1 + Value = Person + Id = Guid + Name = Alex + Height = 0 + Age = 19 + [1] = KeyValuePair`2 + Key = 2 + Value = Person + Id = Guid + Name = Kate + Height = 0 + Age = 21 Father = Person Id = Guid Name = Alex diff --git a/ObjectPrinting/Tests/Family.cs b/ObjectPrinting/Tests/Family.cs index 7f31ca1f0..6ffc097b4 100644 --- a/ObjectPrinting/Tests/Family.cs +++ b/ObjectPrinting/Tests/Family.cs @@ -4,8 +4,9 @@ namespace ObjectPrinting.Tests; public class Family { + public Person[] GrandParents { get; set; } public List Parents { get; set; } - public Person[] Children { get; set; } + public Dictionary Children { get; set; } public Person Father { get; set; } public Person Mother { get; set; } public double Age { get; set; } diff --git a/ObjectPrinting/Tests/ObjectPrinterAcceptanceTests.cs b/ObjectPrinting/Tests/ObjectPrinterAcceptanceTests.cs index ce13bae77..205249a39 100644 --- a/ObjectPrinting/Tests/ObjectPrinterAcceptanceTests.cs +++ b/ObjectPrinting/Tests/ObjectPrinterAcceptanceTests.cs @@ -1,4 +1,5 @@ -using System.Globalization; +using System.Collections.Generic; +using System.Globalization; using ApprovalTests; using ApprovalTests.Namers; using ApprovalTests.Reporters; @@ -21,8 +22,13 @@ public void SetUp() Father = new Person { Name = "Alex", Age = 19 }, Mother = new Person { Name = "Kate", Age = 21 }, Age = 55335.57d, + GrandParents = [new Person { Name = "Alex", Age = 19 }, new Person { Name = "Kate", Age = 21 }], Parents = [new Person { Name = "Alex", Age = 19 }, new Person { Name = "Kate", Age = 21 }], - Children = [new Person { Name = "Alex", Age = 19 }, new Person { Name = "Kate", Age = 21 }] + Children = new Dictionary + { + [1] = new() { Name = "Alex", Age = 19 }, + [2] = new() { Name = "Kate", Age = 21 } + } }; } From 27e637d2279d755ee27155e5c6ffeea77b47fb97 Mon Sep 17 00:00:00 2001 From: Ruslan Date: Sat, 22 Nov 2025 16:47:50 +0500 Subject: [PATCH 5/5] Refactoring --- ObjectPrinting/PrintingConfig.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ObjectPrinting/PrintingConfig.cs b/ObjectPrinting/PrintingConfig.cs index 38f6e401e..98f552f04 100644 --- a/ObjectPrinting/PrintingConfig.cs +++ b/ObjectPrinting/PrintingConfig.cs @@ -135,7 +135,11 @@ private string GetPropertyFullName(Expression expression) if (expression is UnaryExpression unaryExpression) { - return GetPropertyFullName(unaryExpression.Operand); + if (unaryExpression.NodeType == ExpressionType.Convert) + { + return GetPropertyFullName(unaryExpression.Operand); + } + throw new InvalidOperationException("Unsupported expression type"); } if (expression is ParameterExpression)