Я уже несколько лет готовлю задачи для республиканской и районных олипиад по информатике у себя в стране. Конечно, сложно придумать красивую и оригинальную задачу. Но этот процесс творческий и приятный. Другое дело - писать тесты для задачи. Это работа нудная и тяжелая. Впрочем, в некоторых случаях, когда проверяются краевые условия, есть немного творчества. В ряде случаев, однако, тесты необходимо просто сгенерировать в соответствии с некоторыми условиями. Вашему вниманию представляется генератор тестов, то есть входных данных, для конкурсных задач по программированию.
Исходники приложения можно скачать с GITHUB.
Для использования генератора необходимо его скачать и собрать (позже, когда ветер будет попутным, выложу и бинарники).
Требования / зависимости утилиты:
CMake
C++17
библиотека yaml-cpp
Сборка стандартная для консольных утилит. Необходимо скачать (или склонировать) проект и в консоли выполнить следующие команды:
mkdir build cd build cmake ../src cmake --build .
После этого в папке build будет исполняемый файл testgenerator.
Для использования приложения необходимо передать ему в качестве параметра файл описания формата тестов в формате yaml, например:
./testgenerator test-spec.yml
Чтобы ознакомиться со спецификацией тестов можно выполнить команду:
./testgenerator --sample
в результате чего будет сгенерирован файл sample_test_description.yaml следующего содержания:
filename: input%.txt from: 1 to: 10 description: Test description blocks: - nr_of_lines: 1 line: - type: integer min: 1 max: 10 name: N - type: integer min: 1 max: 10 name: M - nr_of_lines: N line: - type: array size: M element: type: string min_length: 8 max_length: 8 characters: abc
Данная спецификация определяет генерацию 10 тестов с именем input%.txt соответствующих описанию:
в первой строке содержатся два целых числа N и M, 1 <= N, M, <= 10 (первый логический блок теста)
следующие N строк содержат по M строк из 8 символов, состоящих из символов abc (второй логический блок).
Более подробную спецификацию смотрите в README файле проекта.
Что можно (важно):
задавать именованные значения (переменные) для их использования в описании теста.
использовать базовые типы: целые числа, действительные числа, строки
задавать массивы базовых типов
определять минимальное и максимальное значение числовых типов
определять количество символов в строке
определять используемые в строке символы
определять несколько спецификаций тестов в одном документе yaml.
Ну, еще один пример описания тестов для задачи 2106А с CodeForces
Скрытый текст
filename: input%.txt from: 1 to: 3 description: Small blocks: - nr_of_lines: 1 line: - type: integer min: 1 max: 10 name: N - nr_of_lines: 2 line: - type: integer min: 1 max: 10 name: M - type: string min_length: M max_length: M characters: '01' --- filename: input%.txt from: 4 to: 6 description: Medium blocks: - nr_of_lines: 1 line: - type: integer min: 10 max: 100 name: N - nr_of_lines: 2 line: - type: integer min: 1 max: 10 name: M - type: string min_length: M max_length: M characters: '01' --- filename: input%.txt from: 7 to: 10 description: Large blocks: - nr_of_lines: 1 line: - type: integer min: 900 max: 1000 name: N - nr_of_lines: 2 line: - type: integer min: 1 max: 10 name: M - type: string min_length: M max_length: M characters: '01'
Понимаю специфику приложения и его узкое применение, однако, надеюсь, оно будет полезно не только мне.
