Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 44 additions & 18 deletions cs/HomeExercises/NumberValidatorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,26 +7,52 @@ namespace HomeExercises
{
public class NumberValidatorTests
{
[Test]
public void Test()
[Test, Category("Constructor")]
public void ValidConstructorParameters_WithNoException()
{
Assert.Throws<ArgumentException>(() => new NumberValidator(-1, 2, true));
Assert.DoesNotThrow(() => new NumberValidator(1, 0, true));
Assert.Throws<ArgumentException>(() => new NumberValidator(-1, 2, false));
Assert.DoesNotThrow(() => new NumberValidator(1, 0, true));
Assert.DoesNotThrow(() => new NumberValidator(2,1, true));
}

[TestCase(-11, 2, false, TestName = "precision is negative", Category = "Constructor")]
[TestCase(8, -13, false, TestName = "scale is negative", Category = "Constructor")]
[TestCase(7, 8, false, TestName = "precision is less than scale", Category = "Constructor")]
[TestCase(0, 0, false, TestName = "precision is zero", Category = "Constructor")]
public void InvalidConstructorParameters_ThrowsArgumentException(int precision, int scale, bool onlyPositive)
{
Assert.Throws<ArgumentException>(() => new NumberValidator(precision, scale, onlyPositive));
}

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"));
[TestCase(null!, TestName = "Null input", Category = "IsValidNumber")]
[TestCase("", TestName = "Empty string", Category = "IsValidNumber")]
[TestCase(" ", TestName = "Whitespace string", Category = "IsValidNumber")]
[TestCase("%;?^", TestName = "Other symbols", Category = "IsValidNumber")]
[TestCase("ddd", TestName = "Non-numeric string", Category = "IsValidNumber")]
public void isValidNumber_ShouldBeFalse_WhenNumberIsNotCorrect(string number)
{
var validator = new NumberValidator(8, 6, true);
validator.IsValidNumber(number).Should()
.BeFalse($"For {number}, IsValidNumber should return false as it's invalid data.");
}

[TestCase("13.5", true, Category = "IsValidNumber")]
[TestCase("88", true, Category = "IsValidNumber")]
[TestCase("7.00", true, Category = "IsValidNumber")]
[TestCase("198.2", true, Category = "IsValidNumber")]
[TestCase("0", true, Category = "IsValidNumber")]
[TestCase("+2.0", true, Category = "IsValidNumber")]
public void isValidNumber_ShouldBeTrue_WhenNumberIsValid(string number, bool result)
{
var validator = new NumberValidator(5, 2, true);
validator.IsValidNumber(number).Should().Be(result);
}
[TestCase("-8", false)]
[TestCase("-0.8", false)]
[TestCase("+4.0", true)]
[TestCase("+0.00", true)]
public void isValidNumber_ShouldBeTrue_WhenNumberWithSigns(string number, bool result)
{
var validator = new NumberValidator(7, 3, true);
validator.IsValidNumber(number).Should().Be(result);
}
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вынести в отдельный файл класс ниже, почему-то не могу к нему коммент оставить. На шпоре, имхо, важно не только смотреть на то место, куда ты вносишь изменения но и на весь проект в целом, если видишь что где-то сделано не очень хорошо - исправляй. Так работает и в промышленной разработке (за исключением случаев, когда код написан настолько плохо, что трогать его страшно)

Expand Down
22 changes: 12 additions & 10 deletions cs/HomeExercises/ObjectComparison.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,10 @@ public void CheckCurrentTsar()

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(member => member.SelectedMemberInfo.Name.ToLower().Contains("id")));

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не очень хороший вариант, а если добавятся еще какие-то поля, в названии которых будет Id, но их не нужно будет исключать? Поэтому тут я бы предложил просто использовать ==


// Перепишите код на использование 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);
}

[Test]
Expand All @@ -37,6 +30,15 @@ public void CheckCurrentTsar_WithCustomEquality()

// Какие недостатки у такого подхода?
Assert.True(AreEqual(actualTsar, expectedTsar));


/*1. При любых изменениях в структуре класса Person, мне придется это менять в методе AreEqual
2. Если тест не пройдет, он мне не скажет какие атрибуты или свойства не эквивалентны
3. Код становится более сложный и менее читаемый. Возможно такой подход необходим если стандартных
возможностей сравнения недостаточно и необходимы более глубокие настройки. Но, не в этом случае.
4. По названию теста не понять область моего тестирования */


}

private bool AreEqual(Person? actual, Person? expected)
Expand Down