Chris@18
|
1 <?php
|
Chris@18
|
2 @include_once 'Text/Diff.php';
|
Chris@18
|
3 @include_once 'Text/Diff/Renderer.php';
|
Chris@18
|
4 @include_once 'Text/Diff/Renderer/unified.php';
|
Chris@18
|
5 require_once 'PEAR/ErrorStack.php';
|
Chris@18
|
6 require_once 'PEAR.php';
|
Chris@18
|
7 class PEAR_PHPTest
|
Chris@18
|
8 {
|
Chris@18
|
9 var $_diffonly;
|
Chris@18
|
10 var $_errors;
|
Chris@18
|
11 function PEAR_PHPTest($diffonly = false, $noStackCatch = false)
|
Chris@18
|
12 {
|
Chris@18
|
13 $this->_diffonly = $diffonly;
|
Chris@18
|
14 $this->_errors = array();
|
Chris@18
|
15 PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, array($this, 'pearerrorCallback'));
|
Chris@18
|
16 if (!$noStackCatch) {
|
Chris@18
|
17 PEAR_ErrorStack::setDefaultCallback(array($this, 'pearerrorstackCallback'));
|
Chris@18
|
18 }
|
Chris@18
|
19 }
|
Chris@18
|
20
|
Chris@18
|
21 function pearerrorCallback($err)
|
Chris@18
|
22 {
|
Chris@18
|
23 PEAR_ErrorStack::staticPush('PEAR_Error', -1, 'error', array('obj' => $err),
|
Chris@18
|
24 $err->getMessage());
|
Chris@18
|
25 }
|
Chris@18
|
26
|
Chris@18
|
27 function pearerrorstackCallback($err)
|
Chris@18
|
28 {
|
Chris@18
|
29 $this->_errors[] = $err;
|
Chris@18
|
30 }
|
Chris@18
|
31
|
Chris@18
|
32 function assertPEARError($err, $message)
|
Chris@18
|
33 {
|
Chris@18
|
34 if (is_a($err, 'PEAR_Error')) {
|
Chris@18
|
35 return true;
|
Chris@18
|
36 }
|
Chris@18
|
37 $this->_failTest(debug_backtrace(), $message);
|
Chris@18
|
38 echo "Not a PEAR_Error\n";
|
Chris@18
|
39 return false;
|
Chris@18
|
40 }
|
Chris@18
|
41
|
Chris@18
|
42 function assertNoErrors($message, $trace = null)
|
Chris@18
|
43 {
|
Chris@18
|
44 if (count($this->_errors) == 0) {
|
Chris@18
|
45 return true;
|
Chris@18
|
46 }
|
Chris@18
|
47 if ($trace === null) {
|
Chris@18
|
48 $trace = debug_backtrace();
|
Chris@18
|
49 }
|
Chris@18
|
50 $this->_failTest($trace, $message);
|
Chris@18
|
51 foreach ($this->_errors as $err) {
|
Chris@18
|
52 if ($err['package'] == 'PEAR_Error') {
|
Chris@18
|
53 echo "Unexpected PEAR_Error:\n";
|
Chris@18
|
54 echo 'message "' . $err['message'] . "\"\n";
|
Chris@18
|
55 } else {
|
Chris@18
|
56 echo "Unexpected PEAR_ErrorStack error:\n";
|
Chris@18
|
57 echo 'package "' . $err['package'] . "\"\n";
|
Chris@18
|
58 echo 'message "' . $err['message'] . "\"\n";
|
Chris@18
|
59 }
|
Chris@18
|
60 }
|
Chris@18
|
61 $this->_errors = array();
|
Chris@18
|
62 return false;
|
Chris@18
|
63 }
|
Chris@18
|
64
|
Chris@18
|
65 function assertErrors($errors, $message, $trace = null)
|
Chris@18
|
66 {
|
Chris@18
|
67 if (!count($this->_errors)) {
|
Chris@18
|
68 if ($trace === null) {
|
Chris@18
|
69 $trace = debug_backtrace();
|
Chris@18
|
70 }
|
Chris@18
|
71 $this->_failTest($trace, $message);
|
Chris@18
|
72 echo "No errors caught, but errors were expected\n";
|
Chris@18
|
73 return false;
|
Chris@18
|
74 }
|
Chris@18
|
75 if (!isset($errors[0])) {
|
Chris@18
|
76 $errors = array($errors);
|
Chris@18
|
77 }
|
Chris@18
|
78 $failed = false;
|
Chris@18
|
79 foreach ($errors as $err) {
|
Chris@18
|
80 $found = false;
|
Chris@18
|
81 foreach ($this->_errors as $i => $caughterror) {
|
Chris@18
|
82 if ($caughterror['package'] == $err['package']) {
|
Chris@18
|
83 if ($caughterror['message'] == $err['message']) {
|
Chris@18
|
84 $found = true;
|
Chris@18
|
85 break;
|
Chris@18
|
86 }
|
Chris@18
|
87 }
|
Chris@18
|
88 }
|
Chris@18
|
89 if ($found) {
|
Chris@18
|
90 unset($this->_errors[$i]);
|
Chris@18
|
91 continue;
|
Chris@18
|
92 }
|
Chris@18
|
93 if (!$failed) {
|
Chris@18
|
94 if ($trace === null) {
|
Chris@18
|
95 $trace = debug_backtrace();
|
Chris@18
|
96 }
|
Chris@18
|
97 $failed = true;
|
Chris@18
|
98 $this->_failTest($trace, $message);
|
Chris@18
|
99 }
|
Chris@18
|
100 echo "Unthrown error:\n";
|
Chris@18
|
101 if ($err['package'] == 'PEAR_Error') {
|
Chris@18
|
102 echo "PEAR_Error:\n";
|
Chris@18
|
103 } else {
|
Chris@18
|
104 echo "error package: \"$err[package]\"\n";
|
Chris@18
|
105 }
|
Chris@18
|
106 echo "message: \"$err[message]\"\n";
|
Chris@18
|
107 }
|
Chris@18
|
108 if (count($this->_errors)) {
|
Chris@18
|
109 if (!$failed) {
|
Chris@18
|
110 if ($trace === null) {
|
Chris@18
|
111 $trace = debug_backtrace();
|
Chris@18
|
112 }
|
Chris@18
|
113 $failed = true;
|
Chris@18
|
114 $this->_failTest($trace, $message);
|
Chris@18
|
115 }
|
Chris@18
|
116 foreach ($this->_errors as $err) {
|
Chris@18
|
117 echo "Unexpected error:\n";
|
Chris@18
|
118 if ($err['package'] == 'PEAR_Error') {
|
Chris@18
|
119 echo "PEAR_Error:\n";
|
Chris@18
|
120 } else {
|
Chris@18
|
121 echo "error package: \"$err[package]\"\n";
|
Chris@18
|
122 }
|
Chris@18
|
123 echo "message: \"$err[message]\"\n";
|
Chris@18
|
124 }
|
Chris@18
|
125 }
|
Chris@18
|
126 $this->_errors = array();
|
Chris@18
|
127 return !$failed;
|
Chris@18
|
128 }
|
Chris@18
|
129
|
Chris@18
|
130 function assertTrue($test, $message)
|
Chris@18
|
131 {
|
Chris@18
|
132 $this->assertNoErrors($message, debug_backtrace());
|
Chris@18
|
133 if ($test === true) {
|
Chris@18
|
134 return true;
|
Chris@18
|
135 }
|
Chris@18
|
136 $this->_failTest(debug_backtrace(), $message);
|
Chris@18
|
137 echo "Unexpected non-true value: \n";
|
Chris@18
|
138 var_export($test);
|
Chris@18
|
139 echo "\n'$message'\n";
|
Chris@18
|
140 return false;
|
Chris@18
|
141 }
|
Chris@18
|
142
|
Chris@18
|
143 function assertIsa($control, $test, $message)
|
Chris@18
|
144 {
|
Chris@18
|
145 $this->assertNoErrors($message, debug_backtrace());
|
Chris@18
|
146 if (is_a($test, $control)) {
|
Chris@18
|
147 return true;
|
Chris@18
|
148 }
|
Chris@18
|
149 $this->_failTest(debug_backtrace(), $message);
|
Chris@18
|
150 echo "Unexpected non-$control object: \n";
|
Chris@18
|
151 var_export($test);
|
Chris@18
|
152 echo "\n'$message'\n";
|
Chris@18
|
153 return false;
|
Chris@18
|
154 }
|
Chris@18
|
155
|
Chris@18
|
156 function assertNull($test, $message)
|
Chris@18
|
157 {
|
Chris@18
|
158 $this->assertNoErrors($message, debug_backtrace());
|
Chris@18
|
159 if ($test === null) {
|
Chris@18
|
160 return true;
|
Chris@18
|
161 }
|
Chris@18
|
162 $this->_failTest(debug_backtrace(), $message);
|
Chris@18
|
163 echo "Unexpected non-null value: \n";
|
Chris@18
|
164 var_export($test);
|
Chris@18
|
165 echo "\n'$message'\n";
|
Chris@18
|
166 return false;
|
Chris@18
|
167 }
|
Chris@18
|
168
|
Chris@18
|
169 function assertNotNull($test, $message)
|
Chris@18
|
170 {
|
Chris@18
|
171 $this->assertNoErrors($message, debug_backtrace());
|
Chris@18
|
172 if ($test !== null) {
|
Chris@18
|
173 return true;
|
Chris@18
|
174 }
|
Chris@18
|
175 $this->_failTest(debug_backtrace(), $message);
|
Chris@18
|
176 echo "Unexpected null: \n";
|
Chris@18
|
177 var_export($test);
|
Chris@18
|
178 echo "\n'$message'\n";
|
Chris@18
|
179 return false;
|
Chris@18
|
180 }
|
Chris@18
|
181
|
Chris@18
|
182 function assertSame($test, $test1, $message)
|
Chris@18
|
183 {
|
Chris@18
|
184 $this->assertNoErrors($message, debug_backtrace());
|
Chris@18
|
185 if ($test === $test1) {
|
Chris@18
|
186 return true;
|
Chris@18
|
187 }
|
Chris@18
|
188 $this->_failTest(debug_backtrace(), $message);
|
Chris@18
|
189 echo "Unexpectedly two vars are not the same thing: \n";
|
Chris@18
|
190 echo "\n'$message'\n";
|
Chris@18
|
191 return false;
|
Chris@18
|
192 }
|
Chris@18
|
193
|
Chris@18
|
194 function assertNotSame($test, $test1, $message)
|
Chris@18
|
195 {
|
Chris@18
|
196 $this->assertNoErrors($message, debug_backtrace());
|
Chris@18
|
197 if ($test !== $test1) {
|
Chris@18
|
198 return true;
|
Chris@18
|
199 }
|
Chris@18
|
200 $this->_failTest(debug_backtrace(), $message);
|
Chris@18
|
201 echo "Unexpectedly two vars are the same thing: \n";
|
Chris@18
|
202 echo "\n'$message'\n";
|
Chris@18
|
203 return false;
|
Chris@18
|
204 }
|
Chris@18
|
205
|
Chris@18
|
206 function assertFalse($test, $message)
|
Chris@18
|
207 {
|
Chris@18
|
208 $this->assertNoErrors($message, debug_backtrace());
|
Chris@18
|
209 if ($test === false) {
|
Chris@18
|
210 return true;
|
Chris@18
|
211 }
|
Chris@18
|
212 $this->_failTest(debug_backtrace(), $message);
|
Chris@18
|
213 echo "Unexpected non-false value: \n";
|
Chris@18
|
214 var_export($test);
|
Chris@18
|
215 echo "\n'$message'\n";
|
Chris@18
|
216 return false;
|
Chris@18
|
217 }
|
Chris@18
|
218
|
Chris@18
|
219 function assertNotTrue($test, $message)
|
Chris@18
|
220 {
|
Chris@18
|
221 $this->assertNoErrors($message, debug_backtrace());
|
Chris@18
|
222 if (!$test) {
|
Chris@18
|
223 return true;
|
Chris@18
|
224 }
|
Chris@18
|
225 $this->_failTest(debug_backtrace(), $message);
|
Chris@18
|
226 echo "Unexpected loose true value: \n";
|
Chris@18
|
227 var_export($test);
|
Chris@18
|
228 echo "\n'$message'\n";
|
Chris@18
|
229 return false;
|
Chris@18
|
230 }
|
Chris@18
|
231
|
Chris@18
|
232 function assertNotFalse($test, $message)
|
Chris@18
|
233 {
|
Chris@18
|
234 $this->assertNoErrors($message, debug_backtrace());
|
Chris@18
|
235 if ($test) {
|
Chris@18
|
236 return true;
|
Chris@18
|
237 }
|
Chris@18
|
238 $this->_failTest(debug_backtrace(), $message);
|
Chris@18
|
239 echo "Unexpected loose false value: \n";
|
Chris@18
|
240 var_export($test);
|
Chris@18
|
241 echo "\n'$message'\n";
|
Chris@18
|
242 return false;
|
Chris@18
|
243 }
|
Chris@18
|
244
|
Chris@18
|
245 function assertEquals($control, $test, $message)
|
Chris@18
|
246 {
|
Chris@18
|
247 $this->assertNoErrors($message, debug_backtrace());
|
Chris@18
|
248 if (str_replace(array("\r", "\n"), array('', ''),
|
Chris@18
|
249 var_export($control, true)) != str_replace(array("\r", "\n"), array('', ''),
|
Chris@18
|
250 var_export($test, true))) {
|
Chris@18
|
251 $this->_failTest(debug_backtrace(), $message);
|
Chris@18
|
252 if (class_exists('Text_Diff')) {
|
Chris@18
|
253 echo "Diff of expecting/received:\n";
|
Chris@18
|
254 $diff = new Text_Diff(
|
Chris@18
|
255 explode("\n", var_export($control, true)),
|
Chris@18
|
256 explode("\n", var_export($test, true)));
|
Chris@18
|
257
|
Chris@18
|
258 // Output the diff in unified format.
|
Chris@18
|
259 $renderer = new Text_Diff_Renderer_unified();
|
Chris@18
|
260 echo $renderer->render($diff);
|
Chris@18
|
261 if ($this->_diffonly) {
|
Chris@18
|
262 return false;
|
Chris@18
|
263 }
|
Chris@18
|
264 }
|
Chris@18
|
265 echo "Expecting:\n";
|
Chris@18
|
266 var_export($control);
|
Chris@18
|
267 echo "\nReceived:\n";
|
Chris@18
|
268 var_export($test);
|
Chris@18
|
269 echo "\n";
|
Chris@18
|
270 return false;
|
Chris@18
|
271 }
|
Chris@18
|
272 return true;
|
Chris@18
|
273 }
|
Chris@18
|
274
|
Chris@18
|
275 function assertFileExists($fname, $message)
|
Chris@18
|
276 {
|
Chris@18
|
277 $this->assertNoErrors($message, debug_backtrace());
|
Chris@18
|
278 if (!@file_exists($fname)) {
|
Chris@18
|
279 $this->_failTest(debug_backtrace(), $message);
|
Chris@18
|
280 echo "File '$fname' does not exist, and should\n";
|
Chris@18
|
281 return false;
|
Chris@18
|
282 }
|
Chris@18
|
283 return true;
|
Chris@18
|
284 }
|
Chris@18
|
285
|
Chris@18
|
286 function assertFileNotExists($fname, $message)
|
Chris@18
|
287 {
|
Chris@18
|
288 $this->assertNoErrors($message, debug_backtrace());
|
Chris@18
|
289 if (@file_exists($fname)) {
|
Chris@18
|
290 $this->_failTest(debug_backtrace(), $message);
|
Chris@18
|
291 echo "File '$fname' exists, and should not\n";
|
Chris@18
|
292 return false;
|
Chris@18
|
293 }
|
Chris@18
|
294 return true;
|
Chris@18
|
295 }
|
Chris@18
|
296
|
Chris@18
|
297 function assertRegEquals($dump, &$reg, $message)
|
Chris@18
|
298 {
|
Chris@18
|
299 $actualdump = var_export(trim($this->dumpReg($reg)), true);
|
Chris@18
|
300 $testdump = var_export(trim($dump), true);
|
Chris@18
|
301 return $this->assertEquals($testdump, $actualdump, $message);
|
Chris@18
|
302 }
|
Chris@18
|
303
|
Chris@18
|
304 function assertPackageInfoEquals($control, $test, $message)
|
Chris@18
|
305 {
|
Chris@18
|
306 $this->assertNoErrors($message, debug_backtrace());
|
Chris@18
|
307 if (isset($control[0])) {
|
Chris@18
|
308 if (!isset($test[0]) || (count($control) != count($test))) {
|
Chris@18
|
309 echo "Invalid packageInfo\n";
|
Chris@18
|
310 $ret = $this->assertEquals($control, $test, $message);
|
Chris@18
|
311 }
|
Chris@18
|
312 $ret = true;
|
Chris@18
|
313 foreach ($control as $i => $packageinfo) {
|
Chris@18
|
314 $ret = $ret &&
|
Chris@18
|
315 $this->assertPackageInfoEquals($packageinfo, $test[$i], $message . $i);
|
Chris@18
|
316 }
|
Chris@18
|
317 return $ret;
|
Chris@18
|
318 }
|
Chris@18
|
319 if (isset($control['_lastmodified'])) {
|
Chris@18
|
320 if (!isset($test['_lastmodified'])) {
|
Chris@18
|
321 echo "_lastmodified is not set in packageInfo() output\n";
|
Chris@18
|
322 $this->_failTest(debug_backtrace(), $message);
|
Chris@18
|
323 return false;
|
Chris@18
|
324 }
|
Chris@18
|
325 }
|
Chris@18
|
326 $savecontrol = sort($control);
|
Chris@18
|
327 $savetest = sort($test);
|
Chris@18
|
328 unset($control['_lastmodified']);
|
Chris@18
|
329 unset($test['_lastmodified']);
|
Chris@18
|
330 if (var_export($control, true) != var_export($test, true)) {
|
Chris@18
|
331 $this->_failTest(debug_backtrace(), $message);
|
Chris@18
|
332 if (class_exists('Text_Diff')) {
|
Chris@18
|
333 echo "Diff of expecting/received:\n";
|
Chris@18
|
334 $diff = new Text_Diff(
|
Chris@18
|
335 explode("\n", var_export($control, true)),
|
Chris@18
|
336 explode("\n", var_export($test, true)));
|
Chris@18
|
337
|
Chris@18
|
338 // Output the diff in unified format.
|
Chris@18
|
339 $renderer = new Text_Diff_Renderer_unified();
|
Chris@18
|
340 echo $renderer->render($diff);
|
Chris@18
|
341 if ($this->_diffonly) {
|
Chris@18
|
342 return false;
|
Chris@18
|
343 }
|
Chris@18
|
344 }
|
Chris@18
|
345 echo "Expecting:\n";
|
Chris@18
|
346 var_export($savecontrol);
|
Chris@18
|
347 echo "\nReceived:\n";
|
Chris@18
|
348 var_export($savetest);
|
Chris@18
|
349 return false;
|
Chris@18
|
350 }
|
Chris@18
|
351 return true;
|
Chris@18
|
352 }
|
Chris@18
|
353
|
Chris@18
|
354 function _sortRegEntries($a, $b)
|
Chris@18
|
355 {
|
Chris@18
|
356 return strnatcasecmp($a['name'], $b['name']);
|
Chris@18
|
357 }
|
Chris@18
|
358
|
Chris@18
|
359 function dumpReg(&$reg)
|
Chris@18
|
360 {
|
Chris@18
|
361 ob_start();
|
Chris@18
|
362 print "dumping registry...\n";
|
Chris@18
|
363 $infos = $reg->packageInfo(null, null, null);
|
Chris@18
|
364 ksort($infos);
|
Chris@18
|
365 foreach ($infos as $channel => $info) {
|
Chris@18
|
366 echo "channel $channel:\n";
|
Chris@18
|
367 usort($info, array($this, '_sortRegEntries'));
|
Chris@18
|
368 foreach ($info as $pkg) {
|
Chris@18
|
369 print $pkg["name"] . ":";
|
Chris@18
|
370 unset($pkg["name"]);
|
Chris@18
|
371 foreach ($pkg as $k => $v) {
|
Chris@18
|
372 if ($k == '_lastmodified') {
|
Chris@18
|
373 print " _lastmodified is set";
|
Chris@18
|
374 continue;
|
Chris@18
|
375 }
|
Chris@18
|
376 if (is_array($v) && $k == 'filelist') {
|
Chris@18
|
377 print " $k=array(";
|
Chris@18
|
378 $i = 0;
|
Chris@18
|
379 foreach ($v as $k2 => $v2) {
|
Chris@18
|
380 if ($i++ > 0) print ",";
|
Chris@18
|
381 print "{$k2}[";
|
Chris@18
|
382 $j = 0;
|
Chris@18
|
383 foreach ($v2 as $k3 => $v3) {
|
Chris@18
|
384 if ($j++ > 0) print ",";
|
Chris@18
|
385 print "$k3=$v3";
|
Chris@18
|
386 }
|
Chris@18
|
387 print "]";
|
Chris@18
|
388 }
|
Chris@18
|
389 print ")";
|
Chris@18
|
390 } else {
|
Chris@18
|
391 print " $k=\"$v\"";
|
Chris@18
|
392 }
|
Chris@18
|
393 }
|
Chris@18
|
394 print "\n";
|
Chris@18
|
395 }
|
Chris@18
|
396 }
|
Chris@18
|
397 print "dump done\n";
|
Chris@18
|
398 $ret = ob_get_contents();
|
Chris@18
|
399 ob_end_clean();
|
Chris@18
|
400 return $ret;
|
Chris@18
|
401 }
|
Chris@18
|
402
|
Chris@18
|
403 function _failTest($trace, $message)
|
Chris@18
|
404 {
|
Chris@18
|
405 echo 'Test Failure: "' . $message . "\"\n in " . $trace[0]['file'] . ' line ' .
|
Chris@18
|
406 $trace[0]['line'] . "\n";
|
Chris@18
|
407 }
|
Chris@18
|
408
|
Chris@18
|
409 function showAll()
|
Chris@18
|
410 {
|
Chris@18
|
411 $this->_diffonly = false;
|
Chris@18
|
412 }
|
Chris@18
|
413 }
|
Chris@18
|
414 ?> |