CoverageMerger.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. <?php
  2. /**
  3. * $Id: CoverageMerger.php 905 2010-10-05 16:28:03Z mrook $
  4. *
  5. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  6. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  7. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  8. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  9. * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  10. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  11. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  12. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  13. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  14. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  15. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  16. *
  17. * This software consists of voluntary contributions made by many individuals
  18. * and is licensed under the LGPL. For more information please see
  19. * <http://phing.info>.
  20. */
  21. require_once 'phing/system/util/Properties.php';
  22. /**
  23. * Saves coverage output of the test to a specified database
  24. *
  25. * @author Michiel Rook <michiel.rook@gmail.com>
  26. * @version $Id: CoverageMerger.php 905 2010-10-05 16:28:03Z mrook $
  27. * @package phing.tasks.ext.coverage
  28. * @since 2.1.0
  29. */
  30. class CoverageMerger
  31. {
  32. private static function mergeCodeCoverage($left, $right)
  33. {
  34. $coverageMerged = array();
  35. reset($left);
  36. reset($right);
  37. while (current($left) && current($right)) {
  38. $linenr_left = key($left);
  39. $linenr_right = key($right);
  40. if ($linenr_left < $linenr_right) {
  41. $coverageMerged[$linenr_left] = current($left);
  42. next($left);
  43. } elseif ($linenr_right < $linenr_left) {
  44. $coverageMerged[$linenr_right] = current($right);
  45. next($right);
  46. } else {
  47. if ((current($left) < 0) || (current($right) < 0)) {
  48. $coverageMerged[$linenr_right] = current($right);
  49. } else {
  50. $coverageMerged[$linenr_right] = current($left) + current($right);
  51. }
  52. next($left);
  53. next($right);
  54. }
  55. }
  56. while (current($left)) {
  57. $coverageMerged[key($left)] = current($left);
  58. next($left);
  59. }
  60. while (current($right)) {
  61. $coverageMerged[key($right)] = current($right);
  62. next($right);
  63. }
  64. return $coverageMerged;
  65. }
  66. static function merge($project, $codeCoverageInformation)
  67. {
  68. $coverageDatabase = $project->getProperty('coverage.database');
  69. if (!$coverageDatabase) {
  70. throw new BuildException("Property coverage.database is not set - please include coverage-setup in your build file");
  71. }
  72. $database = new PhingFile($coverageDatabase);
  73. $props = new Properties();
  74. $props->load($database);
  75. $coverageTotal = $codeCoverageInformation;
  76. foreach ($coverageTotal as $filename => $data) {
  77. $lines = array();
  78. $filename = strtolower($filename);
  79. if ($props->getProperty($filename) != null) {
  80. foreach ($data as $_line => $_data) {
  81. if (is_array($_data)) {
  82. $count = count($_data);
  83. } else if ($_data == -1) {
  84. // not executed
  85. $count = -1;
  86. } else if ($_data == -2) {
  87. // dead code
  88. $count = -2;
  89. }
  90. $lines[$_line] = $count;
  91. }
  92. ksort($lines);
  93. $file = unserialize($props->getProperty($filename));
  94. $left = $file['coverage'];
  95. $coverageMerged = CoverageMerger::mergeCodeCoverage($left, $lines);
  96. $file['coverage'] = $coverageMerged;
  97. $props->setProperty($filename, serialize($file));
  98. }
  99. }
  100. $props->store($database);
  101. }
  102. }