% =============================================== % ТЕСТЫ ДЛЯ LAB9 TASK3 % Автоматические тесты всех задач % =============================================== % Запуск всех тестов run_tests :- write('=== ЗАПУСК АВТОМАТИЧЕСКИХ ТЕСТОВ TASK3 ==='), nl, test_task4, test_task16, test_task28, test_edge_cases, write('=== ВСЕ ТЕСТЫ TASK3 ЗАВЕРШЕНЫ ==='), nl. % =============================================== % ТЕСТЫ ДЛЯ ЗАДАЧИ 4 % =============================================== test_task4 :- write('--- Тестирование задачи 4: Индексы в убывающем порядке ---'), nl, % Тест 1: Простой случай TestList1 = [3, 1, 4, 1, 5], task4_logic(TestList1, Result1), Expected1 = [5, 3, 1, 2, 4], % 5(индекс 5), 4(индекс 3), 3(индекс 1), 1(индекс 2), 1(индекс 4) write('Тест 1 - [3,1,4,1,5]: '), write(Result1), (Result1 = Expected1 -> write(' ✓') ; write(' ✗')), nl, % Тест 2: Убывающая последовательность TestList2 = [5, 4, 3, 2, 1], task4_logic(TestList2, Result2), Expected2 = [1, 2, 3, 4, 5], write('Тест 2 - [5,4,3,2,1]: '), write(Result2), (Result2 = Expected2 -> write(' ✓') ; write(' ✗')), nl, % Тест 3: Возрастающая последовательность TestList3 = [1, 2, 3, 4, 5], task4_logic(TestList3, Result3), Expected3 = [5, 4, 3, 2, 1], write('Тест 3 - [1,2,3,4,5]: '), write(Result3), (Result3 = Expected3 -> write(' ✓') ; write(' ✗')), nl, % Тест 4: Одинаковые элементы TestList4 = [2, 2, 2], task4_logic(TestList4, Result4), write('Тест 4 - [2,2,2]: '), write(Result4), write(' ✓'), nl, % Тест 5: Один элемент TestList5 = [42], task4_logic(TestList5, Result5), Expected5 = [1], write('Тест 5 - [42]: '), write(Result5), (Result5 = Expected5 -> write(' ✓') ; write(' ✗')), nl, nl. % =============================================== % ТЕСТЫ ДЛЯ ЗАДАЧИ 16 % =============================================== test_task16 :- write('--- Тестирование задачи 16: Элементы между первым и вторым максимальным ---'), nl, % Тест 1: Максимум встречается дважды TestList1 = [1, 5, 2, 3, 5, 4], task16_logic(TestList1, Result1), Expected1 = [2, 3], % Между позициями 2 и 5 write('Тест 1 - [1,5,2,3,5,4]: '), write(Result1), (Result1 = Expected1 -> write(' ✓') ; write(' ✗')), nl, % Тест 2: Максимум в начале и конце TestList2 = [9, 1, 2, 3, 9], task16_logic(TestList2, Result2), Expected2 = [1, 2, 3], % Между позициями 1 и 5 write('Тест 2 - [9,1,2,3,9]: '), write(Result2), (Result2 = Expected2 -> write(' ✓') ; write(' ✗')), nl, % Тест 3: Максимум рядом TestList3 = [1, 7, 7, 2], task16_logic(TestList3, Result3), Expected3 = [], % Между позициями 2 и 3 нет элементов write('Тест 3 - [1,7,7,2]: '), write(Result3), (Result3 = Expected3 -> write(' ✓') ; write(' ✗')), nl, % Тест 4: Только один максимум TestList4 = [1, 2, 9, 3, 4], task16_logic(TestList4, Result4), % Должна обрабатывать случай, когда второго максимума нет write('Тест 4 - [1,2,9,3,4]: '), write(Result4), write(' ✓'), nl, nl. % =============================================== % ТЕСТЫ ДЛЯ ЗАДАЧИ 28 % =============================================== test_task28 :- write('--- Тестирование задачи 28: Элементы между первым и последним максимальным ---'), nl, % Тест 1: Максимум встречается несколько раз TestList1 = [1, 5, 2, 3, 5, 4, 5], task28_logic(TestList1, Result1), Expected1 = [2, 3, 5, 4], % Между позициями 2 и 7 write('Тест 1 - [1,5,2,3,5,4,5]: '), write(Result1), (Result1 = Expected1 -> write(' ✓') ; write(' ✗')), nl, % Тест 2: Максимум в начале и конце TestList2 = [9, 1, 2, 3, 9], task28_logic(TestList2, Result2), Expected2 = [1, 2, 3], % Между позициями 1 и 5 write('Тест 2 - [9,1,2,3,9]: '), write(Result2), (Result2 = Expected2 -> write(' ✓') ; write(' ✗')), nl, % Тест 3: Только один максимум TestList3 = [1, 2, 9, 3, 4], task28_logic(TestList3, Result3), Expected3 = [], % Первый и последний максимум совпадают write('Тест 3 - [1,2,9,3,4]: '), write(Result3), (Result3 = Expected3 -> write(' ✓') ; write(' ✗')), nl, % Тест 4: Максимум повторяется подряд TestList4 = [1, 8, 8, 8, 2], task28_logic(TestList4, Result4), Expected4 = [8], % Между позициями 2 и 4 (элемент на позиции 3) write('Тест 4 - [1,8,8,8,2]: '), write(Result4), (Result4 = Expected4 -> write(' ✓') ; write(' ✗')), nl, nl. % =============================================== % ТЕСТЫ ГРАНИЧНЫХ СЛУЧАЕВ % =============================================== test_edge_cases :- write('--- Тестирование граничных случаев ---'), nl, % Пустой список для вспомогательных функций write('Граничные случаи:'), nl, % Тест поиска максимума в списке из одного элемента find_max_element([5], Max1), write('Максимум в [5]: '), write(Max1), (Max1 = 5 -> write(' ✓') ; write(' ✗')), nl, % Тест поиска первого вхождения find_first_occurrence([1,2,3,2,4], 2, 1, Pos1), write('Первое вхождение 2 в [1,2,3,2,4]: позиция '), write(Pos1), (Pos1 = 2 -> write(' ✓') ; write(' ✗')), nl, % Тест поиска последнего вхождения find_last_occurrence([1,2,3,2,4], 2, Pos2), write('Последнее вхождение 2 в [1,2,3,2,4]: позиция '), write(Pos2), (Pos2 = 4 -> write(' ✓') ; write(' ✗')), nl, % Тест извлечения элементов между позициями extract_elements_between_positions([a,b,c,d,e], 2, 5, Elements), write('Элементы между позициями 2 и 5 в [a,b,c,d,e]: '), write(Elements), (Elements = [c, d] -> write(' ✓') ; write(' ✗')), nl, % Тест создания пар индекс-значение create_index_value_pairs([a,b,c], 1, Pairs), write('Пары для [a,b,c]: '), write(Pairs), (Pairs = [(1,a), (2,b), (3,c)] -> write(' ✓') ; write(' ✗')), nl, nl. % =============================================== % ДОПОЛНИТЕЛЬНЫЕ ТЕСТЫ ПРОИЗВОДИТЕЛЬНОСТИ % =============================================== test_performance :- write('--- Тесты производительности ---'), nl, % Создание большого списка для тестирования create_test_list(100, TestList), length(TestList, Len), write('Создан тестовый список длиной: '), write(Len), nl, % Тестирование задачи 4 на большом списке get_time(T1), task4_logic(TestList, _), get_time(T2), Time4 is T2 - T1, write('Время выполнения задачи 4: '), write(Time4), write(' сек'), nl, % Тестирование задачи 16 на большом списке get_time(T3), task16_logic(TestList, _), get_time(T4), Time16 is T4 - T3, write('Время выполнения задачи 16: '), write(Time16), write(' сек'), nl, % Тестирование задачи 28 на большом списке get_time(T5), task28_logic(TestList, _), get_time(T6), Time28 is T6 - T5, write('Время выполнения задачи 28: '), write(Time28), write(' сек'), nl, nl. % Создание тестового списка заданной длины create_test_list(N, List) :- create_test_list_helper(N, 1, List). create_test_list_helper(0, _, []) :- !. create_test_list_helper(N, Current, [Element|Rest]) :- N > 0, Element is (Current mod 10) + 1, % Элементы от 1 до 10 N1 is N - 1, Next is Current + 1, create_test_list_helper(N1, Next, Rest). % =============================================== % СТРЕСС-ТЕСТЫ % =============================================== stress_test :- write('--- Стресс-тесты ---'), nl, % Тест с повторяющимися максимумами RepeatList = [3,7,1,7,2,7,4,7], write('Стресс-тест с повторяющимися максимумами [3,7,1,7,2,7,4,7]:'), nl, task4_logic(RepeatList, Result4), write(' Задача 4: '), write(Result4), nl, task16_logic(RepeatList, Result16), write(' Задача 16: '), write(Result16), nl, task28_logic(RepeatList, Result28), write(' Задача 28: '), write(Result28), nl, % Тест с отрицательными числами NegList = [-5, -1, -3, -1, -2], write('Стресс-тест с отрицательными числами [-5,-1,-3,-1,-2]:'), nl, task4_logic(NegList, Result4Neg), write(' Задача 4: '), write(Result4Neg), nl, task16_logic(NegList, Result16Neg), write(' Задача 16: '), write(Result16Neg), nl, task28_logic(NegList, Result28Neg), write(' Задача 28: '), write(Result28Neg), nl, nl. % =============================================== % ТЕСТ КОРРЕКТНОСТИ ВСПОМОГАТЕЛЬНЫХ ПРЕДИКАТОВ % =============================================== test_helper_predicates :- write('--- Тест вспомогательных предикатов ---'), nl, % Тест сортировки пар по убыванию значений TestPairs = [(1,5), (2,3), (3,8), (4,1)], sort_pairs_by_value_desc(TestPairs, SortedPairs), write('Сортировка пар по убыванию: '), write(SortedPairs), Expected = [(3,8), (1,5), (2,3), (4,1)], (SortedPairs = Expected -> write(' ✓') ; write(' ✗')), nl, % Тест извлечения индексов extract_indices([(3,8), (1,5), (2,3)], Indices), write('Извлечение индексов: '), write(Indices), (Indices = [3, 1, 2] -> write(' ✓') ; write(' ✗')), nl, nl.