source: trunk/server/www/vendors/simpletest/test/visual_test.php @ 6

Last change on this file since 6 was 6, checked in by sander, 11 years ago

Added SimpleTest? test framework

File size: 15.7 KB
Line 
1<?php
2    // $Id: visual_test.php 1547 2007-07-04 00:42:05Z lastcraft $
3
4    // NOTE:
5    // Some of these tests are designed to fail! Do not be alarmed.
6    //                         ----------------
7
8    // The following tests are a bit hacky. Whilst Kent Beck tried to
9    // build a unit tester with a unit tester, I am not that brave.
10    // Instead I have just hacked together odd test scripts until
11    // I have enough of a tester to procede more formally.
12    //
13    // The proper tests start in all_tests.php
14    require_once('../unit_tester.php');
15    require_once('../shell_tester.php');
16    require_once('../mock_objects.php');
17    require_once('../reporter.php');
18    require_once('../xml.php');
19
20    class TestDisplayClass {
21        var $_a;
22
23        function TestDisplayClass($a) {
24            $this->_a = $a;
25        }
26    }
27
28    class PassingUnitTestCaseOutput extends UnitTestCase {
29
30        function testOfResults() {
31            $this->pass('Pass');
32        }
33
34        function testTrue() {
35            $this->assertTrue(true);
36        }
37
38        function testFalse() {
39            $this->assertFalse(false);
40        }
41
42        function testExpectation() {
43            $expectation = &new EqualExpectation(25, 'My expectation message: %s');
44            $this->assert($expectation, 25, 'My assert message : %s');
45        }
46
47        function testNull() {
48            $this->assertNull(null, "%s -> Pass");
49            $this->assertNotNull(false, "%s -> Pass");
50        }
51
52        function testType() {
53            $this->assertIsA("hello", "string", "%s -> Pass");
54            $this->assertIsA($this, "PassingUnitTestCaseOutput", "%s -> Pass");
55            $this->assertIsA($this, "UnitTestCase", "%s -> Pass");
56        }
57
58        function testTypeEquality() {
59            $this->assertEqual("0", 0, "%s -> Pass");
60        }
61
62        function testNullEquality() {
63            $this->assertNotEqual(null, 1, "%s -> Pass");
64            $this->assertNotEqual(1, null, "%s -> Pass");
65        }
66
67        function testIntegerEquality() {
68            $this->assertNotEqual(1, 2, "%s -> Pass");
69        }
70
71        function testStringEquality() {
72            $this->assertEqual("a", "a", "%s -> Pass");
73            $this->assertNotEqual("aa", "ab", "%s -> Pass");
74        }
75
76        function testHashEquality() {
77            $this->assertEqual(array("a" => "A", "b" => "B"), array("b" => "B", "a" => "A"), "%s -> Pass");
78        }
79
80        function testWithin() {
81            $this->assertWithinMargin(5, 5.4, 0.5, "%s -> Pass");
82        }
83
84        function testOutside() {
85            $this->assertOutsideMargin(5, 5.6, 0.5, "%s -> Pass");
86        }
87
88        function testStringIdentity() {
89            $a = "fred";
90            $b = $a;
91            $this->assertIdentical($a, $b, "%s -> Pass");
92        }
93
94        function testTypeIdentity() {
95            $a = "0";
96            $b = 0;
97            $this->assertNotIdentical($a, $b, "%s -> Pass");
98        }
99
100        function testNullIdentity() {
101            $this->assertNotIdentical(null, 1, "%s -> Pass");
102            $this->assertNotIdentical(1, null, "%s -> Pass");
103        }
104
105        function testHashIdentity() {
106        }
107
108        function testObjectEquality() {
109            $this->assertEqual(new TestDisplayClass(4), new TestDisplayClass(4), "%s -> Pass");
110            $this->assertNotEqual(new TestDisplayClass(4), new TestDisplayClass(5), "%s -> Pass");
111        }
112
113        function testObjectIndentity() {
114            $this->assertIdentical(new TestDisplayClass(false), new TestDisplayClass(false), "%s -> Pass");
115            $this->assertNotIdentical(new TestDisplayClass(false), new TestDisplayClass(0), "%s -> Pass");
116        }
117
118        function testReference() {
119            $a = "fred";
120            $b = &$a;
121            $this->assertReference($a, $b, "%s -> Pass");
122        }
123
124        function testCloneOnDifferentObjects() {
125            $a = "fred";
126            $b = $a;
127            $c = "Hello";
128            $this->assertClone($a, $b, "%s -> Pass");
129        }
130
131        function testPatterns() {
132            $this->assertPattern('/hello/i', "Hello there", "%s -> Pass");
133            $this->assertNoPattern('/hello/', "Hello there", "%s -> Pass");
134        }
135
136        function testLongStrings() {
137            $text = "";
138            for ($i = 0; $i < 10; $i++) {
139                $text .= "0123456789";
140            }
141            $this->assertEqual($text, $text);
142        }
143    }
144
145    class FailingUnitTestCaseOutput extends UnitTestCase {
146
147        function testOfResults() {
148            $this->fail('Fail');        // Fail.
149        }
150
151        function testTrue() {
152            $this->assertTrue(false);        // Fail.
153        }
154
155        function testFalse() {
156            $this->assertFalse(true);        // Fail.
157        }
158
159        function testExpectation() {
160            $expectation = &new EqualExpectation(25, 'My expectation message: %s');
161            $this->assert($expectation, 24, 'My assert message : %s');        // Fail.
162        }
163
164        function testNull() {
165            $this->assertNull(false, "%s -> Fail");        // Fail.
166            $this->assertNotNull(null, "%s -> Fail");        // Fail.
167        }
168
169        function testType() {
170            $this->assertIsA(14, "string", "%s -> Fail");        // Fail.
171            $this->assertIsA(14, "TestOfUnitTestCaseOutput", "%s -> Fail");        // Fail.
172            $this->assertIsA($this, "TestReporter", "%s -> Fail");        // Fail.
173        }
174
175        function testTypeEquality() {
176            $this->assertNotEqual("0", 0, "%s -> Fail");        // Fail.
177        }
178
179        function testNullEquality() {
180            $this->assertEqual(null, 1, "%s -> Fail");        // Fail.
181            $this->assertEqual(1, null, "%s -> Fail");        // Fail.
182        }
183
184        function testIntegerEquality() {
185            $this->assertEqual(1, 2, "%s -> Fail");        // Fail.
186        }
187
188        function testStringEquality() {
189            $this->assertNotEqual("a", "a", "%s -> Fail");    // Fail.
190            $this->assertEqual("aa", "ab", "%s -> Fail");        // Fail.
191        }
192
193        function testHashEquality() {
194            $this->assertEqual(array("a" => "A", "b" => "B"), array("b" => "B", "a" => "Z"), "%s -> Fail");
195        }
196
197        function testWithin() {
198            $this->assertWithinMargin(5, 5.6, 0.5, "%s -> Fail");   // Fail.
199        }
200
201        function testOutside() {
202            $this->assertOutsideMargin(5, 5.4, 0.5, "%s -> Fail");   // Fail.
203        }
204
205        function testStringIdentity() {
206            $a = "fred";
207            $b = $a;
208            $this->assertNotIdentical($a, $b, "%s -> Fail");       // Fail.
209        }
210
211        function testTypeIdentity() {
212            $a = "0";
213            $b = 0;
214            $this->assertIdentical($a, $b, "%s -> Fail");        // Fail.
215        }
216
217        function testNullIdentity() {
218            $this->assertIdentical(null, 1, "%s -> Fail");        // Fail.
219            $this->assertIdentical(1, null, "%s -> Fail");        // Fail.
220        }
221
222        function testHashIdentity() {
223            $this->assertIdentical(array("a" => "A", "b" => "B"), array("b" => "B", "a" => "A"), "%s -> fail");        // Fail.
224        }
225
226        function testObjectEquality() {
227            $this->assertNotEqual(new TestDisplayClass(4), new TestDisplayClass(4), "%s -> Fail");    // Fail.
228            $this->assertEqual(new TestDisplayClass(4), new TestDisplayClass(5), "%s -> Fail");        // Fail.
229        }
230
231        function testObjectIndentity() {
232            $this->assertNotIdentical(new TestDisplayClass(false), new TestDisplayClass(false), "%s -> Fail");    // Fail.
233            $this->assertIdentical(new TestDisplayClass(false), new TestDisplayClass(0), "%s -> Fail");        // Fail.
234        }
235
236        function testReference() {
237            $a = "fred";
238            $b = &$a;
239            $this->assertClone($a, $b, "%s -> Fail");        // Fail.
240        }
241
242        function testCloneOnDifferentObjects() {
243            $a = "fred";
244            $b = $a;
245            $c = "Hello";
246            $this->assertClone($a, $c, "%s -> Fail");        // Fail.
247        }
248
249        function testPatterns() {
250            $this->assertPattern('/hello/', "Hello there", "%s -> Fail");            // Fail.
251            $this->assertNoPattern('/hello/i', "Hello there", "%s -> Fail");      // Fail.
252        }
253
254        function testLongStrings() {
255            $text = "";
256            for ($i = 0; $i < 10; $i++) {
257                $text .= "0123456789";
258            }
259            $this->assertEqual($text . $text, $text . "a" . $text);        // Fail.
260        }
261        }
262
263    class Dummy {
264        function Dummy() {
265        }
266
267        function a() {
268        }
269    }
270    Mock::generate('Dummy');
271
272    class TestOfMockObjectsOutput extends UnitTestCase {
273
274        function testCallCounts() {
275            $dummy = &new MockDummy();
276            $dummy->expectCallCount('a', 1, 'My message: %s');
277            $dummy->a();
278            $dummy->a();
279        }
280
281        function testMinimumCallCounts() {
282            $dummy = &new MockDummy();
283            $dummy->expectMinimumCallCount('a', 2, 'My message: %s');
284            $dummy->a();
285            $dummy->a();
286        }
287
288        function testEmptyMatching() {
289            $dummy = &new MockDummy();
290            $dummy->expectArguments('a', array());
291            $dummy->a();
292            $dummy->a(null);        // Fail.
293        }
294
295        function testEmptyMatchingWithCustomMessage() {
296            $dummy = &new MockDummy();
297            $dummy->expectArguments('a', array(), 'My expectation message: %s');
298            $dummy->a();
299            $dummy->a(null);        // Fail.
300        }
301
302        function testNullMatching() {
303            $dummy = &new MockDummy();
304            $dummy->expectArguments('a', array(null));
305            $dummy->a(null);
306            $dummy->a();        // Fail.
307        }
308
309        function testBooleanMatching() {
310            $dummy = &new MockDummy();
311            $dummy->expectArguments('a', array(true, false));
312            $dummy->a(true, false);
313            $dummy->a(true, true);        // Fail.
314        }
315
316        function testIntegerMatching() {
317            $dummy = &new MockDummy();
318            $dummy->expectArguments('a', array(32, 33));
319            $dummy->a(32, 33);
320            $dummy->a(32, 34);        // Fail.
321        }
322
323        function testFloatMatching() {
324            $dummy = &new MockDummy();
325            $dummy->expectArguments('a', array(3.2, 3.3));
326            $dummy->a(3.2, 3.3);
327            $dummy->a(3.2, 3.4);        // Fail.
328        }
329
330        function testStringMatching() {
331            $dummy = &new MockDummy();
332            $dummy->expectArguments('a', array('32', '33'));
333            $dummy->a('32', '33');
334            $dummy->a('32', '34');        // Fail.
335        }
336
337        function testEmptyMatchingWithCustomExpectationMessage() {
338            $dummy = &new MockDummy();
339            $dummy->expectArguments(
340                    'a',
341                    array(new EqualExpectation('A', 'My part expectation message: %s')),
342                    'My expectation message: %s');
343            $dummy->a('A');
344            $dummy->a('B');        // Fail.
345        }
346
347        function testArrayMatching() {
348            $dummy = &new MockDummy();
349            $dummy->expectArguments('a', array(array(32), array(33)));
350            $dummy->a(array(32), array(33));
351            $dummy->a(array(32), array('33'));        // Fail.
352        }
353
354        function testObjectMatching() {
355            $a = new Dummy();
356            $a->a = 'a';
357            $b = new Dummy();
358            $b->b = 'b';
359            $dummy = &new MockDummy();
360            $dummy->expectArguments('a', array($a, $b));
361            $dummy->a($a, $b);
362            $dummy->a($a, $a);        // Fail.
363        }
364
365        function testBigList() {
366            $dummy = &new MockDummy();
367            $dummy->expectArguments('a', array(false, 0, 1, 1.0));
368            $dummy->a(false, 0, 1, 1.0);
369            $dummy->a(true, false, 2, 2.0);        // Fail.
370        }
371    }
372
373    class TestOfPastBugs extends UnitTestCase {
374
375        function testMixedTypes() {
376            $this->assertEqual(array(), null, "%s -> Pass");
377            $this->assertIdentical(array(), null, "%s -> Fail");    // Fail.
378        }
379
380        function testMockWildcards() {
381            $dummy = &new MockDummy();
382            $dummy->expectArguments('a', array('*', array(33)));
383            $dummy->a(array(32), array(33));
384            $dummy->a(array(32), array('33'));        // Fail.
385        }
386    }
387
388    class TestOfVisualShell extends ShellTestCase {
389
390        function testDump() {
391            $this->execute('ls');
392            $this->dumpOutput();
393            $this->execute('dir');
394            $this->dumpOutput();
395        }
396
397        function testDumpOfList() {
398            $this->execute('ls');
399            $this->dump($this->getOutputAsList());
400        }
401    }
402
403    class PassesAsWellReporter extends HtmlReporter {
404
405        function _getCss() {
406            return parent::_getCss() . ' .pass { color: darkgreen; }';
407        }
408
409        function paintPass($message) {
410            parent::paintPass($message);
411            print "<span class=\"pass\">Pass</span>: ";
412            $breadcrumb = $this->getTestList();
413            array_shift($breadcrumb);
414            print implode(" -&gt; ", $breadcrumb);
415            print " -&gt; " . htmlentities($message) . "<br />\n";
416        }
417
418        function paintSignal($type, &$payload) {
419            print "<span class=\"fail\">$type</span>: ";
420            $breadcrumb = $this->getTestList();
421            array_shift($breadcrumb);
422            print implode(" -&gt; ", $breadcrumb);
423            print " -&gt; " . htmlentities(serialize($payload)) . "<br />\n";
424        }
425    }
426   
427    class TestOfSkippingNoMatterWhat extends UnitTestCase {
428        function skip() {
429            $this->skipIf(true, 'Always skipped -> %s');
430        }
431       
432        function testFail() {
433            $this->fail('This really shouldn\'t have happened');
434        }
435    }
436   
437    class TestOfSkippingOrElse extends UnitTestCase {
438        function skip() {
439            $this->skipUnless(false, 'Always skipped -> %s');
440        }
441       
442        function testFail() {
443            $this->fail('This really shouldn\'t have happened');
444        }
445    }
446   
447    class TestOfSkippingTwiceOver extends UnitTestCase {
448        function skip() {
449            $this->skipIf(true, 'First reason -> %s');
450            $this->skipIf(true, 'Second reason -> %s');
451        }
452       
453        function testFail() {
454            $this->fail('This really shouldn\'t have happened');
455        }
456    }
457   
458    class TestThatShouldNotBeSkipped extends UnitTestCase {
459        function skip() {
460            $this->skipIf(false);
461            $this->skipUnless(true);
462        }
463       
464        function testFail() {
465            $this->fail('We should see this message');
466        }
467       
468        function testPass() {
469            $this->pass('We should see this message');
470        }
471    }
472
473    $test = &new TestSuite('Visual test with 46 passes, 47 fails and 0 exceptions');
474    $test->addTestCase(new PassingUnitTestCaseOutput());
475    $test->addTestCase(new FailingUnitTestCaseOutput());
476    $test->addTestCase(new TestOfMockObjectsOutput());
477    $test->addTestCase(new TestOfPastBugs());
478    $test->addTestCase(new TestOfVisualShell());
479    $test->addTestCase(new TestOfSkippingNoMatterWhat());
480    $test->addTestCase(new TestOfSkippingOrElse());
481    $test->addTestCase(new TestOfSkippingTwiceOver());
482    $test->addTestCase(new TestThatShouldNotBeSkipped());
483
484    if (isset($_GET['xml']) || in_array('xml', (isset($argv) ? $argv : array()))) {
485        $reporter = &new XmlReporter();
486    } elseif (TextReporter::inCli()) {
487        $reporter = &new TextReporter();
488    } else {
489        $reporter = &new PassesAsWellReporter();
490    }
491    if (isset($_GET['dry']) || in_array('dry', (isset($argv) ? $argv : array()))) {
492        $reporter->makeDry();
493    }
494    exit ($test->run($reporter) ? 0 : 1);
495?>
Note: See TracBrowser for help on using the repository browser.