1<?php
2/*
3 * This file is part of PHPUnit.
4 *
5 * (c) Sebastian Bergmann <sebastian@phpunit.de>
6 *
7 * For the full copyright and license information, please view the LICENSE
8 * file that was distributed with this source code.
9 */
10
11require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'BeforeAndAfterTest.php';
12require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'BeforeClassAndAfterClassTest.php';
13require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'TestWithTest.php';
14require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'BeforeClassWithOnlyDataProviderTest.php';
15require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'DataProviderSkippedTest.php';
16require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'DataProviderDependencyTest.php';
17require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'DataProviderIncompleteTest.php';
18require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'InheritedTestCase.php';
19require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'NoTestCaseClass.php';
20require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'NoTestCases.php';
21require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'NotPublicTestCase.php';
22require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'NotVoidTestCase.php';
23require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'OverrideTestCase.php';
24require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'RequirementsClassBeforeClassHookTest.php';
25
26class Framework_SuiteTest extends PHPUnit_Framework_TestCase
27{
28    protected $result;
29
30    protected function setUp()
31    {
32        $this->result = new PHPUnit_Framework_TestResult;
33    }
34
35    public static function suite()
36    {
37        $suite = new PHPUnit_Framework_TestSuite;
38
39        $suite->addTest(new self('testAddTestSuite'));
40        $suite->addTest(new self('testInheritedTests'));
41        $suite->addTest(new self('testNoTestCases'));
42        $suite->addTest(new self('testNoTestCaseClass'));
43        $suite->addTest(new self('testNotExistingTestCase'));
44        $suite->addTest(new self('testNotPublicTestCase'));
45        $suite->addTest(new self('testNotVoidTestCase'));
46        $suite->addTest(new self('testOneTestCase'));
47        $suite->addTest(new self('testShadowedTests'));
48        $suite->addTest(new self('testBeforeClassAndAfterClassAnnotations'));
49        $suite->addTest(new self('testBeforeClassWithDataProviders'));
50        $suite->addTest(new self('testBeforeAnnotation'));
51        $suite->addTest(new self('testTestWithAnnotation'));
52        $suite->addTest(new self('testSkippedTestDataProvider'));
53        $suite->addTest(new self('testTestDataProviderDependency'));
54        $suite->addTest(new self('testIncompleteTestDataProvider'));
55        $suite->addTest(new self('testRequirementsBeforeClassHook'));
56        $suite->addTest(new self('testDontSkipInheritedClass'));
57
58        return $suite;
59    }
60
61    public function testAddTestSuite()
62    {
63        $suite = new PHPUnit_Framework_TestSuite(
64            'OneTestCase'
65        );
66
67        $suite->run($this->result);
68
69        $this->assertCount(1, $this->result);
70    }
71
72    public function testInheritedTests()
73    {
74        $suite = new PHPUnit_Framework_TestSuite(
75            'InheritedTestCase'
76        );
77
78        $suite->run($this->result);
79
80        $this->assertTrue($this->result->wasSuccessful());
81        $this->assertCount(2, $this->result);
82    }
83
84    public function testNoTestCases()
85    {
86        $suite = new PHPUnit_Framework_TestSuite(
87            'NoTestCases'
88        );
89
90        $suite->run($this->result);
91
92        $this->assertTrue(!$this->result->wasSuccessful());
93        $this->assertEquals(0, $this->result->failureCount());
94        $this->assertEquals(1, $this->result->warningCount());
95        $this->assertCount(1, $this->result);
96    }
97
98    /**
99     * @expectedException PHPUnit_Framework_Exception
100     */
101    public function testNoTestCaseClass()
102    {
103        $suite = new PHPUnit_Framework_TestSuite('NoTestCaseClass');
104    }
105
106    public function testNotExistingTestCase()
107    {
108        $suite = new self('notExistingMethod');
109
110        $suite->run($this->result);
111
112        $this->assertEquals(0, $this->result->errorCount());
113        $this->assertEquals(1, $this->result->failureCount());
114        $this->assertCount(1, $this->result);
115    }
116
117    public function testNotPublicTestCase()
118    {
119        $suite = new PHPUnit_Framework_TestSuite(
120            'NotPublicTestCase'
121        );
122
123        $this->assertCount(2, $suite);
124    }
125
126    public function testNotVoidTestCase()
127    {
128        $suite = new PHPUnit_Framework_TestSuite(
129            'NotVoidTestCase'
130        );
131
132        $this->assertCount(1, $suite);
133    }
134
135    public function testOneTestCase()
136    {
137        $suite = new PHPUnit_Framework_TestSuite(
138            'OneTestCase'
139        );
140
141        $suite->run($this->result);
142
143        $this->assertEquals(0, $this->result->errorCount());
144        $this->assertEquals(0, $this->result->failureCount());
145        $this->assertCount(1, $this->result);
146        $this->assertTrue($this->result->wasSuccessful());
147    }
148
149    public function testShadowedTests()
150    {
151        $suite = new PHPUnit_Framework_TestSuite(
152            'OverrideTestCase'
153        );
154
155        $suite->run($this->result);
156
157        $this->assertCount(1, $this->result);
158    }
159
160    public function testBeforeClassAndAfterClassAnnotations()
161    {
162        $suite = new PHPUnit_Framework_TestSuite(
163            'BeforeClassAndAfterClassTest'
164        );
165
166        BeforeClassAndAfterClassTest::resetProperties();
167        $suite->run($this->result);
168
169        $this->assertEquals(1, BeforeClassAndAfterClassTest::$beforeClassWasRun, '@beforeClass method was not run once for the whole suite.');
170        $this->assertEquals(1, BeforeClassAndAfterClassTest::$afterClassWasRun, '@afterClass method was not run once for the whole suite.');
171    }
172
173    public function testBeforeClassWithDataProviders()
174    {
175        $suite = new PHPUnit_Framework_TestSuite(
176            'BeforeClassWithOnlyDataProviderTest'
177        );
178
179        BeforeClassWithOnlyDataProviderTest::resetProperties();
180        $suite->run($this->result);
181
182        $this->assertTrue(BeforeClassWithOnlyDataProviderTest::$setUpBeforeClassWasCalled, 'setUpBeforeClass method was not run.');
183        $this->assertTrue(BeforeClassWithOnlyDataProviderTest::$beforeClassWasCalled, '@beforeClass method was not run.');
184    }
185
186    public function testBeforeAnnotation()
187    {
188        $test = new PHPUnit_Framework_TestSuite(
189            'BeforeAndAfterTest'
190        );
191
192        BeforeAndAfterTest::resetProperties();
193        $result = $test->run();
194
195        $this->assertEquals(2, BeforeAndAfterTest::$beforeWasRun);
196        $this->assertEquals(2, BeforeAndAfterTest::$afterWasRun);
197    }
198
199    public function testTestWithAnnotation()
200    {
201        $test = new PHPUnit_Framework_TestSuite(
202            'TestWithTest'
203        );
204
205        BeforeAndAfterTest::resetProperties();
206        $result = $test->run();
207
208        $this->assertCount(4, $result->passed());
209    }
210
211    public function testSkippedTestDataProvider()
212    {
213        $suite = new PHPUnit_Framework_TestSuite('DataProviderSkippedTest');
214
215        $suite->run($this->result);
216
217        $this->assertEquals(3, $this->result->count());
218        $this->assertEquals(1, $this->result->skippedCount());
219    }
220
221    public function testTestDataProviderDependency()
222    {
223        $suite = new PHPUnit_Framework_TestSuite('DataProviderDependencyTest');
224
225        $suite->run($this->result);
226
227        $skipped           = $this->result->skipped();
228        $lastSkippedResult = array_pop($skipped);
229        $message           = $lastSkippedResult->thrownException()->getMessage();
230
231        $this->assertContains('Test for DataProviderDependencyTest::testDependency skipped by data provider', $message);
232    }
233
234    public function testIncompleteTestDataProvider()
235    {
236        $suite = new PHPUnit_Framework_TestSuite('DataProviderIncompleteTest');
237
238        $suite->run($this->result);
239
240        $this->assertEquals(3, $this->result->count());
241        $this->assertEquals(1, $this->result->notImplementedCount());
242    }
243
244    public function testRequirementsBeforeClassHook()
245    {
246        $suite = new PHPUnit_Framework_TestSuite(
247            'RequirementsClassBeforeClassHookTest'
248        );
249
250        $suite->run($this->result);
251
252        $this->assertEquals(0, $this->result->errorCount());
253        $this->assertEquals(1, $this->result->skippedCount());
254    }
255
256    public function testDontSkipInheritedClass()
257    {
258        $suite = new PHPUnit_Framework_TestSuite(
259            'DontSkipInheritedClass'
260        );
261
262        $dir = dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'Inheritance' . DIRECTORY_SEPARATOR;
263
264        $suite->addTestFile($dir . 'InheritanceA.php');
265        $suite->addTestFile($dir . 'InheritanceB.php');
266        $result = $suite->run();
267        $this->assertCount(2, $result);
268    }
269}
270