Вход Регистрация
Файл: gapps/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/XML.php
Строк: 189
<?php
/*
 * This file is part of the PHP_CodeCoverage 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.
 */

/**
 * @since Class available since Release 2.0.0
 */
class PHP_CodeCoverage_Report_XML
{
    
/**
     * @var string
     */
    
private $target;

    
/**
     * @var PHP_CodeCoverage_Report_XML_Project
     */
    
private $project;

    public function 
process(PHP_CodeCoverage $coverage$target)
    {
        if (
substr($target, -11) != DIRECTORY_SEPARATOR) {
            
$target .= DIRECTORY_SEPARATOR;
        }

        
$this->target $target;
        
$this->initTargetDirectory($target);

        
$report $coverage->getReport();

        
$this->project = new PHP_CodeCoverage_Report_XML_Project(
            
$coverage->getReport()->getName()
        );

        
$this->processTests($coverage->getTests());
        
$this->processDirectory($report$this->project);

        
$index                     $this->project->asDom();
        
$index->formatOutput       true;
        
$index->preserveWhiteSpace false;
        
$index->save($target '/index.xml');
    }

    private function 
initTargetDirectory($dir)
    {
        if (
file_exists($dir)) {
            if (!
is_dir($dir)) {
                throw new 
PHP_CodeCoverage_Exception(
                    
"'$dir' exists but is not a directory."
                
);
            }

            if (!
is_writable($dir)) {
                throw new 
PHP_CodeCoverage_Exception(
                    
"'$dir' exists but is not writable."
                
);
            }
        } elseif (!@
mkdir($dir0777true)) {
            throw new 
PHP_CodeCoverage_Exception(
                
"'$dir' could not be created."
            
);
        }
    }

    private function 
processDirectory(PHP_CodeCoverage_Report_Node_Directory $directoryPHP_CodeCoverage_Report_XML_Node $context)
    {
        
$dirObject $context->addDirectory($directory->getName());

        
$this->setTotals($directory$dirObject->getTotals());

        foreach (
$directory as $node) {
            if (
$node instanceof PHP_CodeCoverage_Report_Node_Directory) {
                
$this->processDirectory($node$dirObject);
                continue;
            }

            if (
$node instanceof PHP_CodeCoverage_Report_Node_File) {
                
$this->processFile($node$dirObject);
                continue;
            }

            throw new 
PHP_CodeCoverage_Exception(
                
'Unknown node type for XML report'
            
);
        }
    }

    private function 
processFile(PHP_CodeCoverage_Report_Node_File $filePHP_CodeCoverage_Report_XML_Directory $context)
    {
        
$fileObject $context->addFile(
            
$file->getName(),
            
$file->getId() . '.xml'
        
);

        
$this->setTotals($file$fileObject->getTotals());

        
$fileReport = new PHP_CodeCoverage_Report_XML_File_Report(
            
$file->getName()
        );

        
$this->setTotals($file$fileReport->getTotals());

        foreach (
$file->getClassesAndTraits() as $unit) {
            
$this->processUnit($unit$fileReport);
        }

        foreach (
$file->getFunctions() as $function) {
            
$this->processFunction($function$fileReport);
        }

        foreach (
$file->getCoverageData() as $line => $tests) {
            if (!
is_array($tests) || count($tests) == 0) {
                continue;
            }

            
$coverage $fileReport->getLineCoverage($line);

            foreach (
$tests as $test) {
                
$coverage->addTest($test);
            }

            
$coverage->finalize();
        }

        
$this->initTargetDirectory(
            
$this->target dirname($file->getId()) . '/'
        
);

        
$fileDom                     $fileReport->asDom();
        
$fileDom->formatOutput       true;
        
$fileDom->preserveWhiteSpace false;
        
$fileDom->save($this->target $file->getId() . '.xml');
    }

    private function 
processUnit($unitPHP_CodeCoverage_Report_XML_File_Report $report)
    {
        if (isset(
$unit['className'])) {
            
$unitObject $report->getClassObject($unit['className']);
        } else {
            
$unitObject $report->getTraitObject($unit['traitName']);
        }

        
$unitObject->setLines(
            
$unit['startLine'],
            
$unit['executableLines'],
            
$unit['executedLines']
        );

        
$unitObject->setCrap($unit['crap']);

        
$unitObject->setPackage(
            
$unit['package']['fullPackage'],
            
$unit['package']['package'],
            
$unit['package']['subpackage'],
            
$unit['package']['category']
        );

        
$unitObject->setNamespace($unit['package']['namespace']);

        foreach (
$unit['methods'] as $method) {
            
$methodObject $unitObject->addMethod($method['methodName']);
            
$methodObject->setSignature($method['signature']);
            
$methodObject->setLines($method['startLine'], $method['endLine']);
            
$methodObject->setCrap($method['crap']);
            
$methodObject->setTotals(
                
$method['executableLines'],
                
$method['executedLines'],
                
$method['coverage']
            );
        }
    }

    private function 
processFunction($functionPHP_CodeCoverage_Report_XML_File_Report $report)
    {
        
$functionObject $report->getFunctionObject($function['functionName']);

        
$functionObject->setSignature($function['signature']);
        
$functionObject->setLines($function['startLine']);
        
$functionObject->setCrap($function['crap']);
        
$functionObject->setTotals($function['executableLines'], $function['executedLines'], $function['coverage']);
    }

    private function 
processTests(array $tests)
    {
        
$testsObject $this->project->getTests();

        foreach (
$tests as $test => $result) {
            if (
$test == 'UNCOVERED_FILES_FROM_WHITELIST') {
                continue;
            }

            
$testsObject->addTest($test$result);
        }
    }

    private function 
setTotals(PHP_CodeCoverage_Report_Node $nodePHP_CodeCoverage_Report_XML_Totals $totals)
    {
        
$loc $node->getLinesOfCode();

        
$totals->setNumLines(
            
$loc['loc'],
            
$loc['cloc'],
            
$loc['ncloc'],
            
$node->getNumExecutableLines(),
            
$node->getNumExecutedLines()
        );

        
$totals->setNumClasses(
            
$node->getNumClasses(),
            
$node->getNumTestedClasses()
        );

        
$totals->setNumTraits(
            
$node->getNumTraits(),
            
$node->getNumTestedTraits()
        );

        
$totals->setNumMethods(
            
$node->getNumMethods(),
            
$node->getNumTestedMethods()
        );

        
$totals->setNumFunctions(
            
$node->getNumFunctions(),
            
$node->getNumTestedFunctions()
        );
    }
}
Онлайн: 0
Реклама