Вход Регистрация
Файл: vendor/phpunit/phpunit/src/Framework/TestBuilder.php
Строк: 173
<?php declare(strict_types=1);
/*
 * This file is part of PHPUnit.
 *
 * (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 PHPUnitFramework;

use function 
assert;
use function 
count;
use function 
get_class;
use function 
sprintf;
use function 
trim;
use 
PHPUnitUtilFilter;
use 
PHPUnitUtilInvalidDataSetException;
use 
PHPUnitUtilTest as TestUtil;
use 
ReflectionClass;
use 
Throwable;

/**
 * @internal This class is not covered by the backward compatibility promise for PHPUnit
 */
final class TestBuilder
{
    public function 
build(ReflectionClass $theClassstring $methodName): Test
    
{
        
$className $theClass->getName();

        if (!
$theClass->isInstantiable()) {
            return new 
ErrorTestCase(
                
sprintf('Cannot instantiate class "%s".'$className)
            );
        }

        
$backupSettings TestUtil::getBackupSettings(
            
$className,
            
$methodName
        
);

        
$preserveGlobalState TestUtil::getPreserveGlobalStateSettings(
            
$className,
            
$methodName
        
);

        
$runTestInSeparateProcess TestUtil::getProcessIsolationSettings(
            
$className,
            
$methodName
        
);

        
$runClassInSeparateProcess TestUtil::getClassProcessIsolationSettings(
            
$className,
            
$methodName
        
);

        
$constructor $theClass->getConstructor();

        if (
$constructor === null) {
            throw new 
Exception('No valid test provided.');
        }

        
$parameters $constructor->getParameters();

        
// TestCase() or TestCase($name)
        
if (count($parameters) < 2) {
            
$test $this->buildTestWithoutData($className);
        } 
// TestCase($name, $data)
        
else {
            try {
                
$data TestUtil::getProvidedData(
                    
$className,
                    
$methodName
                
);
            } catch (
IncompleteTestError $e) {
                
$message sprintf(
                    
"Test for %s::%s marked incomplete by data providern%s",
                    
$className,
                    
$methodName,
                    
$this->throwableToString($e)
                );

                
$data = new IncompleteTestCase($className$methodName$message);
            } catch (
SkippedTestError $e) {
                
$message sprintf(
                    
"Test for %s::%s skipped by data providern%s",
                    
$className,
                    
$methodName,
                    
$this->throwableToString($e)
                );

                
$data = new SkippedTestCase($className$methodName$message);
            } catch (
Throwable $t) {
                
$message sprintf(
                    
"The data provider specified for %s::%s is invalid.n%s",
                    
$className,
                    
$methodName,
                    
$this->throwableToString($t)
                );

                
$data = new ErrorTestCase($message);
            }

            
// Test method with @dataProvider.
            
if (isset($data)) {
                
$test $this->buildDataProviderTestSuite(
                    
$methodName,
                    
$className,
                    
$data,
                    
$runTestInSeparateProcess,
                    
$preserveGlobalState,
                    
$runClassInSeparateProcess,
                    
$backupSettings
                
);
            } else {
                
$test $this->buildTestWithoutData($className);
            }
        }

        if (
$test instanceof TestCase) {
            
$test->setName($methodName);
            
$this->configureTestCase(
                
$test,
                
$runTestInSeparateProcess,
                
$preserveGlobalState,
                
$runClassInSeparateProcess,
                
$backupSettings
            
);
        }

        return 
$test;
    }

    
/** @psalm-param class-string $className */
    
private function buildTestWithoutData(string $className)
    {
        return new 
$className;
    }

    
/** @psalm-param class-string $className */
    
private function buildDataProviderTestSuite(
        
string $methodName,
        
string $className,
        
$data,
        
bool $runTestInSeparateProcess,
        ?
bool $preserveGlobalState,
        
bool $runClassInSeparateProcess,
        array 
$backupSettings
    
): DataProviderTestSuite {
        
$dataProviderTestSuite = new DataProviderTestSuite(
            
$className '::' $methodName
        
);

        
$groups TestUtil::getGroups($className$methodName);

        if (
$data instanceof ErrorTestCase ||
            
$data instanceof SkippedTestCase ||
            
$data instanceof IncompleteTestCase) {
            
$dataProviderTestSuite->addTest($data$groups);
        } else {
            foreach (
$data as $_dataName => $_data) {
                
$_test = new $className($methodName$_data$_dataName);

                
assert($_test instanceof TestCase);

                
$this->configureTestCase(
                    
$_test,
                    
$runTestInSeparateProcess,
                    
$preserveGlobalState,
                    
$runClassInSeparateProcess,
                    
$backupSettings
                
);

                
$dataProviderTestSuite->addTest($_test$groups);
            }
        }

        return 
$dataProviderTestSuite;
    }

    private function 
configureTestCase(
        
TestCase $test,
        
bool $runTestInSeparateProcess,
        ?
bool $preserveGlobalState,
        
bool $runClassInSeparateProcess,
        array 
$backupSettings
    
): void {
        if (
$runTestInSeparateProcess) {
            
$test->setRunTestInSeparateProcess(true);

            if (
$preserveGlobalState !== null) {
                
$test->setPreserveGlobalState($preserveGlobalState);
            }
        }

        if (
$runClassInSeparateProcess) {
            
$test->setRunClassInSeparateProcess(true);

            if (
$preserveGlobalState !== null) {
                
$test->setPreserveGlobalState($preserveGlobalState);
            }
        }

        if (
$backupSettings['backupGlobals'] !== null) {
            
$test->setBackupGlobals($backupSettings['backupGlobals']);
        }

        if (
$backupSettings['backupStaticAttributes'] !== null) {
            
$test->setBackupStaticAttributes(
                
$backupSettings['backupStaticAttributes']
            );
        }
    }

    private function 
throwableToString(Throwable $t): string
    
{
        
$message $t->getMessage();

        if (empty(
trim($message))) {
            
$message '<no message>';
        }

        if (
$t instanceof InvalidDataSetException) {
            return 
sprintf(
                
"%sn%s",
                
$message,
                
Filter::getFilteredStacktrace($t)
            );
        }

        return 
sprintf(
            
"%s: %sn%s",
            
get_class($t),
            
$message,
            
Filter::getFilteredStacktrace($t)
        );
    }
}
Онлайн: 1
Реклама