public function testGetRealPath() { $this->given($adapter = new atoum\test\adapter())->and($adapter->realpath = function ($path) { switch ($path) { case '/an/invalid/path': case '/an/invalid': case '/an': case '/': return false; case '/a/b/c/d/e': case '/a/b/c/d': return false; case '/a/b/c': return '/x/y/z'; default: return $path; } })->then->if($path = new testedClass('/a', '/', $adapter))->then->object($path->getRealPath())->isNotIdenticalTo($path)->toString->isEqualTo('/a')->if($path = new testedClass('/a/b/c', '/', $adapter))->then->object($path->getRealPath())->isNotIdenticalTo($path)->toString->isEqualTo('/x/y/z')->if($path = new testedClass('/a/b/c/d/e', '/', $adapter))->then->object($path->getRealPath())->isNotIdenticalTo($path)->toString->isEqualTo('/x/y/z/d/e')->if($path = new testedClass('/an/invalid/path', '/', $adapter))->then->exception(function () use($path) { $path->getRealPath(); })->isInstanceOf('mageekguy\\atoum\\fs\\path\\exception')->hasMessage('Unable to get real path for \'' . $path . '\''); }
/** * @param array $classData * @param int $relevantLines * @param int $coveredLines * @param int $totalLines * @param int $coverage */ protected function buildClassPage($classData, $relevantLines, $coveredLines, $totalLines, $coverage) { // get template $template = $this->templateParser->parseFile($this->templatesDirectory . DIRECTORY_SEPARATOR . 'class.tpl'); // build common $this->buildCommonTemplate($template, array('totalLines' => $totalLines, 'relevantLines' => $relevantLines, 'coveredLines' => $coveredLines, 'coverage' => $coverage), $classData['coverage'], $classData['name']); $methodsTemplates = $template->methods; $methodTemplates = $methodsTemplates->method; $methodCoverageAvailableTemplates = $methodTemplates->methodCoverageAvailable; $methodCoverageUnavailableTemplates = $methodTemplates->methodCoverageUnavailable; $sourceFileTemplates = $template->sourceFile; $templates = array('lineTemplates' => $sourceFileTemplates->line, 'coveredLineTemplates' => $sourceFileTemplates->coveredLine, 'notCoveredLineTemplates' => $sourceFileTemplates->notCoveredLine); $className = $classData['className']; $template->className = $className; $methods = $this->coverage->getCoverageForClass($className); $reflectedMethods = array(); $reflectionClassMethods = $this->getReflectionClass($className)->getMethods(); foreach (array_filter($reflectionClassMethods, function ($reflectedMethod) use($className) { return $reflectedMethod->isAbstract() === false && $reflectedMethod->getDeclaringClass()->getName() === $className; }) as $reflectedMethod) { $reflectedMethods[$reflectedMethod->getName()] = $reflectedMethod; } if (sizeof($reflectedMethods) > 0) { foreach (array_intersect(array_keys($reflectedMethods), array_keys($methods)) as $methodName) { $methodCoverageValue = $this->coverage->getValueForMethod($className, $methodName); if ($methodCoverageValue === null) { $methodCoverageUnavailableTemplates->build(array('methodName' => $methodName)); } else { $methodCoverageAvailableTemplates->build(array('methodName' => $methodName, 'methodCoverageValue' => round($methodCoverageValue * 100, 2), 'methodCoverageRounded' => ceil($methodCoverageValue * 100))); } $methodTemplates->build(); $methodCoverageAvailableTemplates->resetData(); $methodCoverageUnavailableTemplates->resetData(); } $methodsTemplates->build(); $methodTemplates->resetData(); } $srcFile = $this->adapter->fopen($this->sourceDirectory->getRealPath()->__toString() . DIRECTORY_SEPARATOR . $classData['name'], 'r'); if ($srcFile !== false) { $methodLines = array(); foreach ($reflectedMethods as $reflectedMethodName => $reflectedMethod) { $methodLines[$reflectedMethod->getStartLine()] = $reflectedMethodName; } for ($currentMethod = null, $lineNumber = 1, $line = $this->adapter->fgets($srcFile); $line !== false; $lineNumber++, $line = $this->adapter->fgets($srcFile)) { if (isset($methodLines[$lineNumber]) === true) { $currentMethod = $methodLines[$lineNumber]; } switch (true) { case isset($methods[$currentMethod]) === false || (isset($methods[$currentMethod][$lineNumber]) === false || $methods[$currentMethod][$lineNumber] == -2): $lineTemplateName = 'lineTemplates'; break; case isset($methods[$currentMethod]) === true && isset($methods[$currentMethod][$lineNumber]) === true && $methods[$currentMethod][$lineNumber] == -1: $lineTemplateName = 'notCoveredLineTemplates'; break; default: $lineTemplateName = 'coveredLineTemplates'; } $templates[$lineTemplateName]->lineNumber = $lineNumber; $templates[$lineTemplateName]->code = htmlentities($line, ENT_QUOTES, 'UTF-8'); if (isset($methodLines[$lineNumber]) === true) { foreach ($templates[$lineTemplateName]->anchor as $anchorTemplate) { $anchorTemplate->resetData(); $anchorTemplate->method = $currentMethod; $anchorTemplate->build(); } } $templates[$lineTemplateName]->addToParent()->resetData(); } $this->adapter->fclose($srcFile); } $file = $this->destinationDirectory . DIRECTORY_SEPARATOR . str_replace('\\', '/', $className) . self::HTML_EXTENSION_FILE; $directory = $this->adapter->dirname($file); if ($this->adapter->is_dir($directory) === false) { $this->adapter->mkdir($directory, 0777, true); } $this->adapter->file_put_contents($file, (string) $template->build()); }