From de6c58137acd99fd333a815d525f3f8839d48800 Mon Sep 17 00:00:00 2001 From: batyadmx Date: Tue, 28 Nov 2023 15:12:01 +0500 Subject: [PATCH 1/4] Object comparison refactor --- cs/HomeExercises/ObjectComparison.cs | 148 +++++++++++++++------------ 1 file changed, 80 insertions(+), 68 deletions(-) diff --git a/cs/HomeExercises/ObjectComparison.cs b/cs/HomeExercises/ObjectComparison.cs index 44d9aed4..40c9213d 100644 --- a/cs/HomeExercises/ObjectComparison.cs +++ b/cs/HomeExercises/ObjectComparison.cs @@ -3,81 +3,93 @@ namespace HomeExercises { - public class ObjectComparison - { - [Test] - [Description("Проверка текущего царя")] - [Category("ToRefactor")] - public void CheckCurrentTsar() - { - var actualTsar = TsarRegistry.GetCurrentTsar(); + public class ObjectComparison + { + [Test] + [Description("Проверка текущего царя")] + [Category("ToRefactor")] + public void CheckCurrentTsar() + { + 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)); + 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); + /* + 1. Изменять тест придется, только при изменении или добавлении членов класса, которые нужно исключить + из сравнения. + 2. Если забыть добавить новые поля, которые нужно исключить из сравнения, то тест упадет + на эквивалентных экземплярах. + */ - 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); - } + actualTsar + .Should() + .BeEquivalentTo(expectedTsar, + option => + option.Excluding(ctx => ctx.SelectedMemberInfo.Name == nameof(Person.Id) && + ctx.SelectedMemberInfo.DeclaringType.Name == nameof(Person)) + .AllowingInfiniteRecursion()); + } - [Test] - [Description("Альтернативное решение. Какие у него недостатки?")] - 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)); + [Test] + [Description("Альтернативное решение. Какие у него недостатки?")] + 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)); - // Какие недостатки у такого подхода? - Assert.True(AreEqual(actualTsar, expectedTsar)); - } + /* + Какие недостатки у такого подхода? - private bool AreEqual(Person? actual, Person? expected) - { - if (actual == expected) return true; - if (actual == null || expected == null) return false; - return - actual.Name == expected.Name - && actual.Age == expected.Age - && actual.Height == expected.Height - && actual.Weight == expected.Weight - && AreEqual(actual.Parent, expected.Parent); - } - } + 1. Разные классы в объектном графе потребуют создания разных методов для их обхода. + 2. Изменение названий учавствующих в сравнении полей и строк потребует изменения тестов. + 3. Добавление новых полей и свойств, учавствующих в сравнении также потребует изменения тестов. + 4. Если забыть добавить проверку новых полей класса в AreEqual, то тест будет проходить на экземплярах, + которые не равны. + */ + Assert.True(AreEqual(actualTsar, expectedTsar)); + } - public class TsarRegistry - { - public static Person GetCurrentTsar() - { - return new Person( - "Ivan IV The Terrible", 54, 170, 70, - new Person("Vasili III of Russia", 28, 170, 60, null)); - } - } + private bool AreEqual(Person? actual, Person? expected) + { + if (actual == expected) return true; + if (actual == null || expected == null) return false; + return + actual.Name == expected.Name + && actual.Age == expected.Age + && actual.Height == expected.Height + && actual.Weight == expected.Weight + && AreEqual(actual.Parent, expected.Parent); + } + } - public class Person - { - public static int IdCounter = 0; - public int Age, Height, Weight; - public string Name; - public Person? Parent; - public int Id; + public class TsarRegistry + { + public static Person GetCurrentTsar() + { + return new Person( + "Ivan IV The Terrible", 54, 170, 70, + new Person("Vasili III of Russia", 28, 170, 60, null)); + } + } - public Person(string name, int age, int height, int weight, Person? parent) - { - Id = IdCounter++; - Name = name; - Age = age; - Height = height; - Weight = weight; - Parent = parent; - } - } + public class Person + { + public static int IdCounter = 0; + public int Age, Height, Weight; + public string Name; + public Person? Parent; + public int Id; + + public Person(string name, int age, int height, int weight, Person? parent) + { + Id = IdCounter++; + Name = name; + Age = age; + Height = height; + Weight = weight; + Parent = parent; + } + } } \ No newline at end of file From 42990f0337f1efe5ad549807dbfa248b347e502f Mon Sep 17 00:00:00 2001 From: batyadmx Date: Tue, 28 Nov 2023 15:12:27 +0500 Subject: [PATCH 2/4] NumberValidator tests refactor --- cs/HomeExercises/NumberValidatorTests.cs | 200 ++++++++++++++--------- 1 file changed, 127 insertions(+), 73 deletions(-) diff --git a/cs/HomeExercises/NumberValidatorTests.cs b/cs/HomeExercises/NumberValidatorTests.cs index a2878113..8b777d75 100644 --- a/cs/HomeExercises/NumberValidatorTests.cs +++ b/cs/HomeExercises/NumberValidatorTests.cs @@ -1,80 +1,134 @@ using System; 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, false)); - 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")); - } - } - - public class NumberValidator - { - private readonly Regex numberRegex; - private readonly bool onlyPositive; - private readonly int precision; - private readonly int scale; - - public NumberValidator(int precision, int scale = 0, bool onlyPositive = false) - { - this.precision = precision; - this.scale = scale; - this.onlyPositive = onlyPositive; - 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"); - numberRegex = new Regex(@"^([+-]?)(\d+)([.,](\d+))?$", RegexOptions.IgnoreCase); - } - - public bool IsValidNumber(string value) - { - // Проверяем соответствие входного значения формату N(m,k), в соответствии с правилом, - // описанным в Формате описи документов, направляемых в налоговый орган в электронном виде по телекоммуникационным каналам связи: - // Формат числового значения указывается в виде N(m.к), где m – максимальное количество знаков в числе, включая знак (для отрицательного числа), - // целую и дробную часть числа без разделяющей десятичной точки, k – максимальное число знаков дробной части числа. - // Если число знаков дробной части числа равно 0 (т.е. число целое), то формат числового значения имеет вид N(m). - - if (string.IsNullOrEmpty(value)) - return false; - - var match = numberRegex.Match(value); - if (!match.Success) - return false; - - // Знак и целая часть - var intPart = match.Groups[1].Value.Length + match.Groups[2].Value.Length; - // Дробная часть - var fracPart = match.Groups[4].Value.Length; - - if (intPart + fracPart > precision || fracPart > scale) - return false; - - if (onlyPositive && match.Groups[1].Value == "-") - return false; - return true; - } - } + public class NumberValidatorTests + { + [Test] + public void NumberValidator_WithProperParameters_Success() + { + Assert.DoesNotThrow(() => new NumberValidator(1, 0, true)); + } + + [Test] + public void NumberValidator_WithNegativePrecision_ThrowsArgumentException() + { + Assert.Throws(() => new NumberValidator(-1, 2, true)); + } + + [Test] + public void NumberValidator_WithNegativeScale_ThrowsArgumentException() + { + Assert.Throws(() => new NumberValidator(2, -2, true)); + } + + [Test] + public void NumberValidator_WithScaleGreaterThanPrecision_ThrowsArgumentException() + { + Assert.Throws(() => new NumberValidator(2, 4, true)); + } + + [TestCase(17, 2, true, "0.0")] + [TestCase(17, 2, true, "0")] + [TestCase(17, 2, true, "+0.0")] + [TestCase(3, 1, true, "+1.2")] + [TestCase(3, 1, false, "-1.2")] + public void IsValidNumber_WithProperValue_Success + (int precision, int scale, bool positive, string value) + { + var validator = new NumberValidator(precision, scale, positive); + + Assert.True(validator.IsValidNumber(value)); + } + + [TestCase(" ")] + [TestCase("")] + [TestCase(null)] + [TestCase("+-1")] + [TestCase("abc")] + [TestCase("a.bc")] + [TestCase("1.0.1")] + public void IsValidNumber_WithIncorrectValue_ReturnFalse(string value) + { + Assert.False(new NumberValidator(10, 5).IsValidNumber(value)); + } + + + [TestCase("-1.0")] + [TestCase("+1.0")] + [TestCase("10.0")] + [TestCase("1.00")] + public void IsValidNumber_WithValueGreaterThanPrecision_ReturnFalse(string value) + { + var validator = new NumberValidator(2, 1); + + Assert.False(validator.IsValidNumber(value)); + } + + [TestCase(true, "1.00")] + [TestCase(false, "-1.00")] + public void IsValidNumber_WithFracPartGreaterThanScale_ReturnFalse(bool positive, string value) + { + var validator = new NumberValidator(10, 1, positive); + + Assert.False(validator.IsValidNumber(value)); + } + + public void IsValidNumber_OnlyPositiveWithNegativeValue_ReturnFalse() + { + var validator = new NumberValidator(10, 5, true); + + Assert.False(validator.IsValidNumber("-1.0")); + } + } + + public class NumberValidator + { + private readonly Regex numberRegex; + private readonly bool onlyPositive; + private readonly int precision; + private readonly int scale; + + public NumberValidator(int precision, int scale = 0, bool onlyPositive = false) + { + this.precision = precision; + this.scale = scale; + this.onlyPositive = onlyPositive; + 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"); + numberRegex = new Regex(@"^([+-]?)(\d+)([.,](\d+))?$", RegexOptions.IgnoreCase); + } + + public bool IsValidNumber(string value) + { + // Проверяем соответствие входного значения формату N(m,k), в соответствии с правилом, + // описанным в Формате описи документов, направляемых в налоговый орган в электронном виде по телекоммуникационным каналам связи: + // Формат числового значения указывается в виде N(m.к), где m – максимальное количество знаков в числе, включая знак (для отрицательного числа), + // целую и дробную часть числа без разделяющей десятичной точки, k – максимальное число знаков дробной части числа. + // Если число знаков дробной части числа равно 0 (т.е. число целое), то формат числового значения имеет вид N(m). + + if (string.IsNullOrEmpty(value)) + return false; + + var match = numberRegex.Match(value); + if (!match.Success) + return false; + + // Знак и целая часть + var intPart = match.Groups[1].Value.Length + match.Groups[2].Value.Length; + // Дробная часть + var fracPart = match.Groups[4].Value.Length; + + if (intPart + fracPart > precision || fracPart > scale) + return false; + + if (onlyPositive && match.Groups[1].Value == "-") + return false; + return true; + } + } } \ No newline at end of file From 71fdae7d0421fb4202bf1f137bdeea57885266e7 Mon Sep 17 00:00:00 2001 From: batyadmx Date: Thu, 30 Nov 2023 14:23:10 +0500 Subject: [PATCH 3/4] NumberValidator tests refactor --- cs/HomeExercises/NumberValidator.cs | 53 ++++++++++++++ cs/HomeExercises/NumberValidatorTests.cs | 91 ++++++------------------ 2 files changed, 76 insertions(+), 68 deletions(-) create mode 100644 cs/HomeExercises/NumberValidator.cs diff --git a/cs/HomeExercises/NumberValidator.cs b/cs/HomeExercises/NumberValidator.cs new file mode 100644 index 00000000..ec2d273b --- /dev/null +++ b/cs/HomeExercises/NumberValidator.cs @@ -0,0 +1,53 @@ +using System; +using System.Text.RegularExpressions; + +namespace HomeExercises +{ + public class NumberValidator + { + private readonly Regex numberRegex; + private readonly bool onlyPositive; + private readonly int precision; + private readonly int scale; + + public NumberValidator(int precision, int scale = 0, bool onlyPositive = false) + { + this.precision = precision; + this.scale = scale; + this.onlyPositive = onlyPositive; + 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"); + numberRegex = new Regex(@"^([+-]?)(\d+)([.,](\d+))?$", RegexOptions.IgnoreCase); + } + + public bool IsValidNumber(string value) + { + // Проверяем соответствие входного значения формату N(m,k), в соответствии с правилом, + // описанным в Формате описи документов, направляемых в налоговый орган в электронном виде по телекоммуникационным каналам связи: + // Формат числового значения указывается в виде N(m.к), где m – максимальное количество знаков в числе, включая знак (для отрицательного числа), + // целую и дробную часть числа без разделяющей десятичной точки, k – максимальное число знаков дробной части числа. + // Если число знаков дробной части числа равно 0 (т.е. число целое), то формат числового значения имеет вид N(m). + + if (string.IsNullOrEmpty(value)) + return false; + + var match = numberRegex.Match(value); + if (!match.Success) + return false; + + // Знак и целая часть + var intPart = match.Groups[1].Value.Length + match.Groups[2].Value.Length; + // Дробная часть + var fracPart = match.Groups[4].Value.Length; + + if (intPart + fracPart > precision || fracPart > scale) + return false; + + if (onlyPositive && match.Groups[1].Value == "-") + return false; + return true; + } + } +} \ No newline at end of file diff --git a/cs/HomeExercises/NumberValidatorTests.cs b/cs/HomeExercises/NumberValidatorTests.cs index 8b777d75..a5b7a131 100644 --- a/cs/HomeExercises/NumberValidatorTests.cs +++ b/cs/HomeExercises/NumberValidatorTests.cs @@ -1,5 +1,4 @@ using System; -using System.Text.RegularExpressions; using NUnit.Framework; namespace HomeExercises @@ -12,22 +11,12 @@ public void NumberValidator_WithProperParameters_Success() Assert.DoesNotThrow(() => new NumberValidator(1, 0, true)); } - [Test] - public void NumberValidator_WithNegativePrecision_ThrowsArgumentException() - { - Assert.Throws(() => new NumberValidator(-1, 2, true)); - } - - [Test] - public void NumberValidator_WithNegativeScale_ThrowsArgumentException() - { - Assert.Throws(() => new NumberValidator(2, -2, true)); - } - - [Test] - public void NumberValidator_WithScaleGreaterThanPrecision_ThrowsArgumentException() + [TestCase(-2, 2, TestName = "NumberValidator_WithNegativePrecision_ThrowsArgumentException")] + [TestCase(2, -2, TestName = "NumberValidator_WithNegativeScale_ThrowsArgumentException")] + [TestCase(2, 4, TestName = "NumberValidator_WithScaleGreaterThanPrecision_ThrowsArgumentException")] + public void NumberValidator_InvalidParameters_ThrowsArgumentException(int precision, int scale) { - Assert.Throws(() => new NumberValidator(2, 4, true)); + Assert.Throws(() => new NumberValidator(precision, scale, true)); } [TestCase(17, 2, true, "0.0")] @@ -35,12 +24,15 @@ public void NumberValidator_WithScaleGreaterThanPrecision_ThrowsArgumentExceptio [TestCase(17, 2, true, "+0.0")] [TestCase(3, 1, true, "+1.2")] [TestCase(3, 1, false, "-1.2")] + public void IsValidNumber_WithProperValue_Success (int precision, int scale, bool positive, string value) { var validator = new NumberValidator(precision, scale, positive); - Assert.True(validator.IsValidNumber(value)); + var actual = validator.IsValidNumber(value); + + Assert.True(actual); } [TestCase(" ")] @@ -52,7 +44,11 @@ public void IsValidNumber_WithProperValue_Success [TestCase("1.0.1")] public void IsValidNumber_WithIncorrectValue_ReturnFalse(string value) { - Assert.False(new NumberValidator(10, 5).IsValidNumber(value)); + var validator = new NumberValidator(10, 5); + + var actual = validator.IsValidNumber(value); + + Assert.False(actual); } @@ -64,7 +60,9 @@ public void IsValidNumber_WithValueGreaterThanPrecision_ReturnFalse(string value { var validator = new NumberValidator(2, 1); - Assert.False(validator.IsValidNumber(value)); + var actual = validator.IsValidNumber(value); + + Assert.False(actual); } [TestCase(true, "1.00")] @@ -73,62 +71,19 @@ public void IsValidNumber_WithFracPartGreaterThanScale_ReturnFalse(bool positive { var validator = new NumberValidator(10, 1, positive); - Assert.False(validator.IsValidNumber(value)); + var actual = validator.IsValidNumber(value); + + Assert.False(actual); } + [Test] public void IsValidNumber_OnlyPositiveWithNegativeValue_ReturnFalse() { var validator = new NumberValidator(10, 5, true); - Assert.False(validator.IsValidNumber("-1.0")); - } - } - - public class NumberValidator - { - private readonly Regex numberRegex; - private readonly bool onlyPositive; - private readonly int precision; - private readonly int scale; - - public NumberValidator(int precision, int scale = 0, bool onlyPositive = false) - { - this.precision = precision; - this.scale = scale; - this.onlyPositive = onlyPositive; - 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"); - numberRegex = new Regex(@"^([+-]?)(\d+)([.,](\d+))?$", RegexOptions.IgnoreCase); - } + var actual = validator.IsValidNumber("-1.0"); - public bool IsValidNumber(string value) - { - // Проверяем соответствие входного значения формату N(m,k), в соответствии с правилом, - // описанным в Формате описи документов, направляемых в налоговый орган в электронном виде по телекоммуникационным каналам связи: - // Формат числового значения указывается в виде N(m.к), где m – максимальное количество знаков в числе, включая знак (для отрицательного числа), - // целую и дробную часть числа без разделяющей десятичной точки, k – максимальное число знаков дробной части числа. - // Если число знаков дробной части числа равно 0 (т.е. число целое), то формат числового значения имеет вид N(m). - - if (string.IsNullOrEmpty(value)) - return false; - - var match = numberRegex.Match(value); - if (!match.Success) - return false; - - // Знак и целая часть - var intPart = match.Groups[1].Value.Length + match.Groups[2].Value.Length; - // Дробная часть - var fracPart = match.Groups[4].Value.Length; - - if (intPart + fracPart > precision || fracPart > scale) - return false; - - if (onlyPositive && match.Groups[1].Value == "-") - return false; - return true; + Assert.False(actual); } } } \ No newline at end of file From 6fc28bc7812ed8961cbf05be33563cae71dd4522 Mon Sep 17 00:00:00 2001 From: batyadmx Date: Thu, 30 Nov 2023 15:23:06 +0500 Subject: [PATCH 4/4] NumberValidator great test case merge --- cs/HomeExercises/NumberValidatorTests.cs | 98 ++++++++++-------------- 1 file changed, 41 insertions(+), 57 deletions(-) diff --git a/cs/HomeExercises/NumberValidatorTests.cs b/cs/HomeExercises/NumberValidatorTests.cs index a5b7a131..df411dbd 100644 --- a/cs/HomeExercises/NumberValidatorTests.cs +++ b/cs/HomeExercises/NumberValidatorTests.cs @@ -1,4 +1,6 @@ using System; +using System.Collections; +using System.Collections.Generic; using NUnit.Framework; namespace HomeExercises @@ -19,71 +21,53 @@ public void NumberValidator_InvalidParameters_ThrowsArgumentException(int precis Assert.Throws(() => new NumberValidator(precision, scale, true)); } - [TestCase(17, 2, true, "0.0")] - [TestCase(17, 2, true, "0")] - [TestCase(17, 2, true, "+0.0")] - [TestCase(3, 1, true, "+1.2")] - [TestCase(3, 1, false, "-1.2")] - - public void IsValidNumber_WithProperValue_Success - (int precision, int scale, bool positive, string value) + [TestCaseSource(typeof(NumberValidatorData), nameof(NumberValidatorData.TestCaseData))] + public void IsValidNumber_Tests + (int precision, int scale, bool positive, string value, bool expected) { var validator = new NumberValidator(precision, scale, positive); var actual = validator.IsValidNumber(value); - Assert.True(actual); - } - - [TestCase(" ")] - [TestCase("")] - [TestCase(null)] - [TestCase("+-1")] - [TestCase("abc")] - [TestCase("a.bc")] - [TestCase("1.0.1")] - public void IsValidNumber_WithIncorrectValue_ReturnFalse(string value) - { - var validator = new NumberValidator(10, 5); - - var actual = validator.IsValidNumber(value); - - Assert.False(actual); - } - - - [TestCase("-1.0")] - [TestCase("+1.0")] - [TestCase("10.0")] - [TestCase("1.00")] - public void IsValidNumber_WithValueGreaterThanPrecision_ReturnFalse(string value) - { - var validator = new NumberValidator(2, 1); - - var actual = validator.IsValidNumber(value); - - Assert.False(actual); - } - - [TestCase(true, "1.00")] - [TestCase(false, "-1.00")] - public void IsValidNumber_WithFracPartGreaterThanScale_ReturnFalse(bool positive, string value) - { - var validator = new NumberValidator(10, 1, positive); - - var actual = validator.IsValidNumber(value); - - Assert.False(actual); + Assert.AreEqual(expected, actual); } + } - [Test] - public void IsValidNumber_OnlyPositiveWithNegativeValue_ReturnFalse() + public class NumberValidatorData + { + public static IEnumerable TestCaseData { - var validator = new NumberValidator(10, 5, true); - - var actual = validator.IsValidNumber("-1.0"); - - Assert.False(actual); + get + { + //IsValidNumber_WithProperValue_Success + yield return new TestCaseData(17, 2, true, "0.0", true); + yield return new TestCaseData(17, 2, true, "0", true); + yield return new TestCaseData(17, 2, true, "+0.0", true); + yield return new TestCaseData(3, 1, true, "+1.2", true); + yield return new TestCaseData(3, 1, false, "-1.2", true); + + //IsValidNumber_WithIncorrectValue_ReturnFalse + yield return new TestCaseData(10, 5, false, " ", false); + yield return new TestCaseData(10, 5, false, "", false); + yield return new TestCaseData(10, 5, false, null, false); + yield return new TestCaseData(10, 5, false, "+-1", false); + yield return new TestCaseData(10, 5, false, "abc", false); + yield return new TestCaseData(10, 5, false, "a.bc", false); + yield return new TestCaseData(10, 5, false, "1.0.1", false); + + //IsValidNumber_WithValueGreaterThanPrecision_ReturnFalse + yield return new TestCaseData(2, 1, false, "-1.0", false); + yield return new TestCaseData(2, 1, false, "+1.0", false); + yield return new TestCaseData(2, 1, false, "10.0", false); + yield return new TestCaseData(2, 1, false, "1.00", false); + + //IsValidNumber_WithFracPartGreaterThanScale_ReturnFalse + yield return new TestCaseData(10, 1, true, "1.00", false); + yield return new TestCaseData(10, 1, false, "-1.00", false); + + //IsValidNumber_OnlyPositiveWithNegativeValue_ReturnFalse + yield return new TestCaseData(10, 5, true, "-1.0", false); + } } } } \ No newline at end of file