h1. StdSwp: интерфейс тестирования задач с интерактивным вводом-выводом


h2. Применение

*{_}Применение._* Приложение [StdSwp|http://dl.gsu.by/images/agulenko/stdswp.exe] (Standard Swap) запускается тестирующей системой для задач, которые в [task.cfg|http://dl.gsu.by/doc/use/taskcfg.htm] отмечены как имеющие интерактивный тип ({{type=interactive}}). В качестве параметров ей передаются имена файлов player'а и тестируемой программы. Файл player'а должен находиться в папке задачи (файл {{player.exe}}); также для корректной обработки вывода player'а желательно наличие чекера.

*{_}Поведение._* {{StdSwp}} работает следующим образом:
* считывается и обрабатывается файл конфигурации (см. _Конфигурация_);
* запускаются указанные в параметрах файлы (player и тестируемая программа), стандартные потоки ввода-вывода ({{Input}}/{{Output}} в Pascal, {{stdin}}/{{stdout}} в C/C++) этих программ перенаправляются в буфер {{StdSwp}};
* пока работают обе программы, {{StdSwp}} продолжает работу, выполняя обмен данными между программами;
* когда одна из программ завершает работу, {{StdSwp}} перенаправляет её оставшийся вывод на вход другой программе и (по умолчанию) ожидает её завершения.

h2. Настройка

*{_}Конфигурация._* Детали поведения {{StdSwp}} можно задавать, поместив в рабочую папку файл {{stdswp.cfg}}; для этого следует поместить его
в папку задачи и сделать в [task.cfg|http://dl.gsu.by/doc/use/taskcfg.htm] пометку о необходимости его копирования в директорию тестирования:
{code:title=task.cfg}
checksubject=file
checkfiles={stdswp.cfg}
{code}
Файл {{stdswp.cfg}} обрабатывается по следующим правилам:
* каждая строка обрабатывается отдельно;
* если в строке есть символ <{{\#}}>, все символы в строке начиная с него игнорируются (комментарий);
* если в строке (вне комментария) отсутствует символ <{{=}}>, она игнорируется (не соответствует формату);
* оставшиеся строки считаются представленными в следующем формате:
{code}
ИмяОпции=Значение
{code}

Распознаваемые опции:
* {{KillSolution}} (возможные значения {{Yes}} и {{No}}) - при значении {{Yes}} работа тестируемой программы завершается принудительно после завершения работы player'а, значение по умолчанию - {{No}};
* {{KillPlayer}} (возможные значения {{Yes}} и {{No}}) - при значении {{Yes}} работа player'а завершается принудительно после завершения работы тестируемой программы, значение по умолчанию - {{No}};
* {{ListenError}} (возможные значения {{Yes}} и {{No}}) - при значении {{Yes}} тестирование прерывается принудительно, если player делает вывод в stderr (предназначена для прерывания тестирования при некорректном выводе тестируемой программы, также ловит ошибки player'а), значение по умолчанию - {{Yes}}.

h2. Дополнительно

*{_}Примеры._* Пример файла {{stdswp.cfg}}:
{code:title=stdswp.cfg}
# завершить программу после остановки player'а
KillSolution=yes
# раскомментировать для завершения player'а
# после остановки программы
#KillPlayer=YES
{code}
*{_}Важные моменты._* Существуют некоторые особенности, которые следует учитывать при тестировании интерактивных задач с помощью программы {{StdSwp}}:
* поскольку стандартные потоки ввода-вывода перенаправляются системными средствами (pipe'ами) в буфер другой программы, для работы с файлами их использовать нельзя - вместо них нужно использовать файловые переменные (в Pascal) или файловые потоки (в C/C++);

* размер буфера ограничен, поэтому, если одна из программ делает многократный вывод, а другая этот вывод не читает, рано или поздно буфер будет переполнен, и обмен данными прекратится (обе программы, скорее всего, <зависнут> в ожидании ввода);

* похожая ситуация может произойти при неправильно написанном player'е или решении - каждая из двух программ будет ожидать вывода от другой (зачастую причиной ошибки может быть отсутствие {{Flush(Output)}}/{{flush(stdout)}} после операций вывода: если не принуждать программу к завершению вывода перед чтением, другая программа будет ожидать завершения вывода);

* операции ввода-вывода сами по себе занимают сравнительно длительное время, поэтому оценка длительности работы программы при множественном обмене данными вырастает на пару порядков;

* если тестируемая программа делает некорректный вывод, player'у следует отразить это в файле вывода, и +вывести что-нибудь в stderr+ (см. {{ListenError}}); если этого не сделать, то программа, скорее всего, будет ожидать ввода, пока тестирующая система не завершит её работу (в этом случае система <Дистанционного обучения> игнорирует файл вывода и сообщает, что программа была снята с выполнения по превышении лимита времени);

* если тестируемая программа завершила работу, а player продолжает ждать вывода, он будет снят с выполнения по превышении лимита времени с выдачей соответствующего сообщения;

* при групповом тестировании интерактивных задач сообщения чекера игнорируются (при реализации интерактивного типа возможность группового тестирования не учитывалась).

*{_}Исходный код{_}* программы содержится [здесь|http://dl.gsu.by/images/agulenko/stdswp.pas].

*{_}Примеры{_}* установленных задач: \[\].