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

Леонтьев Дмитрий #19

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
74 changes: 72 additions & 2 deletions Testing/Basic/Classwork/1. WordsStatistics/WordsStatisticsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,11 @@ namespace Basic.Task.WordsStatistics;
[TestFixture]
public class WordsStatisticsTests
{

private IWordsStatistics wordsStatistics;

[SetUp]
public void SetUp()
{

wordsStatistics = CreateStatistics();
}

Expand Down Expand Up @@ -46,4 +44,76 @@ public void GetStatistics_ContainsManyItems_AfterAdditionOfDifferentWords()
wordsStatistics.AddWord("def");
wordsStatistics.GetStatistics().Should().HaveCount(2);
}

[Test]
public void GetStatistics_ThrowArgumentNullException_AfterAdditionNull()
{
wordsStatistics
.Invoking(word => word.AddWord(null))
.Should()
.Throw<ArgumentNullException>()
.WithMessage("Value cannot be null. (Parameter 'word')");
}

[Test]
public void GetStatistics_IsEmpty_AfterAdditionWhiteSpaceString()
{
wordsStatistics.AddWord(" ");
wordsStatistics.GetStatistics().Should().BeEmpty();
}

[Test]
public void GetStatistics_LengthWord_AfterAdditionStringLongerThenTen()
{
wordsStatistics.AddWord("very long string");
wordsStatistics.GetStatistics().Should().Equal(new WordCount("very long ", 1));
}

[Test]
public void GetStatistics_Count_AfterAdditionSameWord()
{
for (var i = 0; i < 3; i++)
{
wordsStatistics.AddWord("word");
}

wordsStatistics.GetStatistics().First().Count.Should().Be(3);
}

[Test]
public void GetStatistics_TypeOfWordCount_AfterAdditionWord()
{
wordsStatistics.AddWord("word");

wordsStatistics.GetStatistics().First().GetType().Should().Be(typeof(WordCount));
}

[Test]
public void GetStatistics_IsLowerWord_AfterAdditionWord()
{
wordsStatistics.AddWord("WORD");

wordsStatistics.GetStatistics().First().Word.Should().Be("word");
}

[Test]
public void GetStatistics_OrderByDescending_AfterAdditionDifferentWords()
{
wordsStatistics.AddWord("word3");

for (var i = 0; i < 2; i++)
{
wordsStatistics.AddWord("word2");
}

for (var i = 0; i < 3; i++)
{
wordsStatistics.AddWord("word1");
}

wordsStatistics
.GetStatistics()
.Should()
.Equal(new List<WordCount>{new ("word1", 3), new ("word2", 2), new ("word3", 1)});
}
}
3 changes: 2 additions & 1 deletion Testing/Basic/Classwork/2. TDD/Game.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
namespace TDD.Task;
public class Game
{
private int score = 0;
public void Roll(int pins)
{
throw new NotImplementedException();
}

public int GetScore()
{
throw new NotImplementedException();
return score;
}
}

Expand Down
28 changes: 16 additions & 12 deletions Testing/Basic/Homework/1. ObjectComparison/ObjectComparison.cs
Original file line number Diff line number Diff line change
@@ -1,29 +1,27 @@
using NUnit.Framework;
using NUnit.Framework.Legacy;
using FluentAssertions;

namespace HomeExercise.Tasks.ObjectComparison;

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));

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

Choose a reason for hiding this comment

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

ага, а если будет 3 поколения, будет работать?

Choose a reason for hiding this comment

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

resolved

}

[Test]
Expand All @@ -35,6 +33,12 @@ public void CheckCurrentTsar_WithCustomEquality()
new Person("Vasili III of Russia", 28, 170, 60, null));

// Какие недостатки у такого подхода?
// При изменении класса Person придётся изменять метод AreEqual,
// т.е. если мы добавим поле в Person, то придётся добавить проверку на него в этом методе.
// При провале теста мы не получаем конкретной информации из-за чего тест не прошёл,
// т.к. метод AreEqual возвращает bool и скажет нам только Success или Failed.

Choose a reason for hiding this comment

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

Ага, все так

Choose a reason for hiding this comment

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

resolved

// Невозможно сравнить двух Person без определённых полей,
// придётся создавать различные реализации метода AreEqual.
ClassicAssert.True(AreEqual(actualTsar, expectedTsar));
}

Expand All @@ -49,4 +53,4 @@ private bool AreEqual(Person? actual, Person? expected)
&& actual.Weight == expected.Weight
&& AreEqual(actual.Parent, expected.Parent);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public NumberValidator(int precision, int scale = 0, bool onlyPositive = false)
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");
throw new ArgumentException("scale must be a non-negative number less than precision");
numberRegex = new Regex(@"^([+-]?)(\d+)([.,](\d+))?$", RegexOptions.IgnoreCase);
}

Expand Down
78 changes: 56 additions & 22 deletions Testing/Basic/Homework/2. NumberValidator/NumberValidatorTests.cs
Original file line number Diff line number Diff line change
@@ -1,31 +1,65 @@

using NUnit.Framework;
using NUnit.Framework.Legacy;
using NUnit.Framework;
using FluentAssertions;

namespace HomeExercise.Tasks.NumberValidator;

[TestFixture]
public class NumberValidatorTests
{
[Test]
public void Test()
[TestCase(1, TestName = "precision 1, scale 0")]
public void NumberValidator_CorrectParameters_AfterCreatingCorrectValidator(int precision, int scale = 0)
{
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));

ClassicAssert.IsTrue(new NumberValidator(17, 2, true).IsValidNumber("0.0"));
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.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"));
var creation = () => new NumberValidator(precision, scale, true);

creation.Should()
.NotThrow<ArgumentException>();
}

[TestCase(-1, TestName = "negative precision")]
[TestCase(0, TestName = "zero precision")]
public void NumberValidator_IncorrectPrecision_AfterCreatingIncorrectValidator(int precision, int scale = 0)

Choose a reason for hiding this comment

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

У тестов на конструктор имена не очень удались. Лучше что-нибудь типа
Contructor_WithIncorrectPrecision_Throws (по принципу Что_ПриКакихУсловиях_КакойРезультат)

Choose a reason for hiding this comment

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

resolved

{
var creation = () => new NumberValidator(precision, scale);

creation.Should()
.Throw<ArgumentException>()
.WithMessage("precision must be a positive number");
}

[TestCase(1, -1, TestName = "negative scale")]
[TestCase(1, 2, TestName = "scale greater than precision")]
[TestCase(1, 1, TestName = "scale equal to precision")]
public void NumberValidator_IncorrectScale_AfterCreatingIncorrectValidator(int precision, int scale)
{
var creation = () => new NumberValidator(precision, scale);

creation.Should()
.Throw<ArgumentException>()
.WithMessage("scale must be a non-negative number less than precision");
}

[TestCase(1, 0, true, "0", ExpectedResult = true, TestName = "precision 1, scale 0, only positive, result 0")]
[TestCase(2, 1, true, "0.1", ExpectedResult = true, TestName = "precision 2, scale 1, only positive, result 0.1")]
[TestCase(2, 1, true, "0,1", ExpectedResult = true, TestName = "precision 2, scale 1, only positive, result 0,1")]
[TestCase(2, 0, false, "-1", ExpectedResult = true, TestName = "precision 2, scale 0, not only positive, result -1")]
[TestCase(3, 1, false, "-1.1", ExpectedResult = true, TestName = "precision 3, scale 1, not only positive, result -1.1")]
[TestCase(3, 1, false, "-1,1", ExpectedResult = true, TestName = "precision 3, scale 1, not only positive, result -1,1")]
[TestCase(2, 0, true, "+1", ExpectedResult = true, TestName = "precision 2, scale 0, only positive, result +1")]
[TestCase(3, 1, true, "+1.1", ExpectedResult = true, TestName = "precision 3, scale 1, only positive, result +1.1")]
[TestCase(3, 1, true, "+1,1", ExpectedResult = true, TestName = "precision 3, scale 1, only positive, result +1,1")]

Choose a reason for hiding this comment

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

Я бы предложил сгруппировать тест-кейсы по категориям и отобразить это на уровне методов (разные методы сделать для разных проверок) и на уровне названий (TestName отражает суть проверки, а не перечисляет входные параметры). У тебя так сделано для тестов на конструктор.

Так будет более структурировано, и читать такие тесты будет гораздо легче 🙂

Choose a reason for hiding this comment

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

resolved


[TestCase(2, 1, true, "", ExpectedResult = false, TestName = "precision 2, scale 1, only positive, result not empty string")]
[TestCase(2, 1, true, null, ExpectedResult = false, TestName = "precision 2, scale 1, only positive, result not null")]
[TestCase(2, 1, true, ".0", ExpectedResult = false, TestName = "precision 2, scale 1, only positive, result not .0")]
[TestCase(2, 1, true, "0.", ExpectedResult = false, TestName = "precision 2, scale 1, only positive, result not 0.")]
[TestCase(2, 0, true, "-1", ExpectedResult = false, TestName = "precision 2, scale 0, only positive, result not -1")]
[TestCase(1, 0, true, "+1", ExpectedResult = false, TestName = "precision 1, scale 0, only positive, result not +1")]
public bool IsValidNumber_VariousInput_AfterCreatingValidator(
int precision,
int scale,
bool onlyPositive,
string expectedResultValue)
{
return new NumberValidator(precision, scale, onlyPositive).IsValidNumber(expectedResultValue);

Choose a reason for hiding this comment

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

Здесь ассерт забыл. Должно быть что-то типа Should().BeTrue() или тому подобное, в зависимости от того, что ты хочешь проверить.

Choose a reason for hiding this comment

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

resolved

}
}