From 8a10dc8ffda8dfcb74f3cc5b9de8829e2aba0436 Mon Sep 17 00:00:00 2001 From: stupidnessplusplus <58785209+stupidnessplusplus@users.noreply.github.com> Date: Tue, 5 Nov 2024 16:48:59 +0500 Subject: [PATCH 1/7] Rewrite test using FluentAssertions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Новое решение лучше тем, что оно 1. позволяет не изменять проверяющую на равенство часть метода при добавлении новых полей и свойств классу Person. Они автоматически будут проверяться. Если проверять их не нужно, их можно исключить из проверки, добавив Excluding. 2. лучше читается. Видно, что объекты сравниваются по всем полям, кроме Id. В альтернативном решении нужно искать, какие поля присутствуют в сравнении, а какие - нет. 3. работает для каждого типа. Альтернативное решение предполагает, что мы должны каждый раз писать новый метод AreEqual. --- .../1. ObjectComparison/ObjectComparison.cs | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs b/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs index d544c47..1f1ee9b 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; @@ -6,7 +7,6 @@ public class ObjectComparison { [Test] [Description("Проверка текущего царя")] - [Category("ToRefactor")] public void CheckCurrentTsar() { var actualTsar = TsarRegistry.GetCurrentTsar(); @@ -14,16 +14,11 @@ 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, + options => options + .Excluding(member => member.DeclaringType == typeof(Person) + && member.Name == nameof(Person.Id))); } [Test] @@ -34,7 +29,7 @@ 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)); - // Какие недостатки у такого подхода? + // Какие недостатки у такого подхода? ClassicAssert.True(AreEqual(actualTsar, expectedTsar)); } From d440b1345ab851d80d367aa60775ec4f0409e28c Mon Sep 17 00:00:00 2001 From: stupidnessplusplus <58785209+stupidnessplusplus@users.noreply.github.com> Date: Tue, 5 Nov 2024 17:55:58 +0500 Subject: [PATCH 2/7] Remove initial test --- .../NumberValidatorTests.cs | 24 +------------------ 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs index 950c9bc..356ab7e 100644 --- a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs +++ b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs @@ -1,31 +1,9 @@ - +using FluentAssertions; using NUnit.Framework; -using NUnit.Framework.Legacy; namespace HomeExercise.Tasks.NumberValidator; [TestFixture] 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")); - } } \ No newline at end of file From ae67c1188a5ef4835e19b73209d11554dd3ff38a Mon Sep 17 00:00:00 2001 From: stupidnessplusplus <58785209+stupidnessplusplus@users.noreply.github.com> Date: Tue, 5 Nov 2024 18:18:32 +0500 Subject: [PATCH 3/7] Add tests --- .../NumberValidatorTests.cs | 262 ++++++++++++++++++ 1 file changed, 262 insertions(+) diff --git a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs index 356ab7e..c2c8a59 100644 --- a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs +++ b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs @@ -6,4 +6,266 @@ namespace HomeExercise.Tasks.NumberValidator; [TestFixture] public class NumberValidatorTests { + [TestCase(0)] + [TestCase(-1)] + [TestCase(int.MinValue)] + [Description("Конструктор бросает исключение, " + + "если precision меньше или равен 0")] + public void Constructor_ThrowsException_WhenPrecisionIsNotPositive( + int precision) + { + var constructor = () => new NumberValidator(precision); + constructor.Should().Throw(); + } + + [TestCase(-1)] + [TestCase(int.MinValue)] + [Description("Конструктор бросает исключение, если scale отрицателен")] + public void Constructor_ThrowsException_WhenScaleIsNegative( + int scale) + { + var constructor = () => new NumberValidator(1, scale); + constructor.Should().Throw(); + } + + [TestCase(1, 2)] + [TestCase(2, 2)] + [Description("Конструктор бросает исключение, " + + "если scale больше или равен precision")] + public void Constructor_ThrowsException_WhenScaleIsGreaterThanOrEqualToPrecision( + int precision, + int scale) + { + var constructor = () => new NumberValidator(precision, scale); + constructor.Should().Throw(); + } + + [TestCase(10, 5)] + [TestCase(10, 0)] + [TestCase(int.MaxValue, int.MaxValue - 1)] + [Description("Нет исключений в конструкторе, если параметры правильные")] + public void Constructor_DoesNotThrowException_WithCorrectParams( + int precision, + int scale) + { + var constructor = () => new NumberValidator(precision, scale); + constructor.Should().NotThrow(); + } + + [Test] + [Description("Scale равен 0, если не указан явно")] + public void Constructor_SetsFractionalPartLengthToZero_ByDefault() + { + var numberValidator = new NumberValidator(10); + + numberValidator.IsValidNumber("1") + .Should().BeTrue(); + numberValidator.IsValidNumber("1.1") + .Should().BeFalse(); + } + + [Test] + [Description("Работает с отрицательными числами, " + + "если в конструкторе не указано обратное")] + public void IsValid_ValidatesBothPositiveAndNegativeNumbers_IfNotDisabledInConstructor() + { + var numberValidator = new NumberValidator(20, 10); + + numberValidator.IsValidNumber("-1") + .Should().BeTrue(); + numberValidator.IsValidNumber("-1.1") + .Should().BeTrue(); + } + + [Test, Combinatorial] + [Description("Подходящие целые числа")] + public void IsValidNumber_ReturnsTrue_IfIntegerNumberIsValid( + [Values("", "-", "+")] string sign, + [Values("0", "1", "1234567890", "00", "01")] string number) + { + number = sign + number; + var numberValidator = new NumberValidator(number.Length, 0, false); + + numberValidator.IsValidNumber(number) + .Should().BeTrue(); + } + + [Test, Combinatorial] + [Description("Подходящие числа с дробной частью")] + public void IsValidNumber_ReturnsTrue_IfNumberWithFractionalPartIsValid( + [Values("", "-", "+")] string sign, + [Values("0", "1", "1234567890", "00", "01")] string intPart, + [Values(".", ",")] string decimalPoint, + [Values("0", "1", "1234567890", "00", "01")] string fracPart) + { + var number = sign + intPart + decimalPoint + fracPart; + var numberValidator = new NumberValidator( + sign.Length + intPart.Length + fracPart.Length, + fracPart.Length, + false); + + numberValidator.IsValidNumber(number) + .Should().BeTrue(); + } + + [TestCase(1, 0, "00")] + [TestCase(3, 2, "00.00")] + [TestCase(1, 0, "11")] + [TestCase(2, 0, "-11")] + [TestCase(2, 1, "-1.1")] + [TestCase(2, 1, "11.1")] + [TestCase(3, 1, "-11.1")] + [Description("Много знаков в целой части числа")] + public void IsValidNumber_ReturnsFalse_IfTooManyDigits( + int precision, + int scale, + string number) + { + var numberValidator = new NumberValidator(precision, scale, false); + + numberValidator.IsValidNumber(number) + .Should().BeFalse(); + } + + [TestCase(2, 0, "0.0")] + [TestCase(3, 1, "0.00")] + [TestCase(2, 0, "1.1")] + [TestCase(3, 1, "1.11")] + [Description("Много знаков в дробной части числа")] + public void IsValidNumber_ReturnsFalse_IfTooManyDigitsInFractionalPart( + int precision, + int scale, + string number) + { + var numberValidator = new NumberValidator(precision, scale, false); + + numberValidator.IsValidNumber(number) + .Should().BeFalse(); + } + + [TestCase(null)] + [TestCase("")] + [TestCase(" ")] + [TestCase(" ")] + [Description("Null и пробелы")] + public void IsValidNumber_ReturnsFalse_IfStringIsNullOrWhitespace( + string number) + { + var numberValidator = new NumberValidator(10, 9, false); + + numberValidator.IsValidNumber(number) + .Should().BeFalse(); + } + + [TestCaseSource(nameof(GetNotNumbers))] + [Description("Не число")] + public void IsValidNumber_ReturnsFalse_IfNotNumber( + string number) + { + var numberValidator = new NumberValidator( + number.Length, + number.Length - 1, + false); + + numberValidator.IsValidNumber(number) + .Should().BeFalse(); + } + + [TestCase("-0")] + [TestCase("-1")] + [TestCase("-1.1")] + [Description("Не работает с отрицательными числами, если они отключены")] + public void IsValidNumber_ReturnsFalse_IfNumberIsNegativeAndNegativeNumbersDisabled( + string number) + { + var numberValidator = new NumberValidator( + number.Length, + number.Length - 1, + true); + + numberValidator.IsValidNumber(number) + .Should().BeFalse(); + } + + [TestCase("0")] + [TestCase("+0")] + [TestCase("1")] + [TestCase("+1")] + [TestCase("1.1")] + [TestCase("+1.1")] + [Description("Работает с положительными числами, " + + "если отрицательные отключены")] + public void IsValidNumber_ReturnsTrue_IfNumberIsPositiveAndNegativeNumbersDisabled( + string number) + { + var numberValidator = new NumberValidator( + number.Length, + number.Length - 1, + true); + + numberValidator.IsValidNumber(number) + .Should().BeTrue(); + } + + [Test] + [Description("Работает с большими числами")] + public void IsValidNumber_ReturnsTrue_IfBigIntegerNumberIsValid() + { + var length = 10_000; + var number = new string('1', length); + + var numberValidator = new NumberValidator(length, 0, false); + + numberValidator.IsValidNumber(number) + .Should().BeTrue(); + } + + [Test] + [Description("Работает с большими числами с дробной частью")] + public void IsValidNumber_ReturnsTrue_IfBigNumberWithFractionalPartIsValid() + { + var length = 10_000; + var number = $"0.{new string('1', length - 1)}"; + + var numberValidator = new NumberValidator(length, length - 1, false); + + numberValidator.IsValidNumber(number) + .Should().BeTrue(); + } + + [Test] + [Description("Проверка на нескольких валидаторах")] + public void IsValidNumber_Works_WithMultipleNumberValidatorInstances() + { + var number = "111.11"; + + var numberValidator1 = new NumberValidator(5, 2, false); + var numberValidator2 = new NumberValidator(3, 1, false); + + numberValidator1.IsValidNumber(number) + .Should().BeTrue(); + numberValidator2.IsValidNumber(number) + .Should().BeFalse(); + } + + private static IEnumerable GetNotNumbers() + { + yield return new TestCaseData("abc"); + yield return new TestCaseData("123abc"); + yield return new TestCaseData("123.abc"); + yield return new TestCaseData("abc.123"); + yield return new TestCaseData("."); + yield return new TestCaseData(","); + yield return new TestCaseData("1."); + yield return new TestCaseData(".1"); + yield return new TestCaseData("--1"); + yield return new TestCaseData("++1"); + yield return new TestCaseData("1.-1"); + yield return new TestCaseData("1.+1"); + yield return new TestCaseData("-.1"); + yield return new TestCaseData("+.1"); + yield return new TestCaseData(" 1"); + yield return new TestCaseData("1 "); + yield return new TestCaseData("1. "); + } } \ No newline at end of file From 4ed27de283ae9b61e2940da3211cf044bf27b8b3 Mon Sep 17 00:00:00 2001 From: stupidnessplusplus <58785209+stupidnessplusplus@users.noreply.github.com> Date: Thu, 7 Nov 2024 23:15:17 +0500 Subject: [PATCH 4/7] Add comment with answer to task question --- .../Homework/1. ObjectComparison/ObjectComparison.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs b/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs index 1f1ee9b..0fbdfe1 100644 --- a/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs +++ b/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs @@ -30,6 +30,17 @@ public void CheckCurrentTsar_WithCustomEquality() new Person("Vasili III of Russia", 28, 170, 60, null)); // Какие недостатки у такого подхода? + // + // Решение с FluentAssertions лучше тем, что оно: + // 1. позволяет не изменять проверяющую на равенство часть метода при добавлении новых полей и свойств классу Person. + // Они автоматически будут проверяться. + // Если проверять их не нужно, их можно исключить из проверки, добавив Excluding. + // 2. лучше читается. + // Видно, что объекты сравниваются по всем полям, кроме Id. + // В альтернативном решении нужно искать, какие поля присутствуют в сравнении, а какие - нет. + // 3. работает для каждого типа. + // Альтернативное решение предполагает, что мы должны каждый раз писать новый метод AreEqual. + ClassicAssert.True(AreEqual(actualTsar, expectedTsar)); } From 47ca4b1db40322905d3408cfed08afcdac277482 Mon Sep 17 00:00:00 2001 From: stupidnessplusplus <58785209+stupidnessplusplus@users.noreply.github.com> Date: Fri, 8 Nov 2024 00:34:37 +0500 Subject: [PATCH 5/7] Style changes and refactoring --- .../NumberValidatorTests.cs | 102 ++++++------------ 1 file changed, 35 insertions(+), 67 deletions(-) diff --git a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs index c2c8a59..171115d 100644 --- a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs +++ b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs @@ -9,8 +9,7 @@ public class NumberValidatorTests [TestCase(0)] [TestCase(-1)] [TestCase(int.MinValue)] - [Description("Конструктор бросает исключение, " - + "если precision меньше или равен 0")] + [Description("Конструктор бросает исключение, если precision меньше или равен 0")] public void Constructor_ThrowsException_WhenPrecisionIsNotPositive( int precision) { @@ -30,8 +29,7 @@ public void Constructor_ThrowsException_WhenScaleIsNegative( [TestCase(1, 2)] [TestCase(2, 2)] - [Description("Конструктор бросает исключение, " - + "если scale больше или равен precision")] + [Description("Конструктор бросает исключение, если scale больше или равен precision")] public void Constructor_ThrowsException_WhenScaleIsGreaterThanOrEqualToPrecision( int precision, int scale) @@ -58,27 +56,22 @@ public void Constructor_SetsFractionalPartLengthToZero_ByDefault() { var numberValidator = new NumberValidator(10); - numberValidator.IsValidNumber("1") - .Should().BeTrue(); - numberValidator.IsValidNumber("1.1") - .Should().BeFalse(); + numberValidator.IsValidNumber("1").Should().BeTrue(); + numberValidator.IsValidNumber("1.1").Should().BeFalse(); } [Test] - [Description("Работает с отрицательными числами, " - + "если в конструкторе не указано обратное")] - public void IsValid_ValidatesBothPositiveAndNegativeNumbers_IfNotDisabledInConstructor() + [Description("Работает с отрицательными числами, если в конструкторе не указано обратное")] + public void IsValidNumber_ValidatesNegativeNumbers_IfNotDisabledInConstructor() { var numberValidator = new NumberValidator(20, 10); - numberValidator.IsValidNumber("-1") - .Should().BeTrue(); - numberValidator.IsValidNumber("-1.1") - .Should().BeTrue(); + numberValidator.IsValidNumber("-1").Should().BeTrue(); + numberValidator.IsValidNumber("-1.1").Should().BeTrue(); } [Test, Combinatorial] - [Description("Подходящие целые числа")] + [Description("Возвращает true, если строка - удовлетворяющее ограничениям целое число")] public void IsValidNumber_ReturnsTrue_IfIntegerNumberIsValid( [Values("", "-", "+")] string sign, [Values("0", "1", "1234567890", "00", "01")] string number) @@ -86,12 +79,11 @@ public void IsValidNumber_ReturnsTrue_IfIntegerNumberIsValid( number = sign + number; var numberValidator = new NumberValidator(number.Length, 0, false); - numberValidator.IsValidNumber(number) - .Should().BeTrue(); + numberValidator.IsValidNumber(number).Should().BeTrue(); } [Test, Combinatorial] - [Description("Подходящие числа с дробной частью")] + [Description("Возвращает true, если строка - удовлетворяющее ограничениям число с дробной частью")] public void IsValidNumber_ReturnsTrue_IfNumberWithFractionalPartIsValid( [Values("", "-", "+")] string sign, [Values("0", "1", "1234567890", "00", "01")] string intPart, @@ -99,13 +91,10 @@ public void IsValidNumber_ReturnsTrue_IfNumberWithFractionalPartIsValid( [Values("0", "1", "1234567890", "00", "01")] string fracPart) { var number = sign + intPart + decimalPoint + fracPart; - var numberValidator = new NumberValidator( - sign.Length + intPart.Length + fracPart.Length, - fracPart.Length, - false); + var precision = sign.Length + intPart.Length + fracPart.Length; + var numberValidator = new NumberValidator(precision, fracPart.Length, false); - numberValidator.IsValidNumber(number) - .Should().BeTrue(); + numberValidator.IsValidNumber(number).Should().BeTrue(); } [TestCase(1, 0, "00")] @@ -115,7 +104,7 @@ public void IsValidNumber_ReturnsTrue_IfNumberWithFractionalPartIsValid( [TestCase(2, 1, "-1.1")] [TestCase(2, 1, "11.1")] [TestCase(3, 1, "-11.1")] - [Description("Много знаков в целой части числа")] + [Description("Возвращает false, если у числа много знаков в целой части")] public void IsValidNumber_ReturnsFalse_IfTooManyDigits( int precision, int scale, @@ -123,15 +112,14 @@ public void IsValidNumber_ReturnsFalse_IfTooManyDigits( { var numberValidator = new NumberValidator(precision, scale, false); - numberValidator.IsValidNumber(number) - .Should().BeFalse(); + numberValidator.IsValidNumber(number).Should().BeFalse(); } [TestCase(2, 0, "0.0")] [TestCase(3, 1, "0.00")] [TestCase(2, 0, "1.1")] [TestCase(3, 1, "1.11")] - [Description("Много знаков в дробной части числа")] + [Description("Возвращает false, если у числа много знаков в дробной части")] public void IsValidNumber_ReturnsFalse_IfTooManyDigitsInFractionalPart( int precision, int scale, @@ -139,36 +127,30 @@ public void IsValidNumber_ReturnsFalse_IfTooManyDigitsInFractionalPart( { var numberValidator = new NumberValidator(precision, scale, false); - numberValidator.IsValidNumber(number) - .Should().BeFalse(); + numberValidator.IsValidNumber(number).Should().BeFalse(); } [TestCase(null)] [TestCase("")] [TestCase(" ")] [TestCase(" ")] - [Description("Null и пробелы")] + [Description("Возвращает false, если строка null или состоит из пробелов")] public void IsValidNumber_ReturnsFalse_IfStringIsNullOrWhitespace( string number) { var numberValidator = new NumberValidator(10, 9, false); - numberValidator.IsValidNumber(number) - .Should().BeFalse(); + numberValidator.IsValidNumber(number).Should().BeFalse(); } [TestCaseSource(nameof(GetNotNumbers))] - [Description("Не число")] + [Description("Возвращает false, если строка не является числом")] public void IsValidNumber_ReturnsFalse_IfNotNumber( string number) { - var numberValidator = new NumberValidator( - number.Length, - number.Length - 1, - false); + var numberValidator = new NumberValidator(number.Length, number.Length - 1, false); - numberValidator.IsValidNumber(number) - .Should().BeFalse(); + numberValidator.IsValidNumber(number).Should().BeFalse(); } [TestCase("-0")] @@ -178,13 +160,9 @@ public void IsValidNumber_ReturnsFalse_IfNotNumber( public void IsValidNumber_ReturnsFalse_IfNumberIsNegativeAndNegativeNumbersDisabled( string number) { - var numberValidator = new NumberValidator( - number.Length, - number.Length - 1, - true); + var numberValidator = new NumberValidator(number.Length, number.Length - 1, true); - numberValidator.IsValidNumber(number) - .Should().BeFalse(); + numberValidator.IsValidNumber(number).Should().BeFalse(); } [TestCase("0")] @@ -193,18 +171,13 @@ public void IsValidNumber_ReturnsFalse_IfNumberIsNegativeAndNegativeNumbersDisab [TestCase("+1")] [TestCase("1.1")] [TestCase("+1.1")] - [Description("Работает с положительными числами, " - + "если отрицательные отключены")] - public void IsValidNumber_ReturnsTrue_IfNumberIsPositiveAndNegativeNumbersDisabled( + [Description("Работает с положительными числами, если отрицательные отключены")] + public void IsValidNumber_ReturnsTrue_IfNumberIsPositiveAndNegativeNumbersAreDisabled( string number) { - var numberValidator = new NumberValidator( - number.Length, - number.Length - 1, - true); + var numberValidator = new NumberValidator(number.Length, number.Length - 1, true); - numberValidator.IsValidNumber(number) - .Should().BeTrue(); + numberValidator.IsValidNumber(number).Should().BeTrue(); } [Test] @@ -213,15 +186,13 @@ public void IsValidNumber_ReturnsTrue_IfBigIntegerNumberIsValid() { var length = 10_000; var number = new string('1', length); - var numberValidator = new NumberValidator(length, 0, false); - numberValidator.IsValidNumber(number) - .Should().BeTrue(); + numberValidator.IsValidNumber(number).Should().BeTrue(); } [Test] - [Description("Работает с большими числами с дробной частью")] + [Description("Работает с числами с большой дробной частью")] public void IsValidNumber_ReturnsTrue_IfBigNumberWithFractionalPartIsValid() { var length = 10_000; @@ -229,8 +200,7 @@ public void IsValidNumber_ReturnsTrue_IfBigNumberWithFractionalPartIsValid() var numberValidator = new NumberValidator(length, length - 1, false); - numberValidator.IsValidNumber(number) - .Should().BeTrue(); + numberValidator.IsValidNumber(number).Should().BeTrue(); } [Test] @@ -242,10 +212,8 @@ public void IsValidNumber_Works_WithMultipleNumberValidatorInstances() var numberValidator1 = new NumberValidator(5, 2, false); var numberValidator2 = new NumberValidator(3, 1, false); - numberValidator1.IsValidNumber(number) - .Should().BeTrue(); - numberValidator2.IsValidNumber(number) - .Should().BeFalse(); + numberValidator1.IsValidNumber(number).Should().BeTrue(); + numberValidator2.IsValidNumber(number).Should().BeFalse(); } private static IEnumerable GetNotNumbers() @@ -268,4 +236,4 @@ private static IEnumerable GetNotNumbers() yield return new TestCaseData("1 "); yield return new TestCaseData("1. "); } -} \ No newline at end of file +} From 519107bcfd20ac1f455337e6ff27c2e3d28b89c5 Mon Sep 17 00:00:00 2001 From: stupidnessplusplus <58785209+stupidnessplusplus@users.noreply.github.com> Date: Fri, 8 Nov 2024 00:37:14 +0500 Subject: [PATCH 6/7] Change exception message --- Testing/Basic/Homework/2. NumberValidator/NumberValidator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Testing/Basic/Homework/2. NumberValidator/NumberValidator.cs b/Testing/Basic/Homework/2. NumberValidator/NumberValidator.cs index 327ce9c..9ec611c 100644 --- a/Testing/Basic/Homework/2. NumberValidator/NumberValidator.cs +++ b/Testing/Basic/Homework/2. NumberValidator/NumberValidator.cs @@ -17,7 +17,7 @@ public NumberValidator(int precision, int scale = 0, bool onlyPositive = false) if (precision <= 0) throw new ArgumentException("precision must be a positive number"); if (scale < 0 || scale >= precision) - throw new ArgumentException("precision must be a non-negative number less or equal than precision"); + throw new ArgumentException("scale must be a non-negative number less than precision"); numberRegex = new Regex(@"^([+-]?)(\d+)([.,](\d+))?$", RegexOptions.IgnoreCase); } From 509404a62ddffe02d961a265fbb718ce02393e3f Mon Sep 17 00:00:00 2001 From: stupidnessplusplus <58785209+stupidnessplusplus@users.noreply.github.com> Date: Fri, 8 Nov 2024 00:39:30 +0500 Subject: [PATCH 7/7] Add exception messages test --- .../Homework/2. NumberValidator/NumberValidatorTests.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs index 171115d..de2b915 100644 --- a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs +++ b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs @@ -6,6 +6,9 @@ namespace HomeExercise.Tasks.NumberValidator; [TestFixture] public class NumberValidatorTests { + private const string PrecisionOutOfRangeMessage = "precision must be a positive number"; + private const string ScaleOutOfRangeMessage = "scale must be a non-negative number less than precision"; + [TestCase(0)] [TestCase(-1)] [TestCase(int.MinValue)] @@ -14,7 +17,7 @@ public void Constructor_ThrowsException_WhenPrecisionIsNotPositive( int precision) { var constructor = () => new NumberValidator(precision); - constructor.Should().Throw(); + constructor.Should().Throw().WithMessage(PrecisionOutOfRangeMessage); } [TestCase(-1)] @@ -24,7 +27,7 @@ public void Constructor_ThrowsException_WhenScaleIsNegative( int scale) { var constructor = () => new NumberValidator(1, scale); - constructor.Should().Throw(); + constructor.Should().Throw().WithMessage(ScaleOutOfRangeMessage); } [TestCase(1, 2)] @@ -35,7 +38,7 @@ public void Constructor_ThrowsException_WhenScaleIsGreaterThanOrEqualToPrecision int scale) { var constructor = () => new NumberValidator(precision, scale); - constructor.Should().Throw(); + constructor.Should().Throw().WithMessage(ScaleOutOfRangeMessage); } [TestCase(10, 5)]