Просмотр источника
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]. *{_}Примеры{_}* установленных задач: \[\]. |