From bd903db35e9eef0727be0ee395c0e8a5baf33baf Mon Sep 17 00:00:00 2001 From: artem <17artem12@gmail.com> Date: Wed, 29 Oct 2025 01:53:13 +0500 Subject: [PATCH 01/14] homework done --- Testing/.idea/.idea.Testing/.idea/.gitignore | 13 +++ .../.idea/.idea.Testing/.idea/encodings.xml | 4 + .../.idea/.idea.Testing/.idea/indexLayout.xml | 8 ++ Testing/.idea/.idea.Testing/.idea/vcs.xml | 6 ++ .../1. ObjectComparison/ObjectComparison.cs | 35 +++++- .../NumberValidatorTests.cs | 102 +++++++++++++++++- Testing/Testing.sln.DotSettings.user | 7 ++ 7 files changed, 171 insertions(+), 4 deletions(-) create mode 100644 Testing/.idea/.idea.Testing/.idea/.gitignore create mode 100644 Testing/.idea/.idea.Testing/.idea/encodings.xml create mode 100644 Testing/.idea/.idea.Testing/.idea/indexLayout.xml create mode 100644 Testing/.idea/.idea.Testing/.idea/vcs.xml create mode 100644 Testing/Testing.sln.DotSettings.user diff --git a/Testing/.idea/.idea.Testing/.idea/.gitignore b/Testing/.idea/.idea.Testing/.idea/.gitignore new file mode 100644 index 0000000..96415b3 --- /dev/null +++ b/Testing/.idea/.idea.Testing/.idea/.gitignore @@ -0,0 +1,13 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Rider ignored files +/modules.xml +/.idea.Testing.iml +/contentModel.xml +/projectSettingsUpdater.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/Testing/.idea/.idea.Testing/.idea/encodings.xml b/Testing/.idea/.idea.Testing/.idea/encodings.xml new file mode 100644 index 0000000..df87cf9 --- /dev/null +++ b/Testing/.idea/.idea.Testing/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Testing/.idea/.idea.Testing/.idea/indexLayout.xml b/Testing/.idea/.idea.Testing/.idea/indexLayout.xml new file mode 100644 index 0000000..7b08163 --- /dev/null +++ b/Testing/.idea/.idea.Testing/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Testing/.idea/.idea.Testing/.idea/vcs.xml b/Testing/.idea/.idea.Testing/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/Testing/.idea/.idea.Testing/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs b/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs index d544c47..b246f42 100644 --- a/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs +++ b/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs @@ -1,5 +1,6 @@ using NUnit.Framework; using NUnit.Framework.Legacy; +using FluentAssertions; namespace HomeExercise.Tasks.ObjectComparison; public class ObjectComparison @@ -19,13 +20,41 @@ public void CheckCurrentTsar() 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); + + + + } + + [Test] + [Description("Проверка текущего царя")] + [Category("ToRefactor")] + public void CheckCurrentTsarFluentAssertions() + { + 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)); + + + actualTsar.Should().BeEquivalentTo(expectedTsar, options => + options + .Excluding(p => p.Id) + .Excluding(p => p.Parent.Id) + ); + // Тест с FluentAssertions имеет следующие приемущества: + // 1) Автоматически расширяется при добавлении новых свойств в класс Person + // 2) Лучшая читаемость кода + // 3) При ошибке видно сразу каке свойтво не совпало, например если изменить возраст в expectedTsar вывод будет содержать "Expected field actualTsar.Age to be 53, but found 54." + // а при Assert "Assert.That(actual, Is.EqualTo(expected)) Expected: 54 But was: 53" - не понятно какое именно свойтво провалило тест + } + [Test] [Description("Альтернативное решение. Какие у него недостатки?")] public void CheckCurrentTsar_WithCustomEquality() @@ -36,6 +65,10 @@ public void CheckCurrentTsar_WithCustomEquality() // Какие недостатки у такого подхода? ClassicAssert.True(AreEqual(actualTsar, expectedTsar)); + + // Недостатки такого подхода следущие: + // 1) Есть отдельный метод AreEqual и при изменении класса Person нужно будет идти в него менять т.е. сложно поддреживать + // 2) В стек-трейсе нет информации о том, какое именно свойство не совпало } private bool AreEqual(Person? actual, Person? expected) diff --git a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs index 950c9bc..787f3ff 100644 --- a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs +++ b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs @@ -13,14 +13,14 @@ 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.DoesNotThrow(() => new NumberValidator(1, 0, true)); // Дублирует 2 проверку - ClassicAssert.IsTrue(new NumberValidator(17, 2, true).IsValidNumber("0.0")); + ClassicAssert.IsTrue(new NumberValidator(17, 2, true).IsValidNumber("0.0")); // Дублирует 3 проверку 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.IsTrue(new NumberValidator(17, 2, true).IsValidNumber("0.0")); // Дублирует 3 проверку 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")); @@ -28,4 +28,100 @@ public void Test() ClassicAssert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("-1.23")); ClassicAssert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("a.sd")); } +} + + +// Было изменено: +// 1) Тесты были разделены на логические группы для лучшей читаемости +// 2) Были добалены сообщения к каждому тесту чтобы из стек-трейса было понятно на каких данных тест не работает +// 3) Использован Assert.Multiple() для того чтобы одна упавшая проверка не блокировала прохождение остальных проверок +// 4) Удалены дублирующиеся тесты +// 5) Добавлены тесты проверяющие: пограничные значения на scale и precision, параметр onlyPositive=false, пустую строку и null, запятую в качетве разделителя, +// некоректные форматы чисел (2 точки; число начинается с точки; без дробной части, но с точкой), отрицательный ноль. + +[TestFixture] +public class NumberValidatorTestsFix +{ + [Test] + public void КонструкторКорректноВалидируетПараметры() + { + // Некорректные параметры + Assert.Throws(() => new NumberValidator(-1, 2)); + Assert.Throws(() => new NumberValidator(5, -1)); + Assert.Throws(() => new NumberValidator(5, 6)); + + // Корректные параметры + Assert.DoesNotThrow(() => new NumberValidator(1, 0)); + Assert.DoesNotThrow(() => new NumberValidator(5, 2)); + Assert.DoesNotThrow(() => new NumberValidator(1, 0, true)); + } + + [Test] + public void IsValidNumberКорректноОбрабатываетОсновныеСценарии() + { + var validator = new NumberValidator(17, 2, true); + + Assert.Multiple(() => + { + // Корректные числа + Assert.That(validator.IsValidNumber("0"), Is.True, "Целый ноль"); + Assert.That(validator.IsValidNumber("0.0"), Is.True, "Десятичный ноль"); + Assert.That(validator.IsValidNumber("123.45"), Is.True, "Корректное десятичное"); + Assert.That(validator.IsValidNumber("+1.23"), Is.True, "С явным плюсом"); + + // Некорректные числа + Assert.That(validator.IsValidNumber("-1.23"), Is.False, "Отрицательное при onlyPositive=true"); + Assert.That(validator.IsValidNumber("00.00"), Is.False, "Превышение precision"); + Assert.That(validator.IsValidNumber("0.000"), Is.False, "Превышение scale"); + Assert.That(validator.IsValidNumber("a.sd"), Is.False, "Нечисловой формат"); + Assert.That(validator.IsValidNumber(""), Is.False, "Пустая строка"); + Assert.That(validator.IsValidNumber(null), Is.False, "Null"); + }); + } + + [Test] + public void IsValidNumberКорректноРаботаетСPrecisionИScale() + { + var strictValidator = new NumberValidator(3, 2); + + Assert.Multiple(() => + { + // Граничные случаи + Assert.That(strictValidator.IsValidNumber("1.23"), Is.True, "Максимальная precision и scale"); + Assert.That(strictValidator.IsValidNumber("12.3"), Is.True, "Граница precision"); + Assert.That(strictValidator.IsValidNumber("0.12"), Is.True, "Граница scale"); + + // Превышение лимитов + Assert.That(strictValidator.IsValidNumber("12.34"), Is.False, "Превышение precision"); + Assert.That(strictValidator.IsValidNumber("123.4"), Is.False, "Превышение precision в целой части"); + }); + } + + [Test] + public void IsValidNumberКорректноРаботаетСРежимомOnlyPositive() + { + var positiveOnly = new NumberValidator(5, 2, true); + var anyNum = new NumberValidator(5, 2, false); + + Assert.Multiple(() => + { + Assert.That(positiveOnly.IsValidNumber("-1.23"), Is.False, "Только положительные: отрицательное число"); + Assert.That(anyNum.IsValidNumber("-1.23"), Is.True, "Любые знаки: отрицательное число"); + Assert.That(anyNum.IsValidNumber("+1.23"), Is.True, "Любые знаки: положительное с плюсом"); + Assert.That(anyNum.IsValidNumber("-0"), Is.True, "Любые знаки: отрицательный ноль"); + }); + } + + [Test] + public void IsValidNumberКорректноВалидируетФорматы() + { + var validator = new NumberValidator(10, 2); + + Assert.Multiple(() => + { + Assert.That(validator.IsValidNumber("12..34"), Is.False, "Две точки"); + Assert.That(validator.IsValidNumber(".123"), Is.False, "Начинается с точки"); + Assert.That(validator.IsValidNumber("123."), Is.False, "Оканчивается точкой"); + }); + } } \ No newline at end of file diff --git a/Testing/Testing.sln.DotSettings.user b/Testing/Testing.sln.DotSettings.user new file mode 100644 index 0000000..b4e3475 --- /dev/null +++ b/Testing/Testing.sln.DotSettings.user @@ -0,0 +1,7 @@ + + <SessionState ContinuousTestingMode="0" IsActive="True" Name="All tests from 1. ObjectComparison" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <Or> + <ProjectFolder>6ED454CB-A772-43E5-B72D-3FE9DA27337F/d:Homework/d:1. ObjectComparison</ProjectFolder> + <ProjectFolder>6ED454CB-A772-43E5-B72D-3FE9DA27337F/d:Homework/d:2. NumberValidator</ProjectFolder> + </Or> +</SessionState> \ No newline at end of file From 788579ac177386e8cc503ec20981ff58673d9345 Mon Sep 17 00:00:00 2001 From: artem <17artem12@gmail.com> Date: Wed, 29 Oct 2025 22:27:39 +0500 Subject: [PATCH 02/14] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D1=82=D0=B5=D1=81=D1=82=20CheckCurrentTsa?= =?UTF-8?q?rFluentAssertions=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D0=BB=D0=BE?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=BD=D1=8B=D1=85=20Parent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Testing/.idea/.idea.Testing/.idea/.gitignore | 13 ------------- Testing/.idea/.idea.Testing/.idea/encodings.xml | 4 ---- Testing/.idea/.idea.Testing/.idea/indexLayout.xml | 8 -------- Testing/.idea/.idea.Testing/.idea/vcs.xml | 6 ------ .../1. ObjectComparison/ObjectComparison.cs | 5 ++++- Testing/Testing.sln.DotSettings.user | 7 ------- 6 files changed, 4 insertions(+), 39 deletions(-) delete mode 100644 Testing/.idea/.idea.Testing/.idea/.gitignore delete mode 100644 Testing/.idea/.idea.Testing/.idea/encodings.xml delete mode 100644 Testing/.idea/.idea.Testing/.idea/indexLayout.xml delete mode 100644 Testing/.idea/.idea.Testing/.idea/vcs.xml delete mode 100644 Testing/Testing.sln.DotSettings.user diff --git a/Testing/.idea/.idea.Testing/.idea/.gitignore b/Testing/.idea/.idea.Testing/.idea/.gitignore deleted file mode 100644 index 96415b3..0000000 --- a/Testing/.idea/.idea.Testing/.idea/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Rider ignored files -/modules.xml -/.idea.Testing.iml -/contentModel.xml -/projectSettingsUpdater.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/Testing/.idea/.idea.Testing/.idea/encodings.xml b/Testing/.idea/.idea.Testing/.idea/encodings.xml deleted file mode 100644 index df87cf9..0000000 --- a/Testing/.idea/.idea.Testing/.idea/encodings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Testing/.idea/.idea.Testing/.idea/indexLayout.xml b/Testing/.idea/.idea.Testing/.idea/indexLayout.xml deleted file mode 100644 index 7b08163..0000000 --- a/Testing/.idea/.idea.Testing/.idea/indexLayout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/Testing/.idea/.idea.Testing/.idea/vcs.xml b/Testing/.idea/.idea.Testing/.idea/vcs.xml deleted file mode 100644 index 6c0b863..0000000 --- a/Testing/.idea/.idea.Testing/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs b/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs index b246f42..dd87c38 100644 --- a/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs +++ b/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs @@ -1,6 +1,7 @@ using NUnit.Framework; using NUnit.Framework.Legacy; using FluentAssertions; +using FluentAssertions.Equivalency; namespace HomeExercise.Tasks.ObjectComparison; public class ObjectComparison @@ -44,7 +45,9 @@ public void CheckCurrentTsarFluentAssertions() actualTsar.Should().BeEquivalentTo(expectedTsar, options => options .Excluding(p => p.Id) - .Excluding(p => p.Parent.Id) + .Excluding((IMemberInfo p) => + p.Name == "Id" && + p.Path.Contains("Parent")) ); // Тест с FluentAssertions имеет следующие приемущества: // 1) Автоматически расширяется при добавлении новых свойств в класс Person diff --git a/Testing/Testing.sln.DotSettings.user b/Testing/Testing.sln.DotSettings.user deleted file mode 100644 index b4e3475..0000000 --- a/Testing/Testing.sln.DotSettings.user +++ /dev/null @@ -1,7 +0,0 @@ - - <SessionState ContinuousTestingMode="0" IsActive="True" Name="All tests from 1. ObjectComparison" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> - <Or> - <ProjectFolder>6ED454CB-A772-43E5-B72D-3FE9DA27337F/d:Homework/d:1. ObjectComparison</ProjectFolder> - <ProjectFolder>6ED454CB-A772-43E5-B72D-3FE9DA27337F/d:Homework/d:2. NumberValidator</ProjectFolder> - </Or> -</SessionState> \ No newline at end of file From 0d22773b162fd68abe177c927bbea8cfbd48e214 Mon Sep 17 00:00:00 2001 From: artem <17artem12@gmail.com> Date: Wed, 29 Oct 2025 22:37:14 +0500 Subject: [PATCH 03/14] =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D1=81=D1=82=D0=B0=D1=80=D1=8B=D0=B5=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Testing/.idea/.idea.Testing/.idea/.gitignore | 13 +++++++ .../.idea/.idea.Testing/.idea/encodings.xml | 4 ++ .../.idea/.idea.Testing/.idea/indexLayout.xml | 8 ++++ Testing/.idea/.idea.Testing/.idea/vcs.xml | 6 +++ .../NumberValidatorTests.cs | 38 +------------------ Testing/Testing.sln.DotSettings.user | 7 ++++ 6 files changed, 40 insertions(+), 36 deletions(-) create mode 100644 Testing/.idea/.idea.Testing/.idea/.gitignore create mode 100644 Testing/.idea/.idea.Testing/.idea/encodings.xml create mode 100644 Testing/.idea/.idea.Testing/.idea/indexLayout.xml create mode 100644 Testing/.idea/.idea.Testing/.idea/vcs.xml create mode 100644 Testing/Testing.sln.DotSettings.user diff --git a/Testing/.idea/.idea.Testing/.idea/.gitignore b/Testing/.idea/.idea.Testing/.idea/.gitignore new file mode 100644 index 0000000..96415b3 --- /dev/null +++ b/Testing/.idea/.idea.Testing/.idea/.gitignore @@ -0,0 +1,13 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Rider ignored files +/modules.xml +/.idea.Testing.iml +/contentModel.xml +/projectSettingsUpdater.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/Testing/.idea/.idea.Testing/.idea/encodings.xml b/Testing/.idea/.idea.Testing/.idea/encodings.xml new file mode 100644 index 0000000..df87cf9 --- /dev/null +++ b/Testing/.idea/.idea.Testing/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Testing/.idea/.idea.Testing/.idea/indexLayout.xml b/Testing/.idea/.idea.Testing/.idea/indexLayout.xml new file mode 100644 index 0000000..7b08163 --- /dev/null +++ b/Testing/.idea/.idea.Testing/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Testing/.idea/.idea.Testing/.idea/vcs.xml b/Testing/.idea/.idea.Testing/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/Testing/.idea/.idea.Testing/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs index 787f3ff..6e88f32 100644 --- a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs +++ b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs @@ -4,40 +4,6 @@ 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)); // Дублирует 2 проверку - - ClassicAssert.IsTrue(new NumberValidator(17, 2, true).IsValidNumber("0.0")); // Дублирует 3 проверку - 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")); // Дублирует 3 проверку - 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")); - } -} - - -// Было изменено: -// 1) Тесты были разделены на логические группы для лучшей читаемости -// 2) Были добалены сообщения к каждому тесту чтобы из стек-трейса было понятно на каких данных тест не работает -// 3) Использован Assert.Multiple() для того чтобы одна упавшая проверка не блокировала прохождение остальных проверок -// 4) Удалены дублирующиеся тесты -// 5) Добавлены тесты проверяющие: пограничные значения на scale и precision, параметр onlyPositive=false, пустую строку и null, запятую в качетве разделителя, -// некоректные форматы чисел (2 точки; число начинается с точки; без дробной части, но с точкой), отрицательный ноль. [TestFixture] public class NumberValidatorTestsFix @@ -59,7 +25,7 @@ public void КонструкторКорректноВалидируетПара [Test] public void IsValidNumberКорректноОбрабатываетОсновныеСценарии() { - var validator = new NumberValidator(17, 2, true); + var validator = new NumberValidator(5, 2, true); Assert.Multiple(() => { @@ -71,7 +37,7 @@ public void IsValidNumberКорректноОбрабатываетОсновн // Некорректные числа Assert.That(validator.IsValidNumber("-1.23"), Is.False, "Отрицательное при onlyPositive=true"); - Assert.That(validator.IsValidNumber("00.00"), Is.False, "Превышение precision"); + Assert.That(validator.IsValidNumber("00.000"), Is.False, "Превышение precision"); Assert.That(validator.IsValidNumber("0.000"), Is.False, "Превышение scale"); Assert.That(validator.IsValidNumber("a.sd"), Is.False, "Нечисловой формат"); Assert.That(validator.IsValidNumber(""), Is.False, "Пустая строка"); diff --git a/Testing/Testing.sln.DotSettings.user b/Testing/Testing.sln.DotSettings.user new file mode 100644 index 0000000..b4e3475 --- /dev/null +++ b/Testing/Testing.sln.DotSettings.user @@ -0,0 +1,7 @@ + + <SessionState ContinuousTestingMode="0" IsActive="True" Name="All tests from 1. ObjectComparison" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <Or> + <ProjectFolder>6ED454CB-A772-43E5-B72D-3FE9DA27337F/d:Homework/d:1. ObjectComparison</ProjectFolder> + <ProjectFolder>6ED454CB-A772-43E5-B72D-3FE9DA27337F/d:Homework/d:2. NumberValidator</ProjectFolder> + </Or> +</SessionState> \ No newline at end of file From 47dae7719f55adc1c573d11864d15d539d1a6d79 Mon Sep 17 00:00:00 2001 From: artem <17artem12@gmail.com> Date: Wed, 29 Oct 2025 22:49:40 +0500 Subject: [PATCH 04/14] =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B8=D0=BC=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BD=D0=B0=20=D0=B0=D0=BD=D0=B3=D0=BB=D0=B8?= =?UTF-8?q?=D0=B9=D1=81=D0=BA=D0=B8=D0=B9,=20=D0=B8=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B2=20=D1=81?= =?UTF-8?q?=D0=BE=D0=BE=D1=82=D0=B2=D0=B5=D1=82=D1=81=D0=B2=D0=B8=D0=B8=20?= =?UTF-8?q?=D1=81=20=D0=BF=D1=80=D0=B5=D0=B7=D0=B5=D0=BD=D1=82=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NumberValidatorTests.cs | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs index 6e88f32..912998d 100644 --- a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs +++ b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs @@ -9,33 +9,43 @@ namespace HomeExercise.Tasks.NumberValidator; public class NumberValidatorTestsFix { [Test] - public void КонструкторКорректноВалидируетПараметры() + public void Constructor_WithInvalidParameters_ThrowsArgumentException() { - // Некорректные параметры Assert.Throws(() => new NumberValidator(-1, 2)); Assert.Throws(() => new NumberValidator(5, -1)); Assert.Throws(() => new NumberValidator(5, 6)); - - // Корректные параметры + } + + [Test] + public void Constructor_WithValidParameters_DoesNotThrow() + { Assert.DoesNotThrow(() => new NumberValidator(1, 0)); Assert.DoesNotThrow(() => new NumberValidator(5, 2)); Assert.DoesNotThrow(() => new NumberValidator(1, 0, true)); } [Test] - public void IsValidNumberКорректноОбрабатываетОсновныеСценарии() + public void IsValidNumber_WithValidNumberFormats_ReturnsTrue() { var validator = new NumberValidator(5, 2, true); Assert.Multiple(() => { - // Корректные числа Assert.That(validator.IsValidNumber("0"), Is.True, "Целый ноль"); Assert.That(validator.IsValidNumber("0.0"), Is.True, "Десятичный ноль"); Assert.That(validator.IsValidNumber("123.45"), Is.True, "Корректное десятичное"); Assert.That(validator.IsValidNumber("+1.23"), Is.True, "С явным плюсом"); - - // Некорректные числа + + }); + } + + [Test] + public void IsValidNumber_WithInvalidNumberFormats_ReturnsFalse() + { + var validator = new NumberValidator(5, 2, true); + + Assert.Multiple(() => + { Assert.That(validator.IsValidNumber("-1.23"), Is.False, "Отрицательное при onlyPositive=true"); Assert.That(validator.IsValidNumber("00.000"), Is.False, "Превышение precision"); Assert.That(validator.IsValidNumber("0.000"), Is.False, "Превышение scale"); @@ -46,7 +56,7 @@ public void IsValidNumberКорректноОбрабатываетОсновн } [Test] - public void IsValidNumberКорректноРаботаетСPrecisionИScale() + public void IsValidNumber_WithPrecisionAndScaleLimits_RespectsBoundaries() { var strictValidator = new NumberValidator(3, 2); @@ -64,7 +74,7 @@ public void IsValidNumberКорректноРаботаетСPrecisionИScale() } [Test] - public void IsValidNumberКорректноРаботаетСРежимомOnlyPositive() + public void IsValidNumber_WithOnlyPositiveMode_RespectsSignRestrictions() { var positiveOnly = new NumberValidator(5, 2, true); var anyNum = new NumberValidator(5, 2, false); @@ -79,7 +89,7 @@ public void IsValidNumberКорректноРаботаетСРежимомOnlyP } [Test] - public void IsValidNumberКорректноВалидируетФорматы() + public void IsValidNumber_WithInvalidFormats_ReturnsFalse() { var validator = new NumberValidator(10, 2); From 81a3eeb995af4c5058c42b0c34f6cf491dcec803 Mon Sep 17 00:00:00 2001 From: artem <17artem12@gmail.com> Date: Wed, 29 Oct 2025 22:52:13 +0500 Subject: [PATCH 05/14] =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B5=D0=B5=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D1=8B,=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D1=8B=20=D1=81=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2. NumberValidator/NumberValidatorTests.cs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs index 912998d..290db4a 100644 --- a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs +++ b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs @@ -56,18 +56,25 @@ public void IsValidNumber_WithInvalidNumberFormats_ReturnsFalse() } [Test] - public void IsValidNumber_WithPrecisionAndScaleLimits_RespectsBoundaries() + public void IsValidNumber_WithValidPrecisionAndScale_ReturnsTrue() { var strictValidator = new NumberValidator(3, 2); - + Assert.Multiple(() => { - // Граничные случаи Assert.That(strictValidator.IsValidNumber("1.23"), Is.True, "Максимальная precision и scale"); Assert.That(strictValidator.IsValidNumber("12.3"), Is.True, "Граница precision"); Assert.That(strictValidator.IsValidNumber("0.12"), Is.True, "Граница scale"); - - // Превышение лимитов + }); + } + + [Test] + public void IsValidNumber_WithExceededPrecisionAndScale_ReturnsFalse() + { + var strictValidator = new NumberValidator(3, 2); + + Assert.Multiple(() => + { Assert.That(strictValidator.IsValidNumber("12.34"), Is.False, "Превышение precision"); Assert.That(strictValidator.IsValidNumber("123.4"), Is.False, "Превышение precision в целой части"); }); From f4ce5503940d1e8fd2e760e45375f5093ace2383 Mon Sep 17 00:00:00 2001 From: artem <17artem12@gmail.com> Date: Wed, 29 Oct 2025 23:17:52 +0500 Subject: [PATCH 06/14] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20TestCase,=20=D0=B2=D1=81=D0=B5=20=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D1=8B=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=B0=D0=BD=D1=8B=20=D0=BD=D0=B0=20FluentAssertions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NumberValidatorTests.cs | 117 ++++++++---------- 1 file changed, 52 insertions(+), 65 deletions(-) diff --git a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs index 290db4a..8779a01 100644 --- a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs +++ b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs @@ -1,6 +1,7 @@  using NUnit.Framework; using NUnit.Framework.Legacy; +using FluentAssertions; namespace HomeExercise.Tasks.NumberValidator; @@ -8,76 +9,67 @@ namespace HomeExercise.Tasks.NumberValidator; [TestFixture] public class NumberValidatorTestsFix { - [Test] - public void Constructor_WithInvalidParameters_ThrowsArgumentException() + [TestCase(-1, 2)] + [TestCase(5, -1)] + [TestCase(5, 6)] + public void Constructor_WithInvalidParameters_ThrowsArgumentException(int precision, int scale) { - Assert.Throws(() => new NumberValidator(-1, 2)); - Assert.Throws(() => new NumberValidator(5, -1)); - Assert.Throws(() => new NumberValidator(5, 6)); + Action action = () => new NumberValidator(precision, scale); + + action.Should().Throw(); } - [Test] - public void Constructor_WithValidParameters_DoesNotThrow() + [TestCase(1, 0)] + [TestCase(5, 2)] + [TestCase(1, 0, true)] + public void Constructor_WithValidParameters_DoesNotThrow(int precision, int scale, bool onlyPositive = false) { - Assert.DoesNotThrow(() => new NumberValidator(1, 0)); - Assert.DoesNotThrow(() => new NumberValidator(5, 2)); - Assert.DoesNotThrow(() => new NumberValidator(1, 0, true)); + Action action = () => new NumberValidator(precision, scale, onlyPositive); + + action.Should().NotThrow(); } - [Test] - public void IsValidNumber_WithValidNumberFormats_ReturnsTrue() + [TestCase("0", "Целый ноль")] + [TestCase("0.0", "Десятичный ноль")] + [TestCase("123.45", "Корректное десятичное")] + [TestCase("+1.23", "С явным плюсом")] + public void IsValidNumber_WithValidNumberFormats_ReturnsTrue(string number, string description) { var validator = new NumberValidator(5, 2, true); - - Assert.Multiple(() => - { - Assert.That(validator.IsValidNumber("0"), Is.True, "Целый ноль"); - Assert.That(validator.IsValidNumber("0.0"), Is.True, "Десятичный ноль"); - Assert.That(validator.IsValidNumber("123.45"), Is.True, "Корректное десятичное"); - Assert.That(validator.IsValidNumber("+1.23"), Is.True, "С явным плюсом"); - }); + validator.IsValidNumber(number).Should().BeTrue(description); } - [Test] - public void IsValidNumber_WithInvalidNumberFormats_ReturnsFalse() + [TestCase("-1.23", "Отрицательное при onlyPositive=true")] + [TestCase("00.000", "Превышение precision")] + [TestCase("0.000", "Превышение scale")] + [TestCase("a.sd", "Нечисловой формат")] + [TestCase("", "Пустая строка")] + [TestCase(null, "Null")] + public void IsValidNumber_WithInvalidNumberFormats_ReturnsFalse(string number, string description) { var validator = new NumberValidator(5, 2, true); - - Assert.Multiple(() => - { - Assert.That(validator.IsValidNumber("-1.23"), Is.False, "Отрицательное при onlyPositive=true"); - Assert.That(validator.IsValidNumber("00.000"), Is.False, "Превышение precision"); - Assert.That(validator.IsValidNumber("0.000"), Is.False, "Превышение scale"); - Assert.That(validator.IsValidNumber("a.sd"), Is.False, "Нечисловой формат"); - Assert.That(validator.IsValidNumber(""), Is.False, "Пустая строка"); - Assert.That(validator.IsValidNumber(null), Is.False, "Null"); - }); + + validator.IsValidNumber(number).Should().BeFalse(description); } - [Test] - public void IsValidNumber_WithValidPrecisionAndScale_ReturnsTrue() + [TestCase("1.23", "Максимальная precision и scale")] + [TestCase("12.3", "Граница precision")] + [TestCase("0.12", "Граница scale")] + public void IsValidNumber_WithValidPrecisionAndScale_ReturnsTrue(string number, string description) { var strictValidator = new NumberValidator(3, 2); - - Assert.Multiple(() => - { - Assert.That(strictValidator.IsValidNumber("1.23"), Is.True, "Максимальная precision и scale"); - Assert.That(strictValidator.IsValidNumber("12.3"), Is.True, "Граница precision"); - Assert.That(strictValidator.IsValidNumber("0.12"), Is.True, "Граница scale"); - }); + + strictValidator.IsValidNumber(number).Should().BeTrue(description); } - [Test] - public void IsValidNumber_WithExceededPrecisionAndScale_ReturnsFalse() + [TestCase("12.34", "Превышение precision")] + [TestCase("123.4", "Превышение precision в целой части")] + public void IsValidNumber_WithExceededPrecisionAndScale_ReturnsFalse(string number, string description) { var strictValidator = new NumberValidator(3, 2); - - Assert.Multiple(() => - { - Assert.That(strictValidator.IsValidNumber("12.34"), Is.False, "Превышение precision"); - Assert.That(strictValidator.IsValidNumber("123.4"), Is.False, "Превышение precision в целой части"); - }); + + strictValidator.IsValidNumber(number).Should().BeFalse(description); } [Test] @@ -86,25 +78,20 @@ public void IsValidNumber_WithOnlyPositiveMode_RespectsSignRestrictions() var positiveOnly = new NumberValidator(5, 2, true); var anyNum = new NumberValidator(5, 2, false); - Assert.Multiple(() => - { - Assert.That(positiveOnly.IsValidNumber("-1.23"), Is.False, "Только положительные: отрицательное число"); - Assert.That(anyNum.IsValidNumber("-1.23"), Is.True, "Любые знаки: отрицательное число"); - Assert.That(anyNum.IsValidNumber("+1.23"), Is.True, "Любые знаки: положительное с плюсом"); - Assert.That(anyNum.IsValidNumber("-0"), Is.True, "Любые знаки: отрицательный ноль"); - }); + + positiveOnly.IsValidNumber("-1.23").Should().BeFalse("Только положительные: отрицательное число"); + anyNum.IsValidNumber("-1.23").Should().BeTrue("Любые знаки: отрицательное число"); + anyNum.IsValidNumber("+1.23").Should().BeTrue("Любые знаки: положительное с плюсом"); + anyNum.IsValidNumber("-0").Should().BeTrue("Любые знаки: отрицательный ноль"); } - [Test] - public void IsValidNumber_WithInvalidFormats_ReturnsFalse() + [TestCase("12..34", "Две точки")] + [TestCase(".123", "Начинается с точки")] + [TestCase("123.", "Оканчивается точкой")] + public void IsValidNumber_WithInvalidFormats_ReturnsFalse(string number, string description) { var validator = new NumberValidator(10, 2); - - Assert.Multiple(() => - { - Assert.That(validator.IsValidNumber("12..34"), Is.False, "Две точки"); - Assert.That(validator.IsValidNumber(".123"), Is.False, "Начинается с точки"); - Assert.That(validator.IsValidNumber("123."), Is.False, "Оканчивается точкой"); - }); + + validator.IsValidNumber(number).Should().BeFalse(description); } } \ No newline at end of file From 3df44ce6cf1273afe0fe0ec30213866afbf312d6 Mon Sep 17 00:00:00 2001 From: artem <17artem12@gmail.com> Date: Wed, 29 Oct 2025 23:21:05 +0500 Subject: [PATCH 07/14] =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=20?= =?UTF-8?q?=D0=B4=D1=83=D0=B1=D0=BB=D0=B8=D1=80=D1=83=D1=8E=D1=89=D0=B8?= =?UTF-8?q?=D0=B9=20=D1=82=D0=B5=D1=81=D1=82=20=D0=B4=D0=BB=D1=8F=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Homework/2. NumberValidator/NumberValidatorTests.cs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs index 8779a01..53dfc16 100644 --- a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs +++ b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs @@ -19,15 +19,6 @@ public void Constructor_WithInvalidParameters_ThrowsArgumentException(int precis action.Should().Throw(); } - [TestCase(1, 0)] - [TestCase(5, 2)] - [TestCase(1, 0, true)] - public void Constructor_WithValidParameters_DoesNotThrow(int precision, int scale, bool onlyPositive = false) - { - Action action = () => new NumberValidator(precision, scale, onlyPositive); - - action.Should().NotThrow(); - } [TestCase("0", "Целый ноль")] [TestCase("0.0", "Десятичный ноль")] From b939226c44d582e36db7aa1ccd1f4b83001cb5c3 Mon Sep 17 00:00:00 2001 From: artem <17artem12@gmail.com> Date: Wed, 29 Oct 2025 23:23:31 +0500 Subject: [PATCH 08/14] =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=20?= =?UTF-8?q?=D0=B2=D1=82=D0=BE=D1=80=D0=BE=D0=B9=20=D1=82=D0=B5=D1=81=D1=82?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D0=BF=D1=80=D0=B5=D0=B2=D1=8B=D1=88=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20pre=D1=81ision?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Basic/Homework/2. NumberValidator/NumberValidatorTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs index 53dfc16..b41fe2d 100644 --- a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs +++ b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs @@ -54,7 +54,7 @@ public void IsValidNumber_WithValidPrecisionAndScale_ReturnsTrue(string number, strictValidator.IsValidNumber(number).Should().BeTrue(description); } - [TestCase("12.34", "Превышение precision")] + [TestCase("123.4", "Превышение precision в целой части")] public void IsValidNumber_WithExceededPrecisionAndScale_ReturnsFalse(string number, string description) { From f67c7f2ef9b69de673060ceddbf1bf089d53989a Mon Sep 17 00:00:00 2001 From: artem <17artem12@gmail.com> Date: Wed, 29 Oct 2025 23:35:42 +0500 Subject: [PATCH 09/14] =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B0=20OnlyPositive=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=20=D0=BD=D0=B0?= =?UTF-8?q?=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NumberValidatorTests.cs | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs index b41fe2d..b995975 100644 --- a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs +++ b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs @@ -62,20 +62,28 @@ public void IsValidNumber_WithExceededPrecisionAndScale_ReturnsFalse(string numb strictValidator.IsValidNumber(number).Should().BeFalse(description); } - + [Test] - public void IsValidNumber_WithOnlyPositiveMode_RespectsSignRestrictions() + public void IsValidNumber_WithOnlyPositiveTrue_RejectsNegativeNumbers() { - var positiveOnly = new NumberValidator(5, 2, true); - var anyNum = new NumberValidator(5, 2, false); - - + var positiveOnly = new NumberValidator(5, 2, true); + positiveOnly.IsValidNumber("-1.23").Should().BeFalse("Только положительные: отрицательное число"); - anyNum.IsValidNumber("-1.23").Should().BeTrue("Любые знаки: отрицательное число"); - anyNum.IsValidNumber("+1.23").Should().BeTrue("Любые знаки: положительное с плюсом"); - anyNum.IsValidNumber("-0").Should().BeTrue("Любые знаки: отрицательный ноль"); } + [Test] + public void IsValidNumber_WithOnlyPositiveFalse_AcceptsAllSigns() + { + var anyNum = new NumberValidator(5, 2, false); + + anyNum.IsValidNumber("-1.23").Should().BeTrue("Отрицательное число"); + anyNum.IsValidNumber("+1.23").Should().BeTrue("Положительное число с плюсом"); + anyNum.IsValidNumber("1.23").Should().BeTrue("Положительное число без плюсом"); + anyNum.IsValidNumber("-0").Should().BeTrue("Отрицательный ноль"); + } + + + [TestCase("12..34", "Две точки")] [TestCase(".123", "Начинается с точки")] [TestCase("123.", "Оканчивается точкой")] From 5611bcb85efd93e30e6fdac4009b73ed8e09872e Mon Sep 17 00:00:00 2001 From: artem <17artem12@gmail.com> Date: Wed, 29 Oct 2025 23:41:30 +0500 Subject: [PATCH 10/14] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=82=D0=B5=D1=81=D1=82=20=D0=BD=D0=B0=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BF=D1=8F=D1=82=D1=83=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Homework/2. NumberValidator/NumberValidatorTests.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs index b995975..b96fd76 100644 --- a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs +++ b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs @@ -93,4 +93,12 @@ public void IsValidNumber_WithInvalidFormats_ReturnsFalse(string number, string validator.IsValidNumber(number).Should().BeFalse(description); } + + [TestCase("12,34", "Запятая в качестве разделителя")] + public void IsValidNumber_WithCommaAsSeparator_ReturnsTrue(string number, string description) + { + var validator = new NumberValidator(10, 2); + + validator.IsValidNumber(number).Should().BeTrue(description); + } } \ No newline at end of file From 7a696cb8546f47106feac6e02389a61861159810 Mon Sep 17 00:00:00 2001 From: artem <17artem12@gmail.com> Date: Wed, 29 Oct 2025 23:48:25 +0500 Subject: [PATCH 11/14] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D1=85=20=D1=84?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=20=D0=B8=D0=B7=20=D1=80=D0=B5?= =?UTF-8?q?=D0=BF=D0=BE=D0=B7=D0=B8=D1=82=D0=BE=D1=80=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Testing/.idea/.idea.Testing/.idea/.gitignore | 13 ------------- Testing/.idea/.idea.Testing/.idea/encodings.xml | 4 ---- Testing/.idea/.idea.Testing/.idea/indexLayout.xml | 8 -------- Testing/.idea/.idea.Testing/.idea/vcs.xml | 6 ------ 4 files changed, 31 deletions(-) delete mode 100644 Testing/.idea/.idea.Testing/.idea/.gitignore delete mode 100644 Testing/.idea/.idea.Testing/.idea/encodings.xml delete mode 100644 Testing/.idea/.idea.Testing/.idea/indexLayout.xml delete mode 100644 Testing/.idea/.idea.Testing/.idea/vcs.xml diff --git a/Testing/.idea/.idea.Testing/.idea/.gitignore b/Testing/.idea/.idea.Testing/.idea/.gitignore deleted file mode 100644 index 96415b3..0000000 --- a/Testing/.idea/.idea.Testing/.idea/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Rider ignored files -/modules.xml -/.idea.Testing.iml -/contentModel.xml -/projectSettingsUpdater.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/Testing/.idea/.idea.Testing/.idea/encodings.xml b/Testing/.idea/.idea.Testing/.idea/encodings.xml deleted file mode 100644 index df87cf9..0000000 --- a/Testing/.idea/.idea.Testing/.idea/encodings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Testing/.idea/.idea.Testing/.idea/indexLayout.xml b/Testing/.idea/.idea.Testing/.idea/indexLayout.xml deleted file mode 100644 index 7b08163..0000000 --- a/Testing/.idea/.idea.Testing/.idea/indexLayout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/Testing/.idea/.idea.Testing/.idea/vcs.xml b/Testing/.idea/.idea.Testing/.idea/vcs.xml deleted file mode 100644 index 6c0b863..0000000 --- a/Testing/.idea/.idea.Testing/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 7c94a52274d7f69844af8524dd8031cf55b42787 Mon Sep 17 00:00:00 2001 From: artem <17artem12@gmail.com> Date: Wed, 29 Oct 2025 23:50:45 +0500 Subject: [PATCH 12/14] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20sln.DotSettings.user=20=D0=B8=D0=B7=20=D1=80?= =?UTF-8?q?=D0=B5=D0=BF=D0=BE=D0=B7=D0=B8=D1=82=D0=BE=D1=80=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ Testing/Testing.sln.DotSettings.user | 7 ------- 2 files changed, 2 insertions(+), 7 deletions(-) delete mode 100644 Testing/Testing.sln.DotSettings.user diff --git a/.gitignore b/.gitignore index 03c9b93..ae0d4c0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ bin/ obj/ .vs/ +.idea/ +*.sln.DotSettings.user diff --git a/Testing/Testing.sln.DotSettings.user b/Testing/Testing.sln.DotSettings.user deleted file mode 100644 index b4e3475..0000000 --- a/Testing/Testing.sln.DotSettings.user +++ /dev/null @@ -1,7 +0,0 @@ - - <SessionState ContinuousTestingMode="0" IsActive="True" Name="All tests from 1. ObjectComparison" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> - <Or> - <ProjectFolder>6ED454CB-A772-43E5-B72D-3FE9DA27337F/d:Homework/d:1. ObjectComparison</ProjectFolder> - <ProjectFolder>6ED454CB-A772-43E5-B72D-3FE9DA27337F/d:Homework/d:2. NumberValidator</ProjectFolder> - </Or> -</SessionState> \ No newline at end of file From 28c71cb6d3237af61c72cdee395e46aa3a6daf74 Mon Sep 17 00:00:00 2001 From: artem <17artem12@gmail.com> Date: Thu, 30 Oct 2025 14:33:37 +0500 Subject: [PATCH 13/14] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=B2=20ObjectComparison?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Basic/Homework/1. ObjectComparison/ObjectComparison.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs b/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs index dd87c38..20add75 100644 --- a/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs +++ b/Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs @@ -43,12 +43,9 @@ public void CheckCurrentTsarFluentAssertions() actualTsar.Should().BeEquivalentTo(expectedTsar, options => - options - .Excluding(p => p.Id) - .Excluding((IMemberInfo p) => - p.Name == "Id" && - p.Path.Contains("Parent")) + options.Excluding((IMemberInfo p) => p.Name == nameof(Person.Id)) ); + // Тест с FluentAssertions имеет следующие приемущества: // 1) Автоматически расширяется при добавлении новых свойств в класс Person // 2) Лучшая читаемость кода From 6996e46481c40c9a2c6a7bae4d7c25d362356231 Mon Sep 17 00:00:00 2001 From: artem <17artem12@gmail.com> Date: Thu, 30 Oct 2025 14:56:19 +0500 Subject: [PATCH 14/14] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=B2=20NumberValidatorTests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NumberValidatorTests.cs | 50 ++++++------------- 1 file changed, 14 insertions(+), 36 deletions(-) diff --git a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs index b96fd76..38e97e3 100644 --- a/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs +++ b/Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs @@ -7,16 +7,16 @@ namespace HomeExercise.Tasks.NumberValidator; [TestFixture] -public class NumberValidatorTestsFix +public class NumberValidatorTests { - [TestCase(-1, 2)] - [TestCase(5, -1)] - [TestCase(5, 6)] - public void Constructor_WithInvalidParameters_ThrowsArgumentException(int precision, int scale) + [TestCase(-1, 2, "Исключение, когда precision отрицательная")] + [TestCase(5, -1, "Исключение, когда scale отрицательный")] + [TestCase(5, 6, "Исключение, когда scale больше precision")] + public void Constructor_WithInvalidParameters_ThrowsArgumentException(int precision, int scale, string description) { Action action = () => new NumberValidator(precision, scale); - action.Should().Throw(); + action.Should().Throw(description); } @@ -32,7 +32,8 @@ public void IsValidNumber_WithValidNumberFormats_ReturnsTrue(string number, stri } [TestCase("-1.23", "Отрицательное при onlyPositive=true")] - [TestCase("00.000", "Превышение precision")] + [TestCase("00.000", "Превышение precision в дробной части")] + [TestCase("1234.56", "Превышение precision в целой части")] [TestCase("0.000", "Превышение scale")] [TestCase("a.sd", "Нечисловой формат")] [TestCase("", "Пустая строка")] @@ -47,39 +48,23 @@ public void IsValidNumber_WithInvalidNumberFormats_ReturnsFalse(string number, s [TestCase("1.23", "Максимальная precision и scale")] [TestCase("12.3", "Граница precision")] [TestCase("0.12", "Граница scale")] + [TestCase("1,23", "Запятая в качестве разделителя")] public void IsValidNumber_WithValidPrecisionAndScale_ReturnsTrue(string number, string description) { var strictValidator = new NumberValidator(3, 2); strictValidator.IsValidNumber(number).Should().BeTrue(description); } - - - [TestCase("123.4", "Превышение precision в целой части")] - public void IsValidNumber_WithExceededPrecisionAndScale_ReturnsFalse(string number, string description) - { - var strictValidator = new NumberValidator(3, 2); - - strictValidator.IsValidNumber(number).Should().BeFalse(description); - } - [Test] - public void IsValidNumber_WithOnlyPositiveTrue_RejectsNegativeNumbers() - { - var positiveOnly = new NumberValidator(5, 2, true); - positiveOnly.IsValidNumber("-1.23").Should().BeFalse("Только положительные: отрицательное число"); - } - [Test] - public void IsValidNumber_WithOnlyPositiveFalse_AcceptsAllSigns() + [TestCase("-1.23", "Отрицательное число")] + [TestCase("-0", "Отрицательный ноль")] + public void IsValidNumber_WithOnlyPositiveFalse_AcceptsNegativeNumbers(string number, string description) { - var anyNum = new NumberValidator(5, 2, false); + var anyNum = new NumberValidator(5, 2, false); - anyNum.IsValidNumber("-1.23").Should().BeTrue("Отрицательное число"); - anyNum.IsValidNumber("+1.23").Should().BeTrue("Положительное число с плюсом"); - anyNum.IsValidNumber("1.23").Should().BeTrue("Положительное число без плюсом"); - anyNum.IsValidNumber("-0").Should().BeTrue("Отрицательный ноль"); + anyNum.IsValidNumber(number).Should().BeTrue(description); } @@ -94,11 +79,4 @@ public void IsValidNumber_WithInvalidFormats_ReturnsFalse(string number, string validator.IsValidNumber(number).Should().BeFalse(description); } - [TestCase("12,34", "Запятая в качестве разделителя")] - public void IsValidNumber_WithCommaAsSeparator_ReturnsTrue(string number, string description) - { - var validator = new NumberValidator(10, 2); - - validator.IsValidNumber(number).Should().BeTrue(description); - } } \ No newline at end of file