From a2509ba6cbd00f31414971c6c32d592cbb709e7c Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 12 Dec 2014 19:10:32 +0100 Subject: [PATCH] fix incorrect loading of jacoco coverage data (end line number for a method is inclusive) --- .../coverage/JaCoCoCoverageRunner.java | 5 ++-- .../simple$foo_in_simple.jacoco.coverage | Bin 0 -> 1619 bytes ...Test.java => CoverageIntegrationTest.java} | 27 +++++++++++++----- 3 files changed, 23 insertions(+), 9 deletions(-) create mode 100644 plugins/coverage/testData/simple/simple$foo_in_simple.jacoco.coverage rename plugins/coverage/testSrc/com/intellij/coverage/{PackageAnnotatorTest.java => CoverageIntegrationTest.java} (78%) diff --git a/plugins/coverage/src/com/intellij/coverage/JaCoCoCoverageRunner.java b/plugins/coverage/src/com/intellij/coverage/JaCoCoCoverageRunner.java index 866fb582aaff..9d862cee0b7a 100644 --- a/plugins/coverage/src/com/intellij/coverage/JaCoCoCoverageRunner.java +++ b/plugins/coverage/src/com/intellij/coverage/JaCoCoCoverageRunner.java @@ -90,12 +90,13 @@ public class JaCoCoCoverageRunner extends JavaCoverageRunner { className = className.replace('\\', '.').replace('/', '.'); final ClassData classData = data.getOrCreateClassData(className); final Collection methods = classCoverage.getMethods(); - LineData[] lines = new LineData[classCoverage.getLastLine()]; + LineData[] lines = new LineData[classCoverage.getLastLine() + 1]; for (IMethodCoverage method : methods) { final String desc = method.getName() + method.getDesc(); + // Line numbers are 1-based here. final int firstLine = method.getFirstLine(); final int lastLine = method.getLastLine(); - for (int i = firstLine; i < lastLine; i++) { + for (int i = firstLine; i <= lastLine; i++) { final ILine methodLine = method.getLine(i); final int methodLineStatus = methodLine.getStatus(); final LineData lineData = new LineData(i , desc) { diff --git a/plugins/coverage/testData/simple/simple$foo_in_simple.jacoco.coverage b/plugins/coverage/testData/simple/simple$foo_in_simple.jacoco.coverage new file mode 100644 index 0000000000000000000000000000000000000000..d6bbde0921fc7a6f6e6632fd9a759cbb775144e3 GIT binary patch literal 1619 zcmZQPa6o`ffI+!3KPOc;H>p4`Co!p5FEg(sH76%COD`|AMAszM!XP;%IhBEd(aU~* z_X-HzTOug1e~rczX+}2&sjSkx%o6>Q)QXbQO#PtL;?kUwfFh6~MKZ+<+T4QOZSAW5 zCTg!4bd&RQ^tn{L;$g%duU9p%r_Qa22~Wxz#5J9LsE-NAl@quPR&b6EfQu-U>BVK zVjDwzRzxI&Es7o#-$86HPEF5E%_}L^_b)9eC@t|%%1TWJ8knA0TvAji{P{YIAWMhv z^QN7Xw=pQ8n1yVAX8VCaa~tD;fwY_Rp0VGGro{|A zY5Dp3Zu$AnIf=!^tm1;#om+ARqC&(OB+)|}WOHz7W=X2^ll7N5|K8fI&Mf#~|4D7f zhKWuLS}3l@5^fpN z&cF|filoFMpx=r>UIWS%{ua|xe&d|SU`Mo@f*}bsH3gDDA>I?3y_ZoiMPX}l_{@V= z3=-I)))^R}VyWWhg3lv2XtT2|ieb=0u@jnpAt@1C;^&HH64Z}68+yj{)CL9_Y*s+> zor)pQV~oZt?mY^0U&Ek@VhOf{0}Kh@RA6zyW-Z9487&rty1L~fC+PG*dzT}Lhz*aHjVPpURVOv?K literal 0 HcmV?d00001 diff --git a/plugins/coverage/testSrc/com/intellij/coverage/PackageAnnotatorTest.java b/plugins/coverage/testSrc/com/intellij/coverage/CoverageIntegrationTest.java similarity index 78% rename from plugins/coverage/testSrc/com/intellij/coverage/PackageAnnotatorTest.java rename to plugins/coverage/testSrc/com/intellij/coverage/CoverageIntegrationTest.java index 7998c1ac2bb0..43b4b0381567 100644 --- a/plugins/coverage/testSrc/com/intellij/coverage/PackageAnnotatorTest.java +++ b/plugins/coverage/testSrc/com/intellij/coverage/CoverageIntegrationTest.java @@ -21,6 +21,8 @@ import com.intellij.openapi.project.ex.ProjectManagerEx; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiPackage; +import com.intellij.rt.coverage.data.ClassData; +import com.intellij.rt.coverage.data.LineCoverage; import com.intellij.testFramework.ModuleTestCase; import com.intellij.util.containers.hash.HashMap; @@ -30,7 +32,7 @@ import java.util.Map; /** * @author yole */ -public class PackageAnnotatorTest extends ModuleTestCase { +public class CoverageIntegrationTest extends ModuleTestCase { private static String getTestDataPath() { return PluginPathManager.getPluginHomePath("coverage") + "/testData/simple"; } @@ -44,12 +46,7 @@ public class PackageAnnotatorTest extends ModuleTestCase { } public void testSimple() { - File coverageFile = new File(getTestDataPath(), "simple$foo_in_simple.coverage"); - IDEACoverageRunner runner = CoverageRunner.getInstance(IDEACoverageRunner.class); - CoverageFileProvider fileProvider = new DefaultCoverageFileProvider(coverageFile); - CoverageSuite suite = - JavaCoverageEngine.getInstance().createCoverageSuite(runner, "Simple", fileProvider, null, -1, null, false, false, false); - CoverageSuitesBundle bundle = new CoverageSuitesBundle(suite); + CoverageSuitesBundle bundle = loadCoverageSuite(IDEACoverageRunner.class, "simple$foo_in_simple.coverage"); PsiPackage psiPackage = JavaPsiFacade.getInstance(myProject).findPackage("foo"); PackageAnnotator annotator = new PackageAnnotator(psiPackage); PackageAnnotationConsumer consumer = new PackageAnnotationConsumer(); @@ -58,6 +55,22 @@ public class PackageAnnotatorTest extends ModuleTestCase { assertNotNull(fooClassCoverage); } + public void testJaCoCo() { + CoverageSuitesBundle bundle = loadCoverageSuite(JaCoCoCoverageRunner.class, "simple$foo_in_simple.jacoco.coverage"); + ClassData classData = bundle.getCoverageData().getClassData("foo.FooClass"); + // getStatus() never returns full coverage; it can only distinguish between none and partial + assertEquals(LineCoverage.PARTIAL, classData.getStatus("method1()I").intValue()); + } + + private CoverageSuitesBundle loadCoverageSuite(Class coverageRunnerClass, String coverageDataPath) { + File coverageFile = new File(getTestDataPath(), coverageDataPath); + CoverageRunner runner = CoverageRunner.getInstance(coverageRunnerClass); + CoverageFileProvider fileProvider = new DefaultCoverageFileProvider(coverageFile); + CoverageSuite suite = + JavaCoverageEngine.getInstance().createCoverageSuite(runner, "Simple", fileProvider, null, -1, null, false, false, false, myProject); + return new CoverageSuitesBundle(suite); + } + private static class PackageAnnotationConsumer implements PackageAnnotator.Annotator { private final Map myDirectoryCoverage = new HashMap();