diff --git a/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs b/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs index d544c47..9e1dafa 100644 --- a/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs +++ b/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs @@ -1,29 +1,26 @@ -using NUnit.Framework; +using FluentAssertions; +using NUnit.Framework; using NUnit.Framework.Legacy; namespace HomeExercise.Tasks.ObjectComparison; + public class ObjectComparison { [Test] [Description("Проверка текущего царя")] [Category("ToRefactor")] - public void CheckCurrentTsar() + public void TsarRegistry_ShouldBeEqual_WithCurrentTsar() { var actualTsar = TsarRegistry.GetCurrentTsar(); 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, + options => options + .Excluding(x => x.Path.EndsWith("Id")) + .AllowingInfiniteRecursion() + .IncludingProperties()); } [Test] @@ -36,6 +33,14 @@ public void CheckCurrentTsar_WithCustomEquality() // Какие недостатки у такого подхода? ClassicAssert.True(AreEqual(actualTsar, expectedTsar)); + /* + * Недостатки: + * 1. Такая реализация теста не даёт никакой конкретики при обвале теста, + * он скажет только Success или Failed, но не причину, а точнее мы не узнаем + * какое конкретно поле класса Person показало несовпадение, в отличие от моего решения. + * 2. Ликвидность. Если нам потребуется сравнить каких-нибудь двух Person без определённого поля, + * тогда в текущем классе потребуется несколько реализаций AreEqual, что очень плохо. + */ } private bool AreEqual(Person? actual, Person? expected) @@ -49,4 +54,4 @@ private bool AreEqual(Person? actual, Person? expected) && actual.Weight == expected.Weight && AreEqual(actual.Parent, expected.Parent); } -} +} \ No newline at end of file diff --git a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs index 950c9bc..58d8564 100644 --- a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs +++ b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs @@ -1,31 +1,53 @@ - +using FluentAssertions; using NUnit.Framework; -using NUnit.Framework.Legacy; namespace HomeExercise.Tasks.NumberValidator; -[TestFixture] public class NumberValidatorTests { + [TestCase(-1, 2, true, TestName = "Negative precision")] + [TestCase(2, 5, true, TestName = "Precision less then scale")] + [TestCase(2, -3, true, TestName = "Negative scale")] + [TestCase(-5, -3, true, TestName = "Negative scale and Precision less then scale ")] + public void NumberValidator_ShouldThrowArgumentException_WithIncorrectData( + int precision, int scale, bool onlyPositive) + { + Action act = () => new NumberValidator(precision, scale, onlyPositive); + act.Should().Throw(); + } + [Test] - public void Test() + public void NumberValidator_ShouldNotThrowArgumentException_WithCorrectData() + { + Action act = () => new NumberValidator(1, 0, true); + act.Should().NotThrow(); + } + + [TestCase(8, 2, true, "0.0", ExpectedResult = true)] + [TestCase(3, 0, true, "0", ExpectedResult = true)] + [TestCase(4, 2, false, "-1.24", ExpectedResult = true)] + [TestCase(4, 2, false, "-1.24", ExpectedResult = true)] + public bool NumberValidator_ShouldReturnTrue_WithCorrectData( + int precision, int scale, bool onlyPositive, string number) { - 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)); + NumberValidator numberValidator = new NumberValidator(precision, scale, onlyPositive); + return numberValidator.IsValidNumber(number); + } - 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(4, 2, true, "-1.23", ExpectedResult = false)] + [TestCase(5, 2, true, "1.253", ExpectedResult = false)] + [TestCase(3, 0, false, "a.ds", ExpectedResult = false)] + [TestCase(4, 2, false, "", ExpectedResult = false)] + [TestCase(5, 2, true, "+-1.25", ExpectedResult = false)] + [TestCase(5, 2, true, null, ExpectedResult = false)] + [TestCase(3, 0, true, "1234", ExpectedResult = false)] + [TestCase(5, 2, true, "\r", ExpectedResult = false)] + [TestCase(3, 0, true, "1 23", ExpectedResult = false)] + [TestCase(3, 0, true, " 2.3", ExpectedResult = false)] + public bool NumberValidator_ShouldReturnFalse_WithInCorrectData( + int precision, int scale, bool onlyPositive, string number) + { + NumberValidator numberValidator = new NumberValidator(precision, scale, onlyPositive); + return numberValidator.IsValidNumber(number); } } \ No newline at end of file