Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Муканов Арман #233

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all 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
154 changes: 136 additions & 18 deletions cs/HomeExercises/NumberValidatorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,146 @@

namespace HomeExercises
{
[TestFixture]
public class NumberValidatorTests
{
[Test]
public void Test()
public void Constructor_ShouldThrow_WhenPrecisionNegative()
{
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.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"));
Action act = () => new NumberValidator(-1);
act.Should()
.Throw<ArgumentException>()
.WithMessage("precision must be a positive number");
}

[Test]
public void Constructor_ShouldThrow_WhenPrecisionIsZero()
{
Action act = () => new NumberValidator(0);
act.Should()
.Throw<ArgumentException>()
.WithMessage("precision must be a positive number");
}

[Test]
public void Constructor_ShouldThrow_WhenScaleNegative()
{
Action act = () => new NumberValidator(3, -1);
act.Should()
.Throw<ArgumentException>()
.WithMessage("precision must be a non-negative number less or equal than precision");
}

[Test]
public void Constructor_ShouldThrow_WhenScaleEqualPrecision()
{
Action act = () => new NumberValidator(3, 3);
act.Should()
.Throw<ArgumentException>()
.WithMessage("precision must be a non-negative number less or equal than precision");
}

[Test]
public void Constructor_ShouldThrow_WhenScaleGreaterPrecision()
{
Action act = () => new NumberValidator(3, 4);
act.Should()
.Throw<ArgumentException>()
.WithMessage("precision must be a non-negative number less or equal than precision");
}

[Test]
public void Constructor_ShouldNotThrow_WhenScaleIsZero()
{
Action act = () => new NumberValidator(3, 0);
act.Should().NotThrow<ArgumentException>();
}


[TestCase("1.2")]
[TestCase("1,2")]
public void IsValidNumber_ShouldBeTrue_WhenValueWithDifferentSeparators(string value)
{
var validator = new NumberValidator(4, 2, true);

var result = validator.IsValidNumber(value);

result.Should().BeTrue();
}

[TestCase("1`4")]
[TestCase("1'4")]
[TestCase("1_4")]
[TestCase("1 000")]
public void IsValidNumber_ShouldBeFalse_WhenValueWithUnsupportedSeparators(string value)
{
var validator = new NumberValidator(10, 2, true);

var result = validator.IsValidNumber(value);

result.Should().BeFalse();
}

[TestCase("-0")]
[TestCase("-1")]
public void IsValidNumber_ShouldBeFalse_WhenOnlyPositive(string value)
{
var validator = new NumberValidator(4, 2, true);

var result = validator.IsValidNumber(value);

result.Should().BeFalse();
}

[TestCase("-0")]
[TestCase("-1")]
public void IsValidNumber_ShouldBeTrue_WhenNumberIsNegative(string value)
{
var validator = new NumberValidator(4, 2);

var result = validator.IsValidNumber(value);

result.Should().BeTrue();
}

[TestCase(null)]
[TestCase("")]
public void IsValidNumber_ShouldBeFalse_WhenValueIsNullOrEmpty(string value)
{
var validator = new NumberValidator(10, 2, true);

var result = validator.IsValidNumber(value);

result.Should().BeFalse();
}

[TestCase("1.")]
[TestCase(".1")]
[TestCase("+-0")]
[TestCase("@#$1")]
[TestCase("\n1")]
[TestCase("abc")]
[TestCase("a4")]
public void IsValidNumber_ShouldBeFalse_WhenInvalidFormat(string value)
{
var validator = new NumberValidator(10, 2);

var result = validator.IsValidNumber(value);

result.Should().BeFalse();
}

[TestCase("1111")]
[TestCase("-111")]
[TestCase("-10.0")]
[TestCase("0.00")]
public void IsValidNumber_ShouldBeFalse_WhenValueTooLong(string value)
{
var validator = new NumberValidator(3, 1);

var result = validator.IsValidNumber(value);

result.Should().BeFalse();
}
}

Expand Down
23 changes: 12 additions & 11 deletions cs/HomeExercises/ObjectComparison.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,18 @@ public class ObjectComparison
[Category("ToRefactor")]
public void CheckCurrentTsar()
{
// Это решение более читаемо за счет FluentAPI.
// При неудачном тестировании в отличии от CheckCurrentTsar_WithCustomEquality предоставляет подробную информацию.
// При изменении Person потребуется только немного изменить expectedTsar.


var actualTsar = TsarRegistry.GetCurrentTsar();

var expectedTsar = new Person("Ivan IV The Terrible", 54, 170, 70,
new Person("Vasili III of Russia", 28, 170, 60, null));

// Перепишите код на использование Fluent Assertions.
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);
expectedTsar.Should().BeEquivalentTo(actualTsar,
options => options.Excluding(p => p.SelectedMemberInfo.Name == nameof(Person.Id)));
}

[Test]
Expand All @@ -35,7 +32,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));

// Какие недостатки у такого подхода?
// Какие недостатки у такого подхода?
// Плохо читаем
// Из-за рекурсивного вызова в AreEqual возможно переполнение стека
// Не предоставляет детальную информацию при неудачном тестировании
// При изменении Person потребует изменений в методе AreEqual
Assert.True(AreEqual(actualTsar, expectedTsar));

Choose a reason for hiding this comment

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

Внутри AreEqual есть рекурсивный вызов. Есть ли у него какие-то недостатки?

Copy link
Author

Choose a reason for hiding this comment

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

Добавил

}

Expand Down