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..f0b8944 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,10 @@ 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(o => o.Name == "Id" && + o.DeclaringType == typeof(Person)).IgnoringCyclicReferences() + .AllowingInfiniteRecursion()); } [Test] @@ -34,7 +29,16 @@ 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)); } diff --git a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs index 950c9bc..fe5139f 100644 --- a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs +++ b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs @@ -1,31 +1,59 @@ - +using FluentAssertions; using NUnit.Framework; -using NUnit.Framework.Legacy; namespace HomeExercise.Tasks.NumberValidator; [TestFixture] public class NumberValidatorTests { + [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 Test() + public void ShouldNotThrow_WhenValid() { - 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)); + var func = () => new NumberValidator(1, 0, true); + func.Should().NotThrow(); + } - 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")); + [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); + var result = validator.IsValidNumber(input); + result.Should().Be(expected, $"Input '{input}' did not return expected result '{expected}'."); } } \ No newline at end of file