Trac #73: Exclude classes without instructions from reports.
diff --git a/org.jacoco.core.test/src/org/jacoco/core/analysis/CoverageBuilderTest.java b/org.jacoco.core.test/src/org/jacoco/core/analysis/CoverageBuilderTest.java
index 24e911a..ad9ff88 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/analysis/CoverageBuilderTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/analysis/CoverageBuilderTest.java
@@ -14,6 +14,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.Collection;
@@ -126,12 +127,31 @@
}
@Test
+ public void testIgnoreClassesWithoutCode() {
+ final IClassStructureVisitor classStructure = coverageBuilder
+ .visitClassStructure(123L);
+ classStructure.visit("org/jacoco/examples/Sample", null,
+ "java/lang/Object", new String[0]);
+ final IMethodStructureVisitor methodStructure = classStructure
+ .visitMethodStructure("doit", "()V", null);
+ methodStructure.visitEnd();
+ classStructure.visitEnd();
+
+ final Collection<ClassCoverage> classes = coverageBuilder.getClasses();
+ assertTrue(classes.isEmpty());
+ }
+
+ @Test
public void testCreateSourceFile() {
final IClassStructureVisitor classStructure1 = coverageBuilder
.visitClassStructure(123L);
classStructure1.visit("org/jacoco/examples/Sample", null,
"java/lang/Object", new String[0]);
classStructure1.visitSourceFile("Sample.java");
+ final IMethodStructureVisitor methodStructure1 = classStructure1
+ .visitMethodStructure("doit", "()V", null);
+ methodStructure1.block(0, 3, new int[] { 3, 4, 5 });
+ methodStructure1.visitEnd();
classStructure1.visitEnd();
final IClassStructureVisitor classStructure2 = coverageBuilder
@@ -139,6 +159,10 @@
classStructure2.visit("org/jacoco/examples/Sample", null,
"java/lang/Object", new String[0]);
classStructure2.visitSourceFile("Sample.java");
+ final IMethodStructureVisitor methodStructure2 = classStructure2
+ .visitMethodStructure("doit", "()V", null);
+ methodStructure2.block(0, 3, new int[] { 6, 7, 8 });
+ methodStructure2.visitEnd();
classStructure2.visitEnd();
final Collection<SourceFileCoverage> sourcefiles = coverageBuilder
@@ -156,18 +180,30 @@
.visitClassStructure(1);
classStructure1.visit("org/jacoco/examples/Sample1", null,
"java/lang/Object", new String[0]);
+ final IMethodStructureVisitor methodStructure1 = classStructure1
+ .visitMethodStructure("doit", "()V", null);
+ methodStructure1.block(0, 3, new int[] { 3, 4, 5 });
+ methodStructure1.visitEnd();
classStructure1.visitEnd();
final IClassStructureVisitor classStructure2 = coverageBuilder
.visitClassStructure(2);
classStructure2.visit("org/jacoco/examples/Sample2", null,
"java/lang/Object", new String[0]);
+ final IMethodStructureVisitor methodStructure2 = classStructure2
+ .visitMethodStructure("doit", "()V", null);
+ methodStructure2.block(0, 3, new int[] { 6, 7, 8 });
+ methodStructure2.visitEnd();
classStructure2.visitEnd();
final IClassStructureVisitor classStructure3 = coverageBuilder
.visitClassStructure(3);
classStructure3.visit("Sample3", null, "java/lang/Object",
new String[0]);
+ final IMethodStructureVisitor methodStructure3 = classStructure3
+ .visitMethodStructure("doit", "()V", null);
+ methodStructure3.block(0, 2, new int[] { 1, 2 });
+ methodStructure3.visitEnd();
classStructure3.visitEnd();
BundleCoverage bundle = coverageBuilder.getBundle("testbundle");
diff --git a/org.jacoco.core/src/org/jacoco/core/analysis/CoverageBuilder.java b/org.jacoco.core/src/org/jacoco/core/analysis/CoverageBuilder.java
index d2a7705..3d5646b 100644
--- a/org.jacoco.core/src/org/jacoco/core/analysis/CoverageBuilder.java
+++ b/org.jacoco.core/src/org/jacoco/core/analysis/CoverageBuilder.java
@@ -117,11 +117,14 @@
final ClassCoverage classData = new ClassCoverage(name,
signature, superName, interfaces, sourcename[0],
methods);
- classes.put(Long.valueOf(id), classData);
- if (sourcename[0] != null) {
- final SourceFileCoverage sourceFile = getSourceFile(
- sourcename[0], classData.getPackageName());
- sourceFile.increment(classData);
+ // Only consider classes that actually contain code:
+ if (classData.getInstructionCounter().getTotalCount() > 0) {
+ classes.put(Long.valueOf(id), classData);
+ if (sourcename[0] != null) {
+ final SourceFileCoverage sourceFile = getSourceFile(
+ sourcename[0], classData.getPackageName());
+ sourceFile.increment(classData);
+ }
}
}
};
diff --git a/org.jacoco.doc/docroot/doc/changes.html b/org.jacoco.doc/docroot/doc/changes.html
index 9652915..52738b0 100644
--- a/org.jacoco.doc/docroot/doc/changes.html
+++ b/org.jacoco.doc/docroot/doc/changes.html
@@ -22,6 +22,7 @@
<h3>New Features</h3>
<ul>
<li>Code coverage for static initializers in interfaces (Trac #21).</li>
+ <li>Classes without instructions are excluded from reports. (Trac #73).</li>
</ul>
<h3>API Changes</h3>