Skip to content

Ignored statements #117

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Apr 24, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,9 @@ object Serializer {
<count>
{stmt.count.toString}
</count>
<ignored>
{stmt.ignored.toString}
</ignored>
</statement>
Utility.trim(xml) + "\n"
}
Expand All @@ -86,6 +89,7 @@ object Serializer {
val statements = xml \ "statement" map (node => {
val source = (node \ "source").text
val count = (node \ "count").text.toInt
val ignored = (node \ "ignored").text.toBoolean
val branch = (node \ "branch").text.toBoolean
val _package = (node \ "package").text
val _class = (node \ "class").text
Expand All @@ -112,12 +116,13 @@ object Serializer {
line,
desc,
symbolName,
treeName, branch, count)
treeName, branch, count, ignored)
})

val coverage = Coverage()
for ( statement <- statements )
coverage.add(statement)
if (statement.ignored) coverage.addIgnoredStatement(statement)
else coverage.add(statement)
coverage
}

Expand Down
21 changes: 19 additions & 2 deletions scalac-scoverage-plugin/src/main/scala/scoverage/coverage.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@ case class Coverage()
override def statements = statementsById.values
def add(stmt: Statement): Unit = statementsById.put(stmt.id, stmt)

private val ignoredStatementsById = mutable.Map[Int, Statement]()
override def ignoredStatements = ignoredStatementsById.values
def addIgnoredStatement(stmt: Statement): Unit = ignoredStatementsById.put(stmt.id, stmt)


def avgClassesPerPackage = classCount / packageCount.toDouble
def avgClassesPerPackageFormatted: String = "%.2f".format(avgClassesPerPackage)

Expand Down Expand Up @@ -65,23 +70,30 @@ trait FileBuilders {
def fileCount: Int = files.size
}

case class MeasuredMethod(name: String, statements: Iterable[Statement]) extends CoverageMetrics
case class MeasuredMethod(name: String, statements: Iterable[Statement]) extends CoverageMetrics {
override def ignoredStatements: Iterable[Statement] = Seq()
}

case class MeasuredClass(name: String, statements: Iterable[Statement])
extends CoverageMetrics with MethodBuilders {
def source: String = statements.head.source
def simpleName = name.split('.').last
def loc = statements.map(_.line).max

override def ignoredStatements: Iterable[Statement] = Seq()
}

case class MeasuredPackage(name: String, statements: Iterable[Statement])
extends CoverageMetrics with ClassCoverage with ClassBuilders with FileBuilders {
override def ignoredStatements: Iterable[Statement] = Seq()
}

case class MeasuredFile(source: String, statements: Iterable[Statement])
extends CoverageMetrics with ClassCoverage with ClassBuilders {
def filename = new File(source).getName
def loc = statements.map(_.line).max

override def ignoredStatements: Iterable[Statement] = Seq()
}

case class Statement(source: String,
Expand All @@ -94,7 +106,8 @@ case class Statement(source: String,
symbolName: String,
treeName: String,
branch: Boolean,
var count: Int = 0) extends java.io.Serializable {
var count: Int = 0,
ignored: Boolean = false) extends java.io.Serializable {
def invoked(): Unit = count = count + 1
def isInvoked = count > 0
}
Expand Down Expand Up @@ -126,6 +139,10 @@ object ClassRef {
trait CoverageMetrics {
def statements: Iterable[Statement]
def statementCount: Int = statements.size

def ignoredStatements: Iterable[Statement]
def ignoredStatementCount: Int = ignoredStatements.size

def invokedStatements: Iterable[Statement] = statements.filter(_.count > 0)
def invokedStatementCount = invokedStatements.size
def statementCoverage: Double = if (statementCount == 0) 1 else invokedStatementCount / statementCount.toDouble
Expand Down
27 changes: 14 additions & 13 deletions scalac-scoverage-plugin/src/main/scala/scoverage/plugin.scala
Original file line number Diff line number Diff line change
Expand Up @@ -166,22 +166,23 @@ class ScoverageInstrumentationComponent(val global: Global)
reporter.echo(s"[warn] Could not instrument [${tree.getClass.getSimpleName}/${tree.symbol}]. No pos.")
tree
case Some(source) =>
val id = statementIds.incrementAndGet
val statement = Statement(
source.path,
location,
id,
safeStart(tree),
safeEnd(tree),
safeLine(tree),
original.toString,
Option(original.symbol).fold("<nosymbol>")(_.fullNameString),
tree.getClass.getSimpleName,
branch
)
if (tree.pos.isDefined && !isStatementIncluded(tree.pos)) {
coverage.add(statement.copy(ignored = true))
tree
} else {
val id = statementIds.incrementAndGet
val statement = Statement(
source.path,
location,
id,
safeStart(tree),
safeEnd(tree),
safeLine(tree),
original.toString,
Option(original.symbol).fold("<nosymbol>")(_.fullNameString),
tree.getClass.getSimpleName,
branch
)
coverage.add(statement)

val apply = invokeCall(id)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -494,6 +494,20 @@ class ScoverageHtmlWriter(sourceDirectories: Seq[File], outputDir: File) extends
{coverage.invokedBranchesCount.toString}
</td>
</tr>
<tr>
<td>
Ignored statements:
</td>
<td>
{coverage.ignoredStatementCount.toString}
</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>
Statement coverage:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ object ScoverageXmlReader {
val count = node \ "@invocation-count"
val symbolName = node \ "@symbol"
val treeName = node \ "@tree"
val ignored = node \ "@ignored"

val location = Location(pkg.text,
classname.text,
Expand All @@ -52,7 +53,8 @@ object ScoverageXmlReader {
symbolName.text,
treeName.text,
branch.text.toBoolean,
count.text.toInt
count.text.toInt,
ignored.text.toBoolean
)
}
coverage
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ class ScoverageXmlWriter(sourceDirectories: Seq[File], outputDir: File, debug: B
symbol={Serializer.escape(stmt.symbolName)}
tree={Serializer.escape(stmt.treeName)}
branch={stmt.branch.toString}
invocation-count={stmt.count.toString}>
invocation-count={stmt.count.toString}
ignored={stmt.ignored.toString}>
{Serializer.escape(stmt.desc)}
</statement>
case false =>
Expand All @@ -60,7 +61,8 @@ class ScoverageXmlWriter(sourceDirectories: Seq[File], outputDir: File, debug: B
end={stmt.end.toString}
line={stmt.line.toString}
branch={stmt.branch.toString}
invocation-count={stmt.count.toString}/>
invocation-count={stmt.count.toString}
ignored={stmt.ignored.toString}/>
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ class CoverageMetricsTest extends FreeSpec with Matchers {
null,
false,
1))

override def ignoredStatements: Iterable[Statement] = Seq()
}
metrics.branchCount shouldBe 0
metrics.branchCoverage - 1 shouldBe < (0.0001)
Expand All @@ -35,6 +37,8 @@ class CoverageMetricsTest extends FreeSpec with Matchers {
null,
false,
0))

override def ignoredStatements: Iterable[Statement] = Seq()
}
metrics.branchCount shouldBe 0
metrics.branchCoverage shouldBe 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class SerializerTest extends FunSuite with MockitoSugar with OneInstancePerTest
)
val expected = <statements>
<statement>
<source>mysource</source> <package>org.scoverage</package> <class>test</class> <classType>Trait</classType> <topLevelClass>test</topLevelClass> <method>mymethod</method> <path>mypath</path> <id>14</id> <start>100</start> <end>200</end> <line>4</line> <description>def test : String</description> <symbolName>test</symbolName> <treeName>DefDef</treeName> <branch>true</branch> <count>32</count>
<source>mysource</source> <package>org.scoverage</package> <class>test</class> <classType>Trait</classType> <topLevelClass>test</topLevelClass> <method>mymethod</method> <path>mypath</path> <id>14</id> <start>100</start> <end>200</end> <line>4</line> <description>def test : String</description> <symbolName>test</symbolName> <treeName>DefDef</treeName> <branch>true</branch> <count>32</count> <ignored>false</ignored>
</statement>
</statements>
val writer = new StringWriter()
Expand All @@ -31,7 +31,7 @@ class SerializerTest extends FunSuite with MockitoSugar with OneInstancePerTest
test("coverage should be deserializable from xml") {
val input = <statements>
<statement>
<source>mysource</source> <package>org.scoverage</package> <class>test</class> <classType>Trait</classType> <topLevelClass>test</topLevelClass> <method>mymethod</method> <path>mypath</path> <id>14</id> <start>100</start> <end>200</end> <line>4</line> <description>def test : String</description> <symbolName>test</symbolName> <treeName>DefDef</treeName> <branch>true</branch> <count>32</count>
<source>mysource</source> <package>org.scoverage</package> <class>test</class> <classType>Trait</classType> <topLevelClass>test</topLevelClass> <method>mymethod</method> <path>mypath</path> <id>14</id> <start>100</start> <end>200</end> <line>4</line> <description>def test : String</description> <symbolName>test</symbolName> <treeName>DefDef</treeName> <branch>true</branch> <count>32</count> <ignored>false</ignored>
</statement>
</statements>
val statements = List(Statement(
Expand Down