344 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			344 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /*
 | |
|  * This file is part of the php-code-coverage package.
 | |
|  *
 | |
|  * (c) Sebastian Bergmann <sebastian@phpunit.de>
 | |
|  *
 | |
|  * For the full copyright and license information, please view the LICENSE
 | |
|  * file that was distributed with this source code.
 | |
|  */
 | |
| 
 | |
| namespace SebastianBergmann\CodeCoverage;
 | |
| 
 | |
| use SebastianBergmann\CodeCoverage\Driver\Xdebug;
 | |
| 
 | |
| /**
 | |
|  * Abstract base class for test case classes.
 | |
|  *
 | |
|  * @since Class available since Release 1.0.0
 | |
|  */
 | |
| abstract class TestCase extends \PHPUnit\Framework\TestCase
 | |
| {
 | |
|     protected static $TEST_TMP_PATH;
 | |
| 
 | |
|     public static function setUpBeforeClass()
 | |
|     {
 | |
|         self::$TEST_TMP_PATH = TEST_FILES_PATH . 'tmp';
 | |
|     }
 | |
| 
 | |
|     protected function getXdebugDataForBankAccount()
 | |
|     {
 | |
|         return [
 | |
|             [
 | |
|                 TEST_FILES_PATH . 'BankAccount.php' => [
 | |
|                     8  => 1,
 | |
|                     9  => -2,
 | |
|                     13 => -1,
 | |
|                     14 => -1,
 | |
|                     15 => -1,
 | |
|                     16 => -1,
 | |
|                     18 => -1,
 | |
|                     22 => -1,
 | |
|                     24 => -1,
 | |
|                     25 => -2,
 | |
|                     29 => -1,
 | |
|                     31 => -1,
 | |
|                     32 => -2
 | |
|                 ]
 | |
|             ],
 | |
|             [
 | |
|                 TEST_FILES_PATH . 'BankAccount.php' => [
 | |
|                     8  => 1,
 | |
|                     13 => 1,
 | |
|                     16 => 1,
 | |
|                     29 => 1,
 | |
|                 ]
 | |
|             ],
 | |
|             [
 | |
|                 TEST_FILES_PATH . 'BankAccount.php' => [
 | |
|                     8  => 1,
 | |
|                     13 => 1,
 | |
|                     16 => 1,
 | |
|                     22 => 1,
 | |
|                 ]
 | |
|             ],
 | |
|             [
 | |
|                 TEST_FILES_PATH . 'BankAccount.php' => [
 | |
|                     8  => 1,
 | |
|                     13 => 1,
 | |
|                     14 => 1,
 | |
|                     15 => 1,
 | |
|                     18 => 1,
 | |
|                     22 => 1,
 | |
|                     24 => 1,
 | |
|                     29 => 1,
 | |
|                     31 => 1,
 | |
|                 ]
 | |
|             ]
 | |
|         ];
 | |
|     }
 | |
| 
 | |
|     protected function getCoverageForBankAccount()
 | |
|     {
 | |
|         $data = $this->getXdebugDataForBankAccount();
 | |
|         require_once TEST_FILES_PATH . '/BankAccountTest.php';
 | |
| 
 | |
|         $stub = $this->createMock(Xdebug::class);
 | |
| 
 | |
|         $stub->expects($this->any())
 | |
|             ->method('stop')
 | |
|             ->will($this->onConsecutiveCalls(
 | |
|                 $data[0],
 | |
|                 $data[1],
 | |
|                 $data[2],
 | |
|                 $data[3]
 | |
|             ));
 | |
| 
 | |
|         $filter = new Filter;
 | |
|         $filter->addFileToWhitelist(TEST_FILES_PATH . 'BankAccount.php');
 | |
| 
 | |
|         $coverage = new CodeCoverage($stub, $filter);
 | |
| 
 | |
|         $coverage->start(
 | |
|             new \BankAccountTest('testBalanceIsInitiallyZero'),
 | |
|             true
 | |
|         );
 | |
| 
 | |
|         $coverage->stop(
 | |
|             true,
 | |
|             [TEST_FILES_PATH . 'BankAccount.php' => range(6, 9)]
 | |
|         );
 | |
| 
 | |
|         $coverage->start(
 | |
|             new \BankAccountTest('testBalanceCannotBecomeNegative')
 | |
|         );
 | |
| 
 | |
|         $coverage->stop(
 | |
|             true,
 | |
|             [TEST_FILES_PATH . 'BankAccount.php' => range(27, 32)]
 | |
|         );
 | |
| 
 | |
|         $coverage->start(
 | |
|             new \BankAccountTest('testBalanceCannotBecomeNegative2')
 | |
|         );
 | |
| 
 | |
|         $coverage->stop(
 | |
|             true,
 | |
|             [TEST_FILES_PATH . 'BankAccount.php' => range(20, 25)]
 | |
|         );
 | |
| 
 | |
|         $coverage->start(
 | |
|             new \BankAccountTest('testDepositWithdrawMoney')
 | |
|         );
 | |
| 
 | |
|         $coverage->stop(
 | |
|             true,
 | |
|             [
 | |
|                 TEST_FILES_PATH . 'BankAccount.php' => array_merge(
 | |
|                     range(6, 9),
 | |
|                     range(20, 25),
 | |
|                     range(27, 32)
 | |
|                 )
 | |
|             ]
 | |
|         );
 | |
| 
 | |
|         return $coverage;
 | |
|     }
 | |
| 
 | |
|     protected function getCoverageForBankAccountForFirstTwoTests()
 | |
|     {
 | |
|         $data = $this->getXdebugDataForBankAccount();
 | |
| 
 | |
|         $stub = $this->createMock(Xdebug::class);
 | |
| 
 | |
|         $stub->expects($this->any())
 | |
|             ->method('stop')
 | |
|             ->will($this->onConsecutiveCalls(
 | |
|                 $data[0],
 | |
|                 $data[1]
 | |
|             ));
 | |
| 
 | |
|         $filter = new Filter;
 | |
|         $filter->addFileToWhitelist(TEST_FILES_PATH . 'BankAccount.php');
 | |
| 
 | |
|         $coverage = new CodeCoverage($stub, $filter);
 | |
| 
 | |
|         $coverage->start(
 | |
|             new \BankAccountTest('testBalanceIsInitiallyZero'),
 | |
|             true
 | |
|         );
 | |
| 
 | |
|         $coverage->stop(
 | |
|             true,
 | |
|             [TEST_FILES_PATH . 'BankAccount.php' => range(6, 9)]
 | |
|         );
 | |
| 
 | |
|         $coverage->start(
 | |
|             new \BankAccountTest('testBalanceCannotBecomeNegative')
 | |
|         );
 | |
| 
 | |
|         $coverage->stop(
 | |
|             true,
 | |
|             [TEST_FILES_PATH . 'BankAccount.php' => range(27, 32)]
 | |
|         );
 | |
| 
 | |
|         return $coverage;
 | |
|     }
 | |
| 
 | |
|     protected function getCoverageForBankAccountForLastTwoTests()
 | |
|     {
 | |
|         $data = $this->getXdebugDataForBankAccount();
 | |
| 
 | |
|         $stub = $this->createMock(Xdebug::class);
 | |
| 
 | |
|         $stub->expects($this->any())
 | |
|             ->method('stop')
 | |
|             ->will($this->onConsecutiveCalls(
 | |
|                 $data[2],
 | |
|                 $data[3]
 | |
|             ));
 | |
| 
 | |
|         $filter = new Filter;
 | |
|         $filter->addFileToWhitelist(TEST_FILES_PATH . 'BankAccount.php');
 | |
| 
 | |
|         $coverage = new CodeCoverage($stub, $filter);
 | |
| 
 | |
|         $coverage->start(
 | |
|             new \BankAccountTest('testBalanceCannotBecomeNegative2')
 | |
|         );
 | |
| 
 | |
|         $coverage->stop(
 | |
|             true,
 | |
|             [TEST_FILES_PATH . 'BankAccount.php' => range(20, 25)]
 | |
|         );
 | |
| 
 | |
|         $coverage->start(
 | |
|             new \BankAccountTest('testDepositWithdrawMoney')
 | |
|         );
 | |
| 
 | |
|         $coverage->stop(
 | |
|             true,
 | |
|             [
 | |
|                 TEST_FILES_PATH . 'BankAccount.php' => array_merge(
 | |
|                     range(6, 9),
 | |
|                     range(20, 25),
 | |
|                     range(27, 32)
 | |
|                 )
 | |
|             ]
 | |
|         );
 | |
| 
 | |
|         return $coverage;
 | |
|     }
 | |
| 
 | |
|     protected function getExpectedDataArrayForBankAccount()
 | |
|     {
 | |
|         return [
 | |
|             TEST_FILES_PATH . 'BankAccount.php' => [
 | |
|                 8 => [
 | |
|                     0 => 'BankAccountTest::testBalanceIsInitiallyZero',
 | |
|                     1 => 'BankAccountTest::testDepositWithdrawMoney'
 | |
|                 ],
 | |
|                 9  => null,
 | |
|                 13 => [],
 | |
|                 14 => [],
 | |
|                 15 => [],
 | |
|                 16 => [],
 | |
|                 18 => [],
 | |
|                 22 => [
 | |
|                     0 => 'BankAccountTest::testBalanceCannotBecomeNegative2',
 | |
|                     1 => 'BankAccountTest::testDepositWithdrawMoney'
 | |
|                 ],
 | |
|                 24 => [
 | |
|                     0 => 'BankAccountTest::testDepositWithdrawMoney',
 | |
|                 ],
 | |
|                 25 => null,
 | |
|                 29 => [
 | |
|                     0 => 'BankAccountTest::testBalanceCannotBecomeNegative',
 | |
|                     1 => 'BankAccountTest::testDepositWithdrawMoney'
 | |
|                 ],
 | |
|                 31 => [
 | |
|                     0 => 'BankAccountTest::testDepositWithdrawMoney'
 | |
|                 ],
 | |
|                 32 => null
 | |
|             ]
 | |
|         ];
 | |
|     }
 | |
| 
 | |
|     protected function getCoverageForFileWithIgnoredLines()
 | |
|     {
 | |
|         $filter = new Filter;
 | |
|         $filter->addFileToWhitelist(TEST_FILES_PATH . 'source_with_ignore.php');
 | |
| 
 | |
|         $coverage = new CodeCoverage(
 | |
|             $this->setUpXdebugStubForFileWithIgnoredLines(),
 | |
|             $filter
 | |
|         );
 | |
| 
 | |
|         $coverage->start('FileWithIgnoredLines', true);
 | |
|         $coverage->stop();
 | |
| 
 | |
|         return $coverage;
 | |
|     }
 | |
| 
 | |
|     protected function setUpXdebugStubForFileWithIgnoredLines()
 | |
|     {
 | |
|         $stub = $this->createMock(Xdebug::class);
 | |
| 
 | |
|         $stub->expects($this->any())
 | |
|             ->method('stop')
 | |
|             ->will($this->returnValue(
 | |
|                 [
 | |
|                     TEST_FILES_PATH . 'source_with_ignore.php' => [
 | |
|                         2 => 1,
 | |
|                         4 => -1,
 | |
|                         6 => -1,
 | |
|                         7 => 1
 | |
|                     ]
 | |
|                 ]
 | |
|             ));
 | |
| 
 | |
|         return $stub;
 | |
|     }
 | |
| 
 | |
|     protected function getCoverageForClassWithAnonymousFunction()
 | |
|     {
 | |
|         $filter = new Filter;
 | |
|         $filter->addFileToWhitelist(TEST_FILES_PATH . 'source_with_class_and_anonymous_function.php');
 | |
| 
 | |
|         $coverage = new CodeCoverage(
 | |
|             $this->setUpXdebugStubForClassWithAnonymousFunction(),
 | |
|             $filter
 | |
|         );
 | |
| 
 | |
|         $coverage->start('ClassWithAnonymousFunction', true);
 | |
|         $coverage->stop();
 | |
| 
 | |
|         return $coverage;
 | |
|     }
 | |
| 
 | |
|     protected function setUpXdebugStubForClassWithAnonymousFunction()
 | |
|     {
 | |
|         $stub = $this->createMock(Xdebug::class);
 | |
| 
 | |
|         $stub->expects($this->any())
 | |
|             ->method('stop')
 | |
|             ->will($this->returnValue(
 | |
|                 [
 | |
|                     TEST_FILES_PATH . 'source_with_class_and_anonymous_function.php' => [
 | |
|                         7  => 1,
 | |
|                         9  => 1,
 | |
|                         10 => -1,
 | |
|                         11 => 1,
 | |
|                         12 => 1,
 | |
|                         13 => 1,
 | |
|                         14 => 1,
 | |
|                         17 => 1,
 | |
|                         18 => 1
 | |
|                     ]
 | |
|                 ]
 | |
|             ));
 | |
| 
 | |
|         return $stub;
 | |
|     }
 | |
| }
 |