Я уже несколько лет готовлю задачи для республиканской и районных олипиад по информатике у себя в стране. Конечно, сложно придумать красивую и оригинальную задачу. Но этот процесс творческий и приятный. Другое дело - писать тесты для задачи. Это работа нудная и тяжелая. Впрочем, в некоторых случаях, когда проверяются краевые условия, есть немного творчества. В ряде случаев, однако, тесты необходимо просто сгенерировать в соответствии с некоторыми условиями. Вашему вниманию представляется генератор тестов, то есть входных данных, для конкурсных задач по программированию.
Исходники приложения можно скачать с 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'
Понимаю специфику приложения и его узкое применение, однако, надеюсь, оно будет полезно не только мне.