3 * This file is part of PHPUnit.
5 * (c) Sebastian Bergmann <sebastian@phpunit.de>
7 * For the full copyright and license information, please view the LICENSE
8 * file that was distributed with this source code.
11 if (!defined('TEST_FILES_PATH')) {
14 dirname(__DIR__) . DIRECTORY_SEPARATOR .
15 '_files' . DIRECTORY_SEPARATOR
19 require TEST_FILES_PATH . 'CoverageNamespacedFunctionTest.php';
20 require TEST_FILES_PATH . 'NamespaceCoveredFunction.php';
23 * @since Class available since Release 3.3.6
25 class Util_TestTest extends PHPUnit_Framework_TestCase
28 * @covers PHPUnit_Util_Test::getExpectedException
30 * @todo Split up in separate tests
32 public function testGetExpectedException()
34 $this->assertArraySubset(
35 array('class' => 'FooBarBaz', 'code' => null, 'message' => ''),
36 PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testOne')
39 $this->assertArraySubset(
40 array('class' => 'Foo_Bar_Baz', 'code' => null, 'message' => ''),
41 PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testTwo')
44 $this->assertArraySubset(
45 array('class' => 'Foo\Bar\Baz', 'code' => null, 'message' => ''),
46 PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testThree')
49 $this->assertArraySubset(
50 array('class' => 'ほげ', 'code' => null, 'message' => ''),
51 PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testFour')
54 $this->assertArraySubset(
55 array('class' => 'Class', 'code' => 1234, 'message' => 'Message'),
56 PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testFive')
59 $this->assertArraySubset(
60 array('class' => 'Class', 'code' => 1234, 'message' => 'Message'),
61 PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testSix')
64 $this->assertArraySubset(
65 array('class' => 'Class', 'code' => 'ExceptionCode', 'message' => 'Message'),
66 PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testSeven')
69 $this->assertArraySubset(
70 array('class' => 'Class', 'code' => 0, 'message' => 'Message'),
71 PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testEight')
74 $this->assertArraySubset(
75 array('class' => 'Class', 'code' => ExceptionTest::ERROR_CODE, 'message' => ExceptionTest::ERROR_MESSAGE),
76 PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testNine')
79 $this->assertArraySubset(
80 array('class' => 'Class', 'code' => null, 'message' => ''),
81 PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testSingleLine')
84 $this->assertArraySubset(
85 array('class' => 'Class', 'code' => My\Space\ExceptionNamespaceTest::ERROR_CODE, 'message' => My\Space\ExceptionNamespaceTest::ERROR_MESSAGE),
86 PHPUnit_Util_Test::getExpectedException('My\Space\ExceptionNamespaceTest', 'testConstants')
89 // Ensure the Class::CONST expression is only evaluated when the constant really exists
90 $this->assertArraySubset(
91 array('class' => 'Class', 'code' => 'ExceptionTest::UNKNOWN_CODE_CONSTANT', 'message' => 'ExceptionTest::UNKNOWN_MESSAGE_CONSTANT'),
92 PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testUnknownConstants')
95 $this->assertArraySubset(
96 array('class' => 'Class', 'code' => 'My\Space\ExceptionNamespaceTest::UNKNOWN_CODE_CONSTANT', 'message' => 'My\Space\ExceptionNamespaceTest::UNKNOWN_MESSAGE_CONSTANT'),
97 PHPUnit_Util_Test::getExpectedException('My\Space\ExceptionNamespaceTest', 'testUnknownConstants')
102 * @covers PHPUnit_Util_Test::getExpectedException
104 public function testGetExpectedRegExp()
106 $this->assertArraySubset(
107 array('message_regex' => '#regex#'),
108 PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testWithRegexMessage')
111 $this->assertArraySubset(
112 array('message_regex' => '#regex#'),
113 PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testWithRegexMessageFromClassConstant')
116 $this->assertArraySubset(
117 array('message_regex' => 'ExceptionTest::UNKNOWN_MESSAGE_REGEX_CONSTANT'),
118 PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testWithUnknowRegexMessageFromClassConstant')
123 * @covers PHPUnit_Util_Test::getRequirements
124 * @dataProvider requirementsProvider
126 public function testGetRequirements($test, $result)
130 PHPUnit_Util_Test::getRequirements('RequirementsTest', $test)
134 public function requirementsProvider()
137 array('testOne', array()),
138 array('testTwo', array('PHPUnit' => '1.0')),
139 array('testThree', array('PHP' => '2.0')),
140 array('testFour', array('PHPUnit' => '2.0', 'PHP' => '1.0')),
141 array('testFive', array('PHP' => '5.4.0RC6')),
142 array('testSix', array('PHP' => '5.4.0-alpha1')),
143 array('testSeven', array('PHP' => '5.4.0beta2')),
144 array('testEight', array('PHP' => '5.4-dev')),
145 array('testNine', array('functions' => array('testFunc'))),
146 array('testTen', array('extensions' => array('testExt'))),
147 array('testEleven', array('OS' => '/Linux/i')),
151 'extensions' => array('spl'),
156 'testAllPossibleRequirements',
159 'PHPUnit' => '9-dev',
160 'OS' => '/DOESNOTEXIST/i',
161 'functions' => array(
165 'extensions' => array(
175 * @covers PHPUnit_Util_Test::getRequirements
177 public function testGetRequirementsMergesClassAndMethodDocBlocks()
179 $expectedAnnotations = array(
183 'functions' => array(
187 'extensions' => array(
194 $expectedAnnotations,
195 PHPUnit_Util_Test::getRequirements('RequirementsClassDocBlockTest', 'testMethod')
200 * @covers PHPUnit_Util_Test::getMissingRequirements
201 * @dataProvider missingRequirementsProvider
203 public function testGetMissingRequirements($test, $result)
207 PHPUnit_Util_Test::getMissingRequirements('RequirementsTest', $test)
211 public function missingRequirementsProvider()
214 array('testOne', array()),
215 array('testNine', array('Function testFunc is required.')),
216 array('testTen', array('Extension testExt is required.')),
217 array('testAlwaysSkip', array('PHPUnit 1111111 (or later) is required.')),
218 array('testAlwaysSkip2', array('PHP 9999999 (or later) is required.')),
219 array('testAlwaysSkip3', array('Operating system matching /DOESNOTEXIST/i is required.')),
220 array('testAllPossibleRequirements', array(
221 'PHP 99-dev (or later) is required.',
222 'PHPUnit 9-dev (or later) is required.',
223 'Operating system matching /DOESNOTEXIST/i is required.',
224 'Function testFuncOne is required.',
225 'Function testFuncTwo is required.',
226 'Extension testExtOne is required.',
227 'Extension testExtTwo is required.',
235 * @todo This test does not really test functionality of PHPUnit_Util_Test
237 public function testGetProvidedDataRegEx()
239 $result = preg_match(PHPUnit_Util_Test::REGEX_DATA_PROVIDER, '@dataProvider method', $matches);
240 $this->assertEquals(1, $result);
241 $this->assertEquals('method', $matches[1]);
243 $result = preg_match(PHPUnit_Util_Test::REGEX_DATA_PROVIDER, '@dataProvider class::method', $matches);
244 $this->assertEquals(1, $result);
245 $this->assertEquals('class::method', $matches[1]);
247 $result = preg_match(PHPUnit_Util_Test::REGEX_DATA_PROVIDER, '@dataProvider namespace\class::method', $matches);
248 $this->assertEquals(1, $result);
249 $this->assertEquals('namespace\class::method', $matches[1]);
251 $result = preg_match(PHPUnit_Util_Test::REGEX_DATA_PROVIDER, '@dataProvider namespace\namespace\class::method', $matches);
252 $this->assertEquals(1, $result);
253 $this->assertEquals('namespace\namespace\class::method', $matches[1]);
255 $result = preg_match(PHPUnit_Util_Test::REGEX_DATA_PROVIDER, '@dataProvider メソッド', $matches);
256 $this->assertEquals(1, $result);
257 $this->assertEquals('メソッド', $matches[1]);
261 * @covers PHPUnit_Util_Test::getDataFromTestWithAnnotation
263 public function testTestWithEmptyAnnotation()
265 $result = PHPUnit_Util_Test::getDataFromTestWithAnnotation("/**\n * @anotherAnnotation\n */");
266 $this->assertNull($result);
270 * @covers PHPUnit_Util_Test::getDataFromTestWithAnnotation
272 public function testTestWithSimpleCase()
274 $result = PHPUnit_Util_Test::getDataFromTestWithAnnotation('/**
277 $this->assertEquals(array(array(1)), $result);
281 * @covers PHPUnit_Util_Test::getDataFromTestWithAnnotation
283 public function testTestWithMultiLineMultiParameterCase()
285 $result = PHPUnit_Util_Test::getDataFromTestWithAnnotation('/**
289 $this->assertEquals(array(array(1, 2), array(3, 4)), $result);
293 * @covers PHPUnit_Util_Test::getDataFromTestWithAnnotation
295 public function testTestWithVariousTypes()
297 $result = PHPUnit_Util_Test::getDataFromTestWithAnnotation('/**
302 $this->assertEquals(array(array('ab'), array(true), array(null)), $result);
306 * @covers PHPUnit_Util_Test::getDataFromTestWithAnnotation
308 public function testTestWithAnnotationAfter()
310 $result = PHPUnit_Util_Test::getDataFromTestWithAnnotation('/**
315 $this->assertEquals(array(array(1), array(2)), $result);
319 * @covers PHPUnit_Util_Test::getDataFromTestWithAnnotation
321 public function testTestWithSimpleTextAfter()
323 $result = PHPUnit_Util_Test::getDataFromTestWithAnnotation('/**
328 $this->assertEquals(array(array(1), array(2)), $result);
332 * @covers PHPUnit_Util_Test::getDataFromTestWithAnnotation
334 public function testTestWithCharacterEscape()
336 $result = PHPUnit_Util_Test::getDataFromTestWithAnnotation('/**
337 * @testWith ["\"", "\""]
339 $this->assertEquals(array(array('"', '"')), $result);
343 * @covers PHPUnit_Util_Test::getDataFromTestWithAnnotation
345 public function testTestWithThrowsProperExceptionIfDatasetCannotBeParsed()
347 $this->setExpectedExceptionRegExp(
348 'PHPUnit_Framework_Exception',
349 '/^The dataset for the @testWith annotation cannot be parsed:/'
351 PHPUnit_Util_Test::getDataFromTestWithAnnotation('/**
356 public function testTestWithThrowsProperExceptionIfMultiLineDatasetCannotBeParsed()
358 $this->setExpectedExceptionRegExp(
359 'PHPUnit_Framework_Exception',
360 '/^The dataset for the @testWith annotation cannot be parsed:/'
362 PHPUnit_Util_Test::getDataFromTestWithAnnotation('/**
363 * @testWith ["valid"]
369 * @covers PHPUnit_Util_Test::getDependencies
371 * @todo Not sure what this test tests (name is misleading at least)
373 public function testParseAnnotation()
377 PHPUnit_Util_Test::getDependencies(get_class($this), 'methodForTestParseAnnotation')
385 * @todo Remove fixture from test class
387 public function methodForTestParseAnnotation()
392 * @covers PHPUnit_Util_Test::getDependencies
394 public function testParseAnnotationThatIsOnlyOneLine()
398 PHPUnit_Util_Test::getDependencies(get_class($this), 'methodForTestParseAnnotationThatIsOnlyOneLine')
403 public function methodForTestParseAnnotationThatIsOnlyOneLine()
405 // TODO Remove fixture from test class
409 * @covers PHPUnit_Util_Test::getLinesToBeCovered
410 * @covers PHPUnit_Util_Test::getLinesToBeCoveredOrUsed
411 * @covers PHPUnit_Util_Test::resolveElementToReflectionObjects
412 * @dataProvider getLinesToBeCoveredProvider
414 public function testGetLinesToBeCovered($test, $lines)
416 if (strpos($test, 'Namespace') === 0) {
418 TEST_FILES_PATH . 'NamespaceCoveredClass.php' => $lines
420 } elseif ($test === 'CoverageNoneTest') {
422 } elseif ($test === 'CoverageNothingTest') {
424 } elseif ($test === 'CoverageFunctionTest') {
426 TEST_FILES_PATH . 'CoveredFunction.php' => $lines
429 $expected = array(TEST_FILES_PATH . 'CoveredClass.php' => $lines);
434 PHPUnit_Util_Test::getLinesToBeCovered(
435 $test, 'testSomething'
441 * @covers PHPUnit_Util_Test::getLinesToBeCovered
442 * @covers PHPUnit_Util_Test::getLinesToBeCoveredOrUsed
443 * @covers PHPUnit_Util_Test::resolveElementToReflectionObjects
444 * @expectedException PHPUnit_Framework_CodeCoverageException
446 public function testGetLinesToBeCovered2()
448 PHPUnit_Util_Test::getLinesToBeCovered(
449 'NotExistingCoveredElementTest', 'testOne'
454 * @covers PHPUnit_Util_Test::getLinesToBeCovered
455 * @covers PHPUnit_Util_Test::getLinesToBeCoveredOrUsed
456 * @covers PHPUnit_Util_Test::resolveElementToReflectionObjects
457 * @expectedException PHPUnit_Framework_CodeCoverageException
459 public function testGetLinesToBeCovered3()
461 PHPUnit_Util_Test::getLinesToBeCovered(
462 'NotExistingCoveredElementTest', 'testTwo'
467 * @covers PHPUnit_Util_Test::getLinesToBeCovered
468 * @covers PHPUnit_Util_Test::getLinesToBeCoveredOrUsed
469 * @covers PHPUnit_Util_Test::resolveElementToReflectionObjects
470 * @expectedException PHPUnit_Framework_CodeCoverageException
472 public function testGetLinesToBeCovered4()
474 PHPUnit_Util_Test::getLinesToBeCovered(
475 'NotExistingCoveredElementTest', 'testThree'
480 * @covers PHPUnit_Util_Test::getLinesToBeCovered
481 * @covers PHPUnit_Util_Test::getLinesToBeCoveredOrUsed
483 public function testGetLinesToBeCoveredSkipsNonExistentMethods()
487 PHPUnit_Util_Test::getLinesToBeCovered(
488 'NotExistingCoveredElementTest',
495 * @covers PHPUnit_Util_Test::getLinesToBeCovered
496 * @covers PHPUnit_Util_Test::getLinesToBeCoveredOrUsed
497 * @expectedException PHPUnit_Framework_CodeCoverageException
499 public function testTwoCoversDefaultClassAnnoationsAreNotAllowed()
501 PHPUnit_Util_Test::getLinesToBeCovered(
502 'CoverageTwoDefaultClassAnnotations',
508 * @covers PHPUnit_Util_Test::getLinesToBeCovered
509 * @covers PHPUnit_Util_Test::getLinesToBeCoveredOrUsed
511 public function testFunctionParenthesesAreAllowed()
514 array(TEST_FILES_PATH . 'CoveredFunction.php' => range(2, 4)),
515 PHPUnit_Util_Test::getLinesToBeCovered(
516 'CoverageFunctionParenthesesTest',
523 * @covers PHPUnit_Util_Test::getLinesToBeCovered
524 * @covers PHPUnit_Util_Test::getLinesToBeCoveredOrUsed
526 public function testFunctionParenthesesAreAllowedWithWhitespace()
529 array(TEST_FILES_PATH . 'CoveredFunction.php' => range(2, 4)),
530 PHPUnit_Util_Test::getLinesToBeCovered(
531 'CoverageFunctionParenthesesWhitespaceTest',
538 * @covers PHPUnit_Util_Test::getLinesToBeCovered
539 * @covers PHPUnit_Util_Test::getLinesToBeCoveredOrUsed
541 public function testMethodParenthesesAreAllowed()
544 array(TEST_FILES_PATH . 'CoveredClass.php' => range(31, 35)),
545 PHPUnit_Util_Test::getLinesToBeCovered(
546 'CoverageMethodParenthesesTest',
553 * @covers PHPUnit_Util_Test::getLinesToBeCovered
554 * @covers PHPUnit_Util_Test::getLinesToBeCoveredOrUsed
556 public function testMethodParenthesesAreAllowedWithWhitespace()
559 array(TEST_FILES_PATH . 'CoveredClass.php' => range(31, 35)),
560 PHPUnit_Util_Test::getLinesToBeCovered(
561 'CoverageMethodParenthesesWhitespaceTest',
568 * @covers PHPUnit_Util_Test::getLinesToBeCovered
569 * @covers PHPUnit_Util_Test::getLinesToBeCoveredOrUsed
571 public function testNamespacedFunctionCanBeCoveredOrUsed()
575 TEST_FILES_PATH . 'NamespaceCoveredFunction.php' => range(4, 7)
577 PHPUnit_Util_Test::getLinesToBeCovered(
578 'CoverageNamespacedFunctionTest',
584 public function getLinesToBeCoveredProvider()
592 'CoverageClassExtendedTest',
593 array_merge(range(19, 36), range(2, 17))
600 'CoverageMethodTest',
604 'CoverageMethodOneLineAnnotationTest',
608 'CoverageNotPrivateTest',
609 array_merge(range(25, 29), range(31, 35))
612 'CoverageNotProtectedTest',
613 array_merge(range(21, 23), range(31, 35))
616 'CoverageNotPublicTest',
617 array_merge(range(21, 23), range(25, 29))
620 'CoveragePrivateTest',
624 'CoverageProtectedTest',
628 'CoveragePublicTest',
632 'CoverageFunctionTest',
636 'NamespaceCoverageClassExtendedTest',
637 array_merge(range(21, 38), range(4, 19))
640 'NamespaceCoverageClassTest',
644 'NamespaceCoverageMethodTest',
648 'NamespaceCoverageNotPrivateTest',
649 array_merge(range(27, 31), range(33, 37))
652 'NamespaceCoverageNotProtectedTest',
653 array_merge(range(23, 25), range(33, 37))
656 'NamespaceCoverageNotPublicTest',
657 array_merge(range(23, 25), range(27, 31))
660 'NamespaceCoveragePrivateTest',
664 'NamespaceCoverageProtectedTest',
668 'NamespaceCoveragePublicTest',
672 'NamespaceCoverageCoversClassTest',
673 array_merge(range(23, 25), range(27, 31), range(33, 37), range(6, 8), range(10, 13), range(15, 18))
676 'NamespaceCoverageCoversClassPublicTest',
680 'CoverageNothingTest',