From db3f8b26fa8c1e566eb33467a95dbd59ce781130 Mon Sep 17 00:00:00 2001 From: RenatZubakin Date: Mon, 27 Nov 2023 15:00:53 +0500 Subject: [PATCH 1/5] All hometasks is completed --- cs/HomeExercises/NumberValidatorTests.cs | 84 ++++++++++++++++++++++++ cs/HomeExercises/ObjectComparison.cs | 29 ++++---- 2 files changed, 100 insertions(+), 13 deletions(-) diff --git a/cs/HomeExercises/NumberValidatorTests.cs b/cs/HomeExercises/NumberValidatorTests.cs index a2878113..c62f7c5b 100644 --- a/cs/HomeExercises/NumberValidatorTests.cs +++ b/cs/HomeExercises/NumberValidatorTests.cs @@ -28,6 +28,90 @@ public void Test() Assert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("-1.23")); Assert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("a.sd")); } + + [Test] + public void NumberValidator_Should_Throw_ArgumentException_When_Precision_Is_Not_Positive() + { + Assert.Throws(() => new NumberValidator(-1, 2, true)); + } + + [Test] + public void NumberValidator_Should_Throw_ArgumentException_When_Scale_Is_Negative() + { + Assert.Throws(() => new NumberValidator(3, -2, true)); + } + + [Test] + public void NumberValidator_Should_Throw_ArgumentException_When_Scale_More_Than_Precision() + { + Assert.Throws(() => new NumberValidator(12, 14, true)); + } + + [Test] + public void NumberValidator_Should_Does_Not_Throw_When_Params_Is_Correct() + { + Assert.DoesNotThrow(()=> new NumberValidator(1,0,true)); + } + + [Test] + public void IsValidNumber_Should_Return_False_When_Value_Is_Null() + { + var numberValidator = new NumberValidator(17, 3, true); + + numberValidator.IsValidNumber(null).Should().BeFalse(); + } + + [Test] + public void IsValidNumber_Should_Return_False_When_Value_Is_Empty() + { + var numberValidator = new NumberValidator(17, 3, true); + + numberValidator.IsValidNumber("").Should().BeFalse(); + } + + [Test] + public void IsValidNumber_Should_Return_False_When_Value_Has_Incorrect_Form() + { + var numberValidatior = new NumberValidator(17, 3, true); + numberValidatior.IsValidNumber("ab.c").Should().BeFalse(); + } + + [Test] + public void IsValidNumber_Should_Return_False_When_Value_Length_More_Than_Precision() + { + var numberValidator = new NumberValidator(3, 1, true); + numberValidator.IsValidNumber("000.0").Should().BeFalse(); + } + + [Test] + public void IsValidNumber_Should_Return_False_When_Value_FracPart_Length_More_Than_Scale() + { + var numberValidator = new NumberValidator(3, 1, true); + numberValidator.IsValidNumber("+0.00").Should().BeFalse(); + } + + [Test] + public void IsValidNumber_Should_Return_False_When_OnlyPositive_Is_True_And_Value_Is_Negative() + { + var numberValidator = new NumberValidator(3, 1, true); + numberValidator.IsValidNumber("-0.0").Should().BeFalse(); + } + [Test] + public void IsValidNumber_Should_Return_False_When_OnlyPositive_Is_False_And_Value_Is_Negative() + { + var numberValidator = new NumberValidator(3, 1, false); + numberValidator.IsValidNumber("-0.0").Should().BeTrue(); + } + + [TestCase("0.0")] + [TestCase("+0.0")] + [TestCase("-0.0")] + public void IsValidNumeber_Should_Return_True_When_Value_IsCorrect(string value) + { + var numberValidator = new NumberValidator(3, 1, false); + numberValidator.IsValidNumber(value).Should().BeTrue(); + } + } public class NumberValidator diff --git a/cs/HomeExercises/ObjectComparison.cs b/cs/HomeExercises/ObjectComparison.cs index 44d9aed4..14907690 100644 --- a/cs/HomeExercises/ObjectComparison.cs +++ b/cs/HomeExercises/ObjectComparison.cs @@ -1,4 +1,5 @@ -using FluentAssertions; +using System; +using FluentAssertions; using NUnit.Framework; namespace HomeExercises @@ -15,16 +16,15 @@ 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. - Assert.AreEqual(actualTsar.Name, expectedTsar.Name); - Assert.AreEqual(actualTsar.Age, expectedTsar.Age); - Assert.AreEqual(actualTsar.Height, expectedTsar.Height); - Assert.AreEqual(actualTsar.Weight, expectedTsar.Weight); - - Assert.AreEqual(expectedTsar.Parent!.Name, actualTsar.Parent!.Name); - Assert.AreEqual(expectedTsar.Parent.Age, actualTsar.Parent.Age); - Assert.AreEqual(expectedTsar.Parent.Height, actualTsar.Parent.Height); - Assert.AreEqual(expectedTsar.Parent.Parent, actualTsar.Parent.Parent); + /* + * Данный тест рекурсивно пройдется по всем полям объекта и сравнит их по значению рекурсивно + * По умолчанию рекурсия проходит на глубину 10, для того чтобы снять ограничение + * используется опция AllowingInfiniteRecursion, но она может стать бесконечной, если цепь проверки замкнется. + * Мой способ лучше тем, что в случае добавления новых полей в объект Person, будут проверяться все поля без изменения теста. + * Изменения нужно будет вносить только в случае если мы хотим убрать какие-то поля из проверки. + */ + expectedTsar.Should().BeEquivalentTo(actualTsar,options=> options.Excluding(p=>p.Id).Excluding(p=>p.Parent.Id)); + } [Test] @@ -34,8 +34,11 @@ public void CheckCurrentTsar_WithCustomEquality() 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)); - - // Какие недостатки у такого подхода? + /* + * Какие недостатки у такого подхода? + * 1. Придется менять метод AreEqual, если в объект добавятся еще поля. + * 2. Рекурсия может стать бесконечной, если в каком-то Person Parent будет равен Person, который уже был в цепи проверки + */ Assert.True(AreEqual(actualTsar, expectedTsar)); } From c0644ee27c66453fb6eb7ac72ec686ca32e74792 Mon Sep 17 00:00:00 2001 From: RenatZubakin Date: Tue, 28 Nov 2023 18:01:00 +0500 Subject: [PATCH 2/5] correction of mentor's comments --- cs/HomeExercises/NumberValidatorTests.cs | 93 +++++------------------- cs/HomeExercises/ObjectComparison.cs | 18 +++-- 2 files changed, 30 insertions(+), 81 deletions(-) diff --git a/cs/HomeExercises/NumberValidatorTests.cs b/cs/HomeExercises/NumberValidatorTests.cs index c62f7c5b..457c7a4f 100644 --- a/cs/HomeExercises/NumberValidatorTests.cs +++ b/cs/HomeExercises/NumberValidatorTests.cs @@ -12,7 +12,7 @@ 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.Throws(() => new NumberValidator(-1, 2)); Assert.DoesNotThrow(() => new NumberValidator(1, 0, true)); Assert.IsTrue(new NumberValidator(17, 2, true).IsValidNumber("0.0")); @@ -29,86 +29,31 @@ public void Test() Assert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("a.sd")); } - [Test] - public void NumberValidator_Should_Throw_ArgumentException_When_Precision_Is_Not_Positive() - { - Assert.Throws(() => new NumberValidator(-1, 2, true)); - } - - [Test] - public void NumberValidator_Should_Throw_ArgumentException_When_Scale_Is_Negative() - { - Assert.Throws(() => new NumberValidator(3, -2, true)); - } - - [Test] - public void NumberValidator_Should_Throw_ArgumentException_When_Scale_More_Than_Precision() - { - Assert.Throws(() => new NumberValidator(12, 14, true)); - } - - [Test] - public void NumberValidator_Should_Does_Not_Throw_When_Params_Is_Correct() - { - Assert.DoesNotThrow(()=> new NumberValidator(1,0,true)); - } - - [Test] - public void IsValidNumber_Should_Return_False_When_Value_Is_Null() - { - var numberValidator = new NumberValidator(17, 3, true); - - numberValidator.IsValidNumber(null).Should().BeFalse(); - } - - [Test] - public void IsValidNumber_Should_Return_False_When_Value_Is_Empty() - { - var numberValidator = new NumberValidator(17, 3, true); - - numberValidator.IsValidNumber("").Should().BeFalse(); - } - - [Test] - public void IsValidNumber_Should_Return_False_When_Value_Has_Incorrect_Form() + [TestCase(-1, 2, true, TestName = "When_Precision_Is_Not_Positive")] + [TestCase(1, -2, true, TestName = "When_Scale_Is_Negative(")] + [TestCase(12, 14, true, TestName = "When_Scale_More_Than_Precision")] + public void NumberValidator_Should_Throw_ArgumentException(int precision, int scale, bool onlyPositive) { - var numberValidatior = new NumberValidator(17, 3, true); - numberValidatior.IsValidNumber("ab.c").Should().BeFalse(); + Assert.Throws(() => new NumberValidator(precision, scale, onlyPositive)); } - [Test] - public void IsValidNumber_Should_Return_False_When_Value_Length_More_Than_Precision() - { - var numberValidator = new NumberValidator(3, 1, true); - numberValidator.IsValidNumber("000.0").Should().BeFalse(); - } - - [Test] - public void IsValidNumber_Should_Return_False_When_Value_FracPart_Length_More_Than_Scale() - { - var numberValidator = new NumberValidator(3, 1, true); - numberValidator.IsValidNumber("+0.00").Should().BeFalse(); - } - - [Test] - public void IsValidNumber_Should_Return_False_When_OnlyPositive_Is_True_And_Value_Is_Negative() - { - var numberValidator = new NumberValidator(3, 1, true); - numberValidator.IsValidNumber("-0.0").Should().BeFalse(); - } - [Test] - public void IsValidNumber_Should_Return_False_When_OnlyPositive_Is_False_And_Value_Is_Negative() + [TestCase(3, 1, false, null, TestName = "When_Value_Is_Null")] + [TestCase(3, 1, false, "", TestName = "When_Value_Is_Empty")] + [TestCase(3, 1, true, "ab.c", TestName = "When_Value_Is_Not_Match_Regex")] + [TestCase(3, 1, true, "000.0", TestName = "When_Value_Length_More_Than_Precision")] + [TestCase(3, 1, true, "-0.0", TestName = "When_OnlyPositive_Is_True_And_Value_Is_Negative")] + public void IsValidNumber_Should_Return_False(int precision, int scale, bool onlyPositive, string value) { - var numberValidator = new NumberValidator(3, 1, false); - numberValidator.IsValidNumber("-0.0").Should().BeTrue(); + var numberValidator = new NumberValidator(precision, scale, onlyPositive); + numberValidator.IsValidNumber(value).Should().BeFalse(); } - [TestCase("0.0")] - [TestCase("+0.0")] - [TestCase("-0.0")] - public void IsValidNumeber_Should_Return_True_When_Value_IsCorrect(string value) + [TestCase(4, 2, false, "-0.0", TestName = "When_OnlyPositive_Is_False_And_Value_Is_Negative")] + [TestCase(4, 2, true, "+0.0", TestName = "When_Value_Starts_With_Plus")] + [TestCase(2, 2, true, "0.0", TestName = "When_Value_Is_Positive")] + public void IsValidNumeber_Should_Return_True(int precision, int scale, bool onlyPositive, string value) { - var numberValidator = new NumberValidator(3, 1, false); + var numberValidator = new NumberValidator(precision, scale, onlyPositive); numberValidator.IsValidNumber(value).Should().BeTrue(); } diff --git a/cs/HomeExercises/ObjectComparison.cs b/cs/HomeExercises/ObjectComparison.cs index 14907690..72f55415 100644 --- a/cs/HomeExercises/ObjectComparison.cs +++ b/cs/HomeExercises/ObjectComparison.cs @@ -1,5 +1,6 @@ using System; using FluentAssertions; +using FluentAssertions.Equivalency; using NUnit.Framework; namespace HomeExercises @@ -16,15 +17,16 @@ public void CheckCurrentTsar() var expectedTsar = new Person("Ivan IV The Terrible", 54, 170, 70, new Person("Vasili III of Russia", 28, 170, 60, null)); - /* + /* * Данный тест рекурсивно пройдется по всем полям объекта и сравнит их по значению рекурсивно * По умолчанию рекурсия проходит на глубину 10, для того чтобы снять ограничение - * используется опция AllowingInfiniteRecursion, но она может стать бесконечной, если цепь проверки замкнется. - * Мой способ лучше тем, что в случае добавления новых полей в объект Person, будут проверяться все поля без изменения теста. - * Изменения нужно будет вносить только в случае если мы хотим убрать какие-то поля из проверки. + * используется опция AllowingInfiniteRecursion, но она может стать бесконечной, если цепь проверки замкнется. + * Мой способ лучше тем, что в случае добавления новых полей в объект Person, будут проверяться все поля без изменения теста. + * Изменения нужно будет вносить только в случае если мы хотим убрать какие-то поля из проверки. */ - expectedTsar.Should().BeEquivalentTo(actualTsar,options=> options.Excluding(p=>p.Id).Excluding(p=>p.Parent.Id)); - + actualTsar.Should().BeEquivalentTo(expectedTsar, options => + options.Excluding((IMemberInfo o) => o.SelectedMemberInfo.Name == "Id" && + o.SelectedMemberInfo.DeclaringType == typeof(Person))); } [Test] @@ -35,9 +37,11 @@ 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)); /* - * Какие недостатки у такого подхода? + * Какие недостатки у такого подхода? * 1. Придется менять метод AreEqual, если в объект добавятся еще поля. * 2. Рекурсия может стать бесконечной, если в каком-то Person Parent будет равен Person, который уже был в цепи проверки + * 3. Имя теста никак не сигнализирует о том какой особый случай оно проверяет + * 4. Тест никак не показывает в чем проблема, тест просто становится красным */ Assert.True(AreEqual(actualTsar, expectedTsar)); } From 7c4bd14d3620b1ac429affd64e5647a64ce936d5 Mon Sep 17 00:00:00 2001 From: RenatZubakin Date: Wed, 29 Nov 2023 00:34:00 +0500 Subject: [PATCH 3/5] update --- cs/HomeExercises/NumberValidatorTests.cs | 25 +++++++++--------------- cs/HomeExercises/ObjectComparison.cs | 2 +- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/cs/HomeExercises/NumberValidatorTests.cs b/cs/HomeExercises/NumberValidatorTests.cs index 457c7a4f..49deab07 100644 --- a/cs/HomeExercises/NumberValidatorTests.cs +++ b/cs/HomeExercises/NumberValidatorTests.cs @@ -37,26 +37,19 @@ public void NumberValidator_Should_Throw_ArgumentException(int precision, int sc Assert.Throws(() => new NumberValidator(precision, scale, onlyPositive)); } - [TestCase(3, 1, false, null, TestName = "When_Value_Is_Null")] - [TestCase(3, 1, false, "", TestName = "When_Value_Is_Empty")] - [TestCase(3, 1, true, "ab.c", TestName = "When_Value_Is_Not_Match_Regex")] - [TestCase(3, 1, true, "000.0", TestName = "When_Value_Length_More_Than_Precision")] - [TestCase(3, 1, true, "-0.0", TestName = "When_OnlyPositive_Is_True_And_Value_Is_Negative")] - public void IsValidNumber_Should_Return_False(int precision, int scale, bool onlyPositive, string value) + [TestCase(3, 1, false, null, TestName = "False_When_Value_Is_Null", ExpectedResult = false)] + [TestCase(3, 1, false, "", TestName = "False_When_Value_Is_Empty", ExpectedResult = false)] + [TestCase(3, 1, true, "ab.c", TestName = "False_When_Value_Is_Not_Match_Regex", ExpectedResult = false)] + [TestCase(3, 1, true, "000.0", TestName = "False_When_Value_Length_More_Than_Precision", ExpectedResult = false)] + [TestCase(3, 1, true, "-0.0", TestName = "False_When_OnlyPositive_Is_True_And_Value_Is_Negative", + ExpectedResult = false)] + public bool IsValidNumber_Should_Return(int precision, int scale, bool onlyPositive, string value) { var numberValidator = new NumberValidator(precision, scale, onlyPositive); - numberValidator.IsValidNumber(value).Should().BeFalse(); - } - - [TestCase(4, 2, false, "-0.0", TestName = "When_OnlyPositive_Is_False_And_Value_Is_Negative")] - [TestCase(4, 2, true, "+0.0", TestName = "When_Value_Starts_With_Plus")] - [TestCase(2, 2, true, "0.0", TestName = "When_Value_Is_Positive")] - public void IsValidNumeber_Should_Return_True(int precision, int scale, bool onlyPositive, string value) - { - var numberValidator = new NumberValidator(precision, scale, onlyPositive); - numberValidator.IsValidNumber(value).Should().BeTrue(); + return numberValidator.IsValidNumber(value); } + } public class NumberValidator diff --git a/cs/HomeExercises/ObjectComparison.cs b/cs/HomeExercises/ObjectComparison.cs index 72f55415..129bd646 100644 --- a/cs/HomeExercises/ObjectComparison.cs +++ b/cs/HomeExercises/ObjectComparison.cs @@ -25,7 +25,7 @@ public void CheckCurrentTsar() * Изменения нужно будет вносить только в случае если мы хотим убрать какие-то поля из проверки. */ actualTsar.Should().BeEquivalentTo(expectedTsar, options => - options.Excluding((IMemberInfo o) => o.SelectedMemberInfo.Name == "Id" && + options.Excluding((IMemberInfo o) => o.SelectedMemberInfo.Name == nameof(Person.Id) && o.SelectedMemberInfo.DeclaringType == typeof(Person))); } From 7b01934fea83be4f7f1bade20339dd7db84e9117 Mon Sep 17 00:00:00 2001 From: RenatZubakin Date: Wed, 29 Nov 2023 01:36:33 +0500 Subject: [PATCH 4/5] update tests methods and add ore cases --- cs/HomeExercises/NumberValidatorTests.cs | 72 ++++++++++++++++++++---- cs/HomeExercises/ObjectComparison.cs | 2 +- 2 files changed, 62 insertions(+), 12 deletions(-) diff --git a/cs/HomeExercises/NumberValidatorTests.cs b/cs/HomeExercises/NumberValidatorTests.cs index 49deab07..b8c36574 100644 --- a/cs/HomeExercises/NumberValidatorTests.cs +++ b/cs/HomeExercises/NumberValidatorTests.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Text.RegularExpressions; using FluentAssertions; using NUnit.Framework; @@ -37,22 +38,71 @@ public void NumberValidator_Should_Throw_ArgumentException(int precision, int sc Assert.Throws(() => new NumberValidator(precision, scale, onlyPositive)); } - [TestCase(3, 1, false, null, TestName = "False_When_Value_Is_Null", ExpectedResult = false)] - [TestCase(3, 1, false, "", TestName = "False_When_Value_Is_Empty", ExpectedResult = false)] - [TestCase(3, 1, true, "ab.c", TestName = "False_When_Value_Is_Not_Match_Regex", ExpectedResult = false)] - [TestCase(3, 1, true, "000.0", TestName = "False_When_Value_Length_More_Than_Precision", ExpectedResult = false)] - [TestCase(3, 1, true, "-0.0", TestName = "False_When_OnlyPositive_Is_True_And_Value_Is_Negative", - ExpectedResult = false)] - public bool IsValidNumber_Should_Return(int precision, int scale, bool onlyPositive, string value) + [Test,TestCaseSource(nameof(IsValidNumber_Should_Return_TestData))] + public bool IsValidNumber_Should_Return( bool onlyPositive, string value) { - var numberValidator = new NumberValidator(precision, scale, onlyPositive); + var numberValidator = new NumberValidator(4, 2, onlyPositive); return numberValidator.IsValidNumber(value); } - - } + private static IEnumerable IsValidNumber_Should_Return_TestData() + { + yield return new TestCaseData(false, null) + .SetName("False_When_Value_Is_Null") + .Returns(false); + + yield return new TestCaseData(false, "") + .SetName("False_When_Value_Is_Empty") + .Returns(false); + + yield return new TestCaseData(true, "ab.c") + .SetName("False_When_Value_Is_Not_Match_Regex") + .Returns(false); + + yield return new TestCaseData(true, "000.00") + .SetName("False_When_Value_Length_More_Than_Precision") + .Returns(false); + + yield return new TestCaseData(true, "-0.0") + .SetName("False_When_OnlyPositive_Is_True_And_Value_Is_Negative") + .Returns(false); + + yield return new TestCaseData(false, "-0.0") + .SetName("True_When_OnlyPositive_Is_False_And_Value_Is_Negative") + .Returns(true); + + yield return new TestCaseData(true, "+0.0") + .SetName("True_When_Value_Starts_With_Plus") + .Returns(true); + + yield return new TestCaseData(true,"0.0") + .SetName("True_When_Value_Is_Positive") + .Returns(true); + + // новые кейсы + yield return new TestCaseData(true, "+00.00") + .SetName("False_When_Value_Starts_With_Sign_And_Numbers_Length_Is_Equal_To_Precision") + .Returns(false); + + yield return new TestCaseData(true, " +00.00") + .SetName("False_When_Value_Has_Symbols_Before_Number") + .Returns(false); + + yield return new TestCaseData(true, "+00.00 ") + .SetName("False_When_Value_Has_Symbols_After_Number") + .Returns(false); + + yield return new TestCaseData(true,"0,0") + .SetName("True_When_IntPart_And_FracPart_Separate_By_Comma") + .Returns(true); + + yield return new TestCaseData(true, "0!0") + .SetName("True_When_IntPart_And_FracPart_Separate_By_Another_Symbol_As_Comma_Or_Dot") + .Returns(false); + } + } - public class NumberValidator + public class NumberValidator { private readonly Regex numberRegex; private readonly bool onlyPositive; diff --git a/cs/HomeExercises/ObjectComparison.cs b/cs/HomeExercises/ObjectComparison.cs index 129bd646..e3d24406 100644 --- a/cs/HomeExercises/ObjectComparison.cs +++ b/cs/HomeExercises/ObjectComparison.cs @@ -26,7 +26,7 @@ public void CheckCurrentTsar() */ actualTsar.Should().BeEquivalentTo(expectedTsar, options => options.Excluding((IMemberInfo o) => o.SelectedMemberInfo.Name == nameof(Person.Id) && - o.SelectedMemberInfo.DeclaringType == typeof(Person))); + o.SelectedMemberInfo.DeclaringType == typeof(Person)).IgnoringCyclicReferences()); } [Test] From 2b51d25efd2b43fefb74cd5419cf9c1a294c5e3b Mon Sep 17 00:00:00 2001 From: RenatZubakin Date: Thu, 30 Nov 2023 00:19:58 +0500 Subject: [PATCH 5/5] Decomposition NumberValidatorTests and Refactor ObjectComparsion --- cs/HomeExercises/NumberValidatorTests.cs | 106 +++++++++-------------- cs/HomeExercises/ObjectComparison.cs | 14 +-- cs/testing.sln | 13 +-- 3 files changed, 57 insertions(+), 76 deletions(-) diff --git a/cs/HomeExercises/NumberValidatorTests.cs b/cs/HomeExercises/NumberValidatorTests.cs index b8c36574..342c2b65 100644 --- a/cs/HomeExercises/NumberValidatorTests.cs +++ b/cs/HomeExercises/NumberValidatorTests.cs @@ -1,34 +1,14 @@ using System; using System.Collections.Generic; using System.Text.RegularExpressions; -using FluentAssertions; using NUnit.Framework; namespace HomeExercises { 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)); - Assert.DoesNotThrow(() => new NumberValidator(1, 0, true)); - - Assert.IsTrue(new NumberValidator(17, 2, true).IsValidNumber("0.0")); - Assert.IsTrue(new NumberValidator(17, 2, true).IsValidNumber("0")); - Assert.IsTrue(new NumberValidator(17, 2, true).IsValidNumber("0.0")); - Assert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("00.00")); - Assert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("-0.00")); - Assert.IsTrue(new NumberValidator(17, 2, true).IsValidNumber("0.0")); - Assert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("+0.00")); - Assert.IsTrue(new NumberValidator(4, 2, true).IsValidNumber("+1.23")); - Assert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("+1.23")); - Assert.IsFalse(new NumberValidator(17, 2, true).IsValidNumber("0.000")); - Assert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("-1.23")); - Assert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("a.sd")); - } + private static NumberValidator _numberValidatorOnlyPositiv = new NumberValidator(4, 2, true); + private static NumberValidator _numberValidatorAllValues = new NumberValidator(4, 2); [TestCase(-1, 2, true, TestName = "When_Precision_Is_Not_Positive")] [TestCase(1, -2, true, TestName = "When_Scale_Is_Negative(")] @@ -38,71 +18,69 @@ public void NumberValidator_Should_Throw_ArgumentException(int precision, int sc Assert.Throws(() => new NumberValidator(precision, scale, onlyPositive)); } - [Test,TestCaseSource(nameof(IsValidNumber_Should_Return_TestData))] - public bool IsValidNumber_Should_Return( bool onlyPositive, string value) + [TestCaseSource(nameof(IsValidNumberShouldReturnFalse))] + [TestCaseSource(nameof(IsValidNumberShouldReturnFalse))] + public bool IsValidNumber_Should_Return(NumberValidator numberValidator, string value) { - var numberValidator = new NumberValidator(4, 2, onlyPositive); return numberValidator.IsValidNumber(value); } - private static IEnumerable IsValidNumber_Should_Return_TestData() - { - yield return new TestCaseData(false, null) - .SetName("False_When_Value_Is_Null") - .Returns(false); - - yield return new TestCaseData(false, "") - .SetName("False_When_Value_Is_Empty") - .Returns(false); - - yield return new TestCaseData(true, "ab.c") - .SetName("False_When_Value_Is_Not_Match_Regex") - .Returns(false); + private static IEnumerable IsValidNumberShouldReturnFalse() + { + yield return new TestCaseData(_numberValidatorAllValues, null) + .SetName("False_When_Value_Is_Null") + .Returns(false); - yield return new TestCaseData(true, "000.00") - .SetName("False_When_Value_Length_More_Than_Precision") - .Returns(false); + yield return new TestCaseData(_numberValidatorAllValues, "") + .SetName("False_When_Value_Is_Empty") + .Returns(false); - yield return new TestCaseData(true, "-0.0") - .SetName("False_When_OnlyPositive_Is_True_And_Value_Is_Negative") - .Returns(false); + yield return new TestCaseData(_numberValidatorAllValues, "ab.c") + .SetName("False_When_Value_Is_Not_Match_Regex") + .Returns(false); - yield return new TestCaseData(false, "-0.0") - .SetName("True_When_OnlyPositive_Is_False_And_Value_Is_Negative") - .Returns(true); + yield return new TestCaseData(_numberValidatorAllValues, "000.00") + .SetName("False_When_Value_Length_More_Than_Precision") + .Returns(false); - yield return new TestCaseData(true, "+0.0") - .SetName("True_When_Value_Starts_With_Plus") - .Returns(true); + yield return new TestCaseData(_numberValidatorOnlyPositiv, "-0.0") + .SetName("False_When_OnlyPositive_Is_True_And_Value_Is_Negative") + .Returns(false); - yield return new TestCaseData(true,"0.0") - .SetName("True_When_Value_Is_Positive") - .Returns(true); - - // новые кейсы - yield return new TestCaseData(true, "+00.00") + yield return new TestCaseData(_numberValidatorAllValues, "+00.00") .SetName("False_When_Value_Starts_With_Sign_And_Numbers_Length_Is_Equal_To_Precision") .Returns(false); - yield return new TestCaseData(true, " +00.00") + yield return new TestCaseData(_numberValidatorAllValues, " +00.00") .SetName("False_When_Value_Has_Symbols_Before_Number") .Returns(false); - yield return new TestCaseData(true, "+00.00 ") + yield return new TestCaseData(_numberValidatorAllValues, "+00.00 ") .SetName("False_When_Value_Has_Symbols_After_Number") .Returns(false); - - yield return new TestCaseData(true,"0,0") + } + + private static IEnumerable IsValidNumberShouldReturnTrue() + { + yield return new TestCaseData(_numberValidatorAllValues, "+0.0") + .SetName("True_When_Value_Starts_With_Plus") + .Returns(true); + + yield return new TestCaseData(_numberValidatorAllValues, "0.0") + .SetName("True_When_Value_Is_Positive") + .Returns(true); + + yield return new TestCaseData(_numberValidatorAllValues, "0,0") .SetName("True_When_IntPart_And_FracPart_Separate_By_Comma") .Returns(true); - yield return new TestCaseData(true, "0!0") + yield return new TestCaseData(_numberValidatorAllValues, "0!0") .SetName("True_When_IntPart_And_FracPart_Separate_By_Another_Symbol_As_Comma_Or_Dot") .Returns(false); - } - } + } + } - public class NumberValidator + public class NumberValidator { private readonly Regex numberRegex; private readonly bool onlyPositive; diff --git a/cs/HomeExercises/ObjectComparison.cs b/cs/HomeExercises/ObjectComparison.cs index e3d24406..b26cc368 100644 --- a/cs/HomeExercises/ObjectComparison.cs +++ b/cs/HomeExercises/ObjectComparison.cs @@ -1,6 +1,4 @@ -using System; -using FluentAssertions; -using FluentAssertions.Equivalency; +using FluentAssertions; using NUnit.Framework; namespace HomeExercises @@ -24,9 +22,11 @@ public void CheckCurrentTsar() * Мой способ лучше тем, что в случае добавления новых полей в объект Person, будут проверяться все поля без изменения теста. * Изменения нужно будет вносить только в случае если мы хотим убрать какие-то поля из проверки. */ + actualTsar.Should().BeEquivalentTo(expectedTsar, options => - options.Excluding((IMemberInfo o) => o.SelectedMemberInfo.Name == nameof(Person.Id) && - o.SelectedMemberInfo.DeclaringType == typeof(Person)).IgnoringCyclicReferences()); + options.Excluding(o => o.SelectedMemberInfo.Name == nameof(Person.Id) && + o.SelectedMemberInfo.DeclaringType == typeof(Person)) + .IgnoringCyclicReferences()); } [Test] @@ -71,11 +71,11 @@ public static Person GetCurrentTsar() public class Person { - public static int IdCounter = 0; + public static int IdCounter; public int Age, Height, Weight; + public int Id; public string Name; public Person? Parent; - public int Id; public Person(string name, int age, int height, int weight, Person? parent) { diff --git a/cs/testing.sln b/cs/testing.sln index 4642966f..be154766 100644 --- a/cs/testing.sln +++ b/cs/testing.sln @@ -1,13 +1,13 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26430.13 +# Visual Studio Version 17 +VisualStudioVersion = 17.6.33829.357 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples", "Samples\Samples.csproj", "{E7A56C48-8E36-465B-9F8E-67BC8525CFE5}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples", "Samples\Samples.csproj", "{E7A56C48-8E36-465B-9F8E-67BC8525CFE5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HomeExercises", "HomeExercises\HomeExercises.csproj", "{4F9FBCCA-43E0-431B-944D-834D16AD18F9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HomeExercises", "HomeExercises\HomeExercises.csproj", "{4F9FBCCA-43E0-431B-944D-834D16AD18F9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Challenge", "Challenge\Challenge.csproj", "{BB8C2EFB-6AE9-45BD-8468-829D5AB79DCB}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Challenge", "Challenge\Challenge.csproj", "{BB8C2EFB-6AE9-45BD-8468-829D5AB79DCB}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -31,4 +31,7 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {8F870899-F9CC-4FC5-8908-E2FD1AAC0AD7} + EndGlobalSection EndGlobal