Skip to content

fix: показывать вывод программы студента на панели «вывод»#392

Merged
fey merged 2 commits into
mainfrom
fix/output-panel-stdout
Jul 2, 2026
Merged

fix: показывать вывод программы студента на панели «вывод»#392
fey merged 2 commits into
mainfrom
fix/output-panel-stdout

Conversation

@fey

@fey fey commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Проблема

На панели «вывод» в PHP-уроках студент не видел результат своего кода — только отчёт pretty-print (Collision) и зелёную цитату. Аналог уже починенного в Python (#370) и JavaScript (#853).

Панель показывает дословный stdout от make test (→ PHPUnit). Тесты «выводных» уроков глушили вывод строкой:

$this->expectOutputString($expected);

PHPUnit буферизует stdout студента, сверяет через assertSame и молча отбрасывает. Обратно в терминал PHPUnit печатает только «неожиданный» вывод, а expectOutputString делает вывод «ожидаемым» → на панель он не попадает.

Решение

Централизованно в src/TestCase.php (там решение и так подключается через require):

  • оборачиваем require Solution.php в собственный ob_start() / ob_get_clean() — вывод студента попадает в наш буфер (не в буфер PHPUnit, поэтому нет «risky» при failOnRisky=true);
  • печатаем перехваченное через fwrite(STDOUT, …) — в обход буферизации PHPUnit → попадает на панель (аналог print(out) с capsys.disabled() в Python и снятого мока в JS);
  • добавили хелперы assertOutput($expected) (сверка с выводом из require) и assertOutputOf(callable, $expected) — для уроков, где вывод даёт вызов функции.

В тестах:

  • 41 выводной урок: expectOutputStringassertOutput;
  • 35-calling-functions/270-deterministic: getActualOutputForAssertion()assertOutput (перехват переехал в базовый класс);
  • 2 Group-B (40-define-functions/100-define-function, 50-loops/10-while), где тест вызывает функцию решения → assertOutputOf(fn () => …, $expected).

Наглядно (урок 10-hello-world):

вариант панель
было (expectOutputString) (только отчёт Collision + цитата)
стало Hello, World! + отчёт

Область изменений

  • src/TestCase.php — перехват + fwrite(STDOUT) + хелперы.
  • 42 SolutionTest.php — переход на новые хелперы.

Не менялись: «возвратные» уроки (проверяют возвращаемое значение функции — вывода нет) и курс Java (там вывод уже доходит до панели, правка не нужна).

Проверка

  • Чистый вывод на всех типах уроков (Hello, World!, многострочный heredoc, countdown, случайное число deterministic).
  • make compose-test — вся сюита зелёная (72 урока).
  • make compose-code-lint (php-cs-fixer check) — без ошибок (exit 0).

🤖 Generated with Claude Code

fey and others added 2 commits July 2, 2026 18:58
Тесты выводных уроков глушили вывод: $this->expectOutputString($expected)
буферизует stdout студента и молча отбрасывает после assertSame. PHPUnit
переиздаёт только «неожиданный» вывод, а expectOutputString делает его
«ожидаемым» → на панель он не попадал (студент видел только отчёт).

Централизовали перехват в src/TestCase.php: require Solution.php оборачиваем
в ob_start/ob_get_clean и печатаем перехваченное через fwrite(STDOUT) в обход
буфера PHPUnit — так оно попадает на панель. Добавили хелперы assertOutput()
и assertOutputOf() (для уроков, где вывод даёт вызов функции). В выводных
тестах expectOutputString → assertOutput; deterministic переведён с
getActualOutputForAssertion на assertOutput, два Group-B (define-function,
while) — на assertOutputOf.

Аналог фиксов Python (#370) и JavaScript (#853). Возвратные уроки и курс Java
не менялись.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Документированы назначение класса, $solutionOutput, setUp() (перехват вывода
решения и печать его на панель через fwrite(STDOUT)), assertOutput() и
assertOutputOf() — с акцентом на неочевидную механику вывода на панель.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@fey fey merged commit 09919d4 into main Jul 2, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant