PageRenderTime 25ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/Clover.php

https://gitlab.com/Pasantias/pasantiasASLG
PHP | 284 lines | 219 code | 40 blank | 25 comment | 25 complexity | 3d8676f18b867b8cadfd581179bbe439 MD5 | raw file
  1. <?php
  2. /*
  3. * This file is part of the PHP_CodeCoverage package.
  4. *
  5. * (c) Sebastian Bergmann <sebastian@phpunit.de>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. /**
  11. * Generates a Clover XML logfile from an PHP_CodeCoverage object.
  12. *
  13. * @since Class available since Release 1.0.0
  14. */
  15. class PHP_CodeCoverage_Report_Clover
  16. {
  17. /**
  18. * @param PHP_CodeCoverage $coverage
  19. * @param string $target
  20. * @param string $name
  21. * @return string
  22. */
  23. public function process(PHP_CodeCoverage $coverage, $target = null, $name = null)
  24. {
  25. $xmlDocument = new DOMDocument('1.0', 'UTF-8');
  26. $xmlDocument->formatOutput = true;
  27. $xmlCoverage = $xmlDocument->createElement('coverage');
  28. $xmlCoverage->setAttribute('generated', (int) $_SERVER['REQUEST_TIME']);
  29. $xmlDocument->appendChild($xmlCoverage);
  30. $xmlProject = $xmlDocument->createElement('project');
  31. $xmlProject->setAttribute('timestamp', (int) $_SERVER['REQUEST_TIME']);
  32. if (is_string($name)) {
  33. $xmlProject->setAttribute('name', $name);
  34. }
  35. $xmlCoverage->appendChild($xmlProject);
  36. $packages = array();
  37. $report = $coverage->getReport();
  38. unset($coverage);
  39. foreach ($report as $item) {
  40. $namespace = 'global';
  41. if (!$item instanceof PHP_CodeCoverage_Report_Node_File) {
  42. continue;
  43. }
  44. $xmlFile = $xmlDocument->createElement('file');
  45. $xmlFile->setAttribute('name', $item->getPath());
  46. $classes = $item->getClassesAndTraits();
  47. $coverage = $item->getCoverageData();
  48. $lines = array();
  49. foreach ($classes as $className => $class) {
  50. $classStatements = 0;
  51. $coveredClassStatements = 0;
  52. $coveredMethods = 0;
  53. $classMethods = 0;
  54. foreach ($class['methods'] as $methodName => $method) {
  55. if ($method['executableLines'] == 0) {
  56. continue;
  57. }
  58. $classMethods++;
  59. $classStatements += $method['executableLines'];
  60. $coveredClassStatements += $method['executedLines'];
  61. if ($method['coverage'] == 100) {
  62. $coveredMethods++;
  63. }
  64. $methodCount = 0;
  65. for ($i = $method['startLine'];
  66. $i <= $method['endLine'];
  67. $i++) {
  68. if (isset($coverage[$i]) && ($coverage[$i] !== null)) {
  69. $methodCount = max($methodCount, count($coverage[$i]));
  70. }
  71. }
  72. $lines[$method['startLine']] = array(
  73. 'count' => $methodCount,
  74. 'crap' => $method['crap'],
  75. 'type' => 'method',
  76. 'name' => $methodName
  77. );
  78. }
  79. if (!empty($class['package']['namespace'])) {
  80. $namespace = $class['package']['namespace'];
  81. }
  82. $xmlClass = $xmlDocument->createElement('class');
  83. $xmlClass->setAttribute('name', $className);
  84. $xmlClass->setAttribute('namespace', $namespace);
  85. if (!empty($class['package']['fullPackage'])) {
  86. $xmlClass->setAttribute(
  87. 'fullPackage',
  88. $class['package']['fullPackage']
  89. );
  90. }
  91. if (!empty($class['package']['category'])) {
  92. $xmlClass->setAttribute(
  93. 'category',
  94. $class['package']['category']
  95. );
  96. }
  97. if (!empty($class['package']['package'])) {
  98. $xmlClass->setAttribute(
  99. 'package',
  100. $class['package']['package']
  101. );
  102. }
  103. if (!empty($class['package']['subpackage'])) {
  104. $xmlClass->setAttribute(
  105. 'subpackage',
  106. $class['package']['subpackage']
  107. );
  108. }
  109. $xmlFile->appendChild($xmlClass);
  110. $xmlMetrics = $xmlDocument->createElement('metrics');
  111. $xmlMetrics->setAttribute('methods', $classMethods);
  112. $xmlMetrics->setAttribute('coveredmethods', $coveredMethods);
  113. $xmlMetrics->setAttribute('conditionals', 0);
  114. $xmlMetrics->setAttribute('coveredconditionals', 0);
  115. $xmlMetrics->setAttribute('statements', $classStatements);
  116. $xmlMetrics->setAttribute(
  117. 'coveredstatements',
  118. $coveredClassStatements
  119. );
  120. $xmlMetrics->setAttribute(
  121. 'elements',
  122. $classMethods +
  123. $classStatements
  124. /* + conditionals */
  125. );
  126. $xmlMetrics->setAttribute(
  127. 'coveredelements',
  128. $coveredMethods +
  129. $coveredClassStatements
  130. /* + coveredconditionals */
  131. );
  132. $xmlClass->appendChild($xmlMetrics);
  133. }
  134. foreach ($coverage as $line => $data) {
  135. if ($data === null || isset($lines[$line])) {
  136. continue;
  137. }
  138. $lines[$line] = array(
  139. 'count' => count($data), 'type' => 'stmt'
  140. );
  141. }
  142. ksort($lines);
  143. foreach ($lines as $line => $data) {
  144. $xmlLine = $xmlDocument->createElement('line');
  145. $xmlLine->setAttribute('num', $line);
  146. $xmlLine->setAttribute('type', $data['type']);
  147. if (isset($data['name'])) {
  148. $xmlLine->setAttribute('name', $data['name']);
  149. }
  150. if (isset($data['crap'])) {
  151. $xmlLine->setAttribute('crap', $data['crap']);
  152. }
  153. $xmlLine->setAttribute('count', $data['count']);
  154. $xmlFile->appendChild($xmlLine);
  155. }
  156. $linesOfCode = $item->getLinesOfCode();
  157. $xmlMetrics = $xmlDocument->createElement('metrics');
  158. $xmlMetrics->setAttribute('loc', $linesOfCode['loc']);
  159. $xmlMetrics->setAttribute('ncloc', $linesOfCode['ncloc']);
  160. $xmlMetrics->setAttribute('classes', $item->getNumClassesAndTraits());
  161. $xmlMetrics->setAttribute('methods', $item->getNumMethods());
  162. $xmlMetrics->setAttribute(
  163. 'coveredmethods',
  164. $item->getNumTestedMethods()
  165. );
  166. $xmlMetrics->setAttribute('conditionals', 0);
  167. $xmlMetrics->setAttribute('coveredconditionals', 0);
  168. $xmlMetrics->setAttribute(
  169. 'statements',
  170. $item->getNumExecutableLines()
  171. );
  172. $xmlMetrics->setAttribute(
  173. 'coveredstatements',
  174. $item->getNumExecutedLines()
  175. );
  176. $xmlMetrics->setAttribute(
  177. 'elements',
  178. $item->getNumMethods() + $item->getNumExecutableLines()
  179. /* + conditionals */
  180. );
  181. $xmlMetrics->setAttribute(
  182. 'coveredelements',
  183. $item->getNumTestedMethods() + $item->getNumExecutedLines()
  184. /* + coveredconditionals */
  185. );
  186. $xmlFile->appendChild($xmlMetrics);
  187. if ($namespace == 'global') {
  188. $xmlProject->appendChild($xmlFile);
  189. } else {
  190. if (!isset($packages[$namespace])) {
  191. $packages[$namespace] = $xmlDocument->createElement(
  192. 'package'
  193. );
  194. $packages[$namespace]->setAttribute('name', $namespace);
  195. $xmlProject->appendChild($packages[$namespace]);
  196. }
  197. $packages[$namespace]->appendChild($xmlFile);
  198. }
  199. }
  200. $linesOfCode = $report->getLinesOfCode();
  201. $xmlMetrics = $xmlDocument->createElement('metrics');
  202. $xmlMetrics->setAttribute('files', count($report));
  203. $xmlMetrics->setAttribute('loc', $linesOfCode['loc']);
  204. $xmlMetrics->setAttribute('ncloc', $linesOfCode['ncloc']);
  205. $xmlMetrics->setAttribute(
  206. 'classes',
  207. $report->getNumClassesAndTraits()
  208. );
  209. $xmlMetrics->setAttribute('methods', $report->getNumMethods());
  210. $xmlMetrics->setAttribute(
  211. 'coveredmethods',
  212. $report->getNumTestedMethods()
  213. );
  214. $xmlMetrics->setAttribute('conditionals', 0);
  215. $xmlMetrics->setAttribute('coveredconditionals', 0);
  216. $xmlMetrics->setAttribute(
  217. 'statements',
  218. $report->getNumExecutableLines()
  219. );
  220. $xmlMetrics->setAttribute(
  221. 'coveredstatements',
  222. $report->getNumExecutedLines()
  223. );
  224. $xmlMetrics->setAttribute(
  225. 'elements',
  226. $report->getNumMethods() + $report->getNumExecutableLines()
  227. /* + conditionals */
  228. );
  229. $xmlMetrics->setAttribute(
  230. 'coveredelements',
  231. $report->getNumTestedMethods() + $report->getNumExecutedLines()
  232. /* + coveredconditionals */
  233. );
  234. $xmlProject->appendChild($xmlMetrics);
  235. if ($target !== null) {
  236. if (!is_dir(dirname($target))) {
  237. mkdir(dirname($target), 0777, true);
  238. }
  239. return $xmlDocument->save($target);
  240. } else {
  241. return $xmlDocument->saveXML();
  242. }
  243. }
  244. }