From d5b1e8aea096f153817e9fbe16988a5773b4bc06 Mon Sep 17 00:00:00 2001 From: younggogy Date: Tue, 28 Oct 2025 15:36:09 +0500 Subject: [PATCH 1/3] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB?= =?UTF-8?q?=20=D1=82=D0=B5=D1=81=D1=82=20=D0=B2=20ObjectComparison.cs=20?= =?UTF-8?q?=D1=81=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=D0=BC=20=D0=B1=D0=B8=D0=B1=D0=BB=D0=B8?= =?UTF-8?q?=D0=BE=D1=82=D0=B5=D0=BA=D0=B8=20FluentAssertion.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Отрефакторил NumberValidatorTests.cs с использованием FluentAssertion и TestCase --- .../1. ObjectComparison/ObjectComparison.cs | 46 +++++--- .../NumberValidatorTests.cs | 109 ++++++++++++++---- 2 files changed, 120 insertions(+), 35 deletions(-) diff --git a/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs b/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs index d544c47..60cd548 100644 --- a/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs +++ b/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs @@ -1,31 +1,46 @@ -using NUnit.Framework; +using System.Text.RegularExpressions; +using FluentAssertions; +using FluentAssertions.Equivalency; +using NUnit.Framework; using NUnit.Framework.Legacy; namespace HomeExercise.Tasks.ObjectComparison; -public class ObjectComparison +public partial class ObjectComparison { [Test] [Description("Проверка текущего царя")] [Category("ToRefactor")] - public void CheckCurrentTsar() + public void CheckCurrentTsar_IgnoringIds() { 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); + //можно оставить так, но вдруг появиться свойство, название которого будет начинаться с Id, или иметь Id в середине наименования. + /*actualTsar + .Should() + .BeEquivalentTo(expectedTsar, opt => + opt.Excluding(info => info.Path.EndsWith("Id")));*/ + + actualTsar + .Should() + .BeEquivalentTo(expectedTsar, opt => + opt.Excluding((IMemberInfo memberInfo) => MyRegex().IsMatch(memberInfo.Name))); } - + + + /* + * 1. Если упадет тест мы увидим сообщение из разряда: + * Expected: True + * But was: False + * что не является информативным сообщением, и мы не поймем в чем ошибка конкретно. + * 2. Методе AreEqual реализует то, что уже имеют библиотеки, например .BeEquivalentTo, т.е. мы изобретаем велосипед заново. + * 3. Возвращаем булевый результат, из за чего теряем контекст ошибки(аналогично п.1) + * 4. Метод жестко проверяет свойство parent, и если добавить новое свойство, например Child, тогда тест будет падать, либо нужно будет добавлять новые проверки + * 5. Если добавлять впринципе новые свойства/поля тест упадет, или нужно будет добавлять новые проверки + * 6. Может уйти в бесконечную рекурсию, если ссылка parent будет идти обратно к исходному обьекту. + */ [Test] [Description("Альтернативное решение. Какие у него недостатки?")] public void CheckCurrentTsar_WithCustomEquality() @@ -49,4 +64,7 @@ private bool AreEqual(Person? actual, Person? expected) && actual.Weight == expected.Weight && AreEqual(actual.Parent, expected.Parent); } + + [GeneratedRegex(@"(^Id\b|\bId$)")] + private static partial Regex MyRegex(); } diff --git a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs index 950c9bc..96230fc 100644 --- a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs +++ b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs @@ -1,31 +1,98 @@ - +using FluentAssertions; using NUnit.Framework; -using NUnit.Framework.Legacy; +using System.Collections; namespace HomeExercise.Tasks.NumberValidator; [TestFixture] public class NumberValidatorTests { - [Test] - public void Test() + #region Конструктор + + [TestCase(-1, 2)] + [TestCase(1, -1)] + [TestCase(3, 3)] + [TestCase(3, 4)] + public void Constructor_ShouldThrow_WhenArgsInvalid(int precision, int scale) { - 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")); + var act = () => new NumberValidator(precision, scale); + act.Should().Throw($"precision={precision}, scale={scale} недопустимы"); } + + [TestCase(1, 0, true)] + [TestCase(10, 5, false)] + public void Constructor_ShouldNotThrow_WhenArgsValid(int precision, int scale, bool onlyPositive) + { + var act = () => new NumberValidator(precision, scale, onlyPositive); + act.Should().NotThrow($"precision={precision}, scale={scale}, onlyPositive={onlyPositive} допустимы"); + } + + #endregion + + #region Валидация чисел + + public static IEnumerable ValidNumbers => new[] + { + new TestCaseData(17, 2, true, "0.0").SetName("Valid_0.0"), + new TestCaseData(4, 2, true, "+1.23").SetName("Valid_+1.23"), + new TestCaseData(4, 2, false, "-1.23").SetName("Valid_-1.23"), + new TestCaseData(5, 0, true, "12345").SetName("Valid_Integer") + }; + + [Test, TestCaseSource(nameof(ValidNumbers))] + public void IsValidNumber_ShouldReturnTrue_ForValidNumbers(int precision, int scale, bool onlyPositive, + string input) + { + var validator = new NumberValidator(precision, scale, onlyPositive); + validator + .IsValidNumber(input) + .Should() + .BeTrue( + $"Тест '{TestContext.CurrentContext.Test.Name}' провален: " + + $"'{input}' должно быть валидным для precision={precision}, scale={scale}"); + } + + public static IEnumerable InvalidNumbers => new[] + { + new TestCaseData(3, 2, true, "+0.00", "число превышает допустимое количество знаков").SetName("Invalid_+0.00"), + new TestCaseData(7, 2, true, "-1.231", "число превышает допустимое количество знаков после запятой").SetName( + "Invalid_-1.231"), + new TestCaseData(3, 2, true, "a.sd", "содержит недопустимые символы").SetName("Invalid_Chars"), + new TestCaseData(3, 2, true, "", "пустая строка").SetName("Invalid_Empty"), + new TestCaseData(3, 2, true, " ", "строка содержит только пробел").SetName("Invalid_Space"), + new TestCaseData(3, 2, true, "+", "строка содержит только знак без числа").SetName("Invalid_SignOnly"), + new TestCaseData(3, 2, true, "-", "строка содержит только знак без числа").SetName("Invalid_SignOnlyMinus"), + new TestCaseData(2, 0, true, "211", "число превышает допустимую длину целой части").SetName( + "Invalid_TooLongInteger"), + new TestCaseData(3, 0, true, "0.1", "число превышает допустимую длину дробной части").SetName( + "Invalid_ScaleExceeds"), + new TestCaseData(17, 2, true, "0.000", "число превышает допустимую длину дробной части").SetName( + "Invalid_ScaleExceeds2"), + new TestCaseData(3, 0, true, "0.-12", "недопустимый знак внутри числа").SetName("Invalid_InternalSign"), + new TestCaseData(3, 0, true, "0.+12", "недопустимый знак внутри числа").SetName("Invalid_InternalSignPlus"), + new TestCaseData(3, 0, true, "0.12.12", "число содержит несколько разделителей").SetName( + "Invalid_MultipleSeparators"), + new TestCaseData(3, 0, true, "0.,12.12", "число содержит несколько разделителей").SetName( + "Invalid_MixedSeparators"), + new TestCaseData(3, 0, true, "0.2,12", "число содержит несколько разделителей").SetName( + "Invalid_MixedSeparators2"), + new TestCaseData(3, 0, true, "0,2.12", "число содержит несколько разделителей").SetName( + "Invalid_MixedSeparators3"), + new TestCaseData(3, 2, true, null, "значение null недопустимо").SetName("Invalid_Null") + }; + + [Test, TestCaseSource(nameof(InvalidNumbers))] + public void IsValidNumber_ShouldReturnFalse_ForInvalidNumbers(int precision, int scale, bool onlyPositive, + string input, string expectedMessage) + { + var validator = new NumberValidator(precision, scale, onlyPositive); + validator + .IsValidNumber(input) + .Should() + .BeFalse( + $"Тест '{TestContext.CurrentContext.Test.Name}' провален: " + + $"'{input ?? "null"}'. {expectedMessage}. " + $"Параметры: precision={precision}, scale={scale}"); + } + + #endregion } \ No newline at end of file From 42a05991bd25699010a94a106d7ccbdfb83bacec Mon Sep 17 00:00:00 2001 From: younggogy Date: Tue, 28 Oct 2025 20:24:38 +0500 Subject: [PATCH 2/3] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=87=D0=B0=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=BF=D0=BE=20=D0=BF=D0=BE=D0=B2=D0=BE=D0=B4=D1=83=20Number?= =?UTF-8?q?ValidatorTests.cs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NumberValidatorTests.cs | 160 ++++++++++++------ 1 file changed, 108 insertions(+), 52 deletions(-) diff --git a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs index 96230fc..60ddfc8 100644 --- a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs +++ b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs @@ -9,78 +9,41 @@ public class NumberValidatorTests { #region Конструктор - [TestCase(-1, 2)] - [TestCase(1, -1)] - [TestCase(3, 3)] - [TestCase(3, 4)] - public void Constructor_ShouldThrow_WhenArgsInvalid(int precision, int scale) + [Test, TestCaseSource(nameof(InvalidArgs_NegativeOrScaleTooBig))] + public void Constructor_ShouldThrow_WhenArgsIsNegativeOrScaleAtLeastPrecision(int precision, int scale, string expectedMessage) { var act = () => new NumberValidator(precision, scale); - act.Should().Throw($"precision={precision}, scale={scale} недопустимы"); + act + .Should() + .Throw($"{expectedMessage}. " + $"Параметры: precision={precision}, scale={scale}"); } [TestCase(1, 0, true)] [TestCase(10, 5, false)] - public void Constructor_ShouldNotThrow_WhenArgsValid(int precision, int scale, bool onlyPositive) + public void Constructor_DoesNotThrow_WhenPrecisionScaleAndOnlyPositiveAreValid(int precision, int scale, bool onlyPositive) { var act = () => new NumberValidator(precision, scale, onlyPositive); - act.Should().NotThrow($"precision={precision}, scale={scale}, onlyPositive={onlyPositive} допустимы"); + act + .Should() + .NotThrow($"precision={precision}, scale={scale}, onlyPositive={onlyPositive} допустимы"); } #endregion #region Валидация чисел - public static IEnumerable ValidNumbers => new[] - { - new TestCaseData(17, 2, true, "0.0").SetName("Valid_0.0"), - new TestCaseData(4, 2, true, "+1.23").SetName("Valid_+1.23"), - new TestCaseData(4, 2, false, "-1.23").SetName("Valid_-1.23"), - new TestCaseData(5, 0, true, "12345").SetName("Valid_Integer") - }; - [Test, TestCaseSource(nameof(ValidNumbers))] public void IsValidNumber_ShouldReturnTrue_ForValidNumbers(int precision, int scale, bool onlyPositive, - string input) + string input, string expectedMessage) { var validator = new NumberValidator(precision, scale, onlyPositive); validator .IsValidNumber(input) .Should() - .BeTrue( - $"Тест '{TestContext.CurrentContext.Test.Name}' провален: " + - $"'{input}' должно быть валидным для precision={precision}, scale={scale}"); + .BeTrue($"{input}. {expectedMessage}. " + $"Параметры: precision={precision}, scale={scale}, " + + $"onlyPositive={onlyPositive}"); } - public static IEnumerable InvalidNumbers => new[] - { - new TestCaseData(3, 2, true, "+0.00", "число превышает допустимое количество знаков").SetName("Invalid_+0.00"), - new TestCaseData(7, 2, true, "-1.231", "число превышает допустимое количество знаков после запятой").SetName( - "Invalid_-1.231"), - new TestCaseData(3, 2, true, "a.sd", "содержит недопустимые символы").SetName("Invalid_Chars"), - new TestCaseData(3, 2, true, "", "пустая строка").SetName("Invalid_Empty"), - new TestCaseData(3, 2, true, " ", "строка содержит только пробел").SetName("Invalid_Space"), - new TestCaseData(3, 2, true, "+", "строка содержит только знак без числа").SetName("Invalid_SignOnly"), - new TestCaseData(3, 2, true, "-", "строка содержит только знак без числа").SetName("Invalid_SignOnlyMinus"), - new TestCaseData(2, 0, true, "211", "число превышает допустимую длину целой части").SetName( - "Invalid_TooLongInteger"), - new TestCaseData(3, 0, true, "0.1", "число превышает допустимую длину дробной части").SetName( - "Invalid_ScaleExceeds"), - new TestCaseData(17, 2, true, "0.000", "число превышает допустимую длину дробной части").SetName( - "Invalid_ScaleExceeds2"), - new TestCaseData(3, 0, true, "0.-12", "недопустимый знак внутри числа").SetName("Invalid_InternalSign"), - new TestCaseData(3, 0, true, "0.+12", "недопустимый знак внутри числа").SetName("Invalid_InternalSignPlus"), - new TestCaseData(3, 0, true, "0.12.12", "число содержит несколько разделителей").SetName( - "Invalid_MultipleSeparators"), - new TestCaseData(3, 0, true, "0.,12.12", "число содержит несколько разделителей").SetName( - "Invalid_MixedSeparators"), - new TestCaseData(3, 0, true, "0.2,12", "число содержит несколько разделителей").SetName( - "Invalid_MixedSeparators2"), - new TestCaseData(3, 0, true, "0,2.12", "число содержит несколько разделителей").SetName( - "Invalid_MixedSeparators3"), - new TestCaseData(3, 2, true, null, "значение null недопустимо").SetName("Invalid_Null") - }; - [Test, TestCaseSource(nameof(InvalidNumbers))] public void IsValidNumber_ShouldReturnFalse_ForInvalidNumbers(int precision, int scale, bool onlyPositive, string input, string expectedMessage) @@ -89,10 +52,103 @@ public void IsValidNumber_ShouldReturnFalse_ForInvalidNumbers(int precision, int validator .IsValidNumber(input) .Should() - .BeFalse( - $"Тест '{TestContext.CurrentContext.Test.Name}' провален: " + - $"'{input ?? "null"}'. {expectedMessage}. " + $"Параметры: precision={precision}, scale={scale}"); + .BeFalse($"{input}. {expectedMessage}. " + $"Параметры: precision={precision}, scale={scale}, " + + $"onlyPositive={onlyPositive}"); } #endregion + + public static IEnumerable InvalidNumbers() + { + yield return new TestCaseData(3, 2, true, "+0.00", "число превышает допустимое количество знаков") + .SetName("InvalidNumber_TooManyDigits_PositiveZero"); + + yield return new TestCaseData(7, 2, true, "-1.231", + "число превышает допустимое количество знаков после запятой") + .SetName("InvalidNumber_TooManyDecimals_Negative"); + + yield return new TestCaseData(3, 2, true, "a.sd", "содержит недопустимые символы") + .SetName("InvalidNumber_InvalidCharacters"); + + yield return new TestCaseData(3, 2, true, "", "пустая строка") + .SetName("InvalidNumber_EmptyString"); + + yield return new TestCaseData(3, 2, true, " ", "строка содержит только пробел") + .SetName("InvalidNumber_WhitespaceOnly"); + + yield return new TestCaseData(3, 2, true, "+", "строка содержит только знак без числа") + .SetName("InvalidNumber_SignOnlyPlus"); + + yield return new TestCaseData(3, 2, true, "-", "строка содержит только знак без числа") + .SetName("InvalidNumber_SignOnlyMinus"); + + yield return new TestCaseData(2, 0, true, "211", "число превышает допустимую длину целой части") + .SetName("InvalidNumber_IntegerTooLong"); + + yield return new TestCaseData(3, 0, true, "0.1", "число превышает допустимую длину дробной части") + .SetName("InvalidNumber_ScaleTooLong"); + + yield return new TestCaseData(17, 2, true, "0.000", "число превышает допустимую длину дробной части") + .SetName("InvalidNumber_ScaleTooLong2"); + + yield return new TestCaseData(3, 0, true, "0.-12", "недопустимый знак внутри числа") + .SetName("InvalidNumber_InternalSignMinus"); + + yield return new TestCaseData(3, 0, true, "0.+12", "недопустимый знак внутри числа") + .SetName("InvalidNumber_InternalSignPlus"); + + yield return new TestCaseData(3, 0, true, "0.12.12", "число содержит несколько разделителей") + .SetName("InvalidNumber_MultipleSeparators"); + + yield return new TestCaseData(3, 0, true, "0.,12.12", "число содержит несколько разделителей") + .SetName("InvalidNumber_MixedSeparators1"); + + yield return new TestCaseData(3, 0, true, "0.2,12", "число содержит несколько разделителей") + .SetName("InvalidNumber_MixedSeparators2"); + + yield return new TestCaseData(3, 0, true, "0,2.12", "число содержит несколько разделителей") + .SetName("InvalidNumber_MixedSeparators3"); + + yield return new TestCaseData(3, 2, true, null, "значение null недопустимо") + .SetName("InvalidNumber_NullValue"); + } + + + public static IEnumerable ValidNumbers() + { + yield return new TestCaseData( + 17, 2, true, "0.0", + "целая часть + дробная часть ≤ precision, дробная часть ≤ scale, число положительное" + ).SetName("ValidNumber_ZeroPointZero"); + + yield return new TestCaseData( + 4, 2, true, "+1.23", + "целая часть + дробная часть ≤ precision, дробная часть ≤ scale, число положительное" + ).SetName("ValidNumber_PositiveWithTwoDecimals"); + + yield return new TestCaseData( + 4, 2, false, "-1.23", + "целая часть + дробная часть ≤ precision, дробная часть ≤ scale, отрицательные числа разрешены" + ).SetName("ValidNumber_NegativeWithTwoDecimals"); + + yield return new TestCaseData( + 5, 0, true, "12345", + "целая часть + дробная часть ≤ precision, дробная часть ≤ scale, число положительное" + ).SetName("ValidNumber_Integer"); + } + + public static IEnumerable InvalidArgs_NegativeOrScaleTooBig() + { + yield return new TestCaseData(-1, 2, "отрицательный precision недопустим") + .SetName("Constructor_Invalid_NegativePrecision"); + + yield return new TestCaseData(1, -1, "отрицательный scale недопустим") + .SetName("Constructor_Invalid_NegativeScale"); + + yield return new TestCaseData(3, 3, "scale должен быть меньше чем precision") + .SetName("Constructor_Invalid_ScaleEqualsPrecision"); + + yield return new TestCaseData(3, 4, "scale должен быть меньше чем precision") + .SetName("Constructor_Invalid_ScaleGreaterThanPrecision"); + } } \ No newline at end of file From 776ae26787420c2979f674eb09c65975cdef5be5 Mon Sep 17 00:00:00 2001 From: younggogy Date: Wed, 29 Oct 2025 14:06:07 +0500 Subject: [PATCH 3/3] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BE=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=D1=80=D0=B8=D1=8F=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NumberValidatorTests.cs | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs index 60ddfc8..03539c7 100644 --- a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs +++ b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs @@ -9,18 +9,21 @@ public class NumberValidatorTests { #region Конструктор - [Test, TestCaseSource(nameof(InvalidArgs_NegativeOrScaleTooBig))] - public void Constructor_ShouldThrow_WhenArgsIsNegativeOrScaleAtLeastPrecision(int precision, int scale, string expectedMessage) + [Test, TestCaseSource(nameof(InvalidArguments_NegativeOrScaleTooBig))] + public void Constructor_ShouldThrow_WhenArgumentsAreNegativeOrScaleAtLeastPrecision(int precision, int scale, + string expectedMessage) { var act = () => new NumberValidator(precision, scale); act .Should() - .Throw($"{expectedMessage}. " + $"Параметры: precision={precision}, scale={scale}"); + .Throw($"{expectedMessage}. " + + $"Параметры: precision={precision}, scale={scale}"); } [TestCase(1, 0, true)] [TestCase(10, 5, false)] - public void Constructor_DoesNotThrow_WhenPrecisionScaleAndOnlyPositiveAreValid(int precision, int scale, bool onlyPositive) + public void Constructor_DoesNotThrow_WhenPrecisionScaleAndOnlyPositiveAreValid(int precision, int scale, + bool onlyPositive) { var act = () => new NumberValidator(precision, scale, onlyPositive); act @@ -32,7 +35,7 @@ public void Constructor_DoesNotThrow_WhenPrecisionScaleAndOnlyPositiveAreValid(i #region Валидация чисел - [Test, TestCaseSource(nameof(ValidNumbers))] + [TestCaseSource(nameof(ValidNumbers))] public void IsValidNumber_ShouldReturnTrue_ForValidNumbers(int precision, int scale, bool onlyPositive, string input, string expectedMessage) { @@ -44,7 +47,7 @@ public void IsValidNumber_ShouldReturnTrue_ForValidNumbers(int precision, int sc $"onlyPositive={onlyPositive}"); } - [Test, TestCaseSource(nameof(InvalidNumbers))] + [TestCaseSource(nameof(InvalidNumbers))] public void IsValidNumber_ShouldReturnFalse_ForInvalidNumbers(int precision, int scale, bool onlyPositive, string input, string expectedMessage) { @@ -58,7 +61,7 @@ public void IsValidNumber_ShouldReturnFalse_ForInvalidNumbers(int precision, int #endregion - public static IEnumerable InvalidNumbers() + private static IEnumerable InvalidNumbers() { yield return new TestCaseData(3, 2, true, "+0.00", "число превышает допустимое количество знаков") .SetName("InvalidNumber_TooManyDigits_PositiveZero"); @@ -114,7 +117,7 @@ public static IEnumerable InvalidNumbers() } - public static IEnumerable ValidNumbers() + private static IEnumerable ValidNumbers() { yield return new TestCaseData( 17, 2, true, "0.0", @@ -136,8 +139,8 @@ public static IEnumerable ValidNumbers() "целая часть + дробная часть ≤ precision, дробная часть ≤ scale, число положительное" ).SetName("ValidNumber_Integer"); } - - public static IEnumerable InvalidArgs_NegativeOrScaleTooBig() + + private static IEnumerable InvalidArguments_NegativeOrScaleTooBig() { yield return new TestCaseData(-1, 2, "отрицательный precision недопустим") .SetName("Constructor_Invalid_NegativePrecision");