Вход Регистрация
Файл: vendor/nunomaduro/collision/src/Adapters/Phpunit/Style.php
Строк: 277
<?php

declare(strict_types=1);

namespace 
NunoMaduroCollisionAdaptersPhpunit;

use 
NunoMaduroCollisionExceptionsShouldNotHappen;
use 
NunoMaduroCollisionWriter;
use 
PHPUnitFrameworkAssertionFailedError;
use 
PHPUnitFrameworkExceptionWrapper;
use 
PHPUnitFrameworkExpectationFailedException;
use 
SymfonyComponentConsoleOutputConsoleOutput;
use 
SymfonyComponentConsoleOutputConsoleOutputInterface;
use 
Throwable;
use 
WhoopsExceptionInspector;

/**
 * @internal
 */
final class Style
{
    
/**
     * @var ConsoleOutput
     */
    
private $output;

    
/**
     * Style constructor.
     */
    
public function __construct(ConsoleOutputInterface $output)
    {
        if (! 
$output instanceof ConsoleOutput) {
            throw new 
ShouldNotHappen();
        }

        
$this->output = $output;
    }

    
/**
     * Prints the content.
     */
    
public function write(string $content): void
    
{
        
$this->output->write($content);
    }

    
/**
     * Prints the content similar too:.
     *
     * ```
     *    PASS  UnitExampleTest
     *    ✓ basic test
     * ```
     */
    
public function writeCurrentTestCaseSummary(State $state): void
    
{
        if (
$state->testCaseTestsCount() === 0) {
            return;
        }

        if (! 
$state->headerPrinted) {
            
$this->output->writeln($this->titleLineFrom(
                
$state->getTestCaseTitle() === 'FAIL' ? 'white' : 'black',
                
$state->getTestCaseTitleColor(),
                
$state->getTestCaseTitle(),
                
$state->testCaseName
            
));
            
$state->headerPrinted = true;
        }

        
$state->eachTestCaseTests(function (TestResult $testResult) {
            
$this->output->writeln($this->testLineFrom(
                
$testResult->color,
                
$testResult->icon,
                
$testResult->description,
                
$testResult->warning
            
));
        });
    }

    
/**
     * Prints the content similar too:.
     *
     * ```
     *    PASS  UnitExampleTest
     *    ✓ basic test
     * ```
     */
    
public function writeErrorsSummary(State $state, bool $onFailure): void
    
{
        
$errors = array_filter($state->suiteTests, function (TestResult $testResult) {
            return 
$testResult->type === TestResult::FAIL;
        });

        if (! 
$onFailure) {
            
$this->output->writeln(['', "  e[2m---e[22m", '']);
        }

        
array_map(function (TestResult $testResult) use ($onFailure) {
            if (! 
$onFailure) {
                
$this->output->write(sprintf(
                    
'  <fg=red;options=bold>• %s </>> <fg=red;options=bold>%s</>',
                    
$testResult->testCaseName,
                    
$testResult->description
                
));
            }

            if (! 
$testResult->throwable instanceof Throwable) {
                throw new 
ShouldNotHappen();
            }

            
$this->writeError($testResult->throwable);
        }, 
$errors);
    }

    
/**
     * Writes the final recap.
     */
    
public function writeRecap(State $state, Timer $timer = null): void
    
{
        
$types = [TestResult::FAIL, TestResult::WARN, TestResult::RISKY, TestResult::INCOMPLETE, TestResult::SKIPPED, TestResult::PASS];
        foreach (
$types as $type) {
            if ((
$countTests = $state->countTestsInTestSuiteBy($type)) !== 0) {
                
$color = TestResult::makeColor($type);
                
$tests[] = "<fg=$color;options=bold>$countTests $type</>";
            }
        }

        
$pending = $state->suiteTotalTests - $state->testSuiteTestsCount();
        if (
$pending !== 0) {
            
$tests[] = "e[2m$pending pendinge[22m";
        }

        if (! empty(
$tests)) {
            
$this->output->write([
                
"n",
                
sprintf(
                    
'  <fg=white;options=bold>Tests:  </><fg=default>%s</>',
                    
implode(', ', $tests)
                ),
            ]);
        }

        if (
$timer !== null) {
            
$timeElapsed = number_format($timer->result(), 2, '.', '');
            
$this->output->writeln([
                
'',
                
sprintf(
                    
'  <fg=white;options=bold>Time:   </><fg=default>%ss</>',
                    
$timeElapsed
                
),
            ]
            );
        }

        
$this->output->writeln('');
    }

    
/**
     * Displays a warning message.
     */
    
public function writeWarning(string $message): void
    
{
        
$this->output->writeln($this->testLineFrom('yellow', $message, ''));
    }

    
/**
     * Displays the error using Collision's writer
     * and terminates with exit code === 1.
     */
    
public function writeError(Throwable $throwable): void
    
{
        
$writer = (new Writer())->setOutput($this->output);

        if (
$throwable instanceof AssertionFailedError) {
            
$writer->showTitle(false);
            
$this->output->write('', true);
        }

        
$writer->ignoreFilesIn([
            
'/vendor/bin/pest/',
            
'/bin/pest/',
            
'/vendor/pestphp/pest/',
            
'/vendor/phpspec/prophecy-phpunit/',
            
'/vendor/phpspec/prophecy/',
            
'/vendor/phpunit/phpunit/src/',
            
'/vendor/mockery/mockery/',
            
'/vendor/laravel/dusk/',
            
'/vendor/laravel/framework/src/Illuminate/Testing/',
            
'/vendor/laravel/framework/src/Illuminate/Foundation/Testing/',
            
'/vendor/symfony/framework-bundle/Test/',
            
'/vendor/symfony/phpunit-bridge/',
            
'/vendor/symfony/dom-crawler/',
            
'/vendor/symfony/browser-kit/',
            
'/vendor/symfony/css-selector/',
            
'/vendor/bin/.phpunit/',
            
'/bin/.phpunit/',
            
'/vendor/bin/simple-phpunit/',
            
'/bin/phpunit/',
            
'/vendor/coduo/php-matcher/src/PHPUnit/',
            
'/vendor/sulu/sulu/src/Sulu/Bundle/TestBundle/Testing/',
            
'/vendor/webmozart/assert/',
        ]);

        if (
$throwable instanceof ExceptionWrapper && $throwable->getOriginalException() !== null) {
            
$throwable = $throwable->getOriginalException();
        }

        
$inspector = new Inspector($throwable);

        
$writer->write($inspector);

        if (
$throwable instanceof ExpectationFailedException && $comparisionFailure = $throwable->getComparisonFailure()) {
            
$diff = $comparisionFailure->getDiff();
            
$lines = explode(PHP_EOL, $diff);
            
$diff = '';
            foreach (
$lines as $line) {
                if (
0 === strpos($line, '-')) {
                    
$line = '<fg=red>'.$line.'</>';
                } elseif (
0 === strpos($line, '+')) {
                    
$line = '<fg=green>'.$line.'</>';
                }

                
$diff .= $line.PHP_EOL;
            }

            
$diff = trim((string) preg_replace("/r|n/", "n  ", $diff));

            
$this->output->write("  $diff");
        }

        
$this->output->writeln('');
    }

    
/**
     * Returns the title contents.
     */
    
private function titleLineFrom(string $fg, string $bg, string $title, string $testCaseName): string
    
{
        return 
sprintf(
            
"n  <fg=%s;bg=%s;options=bold> %s </><fg=default> %s</>",
            
$fg,
            
$bg,
            
$title,
            
$testCaseName
        
);
    }

    
/**
     * Returns the test contents.
     */
    
private function testLineFrom(string $fg, string $icon, string $description, string $warning = null): string
    
{
        if (! empty(
$warning)) {
            
$warning = sprintf(
                
' → %s',
                
$warning
            
);
        }

        return 
sprintf(
            
"  <fg=%s;options=bold>%s</><fg=default> e[2m%se[22m</><fg=yellow>%s</>",
            
$fg,
            
$icon,
            
$description,
            
$warning
        
);
    }
}
Онлайн: 0
Реклама