3 * This file is part of PHPUnit.
5 * (c) Sebastian Bergmann <sebastian@phpunit.de>
7 * For the full copyright and license information, please view the LICENSE
8 * file that was distributed with this source code.
12 * A TestListener that generates JSON messages.
14 * @since Class available since Release 3.0.0
16 class PHPUnit_Util_Log_JSON extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener
21 protected $currentTestSuiteName = '';
26 protected $currentTestName = '';
31 protected $currentTestPass = true;
36 * @param PHPUnit_Framework_Test $test
40 public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
45 PHPUnit_Util_Filter::getFilteredStacktrace($e, false),
50 $this->currentTestPass = false;
56 * @param PHPUnit_Framework_Test $test
57 * @param PHPUnit_Framework_AssertionFailedError $e
60 public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
65 PHPUnit_Util_Filter::getFilteredStacktrace($e, false),
70 $this->currentTestPass = false;
76 * @param PHPUnit_Framework_Test $test
80 public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
85 PHPUnit_Util_Filter::getFilteredStacktrace($e, false),
86 'Incomplete Test: ' . $e->getMessage(),
90 $this->currentTestPass = false;
96 * @param PHPUnit_Framework_Test $test
100 * @since Method available since Release 4.0.0
102 public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time)
107 PHPUnit_Util_Filter::getFilteredStacktrace($e, false),
108 'Risky Test: ' . $e->getMessage(),
112 $this->currentTestPass = false;
118 * @param PHPUnit_Framework_Test $test
119 * @param Exception $e
122 public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
127 PHPUnit_Util_Filter::getFilteredStacktrace($e, false),
128 'Skipped Test: ' . $e->getMessage(),
132 $this->currentTestPass = false;
136 * A testsuite started.
138 * @param PHPUnit_Framework_TestSuite $suite
140 public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
142 $this->currentTestSuiteName = $suite->getName();
143 $this->currentTestName = '';
147 'event' => 'suiteStart',
148 'suite' => $this->currentTestSuiteName,
149 'tests' => count($suite)
157 * @param PHPUnit_Framework_TestSuite $suite
159 public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
161 $this->currentTestSuiteName = '';
162 $this->currentTestName = '';
168 * @param PHPUnit_Framework_Test $test
170 public function startTest(PHPUnit_Framework_Test $test)
172 $this->currentTestName = PHPUnit_Util_Test::describe($test);
173 $this->currentTestPass = true;
177 'event' => 'testStart',
178 'suite' => $this->currentTestSuiteName,
179 'test' => $this->currentTestName
187 * @param PHPUnit_Framework_Test $test
190 public function endTest(PHPUnit_Framework_Test $test, $time)
192 if ($this->currentTestPass) {
193 $this->writeCase('pass', $time, array(), '', $test);
198 * @param string $status
200 * @param array $trace
201 * @param string $message
202 * @param PHPUnit_Framework_TestCase|null $test
204 protected function writeCase($status, $time, array $trace = array(), $message = '', $test = null)
207 // take care of TestSuite producing error (e.g. by running into exception) as TestSuite doesn't have hasOutput
208 if ($test !== null && method_exists($test, 'hasOutput') && $test->hasOutput()) {
209 $output = $test->getActualOutput();
214 'suite' => $this->currentTestSuiteName,
215 'test' => $this->currentTestName,
219 'message' => PHPUnit_Util_String::convertToUtf8($message),
226 * @param string $buffer
228 public function write($buffer)
230 array_walk_recursive($buffer, function (&$input) {
231 if (is_string($input)) {
232 $input = PHPUnit_Util_String::convertToUtf8($input);
238 if (defined('JSON_PRETTY_PRINT')) {
239 $flags |= JSON_PRETTY_PRINT;
242 parent::write(json_encode($buffer, $flags));