From 86a4c283b7532b75561a81b8f7cd432f5639c7b4 Mon Sep 17 00:00:00 2001 From: Kostornoj-Dmitrij Date: Tue, 5 Nov 2024 19:04:44 +0500 Subject: [PATCH 1/4] ObjectComparisonComplete --- Testing/Basic/Basic.csproj | 14 +++++++--- .../1. ObjectComparison/ObjectComparison.cs | 26 ++++++++++--------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/Testing/Basic/Basic.csproj b/Testing/Basic/Basic.csproj index d23dca2..2cdfe60 100644 --- a/Testing/Basic/Basic.csproj +++ b/Testing/Basic/Basic.csproj @@ -1,19 +1,27 @@  - net8.0 + net7.0 enable enable + + preview + + + + preview + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + - + diff --git a/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs b/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs index d544c47..766d270 100644 --- a/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs +++ b/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs @@ -1,4 +1,5 @@ -using NUnit.Framework; +using FluentAssertions; +using NUnit.Framework; using NUnit.Framework.Legacy; namespace HomeExercise.Tasks.ObjectComparison; @@ -14,16 +15,9 @@ public void CheckCurrentTsar() var expectedTsar = new Person("Ivan IV The Terrible", 54, 170, 70, new Person("Vasili III of Russia", 28, 170, 60, null)); - // Перепишите код на использование Fluent Assertions. - ClassicAssert.AreEqual(actualTsar.Name, expectedTsar.Name); - ClassicAssert.AreEqual(actualTsar.Age, expectedTsar.Age); - ClassicAssert.AreEqual(actualTsar.Height, expectedTsar.Height); - ClassicAssert.AreEqual(actualTsar.Weight, expectedTsar.Weight); - - ClassicAssert.AreEqual(expectedTsar.Parent!.Name, actualTsar.Parent!.Name); - ClassicAssert.AreEqual(expectedTsar.Parent.Age, actualTsar.Parent.Age); - ClassicAssert.AreEqual(expectedTsar.Parent.Height, actualTsar.Parent.Height); - ClassicAssert.AreEqual(expectedTsar.Parent.Parent, actualTsar.Parent.Parent); + actualTsar.Should().BeEquivalentTo(expectedTsar, properties => properties + .Excluding(person => person.Id) + .Excluding(person => person.Parent.Id)); } [Test] @@ -34,7 +28,15 @@ public void CheckCurrentTsar_WithCustomEquality() var expectedTsar = new Person("Ivan IV The Terrible", 54, 170, 70, new Person("Vasili III of Russia", 28, 170, 60, null)); - // Какие недостатки у такого подхода? + /* Данное решение имеет следующие недостатки: + При добавлении новых свойств в класс Person придётся вручную обновлять метод AreEqual и + включать новое свойство в сравнение, что сделает код очень громоздким и замедлит разработку. + В целом, используя собственный метод AreEqual, мы уменьшаем читаемость (особенно если подобных тестов и методов станет много, + а разбираться в этом будет сторонний разработчик), а также + отказываемся от более информативной обработки исключений FluentAssertions (можем увидеть, какое конкретное поле не совпало, + а не просто получим возврат false) + Таким образом моё решение является более устойчивым к изменениям, читабельным и поддерживаемым по сравнению с данным. + */ ClassicAssert.True(AreEqual(actualTsar, expectedTsar)); } From abcbf470c8715436f616bf2fa7fc2ceb5ef6a696 Mon Sep 17 00:00:00 2001 From: Kostornoj-Dmitrij Date: Tue, 5 Nov 2024 21:04:48 +0500 Subject: [PATCH 2/4] NumberValidatorComplete --- .../NumberValidatorTests.cs | 108 ++++++++++++++---- 1 file changed, 88 insertions(+), 20 deletions(-) diff --git a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs index 950c9bc..2e60692 100644 --- a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs +++ b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs @@ -1,6 +1,7 @@ - +using FluentAssertions; using NUnit.Framework; using NUnit.Framework.Legacy; +using System.ComponentModel.DataAnnotations; namespace HomeExercise.Tasks.NumberValidator; @@ -8,24 +9,91 @@ namespace HomeExercise.Tasks.NumberValidator; public class NumberValidatorTests { [Test] - public void Test() - { - Assert.Throws(() => new NumberValidator(-1, 2, true)); - Assert.DoesNotThrow(() => new NumberValidator(1, 0, true)); - Assert.Throws(() => new NumberValidator(-1, 2, false)); - Assert.DoesNotThrow(() => new NumberValidator(1, 0, true)); - - ClassicAssert.IsTrue(new NumberValidator(17, 2, true).IsValidNumber("0.0")); - ClassicAssert.IsTrue(new NumberValidator(17, 2, true).IsValidNumber("0")); - ClassicAssert.IsTrue(new NumberValidator(17, 2, true).IsValidNumber("0.0")); - ClassicAssert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("00.00")); - ClassicAssert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("-0.00")); - ClassicAssert.IsTrue(new NumberValidator(17, 2, true).IsValidNumber("0.0")); - ClassicAssert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("+0.00")); - ClassicAssert.IsTrue(new NumberValidator(4, 2, true).IsValidNumber("+1.23")); - ClassicAssert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("+1.23")); - ClassicAssert.IsFalse(new NumberValidator(17, 2, true).IsValidNumber("0.000")); - ClassicAssert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("-1.23")); - ClassicAssert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("a.sd")); + public void WhenPrecisionIsNegative_ShouldReturnArgumentException() + { + Action action = () => new NumberValidator(-1, 2, true); + action.Should().Throw().WithMessage("precision must be a positive number"); + } + + [Test] + public void WhenScaleIsNegative_ShouldThrowArgumentException() + { + Action act = () => new NumberValidator(1, -1, false); + act.Should().Throw().WithMessage("precision must be a non-negative number less or equal than precision"); + } + + [Test] + public void WhenScaleIsMoreThanPrecision_ShouldThrowArgumentException() + { + Action act = () => new NumberValidator(2, 3, false); + act.Should().Throw().WithMessage("precision must be a non-negative number less or equal than precision"); + } + + [Test] + public void WhenValid_ShouldNotThrow() + { + Action act = () => new NumberValidator(1, 0, true); + act.Should().NotThrow(); + } + + [Test] + public void WhenInputIsEmpty_ShouldReturnFalse() + { + NumberValidator validator = new NumberValidator(5, 2, true); + ValidateNumber(validator, "", false); + } + + [Test] + public void WhenInputIsNull_ShouldReturnFalse() + { + NumberValidator validator = new NumberValidator(5, 2, true); + ValidateNumber(validator, null, false); + } + + + [Test] + [TestCase("12345", true)] + [TestCase("123.45", true)] + [TestCase("-123.45", false)] + [TestCase("001.23", true)] + [TestCase("0", true)] + [TestCase("0.0", true)] + [TestCase("+123.45", false)] + [TestCase("123456", false)] + [TestCase("123.456", false)] + [TestCase("0000.00", false)] + [TestCase("0.000", false)] + [TestCase("ab.c", false)] + [TestCase("123.45.67", false)] + [TestCase("123,67", true)] + [TestCase("123 45", false)] + [TestCase("++1", false)] + [TestCase("1.", false)] + public void WhenInputIsVarious_ShouldReturnExpected_PositiveValidator(string input, bool expected) + { + NumberValidator validator = new NumberValidator(5, 2, true); + ValidateNumber(validator, input, expected); + } + + [Test] + [TestCase("12345", true)] + [TestCase("123.45", true)] + [TestCase("123.45a", false)] + [TestCase("12.3.4", false)] + [TestCase("-0", true)] + [TestCase("-12.45", true)] + [TestCase("-123.45", false)] + [TestCase("--1", false)] + [TestCase("-1.", false)] + public void WhenInputIsVarious_ShouldReturnExpected_NegativeValidator(string input, bool expected) + { + NumberValidator validator = new NumberValidator(5, 2, false); + ValidateNumber(validator, input, expected); + } + + private void ValidateNumber(NumberValidator validator, string input, bool expected) + { + bool result = validator.IsValidNumber(input); + result.Should().Be(expected, $"Input '{input}' did not return expected result '{expected}'."); } } \ No newline at end of file From ed639e24fcf00d82bdcd54063fa9db0861f539bf Mon Sep 17 00:00:00 2001 From: Kostornoj-Dmitrij Date: Wed, 6 Nov 2024 13:56:33 +0500 Subject: [PATCH 3/4] homework_fixes --- .../1. ObjectComparison/ObjectComparison.cs | 17 +-- .../NumberValidatorTests.cs | 112 ++++++------------ 2 files changed, 48 insertions(+), 81 deletions(-) diff --git a/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs b/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs index 766d270..1d0eb84 100644 --- a/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs +++ b/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs @@ -15,9 +15,9 @@ public void CheckCurrentTsar() var expectedTsar = new Person("Ivan IV The Terrible", 54, 170, 70, new Person("Vasili III of Russia", 28, 170, 60, null)); - actualTsar.Should().BeEquivalentTo(expectedTsar, properties => properties - .Excluding(person => person.Id) - .Excluding(person => person.Parent.Id)); + actualTsar.Should().BeEquivalentTo(expectedTsar, properties => + properties.Excluding(o => o.Name == "Id" && + o.DeclaringType == typeof(Person)).IgnoringCyclicReferences()); } [Test] @@ -31,11 +31,12 @@ public void CheckCurrentTsar_WithCustomEquality() /* Данное решение имеет следующие недостатки: При добавлении новых свойств в класс Person придётся вручную обновлять метод AreEqual и включать новое свойство в сравнение, что сделает код очень громоздким и замедлит разработку. - В целом, используя собственный метод AreEqual, мы уменьшаем читаемость (особенно если подобных тестов и методов станет много, - а разбираться в этом будет сторонний разработчик), а также - отказываемся от более информативной обработки исключений FluentAssertions (можем увидеть, какое конкретное поле не совпало, - а не просто получим возврат false) - Таким образом моё решение является более устойчивым к изменениям, читабельным и поддерживаемым по сравнению с данным. + В целом, используя собственный метод AreEqual, мы уменьшаем читаемость (особенно если подобных тестов + и методов станет много, а разбираться в этом будет сторонний разработчик), а также + отказываемся от более информативной обработки исключений FluentAssertions (можем увидеть, + какое конкретное поле не совпало, а не просто получим возврат false) + Таким образом моё решение является более устойчивым к изменениям, читабельным и + поддерживаемым по сравнению с данным. */ ClassicAssert.True(AreEqual(actualTsar, expectedTsar)); } diff --git a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs index 2e60692..9f30c79 100644 --- a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs +++ b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs @@ -1,99 +1,65 @@ using FluentAssertions; using NUnit.Framework; -using NUnit.Framework.Legacy; -using System.ComponentModel.DataAnnotations; namespace HomeExercise.Tasks.NumberValidator; [TestFixture] public class NumberValidatorTests { - [Test] - public void WhenPrecisionIsNegative_ShouldReturnArgumentException() - { - Action action = () => new NumberValidator(-1, 2, true); - action.Should().Throw().WithMessage("precision must be a positive number"); - } - - [Test] - public void WhenScaleIsNegative_ShouldThrowArgumentException() - { - Action act = () => new NumberValidator(1, -1, false); - act.Should().Throw().WithMessage("precision must be a non-negative number less or equal than precision"); - } - - [Test] - public void WhenScaleIsMoreThanPrecision_ShouldThrowArgumentException() + [TestCase(-1, 2)] + [TestCase(1, -1)] + [TestCase(2, 3)] + public void WhenInvalidParameters_ShouldThrowArgumentException(int precision, int scale) { - Action act = () => new NumberValidator(2, 3, false); - act.Should().Throw().WithMessage("precision must be a non-negative number less or equal than precision"); + var func = () => new NumberValidator(precision, scale); + func.Should().Throw(); } [Test] public void WhenValid_ShouldNotThrow() { - Action act = () => new NumberValidator(1, 0, true); - act.Should().NotThrow(); + var action = () => new NumberValidator(1, 0, true); + action.Should().NotThrow(); } - [Test] - public void WhenInputIsEmpty_ShouldReturnFalse() - { - NumberValidator validator = new NumberValidator(5, 2, true); - ValidateNumber(validator, "", false); - } + [TestCase("", false, true)] + [TestCase(null, false, true)] + [TestCase("12345", true, true)] + [TestCase("123.45", true, true)] + [TestCase("-123.45", false, true)] + [TestCase("001.23", true, true)] + [TestCase("0", true, true)] + [TestCase("0.0", true, true)] + [TestCase("+123.45", false, true)] + [TestCase("123456", false, true)] + [TestCase("123.456", false, true)] + [TestCase("0000.00", false, true)] + [TestCase("0.000", false, true)] + [TestCase("ab.c", false, true)] + [TestCase("123.45.67", false, true)] + [TestCase("123,67", true, true)] + [TestCase("123 45", false, true)] + [TestCase("++1", false, true)] + [TestCase("1.", false, true)] - [Test] - public void WhenInputIsNull_ShouldReturnFalse() - { - NumberValidator validator = new NumberValidator(5, 2, true); - ValidateNumber(validator, null, false); - } - - - [Test] - [TestCase("12345", true)] - [TestCase("123.45", true)] - [TestCase("-123.45", false)] - [TestCase("001.23", true)] - [TestCase("0", true)] - [TestCase("0.0", true)] - [TestCase("+123.45", false)] - [TestCase("123456", false)] - [TestCase("123.456", false)] - [TestCase("0000.00", false)] - [TestCase("0.000", false)] - [TestCase("ab.c", false)] - [TestCase("123.45.67", false)] - [TestCase("123,67", true)] - [TestCase("123 45", false)] - [TestCase("++1", false)] - [TestCase("1.", false)] - public void WhenInputIsVarious_ShouldReturnExpected_PositiveValidator(string input, bool expected) - { - NumberValidator validator = new NumberValidator(5, 2, true); - ValidateNumber(validator, input, expected); - } - - [Test] - [TestCase("12345", true)] - [TestCase("123.45", true)] - [TestCase("123.45a", false)] - [TestCase("12.3.4", false)] - [TestCase("-0", true)] - [TestCase("-12.45", true)] - [TestCase("-123.45", false)] - [TestCase("--1", false)] - [TestCase("-1.", false)] - public void WhenInputIsVarious_ShouldReturnExpected_NegativeValidator(string input, bool expected) + [TestCase("12345", true, false)] + [TestCase("123.45", true, false)] + [TestCase("123.45a", false, false)] + [TestCase("12.3.4", false, false)] + [TestCase("-0", true, false)] + [TestCase("-12.45", true, false)] + [TestCase("-123.45", false, false)] + [TestCase("--1", false, false)] + [TestCase("-1.", false, false)] + public void WhenInputIsVarious_ShouldReturnExpected(string input, bool expected, bool onlyPositive) { - NumberValidator validator = new NumberValidator(5, 2, false); + var validator = new NumberValidator(5, 2, onlyPositive); ValidateNumber(validator, input, expected); } private void ValidateNumber(NumberValidator validator, string input, bool expected) { - bool result = validator.IsValidNumber(input); + var result = validator.IsValidNumber(input); result.Should().Be(expected, $"Input '{input}' did not return expected result '{expected}'."); } } \ No newline at end of file From 3138c9e7c71c6957318cddaf9cd2fb0b53c33b8a Mon Sep 17 00:00:00 2001 From: Kostornoj-Dmitrij Date: Wed, 6 Nov 2024 18:03:17 +0500 Subject: [PATCH 4/4] homework_fixes2 --- .../1. ObjectComparison/ObjectComparison.cs | 3 +- .../NumberValidatorTests.cs | 78 +++++++++---------- 2 files changed, 38 insertions(+), 43 deletions(-) diff --git a/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs b/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs index 1d0eb84..f0b8944 100644 --- a/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs +++ b/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs @@ -17,7 +17,8 @@ public void CheckCurrentTsar() actualTsar.Should().BeEquivalentTo(expectedTsar, properties => properties.Excluding(o => o.Name == "Id" && - o.DeclaringType == typeof(Person)).IgnoringCyclicReferences()); + o.DeclaringType == typeof(Person)).IgnoringCyclicReferences() + .AllowingInfiniteRecursion()); } [Test] diff --git a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs index 9f30c79..fe5139f 100644 --- a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs +++ b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs @@ -6,59 +6,53 @@ namespace HomeExercise.Tasks.NumberValidator; [TestFixture] public class NumberValidatorTests { - [TestCase(-1, 2)] - [TestCase(1, -1)] - [TestCase(2, 3)] - public void WhenInvalidParameters_ShouldThrowArgumentException(int precision, int scale) + [TestCase(-1, 2, TestName = "InvalidPrecision")] + [TestCase(1, -1, TestName = "InvalidScale")] + [TestCase(2, 3, TestName = "ScaleIsBiggerThanPrecision")] + public void ShouldThrowArgumentException_When(int precision, int scale) { var func = () => new NumberValidator(precision, scale); func.Should().Throw(); } [Test] - public void WhenValid_ShouldNotThrow() + public void ShouldNotThrow_WhenValid() { - var action = () => new NumberValidator(1, 0, true); - action.Should().NotThrow(); + var func = () => new NumberValidator(1, 0, true); + func.Should().NotThrow(); } - [TestCase("", false, true)] - [TestCase(null, false, true)] - [TestCase("12345", true, true)] - [TestCase("123.45", true, true)] - [TestCase("-123.45", false, true)] - [TestCase("001.23", true, true)] - [TestCase("0", true, true)] - [TestCase("0.0", true, true)] - [TestCase("+123.45", false, true)] - [TestCase("123456", false, true)] - [TestCase("123.456", false, true)] - [TestCase("0000.00", false, true)] - [TestCase("0.000", false, true)] - [TestCase("ab.c", false, true)] - [TestCase("123.45.67", false, true)] - [TestCase("123,67", true, true)] - [TestCase("123 45", false, true)] - [TestCase("++1", false, true)] - [TestCase("1.", false, true)] - - [TestCase("12345", true, false)] - [TestCase("123.45", true, false)] - [TestCase("123.45a", false, false)] - [TestCase("12.3.4", false, false)] - [TestCase("-0", true, false)] - [TestCase("-12.45", true, false)] - [TestCase("-123.45", false, false)] - [TestCase("--1", false, false)] - [TestCase("-1.", false, false)] - public void WhenInputIsVarious_ShouldReturnExpected(string input, bool expected, bool onlyPositive) + [TestCase("", false, true, TestName = "EmptyInput")] + [TestCase(null, false, true, TestName = "NullInput")] + [TestCase("12345", true, true, TestName = "ValidIntegerAndOnlyPositive")] + [TestCase("123.45", true, true, TestName = "ValidDecimalAndOnlyPositive")] + [TestCase("-123.45", false, true, TestName = "NegativeDecimalAndOnlyPositive")] + [TestCase("001.23", true, true, TestName = "LeadingZerosAndValidDecimal")] + [TestCase("0", true, true, TestName = "Zero")] + [TestCase("0.0", true, true, TestName = "ZeroDecimal")] + [TestCase("+123.45", false, true, TestName = "PositiveSign")] + [TestCase("123456", false, true, TestName = "LongerThanPrecision")] + [TestCase("123.456", false, true, TestName = "TooManyDecimals")] + [TestCase("0000.00", false, true, TestName = "LeadingZerosLongerThanPrecision")] + [TestCase("0.000", false, true, TestName = "TooManyZeroesDecimal")] + [TestCase("ab.c", false, true, TestName = "InvalidCharacters")] + [TestCase("123.45.67", false, true, TestName = "MultipleDots")] + [TestCase("123,67", true, true, TestName = "CommaAsSeparator")] + [TestCase("123 45", false, true, TestName = "SpaceInNumber")] + [TestCase("++1", false, true, TestName = "DoublePositiveSign")] + [TestCase("1.", false, true, TestName = "DecimalWithoutDigitAfterDot")] + [TestCase("12345", true, false, TestName = "ValidIntegerAndAllowNegative")] + [TestCase("123.45", true, false, TestName = "ValidDecimalAndAllowNegative")] + [TestCase("123.45a", false, false, TestName = "InvalidCharactersAndAllowNegative")] + [TestCase("12.3.4", false, false, TestName = "MultipleDotsAndAllowNegative")] + [TestCase("-0", true, false, TestName = "NegativeZero")] + [TestCase("-12.45", true, false, TestName = "NegativeDecimal")] + [TestCase("-123.45", false, false, TestName = "NegativeDecimalLongerThanPrecision")] + [TestCase("--1", false, false, TestName = "DoubleNegativeSign")] + [TestCase("-1.", false, false, TestName = "NegativeDecimalWithoutDigitAfterDot")] + public void ShouldReturnExpectedValidationResult_When(string input, bool expected, bool onlyPositive) { var validator = new NumberValidator(5, 2, onlyPositive); - ValidateNumber(validator, input, expected); - } - - private void ValidateNumber(NumberValidator validator, string input, bool expected) - { var result = validator.IsValidNumber(input); result.Should().Be(expected, $"Input '{input}' did not return expected result '{expected}'."); }