]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - tests/PHPUnit/Util/Log/JSON.php
Added unit tests.
[Github/sugarcrm.git] / tests / PHPUnit / Util / Log / JSON.php
1 <?php
2 /**
3  * PHPUnit
4  *
5  * Copyright (c) 2002-2009, Sebastian Bergmann <sb@sebastian-bergmann.de>.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  *   * Redistributions of source code must retain the above copyright
13  *     notice, this list of conditions and the following disclaimer.
14  *
15  *   * Redistributions in binary form must reproduce the above copyright
16  *     notice, this list of conditions and the following disclaimer in
17  *     the documentation and/or other materials provided with the
18  *     distribution.
19  *
20  *   * Neither the name of Sebastian Bergmann nor the names of his
21  *     contributors may be used to endorse or promote products derived
22  *     from this software without specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
27  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
28  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
29  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
30  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
34  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35  * POSSIBILITY OF SUCH DAMAGE.
36  *
37  * @category   Testing
38  * @package    PHPUnit
39  * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
40  * @copyright  2002-2009 Sebastian Bergmann <sb@sebastian-bergmann.de>
41  * @license    http://www.opensource.org/licenses/bsd-license.php  BSD License
42
43  * @link       http://www.phpunit.de/
44  * @since      File available since Release 3.0.0
45  */
46
47 require_once 'PHPUnit/Framework.php';
48 require_once 'PHPUnit/Util/Filter.php';
49 require_once 'PHPUnit/Util/Printer.php';
50 require_once 'PHPUnit/Util/Test.php';
51
52 PHPUnit_Util_Filter::addFileToFilter(__FILE__, 'PHPUNIT');
53
54 /**
55  * A TestListener that generates JSON messages.
56  *
57  * @category   Testing
58  * @package    PHPUnit
59  * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
60  * @copyright  2002-2009 Sebastian Bergmann <sb@sebastian-bergmann.de>
61  * @license    http://www.opensource.org/licenses/bsd-license.php  BSD License
62  * @version    Release: 3.3.17
63  * @link       http://www.phpunit.de/
64  * @since      Class available since Release 3.0.0
65  */
66 class PHPUnit_Util_Log_JSON extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener
67 {
68     /**
69      * @var    string
70      */
71     protected $currentTestSuiteName = '';
72
73     /**
74      * @var    string
75      */
76     protected $currentTestName = '';
77
78     /**
79      * @var     boolean
80      * @access  private
81      */
82     protected $currentTestPass = TRUE;
83
84     /**
85      * An error occurred.
86      *
87      * @param  PHPUnit_Framework_Test $test
88      * @param  Exception              $e
89      * @param  float                  $time
90      */
91     public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
92     {
93         $this->writeCase(
94           'error',
95           $time,
96           PHPUnit_Util_Filter::getFilteredStacktrace(
97             $e,
98             TRUE,
99             FALSE
100           ),
101           $e->getMessage()
102         );
103
104         $this->currentTestPass = FALSE;
105     }
106
107     /**
108      * A failure occurred.
109      *
110      * @param  PHPUnit_Framework_Test                 $test
111      * @param  PHPUnit_Framework_AssertionFailedError $e
112      * @param  float                                  $time
113      */
114     public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
115     {
116         $this->writeCase(
117           'fail',
118           $time,
119           PHPUnit_Util_Filter::getFilteredStacktrace(
120             $e,
121             TRUE,
122             FALSE
123           ),
124           $e->getMessage()
125         );
126
127         $this->currentTestPass = FALSE;
128     }
129
130     /**
131      * Incomplete test.
132      *
133      * @param  PHPUnit_Framework_Test $test
134      * @param  Exception              $e
135      * @param  float                  $time
136      */
137     public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
138     {
139         $this->writeCase('error', $time, array(), 'Incomplete Test');
140
141         $this->currentTestPass = FALSE;
142     }
143
144     /**
145      * Skipped test.
146      *
147      * @param  PHPUnit_Framework_Test $test
148      * @param  Exception              $e
149      * @param  float                  $time
150      */
151     public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
152     {
153         $this->writeCase('error', $time, array(), 'Skipped Test');
154
155         $this->currentTestPass = FALSE;
156     }
157
158     /**
159      * A testsuite started.
160      *
161      * @param  PHPUnit_Framework_TestSuite $suite
162      */
163     public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
164     {
165         $this->currentTestSuiteName = $suite->getName();
166         $this->currentTestName      = '';
167
168         $message = array(
169           'event' => 'suiteStart',
170           'suite' => $this->currentTestSuiteName,
171           'tests' => count($suite)
172         );
173
174         $this->write($this->encode($message));
175     }
176
177     /**
178      * A testsuite ended.
179      *
180      * @param  PHPUnit_Framework_TestSuite $suite
181      */
182     public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
183     {
184         $this->currentTestSuiteName = '';
185         $this->currentTestName      = '';
186     }
187
188     /**
189      * A test started.
190      *
191      * @param  PHPUnit_Framework_Test $test
192      */
193     public function startTest(PHPUnit_Framework_Test $test)
194     {
195         $this->currentTestName = PHPUnit_Util_Test::describe($test);
196         $this->currentTestPass = TRUE;
197     }
198
199     /**
200      * A test ended.
201      *
202      * @param  PHPUnit_Framework_Test $test
203      * @param  float                  $time
204      */
205     public function endTest(PHPUnit_Framework_Test $test, $time)
206     {
207         if ($this->currentTestPass) {
208             $this->writeCase('pass', $time);
209         }
210     }
211
212     /**
213      * @param string $status
214      * @param float  $time
215      * @param array  $trace
216      * @param string $message
217      */
218     protected function writeCase($status, $time, array $trace = array(), $message = '')
219     {
220         $message = array(
221           'event'   => 'test',
222           'suite'   => $this->currentTestSuiteName,
223           'test'    => $this->currentTestName,
224           'status'  => $status,
225           'time'    => $time,
226           'trace'   => $trace,
227           'message' => $message
228         );
229
230         $this->write($this->encode($message));
231     }
232
233     /**
234      * @param  array $message
235      * @return string
236      */
237     protected function encode($message)
238     {
239         if (function_exists('json_encode')) {
240             return json_encode($message);
241         }
242
243         $first  = TRUE;
244         $result = '';
245
246         if (is_scalar($message)) {
247             $message = array ($message);
248         }
249
250         foreach ($message as $key => $value) {
251             if (!$first) {
252                 $result .= ',';
253             } else {
254                 $first = FALSE;
255             }
256
257             $result .= sprintf('"%s":', $this->escape($key));
258
259             if (is_array($value) || is_object($value)) {
260                 $result .= sprintf('%s', $this->encode($value));
261             } else {
262                 $result .= sprintf('"%s"', $this->escape($value));
263             }
264         }
265
266         return '{' . $result . '}';
267     }
268
269     /**
270      * @param  string $value
271      * @return string
272      */
273     protected function escape($value)
274     {
275         return str_replace(
276           array("\\",   "\"", "/",  "\b", "\f", "\n", "\r", "\t"),
277           array('\\\\', '\"', '\/', '\b', '\f', '\n', '\r', '\t'),
278           $value
279         );
280     }
281 }
282 ?>