CodeIgniter installed
[living-lab-site.git] / system / libraries / Unit_test.php
1 <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
2 /**
3  * CodeIgniter
4  *
5  * An open source application development framework for PHP 5.1.6 or newer
6  *
7  * @package             CodeIgniter
8  * @author              ExpressionEngine Dev Team
9  * @copyright   Copyright (c) 2008 - 2011, EllisLab, Inc.
10  * @license             http://codeigniter.com/user_guide/license.html
11  * @link                http://codeigniter.com
12  * @since               Version 1.3.1
13  * @filesource
14  */
15
16 // ------------------------------------------------------------------------
17
18 /**
19  * Unit Testing Class
20  *
21  * Simple testing class
22  *
23  * @package             CodeIgniter
24  * @subpackage  Libraries
25  * @category    UnitTesting
26  * @author              ExpressionEngine Dev Team
27  * @link                http://codeigniter.com/user_guide/libraries/uri.html
28  */
29 class CI_Unit_test {
30
31         var $active                                     = TRUE;
32         var $results                            = array();
33         var $strict                                     = FALSE;
34         var $_template                          = NULL;
35         var $_template_rows                     = NULL;
36         var $_test_items_visible        = array();
37
38         public function __construct()
39         {
40                 // These are the default items visible when a test is run.
41                 $this->_test_items_visible = array (
42                                                         'test_name',
43                                                         'test_datatype',
44                                                         'res_datatype',
45                                                         'result',
46                                                         'file',
47                                                         'line',
48                                                         'notes'
49                                                 );
50
51                 log_message('debug', "Unit Testing Class Initialized");
52         }
53
54         // --------------------------------------------------------------------
55
56         /**
57          * Run the tests
58          *
59          * Runs the supplied tests
60          *
61          * @access      public
62          * @param       array
63          * @return      void
64          */
65         function set_test_items($items = array())
66         {
67                 if ( ! empty($items) AND is_array($items))
68                 {
69                         $this->_test_items_visible = $items;
70                 }
71         }
72
73         // --------------------------------------------------------------------
74
75         /**
76          * Run the tests
77          *
78          * Runs the supplied tests
79          *
80          * @access      public
81          * @param       mixed
82          * @param       mixed
83          * @param       string
84          * @return      string
85          */
86         function run($test, $expected = TRUE, $test_name = 'undefined', $notes = '')
87         {
88                 if ($this->active == FALSE)
89                 {
90                         return FALSE;
91                 }
92
93                 if (in_array($expected, array('is_object', 'is_string', 'is_bool', 'is_true', 'is_false', 'is_int', 'is_numeric', 'is_float', 'is_double', 'is_array', 'is_null'), TRUE))
94                 {
95                         $expected = str_replace('is_float', 'is_double', $expected);
96                         $result = ($expected($test)) ? TRUE : FALSE;
97                         $extype = str_replace(array('true', 'false'), 'bool', str_replace('is_', '', $expected));
98                 }
99                 else
100                 {
101                         if ($this->strict == TRUE)
102                                 $result = ($test === $expected) ? TRUE : FALSE;
103                         else
104                                 $result = ($test == $expected) ? TRUE : FALSE;
105
106                         $extype = gettype($expected);
107                 }
108
109                 $back = $this->_backtrace();
110
111                 $report[] = array (
112                                                         'test_name'                     => $test_name,
113                                                         'test_datatype'         => gettype($test),
114                                                         'res_datatype'          => $extype,
115                                                         'result'                        => ($result === TRUE) ? 'passed' : 'failed',
116                                                         'file'                          => $back['file'],
117                                                         'line'                          => $back['line'],
118                                                         'notes'                         => $notes
119                                                 );
120
121                 $this->results[] = $report;
122
123                 return($this->report($this->result($report)));
124         }
125
126         // --------------------------------------------------------------------
127
128         /**
129          * Generate a report
130          *
131          * Displays a table with the test data
132          *
133          * @access      public
134          * @return      string
135          */
136         function report($result = array())
137         {
138                 if (count($result) == 0)
139                 {
140                         $result = $this->result();
141                 }
142
143                 $CI =& get_instance();
144                 $CI->load->language('unit_test');
145
146                 $this->_parse_template();
147
148                 $r = '';
149                 foreach ($result as $res)
150                 {
151                         $table = '';
152
153                         foreach ($res as $key => $val)
154                         {
155                                 if ($key == $CI->lang->line('ut_result'))
156                                 {
157                                         if ($val == $CI->lang->line('ut_passed'))
158                                         {
159                                                 $val = '<span style="color: #0C0;">'.$val.'</span>';
160                                         }
161                                         elseif ($val == $CI->lang->line('ut_failed'))
162                                         {
163                                                 $val = '<span style="color: #C00;">'.$val.'</span>';
164                                         }
165                                 }
166
167                                 $temp = $this->_template_rows;
168                                 $temp = str_replace('{item}', $key, $temp);
169                                 $temp = str_replace('{result}', $val, $temp);
170                                 $table .= $temp;
171                         }
172
173                         $r .= str_replace('{rows}', $table, $this->_template);
174                 }
175
176                 return $r;
177         }
178
179         // --------------------------------------------------------------------
180
181         /**
182          * Use strict comparison
183          *
184          * Causes the evaluation to use === rather than ==
185          *
186          * @access      public
187          * @param       bool
188          * @return      null
189          */
190         function use_strict($state = TRUE)
191         {
192                 $this->strict = ($state == FALSE) ? FALSE : TRUE;
193         }
194
195         // --------------------------------------------------------------------
196
197         /**
198          * Make Unit testing active
199          *
200          * Enables/disables unit testing
201          *
202          * @access      public
203          * @param       bool
204          * @return      null
205          */
206         function active($state = TRUE)
207         {
208                 $this->active = ($state == FALSE) ? FALSE : TRUE;
209         }
210
211         // --------------------------------------------------------------------
212
213         /**
214          * Result Array
215          *
216          * Returns the raw result data
217          *
218          * @access      public
219          * @return      array
220          */
221         function result($results = array())
222         {
223                 $CI =& get_instance();
224                 $CI->load->language('unit_test');
225
226                 if (count($results) == 0)
227                 {
228                         $results = $this->results;
229                 }
230
231                 $retval = array();
232                 foreach ($results as $result)
233                 {
234                         $temp = array();
235                         foreach ($result as $key => $val)
236                         {
237                                 if ( ! in_array($key, $this->_test_items_visible))
238                                 {
239                                         continue;
240                                 }
241
242                                 if (is_array($val))
243                                 {
244                                         foreach ($val as $k => $v)
245                                         {
246                                                 if (FALSE !== ($line = $CI->lang->line(strtolower('ut_'.$v))))
247                                                 {
248                                                         $v = $line;
249                                                 }
250                                                 $temp[$CI->lang->line('ut_'.$k)] = $v;
251                                         }
252                                 }
253                                 else
254                                 {
255                                         if (FALSE !== ($line = $CI->lang->line(strtolower('ut_'.$val))))
256                                         {
257                                                 $val = $line;
258                                         }
259                                         $temp[$CI->lang->line('ut_'.$key)] = $val;
260                                 }
261                         }
262
263                         $retval[] = $temp;
264                 }
265
266                 return $retval;
267         }
268
269         // --------------------------------------------------------------------
270
271         /**
272          * Set the template
273          *
274          * This lets us set the template to be used to display results
275          *
276          * @access      public
277          * @param       string
278          * @return      void
279          */
280         function set_template($template)
281         {
282                 $this->_template = $template;
283         }
284
285         // --------------------------------------------------------------------
286
287         /**
288          * Generate a backtrace
289          *
290          * This lets us show file names and line numbers
291          *
292          * @access      private
293          * @return      array
294          */
295         function _backtrace()
296         {
297                 if (function_exists('debug_backtrace'))
298                 {
299                         $back = debug_backtrace();
300
301                         $file = ( ! isset($back['1']['file'])) ? '' : $back['1']['file'];
302                         $line = ( ! isset($back['1']['line'])) ? '' : $back['1']['line'];
303
304                         return array('file' => $file, 'line' => $line);
305                 }
306                 return array('file' => 'Unknown', 'line' => 'Unknown');
307         }
308
309         // --------------------------------------------------------------------
310
311         /**
312          * Get Default Template
313          *
314          * @access      private
315          * @return      string
316          */
317         function _default_template()
318         {
319                 $this->_template = "\n".'<table style="width:100%; font-size:small; margin:10px 0; border-collapse:collapse; border:1px solid #CCC;">';
320                 $this->_template .= '{rows}';
321                 $this->_template .= "\n".'</table>';
322
323                 $this->_template_rows = "\n\t".'<tr>';
324                 $this->_template_rows .= "\n\t\t".'<th style="text-align: left; border-bottom:1px solid #CCC;">{item}</th>';
325                 $this->_template_rows .= "\n\t\t".'<td style="border-bottom:1px solid #CCC;">{result}</td>';
326                 $this->_template_rows .= "\n\t".'</tr>';
327         }
328
329         // --------------------------------------------------------------------
330
331         /**
332          * Parse Template
333          *
334          * Harvests the data within the template {pseudo-variables}
335          *
336          * @access      private
337          * @return      void
338          */
339         function _parse_template()
340         {
341                 if ( ! is_null($this->_template_rows))
342                 {
343                         return;
344                 }
345
346                 if (is_null($this->_template))
347                 {
348                         $this->_default_template();
349                         return;
350                 }
351
352                 if ( ! preg_match("/\{rows\}(.*?)\{\/rows\}/si", $this->_template, $match))
353                 {
354                         $this->_default_template();
355                         return;
356                 }
357
358                 $this->_template_rows = $match['1'];
359                 $this->_template = str_replace($match['0'], '{rows}', $this->_template);
360         }
361
362 }
363 // END Unit_test Class
364
365 /**
366  * Helper functions to test boolean true/false
367  *
368  *
369  * @access      private
370  * @return      bool
371  */
372 function is_true($test)
373 {
374         return (is_bool($test) AND $test === TRUE) ? TRUE : FALSE;
375 }
376 function is_false($test)
377 {
378         return (is_bool($test) AND $test === FALSE) ? TRUE : FALSE;
379 }
380
381
382 /* End of file Unit_test.php */
383 /* Location: ./system/libraries/Unit_test.php */