using FluentAssertions; using Telegram.Bot.Types.Enums; using Telegrator.Core.Descriptors; using Telegrator.Filters.Components; using Xunit; namespace Telegrator.Tests.Collections { /// /// Тесты для коллекций. /// /// ПАРАДИГМЫ ТЕСТИРОВАНИЯ: /// 1. Collection Testing - тестирование коллекций и их операций /// 2. List Testing - тестирование списков /// 3. Indexing Testing - тестирование индексации /// 4. Enumeration Testing - тестирование перечисления /// 5. Capacity Testing - тестирование емкости коллекций /// public class CollectionTests { /// /// Тест для HandlerDescriptorList - создание списка. /// /// ПРИНЦИП: Тестируем создание коллекций /// [Fact] public void HandlerDescriptorList_ShouldBeCreated() { // Arrange & Act var list = new HandlerDescriptorList(); // Assert list.Should().NotBeNull(); list.Should().BeEmpty(); } /// /// Тест для HandlerDescriptorList - добавление дескриптора. /// /// ПРИНЦИП: Тестируем добавление элементов в коллекцию /// [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); } /// /// Тест для HandlerDescriptorList - добавление нескольких дескрипторов. /// /// ПРИНЦИП: Тестируем множественные операции /// [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); } /// /// Тест для HandlerDescriptorList - получение по индексу. /// /// ПРИНЦИП: Тестируем индексацию коллекций /// [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); } /// /// Тест для HandlerDescriptorList - получение по неверному индексу. /// /// ПРИНЦИП: Тестируем исключения при некорректном доступе /// [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(); } /// /// Тест для HandlerDescriptorList - перечисление элементов. /// /// ПРИНЦИП: Тестируем перечисление коллекций /// [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); } /// /// Тест для HandlerDescriptorList - очистка списка. /// /// ПРИНЦИП: Тестируем очистку коллекций /// [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); } /// /// Тест для HandlerDescriptorList - проверка содержания элемента. /// /// ПРИНЦИП: Тестируем поиск в коллекциях /// [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(); } /// /// Тест для HandlerDescriptorList - удаление элемента. /// /// ПРИНЦИП: Тестируем удаление элементов из коллекций /// [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); } /// /// Тест для HandlerDescriptorList - удаление несуществующего элемента. /// /// ПРИНЦИП: Тестируем удаление несуществующих элементов /// [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(); } /// /// Тест для CompletedFiltersList - создание списка. /// /// ПРИНЦИП: Тестируем создание специализированных коллекций /// [Fact] public void CompletedFiltersList_ShouldBeCreated() { // Arrange & Act var list = new CompletedFiltersList(); // Assert list.Should().NotBeNull(); list.Should().BeEmpty(); } /// /// Тест для проверки производительности коллекций. /// /// ПРИНЦИП: Тестируем производительность при большом количестве элементов /// [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); } /// /// Тест для проверки потокобезопасности (базовый тест). /// /// ПРИНЦИП: Тестируем базовую потокобезопасность /// [Fact] public async void HandlerDescriptorList_ShouldHandleConcurrentAccess() { // Arrange var list = new HandlerDescriptorList(); var tasks = new List(); // 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); } /// /// Вспомогательный метод для создания тестового дескриптора. /// private static HandlerDescriptor CreateTestDescriptor(UpdateType updateType) { return new HandlerDescriptor(DescriptorType.General, typeof(TestUpdateHandler)); } } }