Files
Telegrator/tests/Telegrator.Tests/Collections/CollectionTests.cs
T

317 lines
9.5 KiB
C#
Raw Normal View History

2025-07-24 23:19:59 +04:00
using FluentAssertions;
using Telegram.Bot.Types.Enums;
2026-03-06 23:19:24 +04:00
using Telegrator.Core.Descriptors;
2026-03-06 23:27:11 +04:00
using Telegrator.Core.Filters;
2025-07-24 23:19:59 +04:00
using Xunit;
2026-03-07 00:17:31 +04:00
namespace Telegrator.Tests.Collections;
/// <summary>
/// Тесты для коллекций.
///
/// ПАРАДИГМЫ ТЕСТИРОВАНИЯ:
/// 1. Collection Testing - тестирование коллекций и их операций
/// 2. List Testing - тестирование списков
/// 3. Indexing Testing - тестирование индексации
/// 4. Enumeration Testing - тестирование перечисления
/// 5. Capacity Testing - тестирование емкости коллекций
/// </summary>
public class CollectionTests
2025-07-24 23:19:59 +04:00
{
/// <summary>
2026-03-07 00:17:31 +04:00
/// Тест для HandlerDescriptorList - создание списка.
2025-07-24 23:19:59 +04:00
///
2026-03-07 00:17:31 +04:00
/// ПРИНЦИП: Тестируем создание коллекций
2025-07-24 23:19:59 +04:00
/// </summary>
2026-03-07 00:17:31 +04:00
[Fact]
public void HandlerDescriptorList_ShouldBeCreated()
2025-07-24 23:19:59 +04:00
{
2026-03-07 00:17:31 +04:00
// Arrange & Act
var list = new HandlerDescriptorList();
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
// Assert
list.Should().NotBeNull();
list.Should().BeEmpty();
}
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
/// <summary>
/// Тест для HandlerDescriptorList - добавление дескриптора.
///
/// ПРИНЦИП: Тестируем добавление элементов в коллекцию
/// </summary>
[Fact]
public void HandlerDescriptorList_Add_ShouldAddDescriptor()
{
// Arrange
var list = new HandlerDescriptorList();
2026-03-09 13:40:58 +04:00
var descriptor = CreateTestDescriptor();
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
// Act
list.Add(descriptor);
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
// Assert
list.Should().HaveCount(1);
list.Should().Contain(descriptor);
}
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
/// <summary>
/// Тест для HandlerDescriptorList - добавление нескольких дескрипторов.
///
/// ПРИНЦИП: Тестируем множественные операции
/// </summary>
[Fact]
public void HandlerDescriptorList_AddMultiple_ShouldAddAllDescriptors()
{
// Arrange
var list = new HandlerDescriptorList();
2026-03-09 13:40:58 +04:00
var descriptor1 = CreateTestDescriptor();
var descriptor2 = CreateTestDescriptor();
var descriptor3 = CreateTestDescriptor();
2026-03-07 00:17:31 +04:00
// 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);
}
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
/// <summary>
/// Тест для HandlerDescriptorList - получение по индексу.
///
/// ПРИНЦИП: Тестируем индексацию коллекций
/// </summary>
[Fact]
public void HandlerDescriptorList_Indexer_ShouldReturnDescriptorAtIndex()
{
// Arrange
2026-03-09 13:40:58 +04:00
var descriptor = CreateTestDescriptor();
2026-03-07 00:17:31 +04:00
var list = new HandlerDescriptorList
2025-07-24 23:19:59 +04:00
{
2026-03-07 00:17:31 +04:00
descriptor
};
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
// Act
var result = list[0];
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
// Assert
result.Should().Be(descriptor);
}
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
/// <summary>
/// Тест для HandlerDescriptorList - получение по неверному индексу.
///
/// ПРИНЦИП: Тестируем исключения при некорректном доступе
/// </summary>
[Theory]
[InlineData(-1)]
[InlineData(1)]
[InlineData(100)]
public void HandlerDescriptorList_IndexerWithInvalidIndex_ShouldThrowArgumentOutOfRangeException(int invalidIndex)
{
// Arrange
var list = new HandlerDescriptorList
2025-07-24 23:19:59 +04:00
{
2026-03-09 13:40:58 +04:00
CreateTestDescriptor()
2026-03-07 00:17:31 +04:00
};
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
// Act & Assert
list.Invoking(l => _ = l[invalidIndex])
.Should().Throw<ArgumentOutOfRangeException>();
}
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
/// <summary>
/// Тест для HandlerDescriptorList - перечисление элементов.
///
/// ПРИНЦИП: Тестируем перечисление коллекций
/// </summary>
[Fact]
public void HandlerDescriptorList_ShouldBeEnumerable()
{
// Arrange
2026-03-09 13:40:58 +04:00
var descriptor1 = CreateTestDescriptor();
var descriptor2 = CreateTestDescriptor();
2026-03-07 00:17:31 +04:00
var list = new HandlerDescriptorList
2025-07-24 23:19:59 +04:00
{
2026-03-07 00:17:31 +04:00
descriptor1,
descriptor2
};
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
// Act
var enumeratedItems = list.ToList();
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
// Assert
enumeratedItems.Should().HaveCount(2);
enumeratedItems.Should().Contain(descriptor1);
enumeratedItems.Should().Contain(descriptor2);
}
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
/// <summary>
/// Тест для HandlerDescriptorList - очистка списка.
///
/// ПРИНЦИП: Тестируем очистку коллекций
/// </summary>
[Fact]
public void HandlerDescriptorList_Clear_ShouldRemoveAllDescriptors()
{
// Arrange
var list = new HandlerDescriptorList
2025-07-24 23:19:59 +04:00
{
2026-03-09 13:40:58 +04:00
CreateTestDescriptor(),
CreateTestDescriptor()
2026-03-07 00:17:31 +04:00
};
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
// Act
list.Clear();
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
// Assert
list.Should().BeEmpty();
list.Should().HaveCount(0);
}
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
/// <summary>
/// Тест для HandlerDescriptorList - проверка содержания элемента.
///
/// ПРИНЦИП: Тестируем поиск в коллекциях
/// </summary>
[Fact]
public void HandlerDescriptorList_Contains_ShouldReturnCorrectResult()
{
// Arrange
var list = new HandlerDescriptorList();
2026-03-09 13:40:58 +04:00
var descriptor = CreateTestDescriptor();
var nonExistentDescriptor = CreateTestDescriptor();
2026-03-07 00:17:31 +04:00
// Act
list.Add(descriptor);
var containsExisting = list.Contains(descriptor);
var containsNonExistent = list.Contains(nonExistentDescriptor);
// Assert
containsExisting.Should().BeTrue();
containsNonExistent.Should().BeFalse();
}
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
/// <summary>
/// Тест для HandlerDescriptorList - удаление элемента.
///
/// ПРИНЦИП: Тестируем удаление элементов из коллекций
/// </summary>
[Fact]
public void HandlerDescriptorList_Remove_ShouldRemoveDescriptor()
{
// Arrange
var list = new HandlerDescriptorList();
2026-03-09 13:40:58 +04:00
var descriptor = CreateTestDescriptor();
2026-03-07 00:17:31 +04:00
list.Add(descriptor);
// Act
var removed = list.Remove(descriptor);
// Assert
removed.Should().BeTrue();
list.Should().BeEmpty();
list.Should().NotContain(descriptor);
}
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
/// <summary>
/// Тест для HandlerDescriptorList - удаление несуществующего элемента.
///
/// ПРИНЦИП: Тестируем удаление несуществующих элементов
/// </summary>
[Fact]
public void HandlerDescriptorList_RemoveNonExistent_ShouldReturnFalse()
{
// Arrange
var list = new HandlerDescriptorList();
2026-03-09 13:40:58 +04:00
var nonExistentDescriptor = CreateTestDescriptor();
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
// Act
var removed = list.Remove(nonExistentDescriptor);
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
// Assert
removed.Should().BeFalse();
list.Should().BeEmpty();
}
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
/// <summary>
/// Тест для CompletedFiltersList - создание списка.
///
/// ПРИНЦИП: Тестируем создание специализированных коллекций
/// </summary>
[Fact]
public void CompletedFiltersList_ShouldBeCreated()
{
// Arrange & Act
var list = new CompletedFiltersList();
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
// Assert
list.Should().NotBeNull();
list.Should().BeEmpty();
}
/// <summary>
/// Тест для проверки производительности коллекций.
///
/// ПРИНЦИП: Тестируем производительность при большом количестве элементов
/// </summary>
[Fact]
public void HandlerDescriptorList_ShouldHandleLargeNumberOfItems()
{
// Arrange
var list = new HandlerDescriptorList();
var itemsCount = 1000;
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
// Act
for (int i = 0; i < itemsCount; i++)
2025-07-24 23:19:59 +04:00
{
2026-03-09 13:40:58 +04:00
list.Add(CreateTestDescriptor());
2026-03-07 00:17:31 +04:00
}
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
// Assert
list.Should().HaveCount(itemsCount);
}
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
/// <summary>
/// Тест для проверки потокобезопасности (базовый тест).
///
/// ПРИНЦИП: Тестируем базовую потокобезопасность
/// </summary>
[Fact]
public async void HandlerDescriptorList_ShouldHandleConcurrentAccess()
{
// Arrange
var list = new HandlerDescriptorList();
var tasks = new List<Task>();
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
// Act
for (int i = 0; i < 10; i++)
2025-07-24 23:19:59 +04:00
{
2026-03-07 00:17:31 +04:00
tasks.Add(Task.Run(() =>
2025-07-24 23:19:59 +04:00
{
2026-03-07 00:17:31 +04:00
for (int j = 0; j < 10; j++)
2025-07-24 23:19:59 +04:00
{
2026-03-09 13:40:58 +04:00
list.Add(CreateTestDescriptor());
2026-03-07 00:17:31 +04:00
}
}));
}
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
await Task.WhenAll(tasks.ToArray());
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
// Assert
list.Should().HaveCount(100);
}
2025-07-24 23:19:59 +04:00
2026-03-07 00:17:31 +04:00
/// <summary>
/// Вспомогательный метод для создания тестового дескриптора.
/// </summary>
2026-03-09 13:40:58 +04:00
private static HandlerDescriptor CreateTestDescriptor()
2026-03-07 00:17:31 +04:00
{
return new HandlerDescriptor(DescriptorType.General, typeof(TestUpdateHandler));
2025-07-24 23:19:59 +04:00
}
2026-03-07 00:17:31 +04:00
}