| h1. StdSwp: интерфейс тестирования задач с интерактивным вводом-выводом |
| |
| | |
| h2. Применение |
| |
| | *{_}Применение._* Приложение {{StdSwp}} (Standard Swap) запускается тестирующей системой для задач, которые в [task.cfg|http://dl.gsu.by/doc/use/taskcfg.htm] отмечены как имеющие интерактивный тип ({{type=interactive}}). В качестве параметров ей передаются имена файлов player'а и тестируемой программы. Файл player'а должен находиться в папке задачи (файл {{player.exe}}); также для корректной обработки вывода player'а желательно наличие чекера. |
| | *{_}Применение._* Приложение [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}}; для этого следует поместить его |
| | *{_}Конфигурация._* Детали поведения {{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]. |
| |
| | _*Примеры*_ установленных задач: []. |
| | *{_}Примеры{_}* установленных задач: \[\]. |