Subversion-Projekte lars-tiefland.php_share

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
<?php
2
/**
3
 * $Id: CoverageMerger.php 426 2008-10-28 19:29:49Z 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
 
22
require_once 'phing/system/util/Properties.php';
23
 
24
/**
25
 * Saves coverage output of the test to a specified database
26
 *
27
 * @author Michiel Rook <michiel.rook@gmail.com>
28
 * @version $Id: CoverageMerger.php 426 2008-10-28 19:29:49Z mrook $
29
 * @package phing.tasks.ext.coverage
30
 * @since 2.1.0
31
 */
32
class CoverageMerger
33
{
34
	private static function mergeCodeCoverage($left, $right)
35
	{
36
		$coverageMerged = array();
37
 
38
		reset($left);
39
		reset($right);
40
 
41
		while (current($left) && current($right))
42
		{
43
			$linenr_left = key($left);
44
			$linenr_right = key($right);
45
 
46
			if ($linenr_left < $linenr_right)
47
			{
48
				$coverageMerged[$linenr_left] = current($left);
49
 
50
				next($left);
51
			}
52
			else
53
			if ($linenr_right < $linenr_left)
54
			{
55
				$coverageMerged[$linenr_right] = current($right);
56
				next($right);
57
			}
58
			else
59
			{
60
				if (current($left) < 0)
61
				{
62
					$coverageMerged[$linenr_right] = current($right);
63
				}
64
				else
65
				if (current($right) < 0)
66
				{
67
					$coverageMerged[$linenr_right] = current($left);
68
				}
69
				else
70
				{
71
					$coverageMerged[$linenr_right] = current($left) + current($right);
72
				}
73
 
74
				next($left);
75
				next($right);
76
			}
77
		}
78
 
79
		while (current($left))
80
		{
81
			$coverageMerged[key($left)] = current($left);
82
			next($left);
83
		}
84
 
85
		while (current($right))
86
		{
87
			$coverageMerged[key($right)] = current($right);
88
			next($right);
89
		}
90
 
91
		return $coverageMerged;
92
	}
93
 
94
	static function merge($project, $codeCoverageInformation)
95
	{
96
		$database = new PhingFile($project->getProperty('coverage.database'));
97
 
98
		$props = new Properties();
99
		$props->load($database);
100
 
101
		$coverageTotal = $codeCoverageInformation;
102
 
103
		foreach ($coverageTotal as $coverage)
104
		{
105
			foreach ($coverage as $filename => $coverageFile)
106
			{
107
				$filename = strtolower($filename);
108
 
109
				if ($props->getProperty($filename) != null)
110
				{
111
					$file = unserialize($props->getProperty($filename));
112
					$left = $file['coverage'];
113
					$right = $coverageFile;
114
					if (!is_array($right)) {
115
						$right = array_shift(PHPUnit_Util_CodeCoverage::bitStringToCodeCoverage(array($right), 1));
116
					}
117
 
118
					$coverageMerged = CoverageMerger::mergeCodeCoverage($left, $right);
119
 
120
					foreach ($coverageMerged as $key => $value)
121
					{
122
						if ($value == -2)
123
						{
124
							unset($coverageMerged[$key]);
125
						}
126
					}
127
 
128
					$file['coverage'] = $coverageMerged;
129
 
130
					$props->setProperty($filename, serialize($file));
131
				}
132
			}
133
		}
134
 
135
		$props->store($database);
136
	}
137
}