* Added missing summaries

This commit is contained in:
2026-03-07 00:17:31 +04:00
parent 1ebf4ec22a
commit 3cdc058fb5
18 changed files with 1045 additions and 964 deletions
@@ -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));
}
}
+161 -162
View File
@@ -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();
}
}