/lenasys/trunk

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/lenasys/trunk
20.1.1 by galaxyAbstractor
* Added an simple admin panel to the codeviewer-cmssy stuff
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 */