* Added missing summaries
This commit is contained in:
@@ -4,314 +4,313 @@ using Telegrator.Core.Descriptors;
|
||||
using Telegrator.Core.Filters;
|
||||
using Xunit;
|
||||
|
||||
namespace Telegrator.Tests.Collections
|
||||
namespace Telegrator.Tests.Collections;
|
||||
|
||||
/// <summary>
|
||||
/// Тесты для коллекций.
|
||||
///
|
||||
/// ПАРАДИГМЫ ТЕСТИРОВАНИЯ:
|
||||
/// 1. Collection Testing - тестирование коллекций и их операций
|
||||
/// 2. List Testing - тестирование списков
|
||||
/// 3. Indexing Testing - тестирование индексации
|
||||
/// 4. Enumeration Testing - тестирование перечисления
|
||||
/// 5. Capacity Testing - тестирование емкости коллекций
|
||||
/// </summary>
|
||||
public class CollectionTests
|
||||
{
|
||||
/// <summary>
|
||||
/// Тесты для коллекций.
|
||||
/// Тест для HandlerDescriptorList - создание списка.
|
||||
///
|
||||
/// ПАРАДИГМЫ ТЕСТИРОВАНИЯ:
|
||||
/// 1. Collection Testing - тестирование коллекций и их операций
|
||||
/// 2. List Testing - тестирование списков
|
||||
/// 3. Indexing Testing - тестирование индексации
|
||||
/// 4. Enumeration Testing - тестирование перечисления
|
||||
/// 5. Capacity Testing - тестирование емкости коллекций
|
||||
/// ПРИНЦИП: Тестируем создание коллекций
|
||||
/// </summary>
|
||||
public class CollectionTests
|
||||
[Fact]
|
||||
public void HandlerDescriptorList_ShouldBeCreated()
|
||||
{
|
||||
/// <summary>
|
||||
/// Тест для HandlerDescriptorList - создание списка.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем создание коллекций
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void HandlerDescriptorList_ShouldBeCreated()
|
||||
{
|
||||
// Arrange & Act
|
||||
var list = new HandlerDescriptorList();
|
||||
// Arrange & Act
|
||||
var list = new HandlerDescriptorList();
|
||||
|
||||
// Assert
|
||||
list.Should().NotBeNull();
|
||||
list.Should().BeEmpty();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для HandlerDescriptorList - добавление дескриптора.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем добавление элементов в коллекцию
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void HandlerDescriptorList_Add_ShouldAddDescriptor()
|
||||
{
|
||||
// Arrange
|
||||
var list = new HandlerDescriptorList();
|
||||
var descriptor = CreateTestDescriptor(UpdateType.Message);
|
||||
|
||||
// Act
|
||||
list.Add(descriptor);
|
||||
|
||||
// Assert
|
||||
list.Should().HaveCount(1);
|
||||
list.Should().Contain(descriptor);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для HandlerDescriptorList - добавление нескольких дескрипторов.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем множественные операции
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void HandlerDescriptorList_AddMultiple_ShouldAddAllDescriptors()
|
||||
{
|
||||
// Arrange
|
||||
var list = new HandlerDescriptorList();
|
||||
var descriptor1 = CreateTestDescriptor(UpdateType.Message);
|
||||
var descriptor2 = CreateTestDescriptor(UpdateType.CallbackQuery);
|
||||
var descriptor3 = CreateTestDescriptor(UpdateType.InlineQuery);
|
||||
|
||||
// Act
|
||||
list.Add(descriptor1);
|
||||
list.Add(descriptor2);
|
||||
list.Add(descriptor3);
|
||||
|
||||
// Assert
|
||||
list.Should().HaveCount(3);
|
||||
list.Should().Contain(descriptor1);
|
||||
list.Should().Contain(descriptor2);
|
||||
list.Should().Contain(descriptor3);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для HandlerDescriptorList - получение по индексу.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем индексацию коллекций
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void HandlerDescriptorList_Indexer_ShouldReturnDescriptorAtIndex()
|
||||
{
|
||||
// Arrange
|
||||
var descriptor = CreateTestDescriptor(UpdateType.Message);
|
||||
var list = new HandlerDescriptorList
|
||||
{
|
||||
descriptor
|
||||
};
|
||||
|
||||
// Act
|
||||
var result = list[0];
|
||||
|
||||
// Assert
|
||||
result.Should().Be(descriptor);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для HandlerDescriptorList - получение по неверному индексу.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем исключения при некорректном доступе
|
||||
/// </summary>
|
||||
[Theory]
|
||||
[InlineData(-1)]
|
||||
[InlineData(1)]
|
||||
[InlineData(100)]
|
||||
public void HandlerDescriptorList_IndexerWithInvalidIndex_ShouldThrowArgumentOutOfRangeException(int invalidIndex)
|
||||
{
|
||||
// Arrange
|
||||
var list = new HandlerDescriptorList
|
||||
{
|
||||
CreateTestDescriptor(UpdateType.Message)
|
||||
};
|
||||
|
||||
// Act & Assert
|
||||
list.Invoking(l => _ = l[invalidIndex])
|
||||
.Should().Throw<ArgumentOutOfRangeException>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для HandlerDescriptorList - перечисление элементов.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем перечисление коллекций
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void HandlerDescriptorList_ShouldBeEnumerable()
|
||||
{
|
||||
// Arrange
|
||||
var descriptor1 = CreateTestDescriptor(UpdateType.Message);
|
||||
var descriptor2 = CreateTestDescriptor(UpdateType.CallbackQuery);
|
||||
var list = new HandlerDescriptorList
|
||||
{
|
||||
descriptor1,
|
||||
descriptor2
|
||||
};
|
||||
|
||||
// Act
|
||||
var enumeratedItems = list.ToList();
|
||||
|
||||
// Assert
|
||||
enumeratedItems.Should().HaveCount(2);
|
||||
enumeratedItems.Should().Contain(descriptor1);
|
||||
enumeratedItems.Should().Contain(descriptor2);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для HandlerDescriptorList - очистка списка.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем очистку коллекций
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void HandlerDescriptorList_Clear_ShouldRemoveAllDescriptors()
|
||||
{
|
||||
// Arrange
|
||||
var list = new HandlerDescriptorList
|
||||
{
|
||||
CreateTestDescriptor(UpdateType.Message),
|
||||
CreateTestDescriptor(UpdateType.CallbackQuery)
|
||||
};
|
||||
|
||||
// Act
|
||||
list.Clear();
|
||||
|
||||
// Assert
|
||||
list.Should().BeEmpty();
|
||||
list.Should().HaveCount(0);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для HandlerDescriptorList - проверка содержания элемента.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем поиск в коллекциях
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void HandlerDescriptorList_Contains_ShouldReturnCorrectResult()
|
||||
{
|
||||
// Arrange
|
||||
var list = new HandlerDescriptorList();
|
||||
var descriptor = CreateTestDescriptor(UpdateType.Message);
|
||||
var nonExistentDescriptor = CreateTestDescriptor(UpdateType.CallbackQuery);
|
||||
|
||||
// Act
|
||||
list.Add(descriptor);
|
||||
var containsExisting = list.Contains(descriptor);
|
||||
var containsNonExistent = list.Contains(nonExistentDescriptor);
|
||||
|
||||
// Assert
|
||||
containsExisting.Should().BeTrue();
|
||||
containsNonExistent.Should().BeFalse();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для HandlerDescriptorList - удаление элемента.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем удаление элементов из коллекций
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void HandlerDescriptorList_Remove_ShouldRemoveDescriptor()
|
||||
{
|
||||
// Arrange
|
||||
var list = new HandlerDescriptorList();
|
||||
var descriptor = CreateTestDescriptor(UpdateType.Message);
|
||||
list.Add(descriptor);
|
||||
|
||||
// Act
|
||||
var removed = list.Remove(descriptor);
|
||||
|
||||
// Assert
|
||||
removed.Should().BeTrue();
|
||||
list.Should().BeEmpty();
|
||||
list.Should().NotContain(descriptor);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для HandlerDescriptorList - удаление несуществующего элемента.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем удаление несуществующих элементов
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void HandlerDescriptorList_RemoveNonExistent_ShouldReturnFalse()
|
||||
{
|
||||
// Arrange
|
||||
var list = new HandlerDescriptorList();
|
||||
var nonExistentDescriptor = CreateTestDescriptor(UpdateType.CallbackQuery);
|
||||
|
||||
// Act
|
||||
var removed = list.Remove(nonExistentDescriptor);
|
||||
|
||||
// Assert
|
||||
removed.Should().BeFalse();
|
||||
list.Should().BeEmpty();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для CompletedFiltersList - создание списка.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем создание специализированных коллекций
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void CompletedFiltersList_ShouldBeCreated()
|
||||
{
|
||||
// Arrange & Act
|
||||
var list = new CompletedFiltersList();
|
||||
|
||||
// Assert
|
||||
list.Should().NotBeNull();
|
||||
list.Should().BeEmpty();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для проверки производительности коллекций.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем производительность при большом количестве элементов
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void HandlerDescriptorList_ShouldHandleLargeNumberOfItems()
|
||||
{
|
||||
// Arrange
|
||||
var list = new HandlerDescriptorList();
|
||||
var itemsCount = 1000;
|
||||
|
||||
// Act
|
||||
for (int i = 0; i < itemsCount; i++)
|
||||
{
|
||||
list.Add(CreateTestDescriptor(UpdateType.Message));
|
||||
}
|
||||
|
||||
// Assert
|
||||
list.Should().HaveCount(itemsCount);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для проверки потокобезопасности (базовый тест).
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем базовую потокобезопасность
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public async void HandlerDescriptorList_ShouldHandleConcurrentAccess()
|
||||
{
|
||||
// Arrange
|
||||
var list = new HandlerDescriptorList();
|
||||
var tasks = new List<Task>();
|
||||
|
||||
// Act
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
tasks.Add(Task.Run(() =>
|
||||
{
|
||||
for (int j = 0; j < 10; j++)
|
||||
{
|
||||
list.Add(CreateTestDescriptor(UpdateType.Message));
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
await Task.WhenAll(tasks.ToArray());
|
||||
|
||||
// Assert
|
||||
list.Should().HaveCount(100);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Вспомогательный метод для создания тестового дескриптора.
|
||||
/// </summary>
|
||||
private static HandlerDescriptor CreateTestDescriptor(UpdateType updateType)
|
||||
{
|
||||
return new HandlerDescriptor(DescriptorType.General, typeof(TestUpdateHandler));
|
||||
}
|
||||
// Assert
|
||||
list.Should().NotBeNull();
|
||||
list.Should().BeEmpty();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для HandlerDescriptorList - добавление дескриптора.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем добавление элементов в коллекцию
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void HandlerDescriptorList_Add_ShouldAddDescriptor()
|
||||
{
|
||||
// Arrange
|
||||
var list = new HandlerDescriptorList();
|
||||
var descriptor = CreateTestDescriptor(UpdateType.Message);
|
||||
|
||||
// Act
|
||||
list.Add(descriptor);
|
||||
|
||||
// Assert
|
||||
list.Should().HaveCount(1);
|
||||
list.Should().Contain(descriptor);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для HandlerDescriptorList - добавление нескольких дескрипторов.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем множественные операции
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void HandlerDescriptorList_AddMultiple_ShouldAddAllDescriptors()
|
||||
{
|
||||
// Arrange
|
||||
var list = new HandlerDescriptorList();
|
||||
var descriptor1 = CreateTestDescriptor(UpdateType.Message);
|
||||
var descriptor2 = CreateTestDescriptor(UpdateType.CallbackQuery);
|
||||
var descriptor3 = CreateTestDescriptor(UpdateType.InlineQuery);
|
||||
|
||||
// Act
|
||||
list.Add(descriptor1);
|
||||
list.Add(descriptor2);
|
||||
list.Add(descriptor3);
|
||||
|
||||
// Assert
|
||||
list.Should().HaveCount(3);
|
||||
list.Should().Contain(descriptor1);
|
||||
list.Should().Contain(descriptor2);
|
||||
list.Should().Contain(descriptor3);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для HandlerDescriptorList - получение по индексу.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем индексацию коллекций
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void HandlerDescriptorList_Indexer_ShouldReturnDescriptorAtIndex()
|
||||
{
|
||||
// Arrange
|
||||
var descriptor = CreateTestDescriptor(UpdateType.Message);
|
||||
var list = new HandlerDescriptorList
|
||||
{
|
||||
descriptor
|
||||
};
|
||||
|
||||
// Act
|
||||
var result = list[0];
|
||||
|
||||
// Assert
|
||||
result.Should().Be(descriptor);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для HandlerDescriptorList - получение по неверному индексу.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем исключения при некорректном доступе
|
||||
/// </summary>
|
||||
[Theory]
|
||||
[InlineData(-1)]
|
||||
[InlineData(1)]
|
||||
[InlineData(100)]
|
||||
public void HandlerDescriptorList_IndexerWithInvalidIndex_ShouldThrowArgumentOutOfRangeException(int invalidIndex)
|
||||
{
|
||||
// Arrange
|
||||
var list = new HandlerDescriptorList
|
||||
{
|
||||
CreateTestDescriptor(UpdateType.Message)
|
||||
};
|
||||
|
||||
// Act & Assert
|
||||
list.Invoking(l => _ = l[invalidIndex])
|
||||
.Should().Throw<ArgumentOutOfRangeException>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для HandlerDescriptorList - перечисление элементов.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем перечисление коллекций
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void HandlerDescriptorList_ShouldBeEnumerable()
|
||||
{
|
||||
// Arrange
|
||||
var descriptor1 = CreateTestDescriptor(UpdateType.Message);
|
||||
var descriptor2 = CreateTestDescriptor(UpdateType.CallbackQuery);
|
||||
var list = new HandlerDescriptorList
|
||||
{
|
||||
descriptor1,
|
||||
descriptor2
|
||||
};
|
||||
|
||||
// Act
|
||||
var enumeratedItems = list.ToList();
|
||||
|
||||
// Assert
|
||||
enumeratedItems.Should().HaveCount(2);
|
||||
enumeratedItems.Should().Contain(descriptor1);
|
||||
enumeratedItems.Should().Contain(descriptor2);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для HandlerDescriptorList - очистка списка.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем очистку коллекций
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void HandlerDescriptorList_Clear_ShouldRemoveAllDescriptors()
|
||||
{
|
||||
// Arrange
|
||||
var list = new HandlerDescriptorList
|
||||
{
|
||||
CreateTestDescriptor(UpdateType.Message),
|
||||
CreateTestDescriptor(UpdateType.CallbackQuery)
|
||||
};
|
||||
|
||||
// Act
|
||||
list.Clear();
|
||||
|
||||
// Assert
|
||||
list.Should().BeEmpty();
|
||||
list.Should().HaveCount(0);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для HandlerDescriptorList - проверка содержания элемента.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем поиск в коллекциях
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void HandlerDescriptorList_Contains_ShouldReturnCorrectResult()
|
||||
{
|
||||
// Arrange
|
||||
var list = new HandlerDescriptorList();
|
||||
var descriptor = CreateTestDescriptor(UpdateType.Message);
|
||||
var nonExistentDescriptor = CreateTestDescriptor(UpdateType.CallbackQuery);
|
||||
|
||||
// Act
|
||||
list.Add(descriptor);
|
||||
var containsExisting = list.Contains(descriptor);
|
||||
var containsNonExistent = list.Contains(nonExistentDescriptor);
|
||||
|
||||
// Assert
|
||||
containsExisting.Should().BeTrue();
|
||||
containsNonExistent.Should().BeFalse();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для HandlerDescriptorList - удаление элемента.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем удаление элементов из коллекций
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void HandlerDescriptorList_Remove_ShouldRemoveDescriptor()
|
||||
{
|
||||
// Arrange
|
||||
var list = new HandlerDescriptorList();
|
||||
var descriptor = CreateTestDescriptor(UpdateType.Message);
|
||||
list.Add(descriptor);
|
||||
|
||||
// Act
|
||||
var removed = list.Remove(descriptor);
|
||||
|
||||
// Assert
|
||||
removed.Should().BeTrue();
|
||||
list.Should().BeEmpty();
|
||||
list.Should().NotContain(descriptor);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для HandlerDescriptorList - удаление несуществующего элемента.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем удаление несуществующих элементов
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void HandlerDescriptorList_RemoveNonExistent_ShouldReturnFalse()
|
||||
{
|
||||
// Arrange
|
||||
var list = new HandlerDescriptorList();
|
||||
var nonExistentDescriptor = CreateTestDescriptor(UpdateType.CallbackQuery);
|
||||
|
||||
// Act
|
||||
var removed = list.Remove(nonExistentDescriptor);
|
||||
|
||||
// Assert
|
||||
removed.Should().BeFalse();
|
||||
list.Should().BeEmpty();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для CompletedFiltersList - создание списка.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем создание специализированных коллекций
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void CompletedFiltersList_ShouldBeCreated()
|
||||
{
|
||||
// Arrange & Act
|
||||
var list = new CompletedFiltersList();
|
||||
|
||||
// Assert
|
||||
list.Should().NotBeNull();
|
||||
list.Should().BeEmpty();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для проверки производительности коллекций.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем производительность при большом количестве элементов
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void HandlerDescriptorList_ShouldHandleLargeNumberOfItems()
|
||||
{
|
||||
// Arrange
|
||||
var list = new HandlerDescriptorList();
|
||||
var itemsCount = 1000;
|
||||
|
||||
// Act
|
||||
for (int i = 0; i < itemsCount; i++)
|
||||
{
|
||||
list.Add(CreateTestDescriptor(UpdateType.Message));
|
||||
}
|
||||
|
||||
// Assert
|
||||
list.Should().HaveCount(itemsCount);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для проверки потокобезопасности (базовый тест).
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем базовую потокобезопасность
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public async void HandlerDescriptorList_ShouldHandleConcurrentAccess()
|
||||
{
|
||||
// Arrange
|
||||
var list = new HandlerDescriptorList();
|
||||
var tasks = new List<Task>();
|
||||
|
||||
// Act
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
tasks.Add(Task.Run(() =>
|
||||
{
|
||||
for (int j = 0; j < 10; j++)
|
||||
{
|
||||
list.Add(CreateTestDescriptor(UpdateType.Message));
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
await Task.WhenAll(tasks.ToArray());
|
||||
|
||||
// Assert
|
||||
list.Should().HaveCount(100);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Вспомогательный метод для создания тестового дескриптора.
|
||||
/// </summary>
|
||||
private static HandlerDescriptor CreateTestDescriptor(UpdateType updateType)
|
||||
{
|
||||
return new HandlerDescriptor(DescriptorType.General, typeof(TestUpdateHandler));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,173 +5,172 @@ using Telegrator.Filters;
|
||||
using Xunit;
|
||||
|
||||
#pragma warning disable CS8625
|
||||
namespace Telegrator.Tests.Filters
|
||||
namespace Telegrator.Tests.Filters;
|
||||
|
||||
/// <summary>
|
||||
/// Тесты для базовых фильтров.
|
||||
///
|
||||
/// ПАРАДИГМЫ ТЕСТИРОВАНИЯ:
|
||||
/// 1. AAA (Arrange-Act-Assert) - структура теста: подготовка, действие, проверка
|
||||
/// 2. Given-When-Then - альтернативная формулировка AAA для лучшей читаемости
|
||||
/// 3. Тестирование граничных случаев и исключений
|
||||
/// 4. Использование моков для изоляции тестируемого кода
|
||||
/// 5. Тестирование как позитивных, так и негативных сценариев
|
||||
/// </summary>
|
||||
public class FilterTests
|
||||
{
|
||||
/// <summary>
|
||||
/// Тесты для базовых фильтров.
|
||||
/// Тест для AnyFilter - фильтр, который всегда проходит.
|
||||
///
|
||||
/// ПАРАДИГМЫ ТЕСТИРОВАНИЯ:
|
||||
/// 1. AAA (Arrange-Act-Assert) - структура теста: подготовка, действие, проверка
|
||||
/// 2. Given-When-Then - альтернативная формулировка AAA для лучшей читаемости
|
||||
/// 3. Тестирование граничных случаев и исключений
|
||||
/// 4. Использование моков для изоляции тестируемого кода
|
||||
/// 5. Тестирование как позитивных, так и негативных сценариев
|
||||
/// ПРИНЦИП: Тестируем базовое поведение - фильтр должен всегда возвращать true
|
||||
/// </summary>
|
||||
public class FilterTests
|
||||
[Fact]
|
||||
public void AnyFilter_ShouldAlwaysPass()
|
||||
{
|
||||
/// <summary>
|
||||
/// Тест для AnyFilter - фильтр, который всегда проходит.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем базовое поведение - фильтр должен всегда возвращать true
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void AnyFilter_ShouldAlwaysPass()
|
||||
{
|
||||
// Arrange (Given) - подготовка тестовых данных
|
||||
var anyFilter = Filter<Update>.Any();
|
||||
var context = new FilterExecutionContext<Update>(new TelegramBotInfo(null), new Update(), new Update(), new Dictionary<string, object>(), new CompletedFiltersList());
|
||||
// Arrange (Given) - подготовка тестовых данных
|
||||
var anyFilter = Filter<Update>.Any();
|
||||
var context = new FilterExecutionContext<Update>(new TelegramBotInfo(null), new Update(), new Update(), new Dictionary<string, object>(), new CompletedFiltersList());
|
||||
|
||||
// Act (When) - выполнение тестируемого действия
|
||||
var result = anyFilter.CanPass(context);
|
||||
// Act (When) - выполнение тестируемого действия
|
||||
var result = anyFilter.CanPass(context);
|
||||
|
||||
// Assert (Then) - проверка результата
|
||||
result.Should().BeTrue();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для ReverseFilter - инвертирование результата фильтра.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем композицию фильтров и логику инверсии
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void ReverseFilter_ShouldInvertResult()
|
||||
{
|
||||
// Arrange
|
||||
var alwaysTrueFilter = Filter<Update>.Any();
|
||||
var reverseFilter = alwaysTrueFilter.Not();
|
||||
var context = new FilterExecutionContext<Update>(new TelegramBotInfo(null), new Update(), new Update(), new Dictionary<string, object>(), new CompletedFiltersList());
|
||||
|
||||
// Act
|
||||
var result = reverseFilter.CanPass(context);
|
||||
|
||||
// Assert
|
||||
result.Should().BeFalse();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для AndFilter - логическое И между фильтрами.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем комбинирование фильтров и логику И
|
||||
/// </summary>
|
||||
[Theory]
|
||||
[InlineData(true, true, true)] // Оба фильтра проходят
|
||||
[InlineData(true, false, false)] // Первый проходит, второй нет
|
||||
[InlineData(false, true, false)] // Первый не проходит, второй проходит
|
||||
[InlineData(false, false, false)] // Оба фильтра не проходят
|
||||
public void AndFilter_ShouldCombineFiltersWithAndLogic(bool firstResult, bool secondResult, bool expectedResult)
|
||||
{
|
||||
// Arrange
|
||||
var firstFilter = Filter<Update>.If(_ => firstResult);
|
||||
var secondFilter = Filter<Update>.If(_ => secondResult);
|
||||
var andFilter = firstFilter.And(secondFilter);
|
||||
var context = new FilterExecutionContext<Update>(new TelegramBotInfo(null), new Update(), new Update(), new Dictionary<string, object>(), new CompletedFiltersList());
|
||||
|
||||
// Act
|
||||
var result = andFilter.CanPass(context);
|
||||
|
||||
// Assert
|
||||
result.Should().Be(expectedResult);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для OrFilter - логическое ИЛИ между фильтрами.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем комбинирование фильтров и логику ИЛИ
|
||||
/// </summary>
|
||||
[Theory]
|
||||
[InlineData(true, true, true)] // Оба фильтра проходят
|
||||
[InlineData(true, false, true)] // Первый проходит, второй нет
|
||||
[InlineData(false, true, true)] // Первый не проходит, второй проходит
|
||||
[InlineData(false, false, false)] // Оба фильтра не проходят
|
||||
public void OrFilter_ShouldCombineFiltersWithOrLogic(bool firstResult, bool secondResult, bool expectedResult)
|
||||
{
|
||||
// Arrange
|
||||
var firstFilter = Filter<Update>.If(_ => firstResult);
|
||||
var secondFilter = Filter<Update>.If(_ => secondResult);
|
||||
var orFilter = firstFilter.Or(secondFilter);
|
||||
var context = new FilterExecutionContext<Update>(new TelegramBotInfo(null), new Update(), new Update(), new Dictionary<string, object>(), new CompletedFiltersList());
|
||||
|
||||
// Act
|
||||
var result = orFilter.CanPass(context);
|
||||
|
||||
// Assert
|
||||
result.Should().Be(expectedResult);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для CompiledFilter - компиляция нескольких фильтров.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем сложную композицию фильтров
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void CompiledFilter_ShouldPassOnlyWhenAllFiltersPass()
|
||||
{
|
||||
// Arrange
|
||||
var filter1 = Filter<Update>.If(_ => true);
|
||||
var filter2 = Filter<Update>.If(_ => true);
|
||||
var filter3 = Filter<Update>.If(_ => false);
|
||||
|
||||
var compiledFilter = new CompiledFilter<Update>(filter1, filter2, filter3);
|
||||
var context = new FilterExecutionContext<Update>(new TelegramBotInfo(null), new Update(), new Update(), new Dictionary<string, object>(), new CompletedFiltersList());
|
||||
|
||||
// Act
|
||||
var result = compiledFilter.CanPass(context);
|
||||
|
||||
// Assert
|
||||
result.Should().BeFalse(); // Должен вернуть false, так как filter3 возвращает false
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для проверки IsCollectible свойства.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем свойства объектов
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void Filter_IsCollectible_ShouldBeTrueForAnyFilter()
|
||||
{
|
||||
// Arrange
|
||||
var anyFilter = Filter<Update>.Any();
|
||||
|
||||
// Act
|
||||
var isCollectible = anyFilter.IsCollectible;
|
||||
|
||||
// Assert
|
||||
isCollectible.Should().BeFalse();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для FunctionFilter - фильтр на основе функции.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем создание фильтров из функций
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void FunctionFilter_ShouldUseProvidedFunction()
|
||||
{
|
||||
// Arrange
|
||||
var wasCalled = false;
|
||||
var functionFilter = Filter<Update>.If(_ =>
|
||||
{
|
||||
wasCalled = true;
|
||||
return true;
|
||||
});
|
||||
var context = new FilterExecutionContext<Update>(new TelegramBotInfo(null), new Update(), new Update(), new Dictionary<string, object>(), new CompletedFiltersList());
|
||||
|
||||
// Act
|
||||
var result = functionFilter.CanPass(context);
|
||||
|
||||
// Assert
|
||||
result.Should().BeTrue();
|
||||
wasCalled.Should().BeTrue();
|
||||
}
|
||||
// Assert (Then) - проверка результата
|
||||
result.Should().BeTrue();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для ReverseFilter - инвертирование результата фильтра.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем композицию фильтров и логику инверсии
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void ReverseFilter_ShouldInvertResult()
|
||||
{
|
||||
// Arrange
|
||||
var alwaysTrueFilter = Filter<Update>.Any();
|
||||
var reverseFilter = alwaysTrueFilter.Not();
|
||||
var context = new FilterExecutionContext<Update>(new TelegramBotInfo(null), new Update(), new Update(), new Dictionary<string, object>(), new CompletedFiltersList());
|
||||
|
||||
// Act
|
||||
var result = reverseFilter.CanPass(context);
|
||||
|
||||
// Assert
|
||||
result.Should().BeFalse();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для AndFilter - логическое И между фильтрами.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем комбинирование фильтров и логику И
|
||||
/// </summary>
|
||||
[Theory]
|
||||
[InlineData(true, true, true)] // Оба фильтра проходят
|
||||
[InlineData(true, false, false)] // Первый проходит, второй нет
|
||||
[InlineData(false, true, false)] // Первый не проходит, второй проходит
|
||||
[InlineData(false, false, false)] // Оба фильтра не проходят
|
||||
public void AndFilter_ShouldCombineFiltersWithAndLogic(bool firstResult, bool secondResult, bool expectedResult)
|
||||
{
|
||||
// Arrange
|
||||
var firstFilter = Filter<Update>.If(_ => firstResult);
|
||||
var secondFilter = Filter<Update>.If(_ => secondResult);
|
||||
var andFilter = firstFilter.And(secondFilter);
|
||||
var context = new FilterExecutionContext<Update>(new TelegramBotInfo(null), new Update(), new Update(), new Dictionary<string, object>(), new CompletedFiltersList());
|
||||
|
||||
// Act
|
||||
var result = andFilter.CanPass(context);
|
||||
|
||||
// Assert
|
||||
result.Should().Be(expectedResult);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для OrFilter - логическое ИЛИ между фильтрами.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем комбинирование фильтров и логику ИЛИ
|
||||
/// </summary>
|
||||
[Theory]
|
||||
[InlineData(true, true, true)] // Оба фильтра проходят
|
||||
[InlineData(true, false, true)] // Первый проходит, второй нет
|
||||
[InlineData(false, true, true)] // Первый не проходит, второй проходит
|
||||
[InlineData(false, false, false)] // Оба фильтра не проходят
|
||||
public void OrFilter_ShouldCombineFiltersWithOrLogic(bool firstResult, bool secondResult, bool expectedResult)
|
||||
{
|
||||
// Arrange
|
||||
var firstFilter = Filter<Update>.If(_ => firstResult);
|
||||
var secondFilter = Filter<Update>.If(_ => secondResult);
|
||||
var orFilter = firstFilter.Or(secondFilter);
|
||||
var context = new FilterExecutionContext<Update>(new TelegramBotInfo(null), new Update(), new Update(), new Dictionary<string, object>(), new CompletedFiltersList());
|
||||
|
||||
// Act
|
||||
var result = orFilter.CanPass(context);
|
||||
|
||||
// Assert
|
||||
result.Should().Be(expectedResult);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для CompiledFilter - компиляция нескольких фильтров.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем сложную композицию фильтров
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void CompiledFilter_ShouldPassOnlyWhenAllFiltersPass()
|
||||
{
|
||||
// Arrange
|
||||
var filter1 = Filter<Update>.If(_ => true);
|
||||
var filter2 = Filter<Update>.If(_ => true);
|
||||
var filter3 = Filter<Update>.If(_ => false);
|
||||
|
||||
var compiledFilter = new CompiledFilter<Update>(filter1, filter2, filter3);
|
||||
var context = new FilterExecutionContext<Update>(new TelegramBotInfo(null), new Update(), new Update(), new Dictionary<string, object>(), new CompletedFiltersList());
|
||||
|
||||
// Act
|
||||
var result = compiledFilter.CanPass(context);
|
||||
|
||||
// Assert
|
||||
result.Should().BeFalse(); // Должен вернуть false, так как filter3 возвращает false
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для проверки IsCollectible свойства.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем свойства объектов
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void Filter_IsCollectible_ShouldBeTrueForAnyFilter()
|
||||
{
|
||||
// Arrange
|
||||
var anyFilter = Filter<Update>.Any();
|
||||
|
||||
// Act
|
||||
var isCollectible = anyFilter.IsCollectible;
|
||||
|
||||
// Assert
|
||||
isCollectible.Should().BeFalse();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Тест для FunctionFilter - фильтр на основе функции.
|
||||
///
|
||||
/// ПРИНЦИП: Тестируем создание фильтров из функций
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void FunctionFilter_ShouldUseProvidedFunction()
|
||||
{
|
||||
// Arrange
|
||||
var wasCalled = false;
|
||||
var functionFilter = Filter<Update>.If(_ =>
|
||||
{
|
||||
wasCalled = true;
|
||||
return true;
|
||||
});
|
||||
var context = new FilterExecutionContext<Update>(new TelegramBotInfo(null), new Update(), new Update(), new Dictionary<string, object>(), new CompletedFiltersList());
|
||||
|
||||
// Act
|
||||
var result = functionFilter.CanPass(context);
|
||||
|
||||
// Assert
|
||||
result.Should().BeTrue();
|
||||
wasCalled.Should().BeTrue();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user