Skip to content

Commit 9175228

Browse files
committed
#24 Added report merger
1 parent 03af2b1 commit 9175228

File tree

6 files changed

+202
-3
lines changed

6 files changed

+202
-3
lines changed

build.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ crossScalaVersions := Seq("2.10.4", "2.11.1")
1818

1919
libraryDependencies ++= Seq(
2020
"commons-io" % "commons-io" % "2.4",
21-
"org.scalatest" %% "scalatest" % "2.1.6" % "test",
21+
"org.scalatest" %% "scalatest" % "2.2.0" % "test",
2222
"com.typesafe.scala-logging" %% "scala-logging-slf4j" % "2.1.2" % "test",
2323
"org.mockito" % "mockito-all" % "1.9.5" % "test",
2424
"joda-time" % "joda-time" % "2.3" % "test",

src/main/resources/report1.xml

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<scoverage statement-count="2"
2+
statements-invoked="2"
3+
statement-rate="100"
4+
branch-rate="100.00"
5+
version="1.0"
6+
timestamp="1400456035212">
7+
<packages>
8+
<package name="com.sksamuel.scoverage.samples"
9+
statement-count="2"
10+
statements-invoked="2"
11+
statement-rate="100">
12+
<classes>
13+
<class name="EitherMappableFuture"
14+
filename="/com/sksamuel/scoverage/samples/Futures.scala"
15+
statement-count="2"
16+
statements-invoked="2"
17+
statement-rate="100.00"
18+
branch-rate="100.00">
19+
<methods>
20+
<method name="com.sksamuel.scoverage.samples/EitherMappableFuture/&lt;none&gt;"
21+
statement-count="2"
22+
statements-invoked="2"
23+
statement-rate="100.00"
24+
branch-rate="100.00">
25+
<statements>
26+
<statement
27+
package="com.sksamuel.scoverage.samples" class="EitherMappableFuture"
28+
method="&lt;none&gt;" start="965" line="34"
29+
symbol="scala.concurrent.Future.flatMap" tree="ApplyToImplicitArgs"
30+
branch="false" invocation-count="1">
31+
</statement>
32+
<statement
33+
package="com.sksamuel.scoverage.samples" class="EitherMappableFuture"
34+
method="&lt;none&gt;" start="1225" line="42"
35+
symbol="com.sksamuel.scoverage.samples.EitherMappableFuture.apply" tree="Apply"
36+
branch="false" invocation-count="1">
37+
</statement>
38+
</statements>
39+
</method>
40+
</methods>
41+
</class>
42+
</classes>
43+
</package>
44+
</packages>
45+
</scoverage>

src/main/resources/report2.xml

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
<scoverage statement-count="10"
2+
statements-invoked="9"
3+
statement-rate="90"
4+
branch-rate="100.00"
5+
version="1.0"
6+
timestamp="1400456035212">
7+
<packages>
8+
<package name="com.sksamuel.scoverage.samples"
9+
statement-count="10"
10+
statements-invoked="9"
11+
statement-rate="90">
12+
<classes>
13+
<class name="Futures"
14+
filename="/com/sksamuel/scoverage/samples/Futures.scala"
15+
statement-count="10"
16+
statements-invoked="9"
17+
statement-rate="90.00"
18+
branch-rate="100.00">
19+
<methods>
20+
<method name="com.sksamuel.scoverage.samples/Futures/&lt;none&gt;"
21+
statement-count="7"
22+
statements-invoked="6"
23+
statement-rate="85.71"
24+
branch-rate="100.00">
25+
<statements>
26+
<statement
27+
package="com.sksamuel.scoverage.samples" class="Futures" method="&lt;none&gt;"
28+
start="664" line="25" symbol="scala.util.Right.apply" tree="Apply"
29+
branch="false" invocation-count="1">
30+
</statement>
31+
<statement
32+
package="com.sksamuel.scoverage.samples" class="Futures" method="&lt;none&gt;"
33+
start="589" line="23" symbol="com.sksamuel.scoverage.samples.Futures.check"
34+
tree="Apply" branch="false" invocation-count="1">
35+
</statement>
36+
<statement
37+
package="com.sksamuel.scoverage.samples" class="Futures" method="&lt;none&gt;"
38+
start="533" line="20" symbol="scala.util.Right.apply" tree="Apply"
39+
branch="false" invocation-count="1">
40+
</statement>
41+
<statement
42+
package="com.sksamuel.scoverage.samples" class="Futures" method="&lt;none&gt;"
43+
start="632" line="24" symbol="&lt;nosymbol&gt;" tree="Block" branch="false"
44+
invocation-count="0">
45+
</statement>
46+
<statement
47+
package="com.sksamuel.scoverage.samples" class="Futures" method="&lt;none&gt;"
48+
start="598" line="23" symbol="&lt;nosymbol&gt;" tree="Match" branch="false"
49+
invocation-count="1">
50+
</statement>
51+
<statement
52+
package="com.sksamuel.scoverage.samples" class="Futures" method="&lt;none&gt;"
53+
start="664" line="25" symbol="&lt;nosymbol&gt;" tree="Block" branch="false"
54+
invocation-count="1">
55+
</statement>
56+
<statement
57+
package="com.sksamuel.scoverage.samples" class="Futures" method="&lt;none&gt;"
58+
start="632" line="24" symbol="scala.util.Left.apply" tree="Apply" branch="false"
59+
invocation-count="1">
60+
</statement>
61+
</statements>
62+
</method>
63+
<method name="com.sksamuel.scoverage.samples/Futures/insert"
64+
statement-count="3"
65+
statements-invoked="3"
66+
statement-rate="100.00"
67+
branch-rate="100.00">
68+
<statements>
69+
<statement
70+
package="com.sksamuel.scoverage.samples" class="Futures" method="insert"
71+
start="366" line="14" symbol="scala.concurrent.Future.onComplete"
72+
tree="ApplyToImplicitArgs" branch="false" invocation-count="1">
73+
</statement>
74+
<statement
75+
package="com.sksamuel.scoverage.samples" class="Futures" method="insert"
76+
start="309" line="11" symbol="scala.concurrent.Promise.apply" tree="Apply"
77+
branch="false" invocation-count="1">
78+
</statement>
79+
<statement
80+
package="com.sksamuel.scoverage.samples" class="Futures" method="insert"
81+
start="453" line="17"
82+
symbol="com.sksamuel.scoverage.samples.EitherMappableFuture.mapEither"
83+
tree="ApplyToImplicitArgs" branch="false" invocation-count="1">
84+
</statement>
85+
</statements>
86+
</method>
87+
</methods>
88+
</class>
89+
</classes>
90+
</package>
91+
</packages>
92+
</scoverage>
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package scoverage.report
2+
3+
import scala.xml.Node
4+
5+
/** @author Stephen Samuel */
6+
object ScoverageXmlMerger {
7+
8+
/**
9+
* Merge the contents of the scoverage XML nodes into a single node.
10+
*/
11+
def merge(nodes: Seq[Node]): Node = {
12+
def merge(node1: Node, node2: Node): Node = {
13+
val statementCount = (node1 \ "@statement-count").text.toInt + (node2 \ "@statement-count").text.toInt
14+
val statementsInvoked = (node1 \ "@statements-invoked").text.toInt + (node2 \ "@statements-invoked").text.toInt
15+
val statementRate = "%.2f".format(statementsInvoked.toDouble / statementCount.toDouble * 100.0d)
16+
val packages = (node1 \\ "packages") ++ (node2 \\ "packages")
17+
<scoverage statement-count={statementCount.toString}
18+
statements-invoked={statementsInvoked.toString}
19+
statement-rate={statementRate}
20+
version="1.0"
21+
timestamp={System.currentTimeMillis.toString}>
22+
{packages}
23+
</scoverage>
24+
}
25+
nodes.foldLeft(<scoverage statement-count="0" statements-invoked="0"/>: Node)((b, node) => merge(b, node))
26+
}
27+
}

src/test/scala/scoverage/CoberturaXmlWriterTest.scala renamed to src/test/scala/scoverage/report/CoberturaXmlWriterTest.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package scoverage
1+
package scoverage.report
22

33
import java.io.File
44
import java.util.UUID
@@ -7,7 +7,7 @@ import javax.xml.parsers.DocumentBuilderFactory
77
import org.apache.commons.io.FileUtils
88
import org.scalatest.{BeforeAndAfter, FunSuite, OneInstancePerTest}
99
import org.xml.sax.{ErrorHandler, SAXParseException}
10-
import scoverage.report.CoberturaXmlWriter
10+
import scoverage.{ClassType, Coverage, Location, MeasuredStatement}
1111

1212
import scala.xml.XML
1313

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package scoverage.report
2+
3+
import org.scalatest.{FreeSpec, Matchers}
4+
5+
/** @author Stephen Samuel */
6+
class ScoverageXmlMergerTest extends FreeSpec with Matchers {
7+
8+
val node1 = scala.xml.XML.load(getClass.getResourceAsStream("/report1.xml"))
9+
val node2 = scala.xml.XML.load(getClass.getResourceAsStream("/report2.xml"))
10+
11+
"scoverage xml merger" - {
12+
"should add top level statement-count" in {
13+
val node = ScoverageXmlMerger.merge(List(node1, node2))
14+
(node \ "@statement-count").text.toInt shouldBe 12
15+
}
16+
"should add top level statements-invoked" in {
17+
val node = ScoverageXmlMerger.merge(List(node1, node2))
18+
(node \ "@statements-invoked").text.toInt shouldBe 11
19+
}
20+
"should recalculate statement-rate" in {
21+
val node = ScoverageXmlMerger.merge(List(node1, node2))
22+
(node \ "@statement-rate").text.toDouble shouldBe 91.67
23+
}
24+
"should reset timestamp" in {
25+
val node = ScoverageXmlMerger.merge(List(node1, node2))
26+
val original = (node \ "@timestamp").text.toLong
27+
(node \ "@timestamp").text.toLong shouldBe >=(original)
28+
}
29+
"should concatenate all package elements" in {
30+
val expected = (node1 \\ "package").size + (node2 \\ "package").size
31+
val node = ScoverageXmlMerger.merge(List(node1, node2))
32+
(node \\ "package").size shouldBe expected
33+
}
34+
}
35+
}

0 commit comments

Comments
 (0)