diff options
author | Marc R. Hoffmann <hoffmann@mountainminds.com> | 2018-08-02 21:56:26 +0200 |
---|---|---|
committer | Evgeny Mandrikov <Godin@users.noreply.github.com> | 2018-08-02 21:56:26 +0200 |
commit | b2c5ff73d24cc0c57f308f046de008568068b4c8 (patch) | |
tree | ede5f93173e1a7f9fc7fe8300b2ba94040a8a46c /org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation | |
parent | 65d1aea1bd0f85f8be9bbc5076b7191515fe5f39 (diff) | |
download | jacoco-b2c5ff73d24cc0c57f308f046de008568068b4c8.tar.gz |
Reorganize validation test packages (#716)
* Use module names as package names
* Merge previously separate filter validation tests
* Move non-version specific tests to org.jacoco.core.test
Diffstat (limited to 'org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation')
45 files changed, 1093 insertions, 589 deletions
diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/ClassFileVersionsTest.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/ClassFileVersionsTest.java deleted file mode 100644 index 87d78a21..00000000 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/ClassFileVersionsTest.java +++ /dev/null @@ -1,195 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Marc R. Hoffmann - initial API and implementation - * - *******************************************************************************/ -package org.jacoco.core.test.validation; - -import static org.junit.Assert.assertEquals; -import static org.objectweb.asm.Opcodes.ACC_PUBLIC; -import static org.objectweb.asm.Opcodes.ACC_SUPER; -import static org.objectweb.asm.Opcodes.ALOAD; -import static org.objectweb.asm.Opcodes.F_NEW; -import static org.objectweb.asm.Opcodes.IFEQ; -import static org.objectweb.asm.Opcodes.ILOAD; -import static org.objectweb.asm.Opcodes.INVOKESPECIAL; -import static org.objectweb.asm.Opcodes.INVOKEVIRTUAL; -import static org.objectweb.asm.Opcodes.POP; -import static org.objectweb.asm.Opcodes.RETURN; -import static org.objectweb.asm.Opcodes.V1_1; -import static org.objectweb.asm.Opcodes.V1_2; -import static org.objectweb.asm.Opcodes.V1_3; -import static org.objectweb.asm.Opcodes.V1_4; -import static org.objectweb.asm.Opcodes.V1_5; -import static org.objectweb.asm.Opcodes.V1_6; -import static org.objectweb.asm.Opcodes.V1_7; -import static org.objectweb.asm.Opcodes.V1_8; -import static org.objectweb.asm.Opcodes.V9; - -import java.io.IOException; - -import org.jacoco.core.instr.Instrumenter; -import org.jacoco.core.internal.BytecodeVersion; -import org.jacoco.core.internal.instr.InstrSupport; -import org.jacoco.core.runtime.IRuntime; -import org.jacoco.core.runtime.SystemPropertiesRuntime; -import org.junit.Test; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.Label; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; - -/** - * Test class inserted stackmap frames for different class file versions. - */ -public class ClassFileVersionsTest { - - @Test - public void test_1_1() throws IOException { - testVersion(V1_1, false); - } - - @Test - public void test_1_2() throws IOException { - testVersion(V1_2, false); - } - - @Test - public void test_1_3() throws IOException { - testVersion(V1_3, false); - } - - @Test - public void test_1_4() throws IOException { - testVersion(V1_4, false); - } - - @Test - public void test_1_5() throws IOException { - testVersion(V1_5, false); - } - - @Test - public void test_1_6() throws IOException { - testVersion(V1_6, true); - } - - @Test - public void test_1_7() throws IOException { - testVersion(V1_7, true); - } - - @Test - public void test_1_8() throws IOException { - testVersion(V1_8, true); - } - - @Test - public void test_9() throws IOException { - testVersion(V9, true); - } - - @Test - public void test_10() throws IOException { - testVersion(BytecodeVersion.V10, true); - } - - private void testVersion(int version, boolean frames) throws IOException { - final byte[] original = createClass(version, frames); - - IRuntime runtime = new SystemPropertiesRuntime(); - Instrumenter instrumenter = new Instrumenter(runtime); - byte[] instrumented = instrumenter.instrument(original, "TestTarget"); - - assertFrames(instrumented, frames); - } - - private void assertFrames(byte[] source, final boolean expected) { - int version = BytecodeVersion.get(source); - source = BytecodeVersion.downgradeIfNeeded(version, source); - new ClassReader(source) - .accept(new ClassVisitor(InstrSupport.ASM_API_VERSION) { - - @Override - public MethodVisitor visitMethod(int access, String name, - String desc, String signature, - String[] exceptions) { - return new MethodVisitor(InstrSupport.ASM_API_VERSION) { - boolean frames = false; - - @Override - public void visitFrame(int type, int nLocal, - Object[] local, int nStack, - Object[] stack) { - frames = true; - } - - @Override - public void visitEnd() { - assertEquals(Boolean.valueOf(expected), - Boolean.valueOf(frames)); - } - }; - } - }, 0); - } - - /** - * Creates a class that requires a frame before the return statement. Also - * for this class instrumentation should insert another frame. - * - * <code><pre> - * public class Sample { - * public Sample(boolean b){ - * if(b){ - * toString(); - * } - * return; - * } - * } - * </pre></code> - */ - private byte[] createClass(int version, boolean frames) { - - ClassWriter cw = new ClassWriter(0); - MethodVisitor mv; - - cw.visit(version, ACC_PUBLIC + ACC_SUPER, "org/jacoco/test/Sample", - null, "java/lang/Object", null); - - mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(Z)V", null, null); - mv.visitCode(); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", - false); - mv.visitVarInsn(ILOAD, 1); - Label l1 = new Label(); - mv.visitJumpInsn(IFEQ, l1); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "toString", - "()Ljava/lang/String;", false); - mv.visitInsn(POP); - mv.visitLabel(l1); - if (frames) { - mv.visitFrame(F_NEW, 2, - new Object[] { "org/jacoco/test/Sample", Opcodes.INTEGER }, - 0, new Object[] {}); - } - mv.visitInsn(RETURN); - mv.visitMaxs(1, 2); - mv.visitEnd(); - - cw.visitEnd(); - - return cw.toByteArray(); - } - -} diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/ImplicitDefaultConstructorTest.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/ImplicitDefaultConstructorTest.java deleted file mode 100644 index 09872e8d..00000000 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/ImplicitDefaultConstructorTest.java +++ /dev/null @@ -1,36 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Marc R. Hoffmann - initial API and implementation - * - *******************************************************************************/ -package org.jacoco.core.test.validation; - -import org.jacoco.core.analysis.ICounter; -import org.jacoco.core.test.validation.targets.Target06; -import org.junit.Test; - -/** - * Test of a implicit default constructor. - * - * @see PrivateEmptyDefaultConstructorTest - */ -public class ImplicitDefaultConstructorTest extends ValidationTestBase { - - public ImplicitDefaultConstructorTest() { - super(Target06.class); - } - - @Test - public void testCoverageResult() { - - assertLine("classdef", ICounter.FULLY_COVERED); - - } - -} diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/ResizeInstructionsTest.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/ResizeInstructionsTest.java deleted file mode 100644 index fe6d134a..00000000 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/ResizeInstructionsTest.java +++ /dev/null @@ -1,171 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Evgeny Mandrikov - initial API and implementation - * - *******************************************************************************/ -package org.jacoco.core.test.validation; - -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; - -import org.jacoco.core.instr.Instrumenter; -import org.jacoco.core.internal.BytecodeVersion; -import org.jacoco.core.internal.instr.InstrSupport; -import org.jacoco.core.runtime.IRuntime; -import org.jacoco.core.runtime.RuntimeData; -import org.jacoco.core.runtime.SystemPropertiesRuntime; -import org.jacoco.core.test.TargetLoader; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.Label; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; - -public class ResizeInstructionsTest { - - private final IRuntime runtime = new SystemPropertiesRuntime(); - private final Instrumenter instrumenter = new Instrumenter(runtime); - - private boolean computedCommonSuperClass = false; - - @Before - public void setup() throws Exception { - runtime.startup(new RuntimeData()); - } - - @After - public void teardown() { - runtime.shutdown(); - } - - private class Inner { - } - - /** - * Test of ASM bug - * <a href="https://gitlab.ow2.org/asm/asm/issues/317792">#317792</a>. - */ - @Test - public void should_not_loose_InnerClasses_attribute() throws Exception { - byte[] source = TargetLoader.getClassDataAsBytes(Inner.class); - final int version = BytecodeVersion.get(source); - source = BytecodeVersion.downgradeIfNeeded(version, source); - - final ClassReader cr = new ClassReader(source); - final ClassWriter cw = new ClassWriter(0); - cr.accept(new ClassVisitor(InstrSupport.ASM_API_VERSION, cw) { - @Override - public void visitEnd() { - final MethodVisitor mv = cv.visitMethod(0, "m", "()V", null, - null); - mv.visitCode(); - addCauseOfResizeInstructions(mv); - mv.visitInsn(Opcodes.NOP); - mv.visitMaxs(2, 1); - mv.visitEnd(); - super.visitEnd(); - } - }, 0); - source = cw.toByteArray(); - BytecodeVersion.set(source, version); - - final byte[] bytes = instrumenter.instrument(source, ""); - - final TargetLoader targetLoader = new TargetLoader(); - final Class<?> outer = targetLoader.add(ResizeInstructionsTest.class, - TargetLoader.getClassDataAsBytes(ResizeInstructionsTest.class)); - final Class<?> inner = targetLoader.add(Inner.class, bytes); - assertSame(outer, inner.getEnclosingClass()); - assertNotNull(inner.getEnclosingClass()); - assertSame(outer, inner.getDeclaringClass()); - assertNotNull(inner.getDeclaringClass()); - } - - /** - * Test of ASM bug - * <a href= "https://gitlab.ow2.org/asm/asm/issues/317630">#317630</a> that - * caused {@code java.lang.ClassNotFoundException}. - */ - @Test - public void should_not_require_computation_of_common_superclass() - throws Exception { - final String className = "Example"; - - final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES) { - @Override - protected String getCommonSuperClass(final String type1, - final String type2) { - computedCommonSuperClass |= className.equals(type1) - || className.equals(type2); - return "java/lang/Object"; - } - }; - cw.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC, className, null, - "java/lang/Object", null); - final MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "m", "()V", - null, null); - mv.visitCode(); - addCauseOfResizeInstructions(mv); - addCauseOfGetCommonSuperClass(mv); - mv.visitMaxs(1, 1); - mv.visitEnd(); - cw.visitEnd(); - final byte[] original = cw.toByteArray(); - assertTrue(computedCommonSuperClass); - new TargetLoader().add(className, original); - - final byte[] instrumented = instrumenter.instrument(original, - className); - new TargetLoader().add(className, instrumented); - } - - /** - * Adds code that requires - * {@link ClassWriter#getCommonSuperClass(String, String)}. - * - * <pre> - * Object o = this; - * while (true) { - * o = (Integer) null; - * } - * </pre> - */ - private static void addCauseOfGetCommonSuperClass(final MethodVisitor mv) { - mv.visitVarInsn(Opcodes.ALOAD, 0); - mv.visitVarInsn(Opcodes.ASTORE, 1); - Label label = new Label(); - mv.visitLabel(label); - mv.visitInsn(Opcodes.ACONST_NULL); - mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Integer"); - mv.visitVarInsn(Opcodes.ASTORE, 1); - mv.visitJumpInsn(Opcodes.GOTO, label); - } - - /** - * Adds code that triggers usage of - * {@link org.objectweb.asm.MethodWriter#COMPUTE_INSERTED_FRAMES} during - * instrumentation. - */ - private static void addCauseOfResizeInstructions(final MethodVisitor mv) { - mv.visitInsn(Opcodes.ICONST_0); - mv.visitInsn(Opcodes.ICONST_1); - final Label target = new Label(); - mv.visitJumpInsn(Opcodes.IFLE, target); - for (int i = 0; i < Short.MAX_VALUE; i++) { - mv.visitInsn(Opcodes.NOP); - } - mv.visitLabel(target); - } - -} diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/AnnotationInitializerTest.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/AnnotationInitializerTest.java index 60a38339..7286cd13 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/AnnotationInitializerTest.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/AnnotationInitializerTest.java @@ -9,10 +9,11 @@ * Evgeny Mandrikov - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation; +package org.jacoco.core.test.validation.java5; import org.jacoco.core.analysis.ICounter; -import org.jacoco.core.test.validation.targets.AnnotationInitializer; +import org.jacoco.core.test.validation.ValidationTestBase; +import org.jacoco.core.test.validation.java5.targets.AnnotationInitializerTarget; import org.junit.Test; import static org.junit.Assert.assertEquals; @@ -23,7 +24,7 @@ import static org.junit.Assert.assertEquals; public class AnnotationInitializerTest extends ValidationTestBase { public AnnotationInitializerTest() { - super(AnnotationInitializer.class); + super(AnnotationInitializerTarget.class); } @Override diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/BadCycleClassTest.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/BadCycleClassTest.java index aa646ddf..da53f5a0 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/BadCycleClassTest.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/BadCycleClassTest.java @@ -9,10 +9,11 @@ * Evgeny Mandrikov - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation; +package org.jacoco.core.test.validation.java5; import org.jacoco.core.analysis.ICounter; -import org.jacoco.core.test.validation.targets.BadCycleClass; +import org.jacoco.core.test.validation.ValidationTestBase; +import org.jacoco.core.test.validation.java5.targets.BadCycleClassTarget; import org.junit.Test; /** @@ -21,7 +22,7 @@ import org.junit.Test; public class BadCycleClassTest extends ValidationTestBase { public BadCycleClassTest() throws Exception { - super(BadCycleClass.class); + super(BadCycleClassTarget.class); } @Test diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/BooleanExpressionsTest.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/BooleanExpressionsTest.java index 64dee474..f91e1c10 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/BooleanExpressionsTest.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/BooleanExpressionsTest.java @@ -9,10 +9,11 @@ * Marc R. Hoffmann - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation; +package org.jacoco.core.test.validation.java5; import org.jacoco.core.analysis.ICounter; -import org.jacoco.core.test.validation.targets.Target02; +import org.jacoco.core.test.validation.ValidationTestBase; +import org.jacoco.core.test.validation.java5.targets.BooleanExpressionsTarget; import org.junit.Test; /** @@ -21,7 +22,7 @@ import org.junit.Test; public class BooleanExpressionsTest extends ValidationTestBase { public BooleanExpressionsTest() { - super(Target02.class); + super(BooleanExpressionsTarget.class); } @Test diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/ClassInitializerTest.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/ClassInitializerTest.java index f87e705c..8df6e8d8 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/ClassInitializerTest.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/ClassInitializerTest.java @@ -9,10 +9,11 @@ * Marc R. Hoffmann - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation; +package org.jacoco.core.test.validation.java5; import org.jacoco.core.analysis.ICounter; -import org.jacoco.core.test.validation.targets.Target05; +import org.jacoco.core.test.validation.ValidationTestBase; +import org.jacoco.core.test.validation.java5.targets.ClassInitializerTarget; import org.junit.Test; /** @@ -21,7 +22,7 @@ import org.junit.Test; public class ClassInitializerTest extends ValidationTestBase { public ClassInitializerTest() { - super(Target05.class); + super(ClassInitializerTarget.class); } @Test diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/ConstructorsTest.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/ConstructorsTest.java new file mode 100644 index 00000000..4c3ed6ac --- /dev/null +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/ConstructorsTest.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Evgeny Mandrikov - initial API and implementation + * + *******************************************************************************/ +package org.jacoco.core.test.validation.java5; + +import org.jacoco.core.analysis.ICounter; +import org.jacoco.core.test.validation.ValidationTestBase; +import org.jacoco.core.test.validation.java5.targets.ConstructorsTarget; +import org.junit.Test; + +/** + * Tests for different constructors. Private empty constructors without + * arguments are filtered. + */ +public class ConstructorsTest extends ValidationTestBase { + + public ConstructorsTest() { + super(ConstructorsTarget.class); + } + + @Test + public void testCoverageResult() { + // not filtered because not private: + assertLine("packageLocal", ICounter.FULLY_COVERED); + + // not filtered because has argument: + assertLine("arg", ICounter.FULLY_COVERED); + + // not filtered because not empty - prepares arguments for super + // constructor: + assertLine("super", ICounter.FULLY_COVERED); + + // not filtered because contains initialization of a field to hold + // reference to an instance of outer class that is passed as an + // argument: + assertLine("inner", ICounter.FULLY_COVERED); + + // not filtered because not empty - contains initialization of + // a field: + assertLine("innerStatic", ICounter.FULLY_COVERED); + + // not filtered because default constructor for not private inner + // classes is not private: + assertLine("publicDefault", ICounter.FULLY_COVERED); + assertLine("packageLocalDefault", ICounter.FULLY_COVERED); + + assertLine("privateDefault", ICounter.EMPTY); + + assertLine("privateNonEmptyNoArg", ICounter.FULLY_COVERED); + + assertLine("privateEmptyNoArg", ICounter.EMPTY); + assertLine("return", ICounter.EMPTY); + } + +} diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/ProbesBeforeSuperConstructorTest.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/ControlStructureBeforeSuperConstructorTest.java index 88b1ae54..d381887a 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/ProbesBeforeSuperConstructorTest.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/ControlStructureBeforeSuperConstructorTest.java @@ -9,19 +9,20 @@ * Marc R. Hoffmann - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation; +package org.jacoco.core.test.validation.java5; import org.jacoco.core.analysis.ICounter; -import org.jacoco.core.test.validation.targets.Target10; +import org.jacoco.core.test.validation.ValidationTestBase; +import org.jacoco.core.test.validation.java5.targets.ControlStructureBeforeSuperConstructorTarget; import org.junit.Test; /** * Test of probes before the super constructor call. */ -public class ProbesBeforeSuperConstructorTest extends ValidationTestBase { +public class ControlStructureBeforeSuperConstructorTest extends ValidationTestBase { - public ProbesBeforeSuperConstructorTest() { - super(Target10.class); + public ControlStructureBeforeSuperConstructorTest() { + super(ControlStructureBeforeSuperConstructorTarget.class); } @Test diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/ControlStructuresTest.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/ControlStructuresTest.java index 37db4c14..768312fc 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/ControlStructuresTest.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/ControlStructuresTest.java @@ -9,10 +9,11 @@ * Marc R. Hoffmann - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation; +package org.jacoco.core.test.validation.java5; import org.jacoco.core.analysis.ICounter; -import org.jacoco.core.test.validation.targets.Target01; +import org.jacoco.core.test.validation.ValidationTestBase; +import org.jacoco.core.test.validation.java5.targets.ControlStructuresTarget; import org.junit.Test; /** @@ -21,7 +22,7 @@ import org.junit.Test; public class ControlStructuresTest extends ValidationTestBase { public ControlStructuresTest() { - super(Target01.class); + super(ControlStructuresTarget.class); } @Test diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/CyclomaticComplexityTest.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/CyclomaticComplexityTest.java index 122612ce..b7b11286 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/CyclomaticComplexityTest.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/CyclomaticComplexityTest.java @@ -9,7 +9,7 @@ * Marc R. Hoffmann - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation; +package org.jacoco.core.test.validation.java5; import static org.jacoco.core.test.validation.targets.Stubs.nop; import static org.junit.Assert.assertEquals; diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/EnumConstructorTest.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/EnumConstructorTest.java new file mode 100644 index 00000000..28652700 --- /dev/null +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/EnumConstructorTest.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Evgeny Mandrikov - initial API and implementation + * + *******************************************************************************/ +package org.jacoco.core.test.validation.java5; + +import org.jacoco.core.analysis.ICounter; +import org.jacoco.core.test.validation.ValidationTestBase; +import org.jacoco.core.test.validation.java5.targets.EnumConstructorTarget; +import org.junit.Test; + +/** + * Test of filtering of enum constructors. + */ +public class EnumConstructorTest extends ValidationTestBase { + + public EnumConstructorTest() { + super(EnumConstructorTarget.class); + } + + /** + * {@link EnumConstructorTarget.ImplicitConstructor} + */ + @Test + public void implicit_constructor_should_be_filtered() { + // without filter next line is partly covered: + assertLine("implicitConstructor", ICounter.FULLY_COVERED); + } + + /** + * {@link EnumConstructorTarget.ExplicitNonEmptyConstructor#ExplicitNonEmptyConstructor()} + */ + @Test + public void explicit_non_empty_constructor_should_not_be_filtered() { + assertLine("explicitNonEmptyConstructor", ICounter.NOT_COVERED); + } + + /** + * {@link EnumConstructorTarget.ExplicitEmptyConstructor#ExplicitEmptyConstructor()} + */ + @Test + public void explicit_empty_constructor_should_be_filtered() { + // without filter next line is not covered: + assertLine("explicitEmptyConstructor", ICounter.EMPTY); + } + + /** + * {@link EnumConstructorTarget.ExplicitEmptyConstructor#ExplicitEmptyConstructor(Object)} + */ + @Test + public void explicit_empty_constructor_with_parameters_should_not_be_filtered() { + assertLine("explicitEmptyConstructorWithParameter", + ICounter.NOT_COVERED); + } + +} diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/EnumImplicitMethodsTest.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/EnumImplicitMethodsTest.java index fbd9e540..0f6a8660 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/EnumImplicitMethodsTest.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/EnumImplicitMethodsTest.java @@ -9,10 +9,11 @@ * Evgeny Mandrikov - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation; +package org.jacoco.core.test.validation.java5; import org.jacoco.core.analysis.ICounter; -import org.jacoco.core.test.validation.targets.EnumImplicitMethods; +import org.jacoco.core.test.validation.ValidationTestBase; +import org.jacoco.core.test.validation.java5.targets.EnumImplicitMethodsTarget; import org.junit.Test; /** @@ -21,7 +22,7 @@ import org.junit.Test; public class EnumImplicitMethodsTest extends ValidationTestBase { public EnumImplicitMethodsTest() { - super(EnumImplicitMethods.class); + super(EnumImplicitMethodsTarget.class); } @Test diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/EnumSwitchTest.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/EnumSwitchTest.java new file mode 100644 index 00000000..fa3c44ca --- /dev/null +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/EnumSwitchTest.java @@ -0,0 +1,40 @@ +/******************************************************************************* + * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Evgeny Mandrikov - initial API and implementation + * + *******************************************************************************/ +package org.jacoco.core.test.validation.java5; + +import org.jacoco.core.analysis.ICounter; +import org.jacoco.core.test.validation.ValidationTestBase; +import org.jacoco.core.test.validation.java5.targets.EnumSwitchTarget; +import org.junit.Test; + +/** + * Test of filtering of a synthetic class that is generated by javac for a enum + * in switch statement. + */ +public class EnumSwitchTest extends ValidationTestBase { + + public EnumSwitchTest() { + super(EnumSwitchTarget.class); + } + + @Test + public void testCoverageResult() { + if (isJDKCompiler && JAVA_VERSION.isBefore("1.6")) { + // class that holds "switch map" is not marked as synthetic when + // compiling with javac 1.5 + assertLine("switch", ICounter.PARTLY_COVERED, 0, 2); + } else { + assertLine("switch", ICounter.FULLY_COVERED, 0, 2); + } + } + +} diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/ExceptionsTest.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/ExceptionsTest.java index c68bd374..15e47167 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/ExceptionsTest.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/ExceptionsTest.java @@ -9,10 +9,11 @@ * Marc R. Hoffmann - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation; +package org.jacoco.core.test.validation.java5; import org.jacoco.core.analysis.ICounter; -import org.jacoco.core.test.validation.targets.Target03; +import org.jacoco.core.test.validation.ValidationTestBase; +import org.jacoco.core.test.validation.java5.targets.ExceptionsTarget; import org.junit.Test; /** @@ -21,7 +22,7 @@ import org.junit.Test; public class ExceptionsTest extends ValidationTestBase { public ExceptionsTest() { - super(Target03.class); + super(ExceptionsTarget.class); } @Test diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/ExplicitInitialFrameTest.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/ExplicitInitialFrameTest.java index 1c0a02f1..b04c1a6b 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/ExplicitInitialFrameTest.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/ExplicitInitialFrameTest.java @@ -9,10 +9,11 @@ * Marc R. Hoffmann - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation; +package org.jacoco.core.test.validation.java5; import org.jacoco.core.analysis.ICounter; -import org.jacoco.core.test.validation.targets.Target11; +import org.jacoco.core.test.validation.ValidationTestBase; +import org.jacoco.core.test.validation.java5.targets.ExplicitInitialFrameTarget; import org.junit.Test; /** @@ -21,7 +22,7 @@ import org.junit.Test; public class ExplicitInitialFrameTest extends ValidationTestBase { public ExplicitInitialFrameTest() { - super(Target11.class); + super(ExplicitInitialFrameTarget.class); } @Test diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/FieldInitializationInTwoConstructorsTest.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/FieldInitializationInTwoConstructorsTest.java index 6896bf6d..6be37f4d 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/FieldInitializationInTwoConstructorsTest.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/FieldInitializationInTwoConstructorsTest.java @@ -9,10 +9,11 @@ * Marc R. Hoffmann - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation; +package org.jacoco.core.test.validation.java5; import org.jacoco.core.analysis.ICounter; -import org.jacoco.core.test.validation.targets.Target09; +import org.jacoco.core.test.validation.ValidationTestBase; +import org.jacoco.core.test.validation.java5.targets.FieldInitializationInTwoConstructorsTarget; import org.junit.Test; /** @@ -22,7 +23,7 @@ public class FieldInitializationInTwoConstructorsTest extends ValidationTestBase { public FieldInitializationInTwoConstructorsTest() { - super(Target09.class); + super(FieldInitializationInTwoConstructorsTarget.class); } @Test diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/FinallyTest.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/FinallyTest.java new file mode 100644 index 00000000..8531a501 --- /dev/null +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/FinallyTest.java @@ -0,0 +1,267 @@ +/******************************************************************************* + * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Evgeny Mandrikov - initial API and implementation + * + *******************************************************************************/ +package org.jacoco.core.test.validation.java5; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.util.HashSet; +import java.util.Set; + +import org.jacoco.core.analysis.ICounter; +import org.jacoco.core.internal.BytecodeVersion; +import org.jacoco.core.test.TargetLoader; +import org.jacoco.core.test.validation.ValidationTestBase; +import org.jacoco.core.test.validation.java5.targets.FinallyTarget; +import org.junit.Test; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.AbstractInsnNode; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.LineNumberNode; +import org.objectweb.asm.tree.MethodNode; + +/** + * Test of filtering of duplicated bytecode that is generated for finally block. + */ +public class FinallyTest extends ValidationTestBase { + + public FinallyTest() { + super(FinallyTarget.class); + } + + /** + * {@link FinallyTarget#example(boolean)} + */ + @Test + public void example() { + if (isJDKCompiler) { + assertLine("example.0", ICounter.EMPTY); + } else { + assertLine("example.0", ICounter.FULLY_COVERED); + } + assertLine("example.1", ICounter.FULLY_COVERED, 0, 2); + assertLine("example.2", ICounter.FULLY_COVERED); + assertLine("example.3", ICounter.EMPTY); + assertLine("example.4", ICounter.EMPTY); + } + + /** + * GOTO instructions at the end of duplicates of finally block might have + * line number of a last instruction of finally block and hence lead to + * unexpected coverage results, like for example in case of ECJ for + * {@link FinallyTarget#catchNotExecuted()}, + * {@link FinallyTarget#emptyCatch()}. So we decided to ignore them, even if + * they can correspond to a real break statement. + * <p> + * See also <a href= + * "https://bugs.openjdk.java.net/browse/JDK-8180141">JDK-8180141</a> and + * <a href= + * "https://bugs.openjdk.java.net/browse/JDK-7008643">JDK-7008643</a>. + * <p> + * {@link FinallyTarget#breakStatement()} + */ + @Test + public void breakStatement() { + assertLine("breakStatement", ICounter.EMPTY); + + assertLine("breakStatement.1", ICounter.FULLY_COVERED); + assertLine("breakStatement.2", ICounter.EMPTY); + } + + /** + * {@link FinallyTarget#catchNotExecuted()} + */ + @Test + public void catchNotExecuted() { + assertLine("catchNotExecuted.catch", ICounter.NOT_COVERED); + assertLine("catchNotExecuted.0", ICounter.EMPTY); + assertLine("catchNotExecuted.1", ICounter.FULLY_COVERED); + assertLine("catchNotExecuted.2", ICounter.EMPTY); + } + + /** + * {@link FinallyTarget#emptyCatch()} + */ + @Test + public void emptyCatch() { + assertLine("emptyCatch.0", ICounter.EMPTY); + assertLine("emptyCatch.1", ICounter.FULLY_COVERED); + assertLine("emptyCatch.2", ICounter.EMPTY); + } + + /** + * {@link FinallyTarget#twoRegions()} + */ + @Test + public void twoRegions() { + assertLine("twoRegions.0", ICounter.EMPTY); + if (isJDKCompiler && JAVA_VERSION.isBefore("1.8")) { + // https://bugs.openjdk.java.net/browse/JDK-7008643 + assertLine("twoRegions.1", ICounter.PARTLY_COVERED); + assertLine("twoRegions.return.1", ICounter.EMPTY); + assertLine("twoRegions.return.2", ICounter.EMPTY); + } else { + assertLine("twoRegions.1", ICounter.FULLY_COVERED); + assertLine("twoRegions.return.1", ICounter.FULLY_COVERED); + assertLine("twoRegions.return.2", ICounter.NOT_COVERED); + } + assertLine("twoRegions.2", ICounter.EMPTY); + + assertLine("twoRegions.if", ICounter.FULLY_COVERED); + assertLine("twoRegions.region.1", ICounter.FULLY_COVERED); + assertLine("twoRegions.region.2", ICounter.NOT_COVERED); + } + + /** + * {@link FinallyTarget#nested()} + */ + @Test + public void nested() { + if (isJDKCompiler) { + assertLine("nested.0", ICounter.EMPTY); + } else { + assertLine("nested.0", ICounter.FULLY_COVERED); + } + assertLine("nested.1", ICounter.EMPTY); + assertLine("nested.2", ICounter.FULLY_COVERED); + if (isJDKCompiler) { + assertLine("nested.3", ICounter.EMPTY); + } else { + assertLine("nested.3", ICounter.FULLY_COVERED); + } + assertLine("nested.4", ICounter.FULLY_COVERED); + } + + /** + * {@link FinallyTarget#emptyTry()} + */ + @Test + public void emptyTry() { + assertLine("emptyTry.0", ICounter.EMPTY); + if (isJDKCompiler && JAVA_VERSION.isBefore("1.8")) { + // compiler bug fixed in javac >= 1.8: + assertLine("emptyTry.1", ICounter.PARTLY_COVERED); + assertLine("emptyTry.2", ICounter.FULLY_COVERED); + } else { + assertLine("emptyTry.1", ICounter.FULLY_COVERED); + assertLine("emptyTry.2", ICounter.EMPTY); + } + } + + /** + * {@link FinallyTarget#alwaysCompletesAbruptly()} + */ + @Test + public void alwaysCompletesAbruptly() { + if (isJDKCompiler) { + // uncovered case: + assertLine("alwaysCompletesAbruptly.0", ICounter.EMPTY); + assertLine("alwaysCompletesAbruptly.1", ICounter.PARTLY_COVERED); + } else { + assertLine("alwaysCompletesAbruptly.0", ICounter.PARTLY_COVERED); + assertLine("alwaysCompletesAbruptly.1", ICounter.FULLY_COVERED); + } + assertLine("alwaysCompletesAbruptly.2", ICounter.EMPTY); + } + + /** + * This test studies placement of GOTO instructions. + */ + @Test + public void gotos() throws IOException { + byte[] b = TargetLoader.getClassDataAsBytes(FinallyTarget.class); + b = BytecodeVersion.downgradeIfNeeded(BytecodeVersion.get(b), b); + + final ClassNode classNode = new ClassNode(); + new ClassReader(b).accept(classNode, 0); + final Set<String> tags = new HashSet<String>(); + for (final MethodNode m : classNode.methods) { + if ("main".equals(m.name)) { + // skip it + continue; + } + int lineNumber = -1; + for (AbstractInsnNode i = m.instructions + .getFirst(); i != null; i = i.getNext()) { + if (AbstractInsnNode.LINE == i.getType()) { + lineNumber = ((LineNumberNode) i).line; + } + if (Opcodes.GOTO == i.getOpcode()) { + final String line = getSource().getLine(lineNumber); + if (line.indexOf('$') < 0) { + throw new AssertionError( + "No tag at line " + lineNumber); + } + final String tag = line.substring( + line.indexOf('$') + "$line-".length(), + line.lastIndexOf('$')); + tags.add(tag); + } + } + } + + final Set<String> expected = new HashSet<String>(); + + if (isJDKCompiler) { + expected.add("example.2"); + } else { + expected.add("example.0"); + } + + expected.add("breakStatement.for"); + if (isJDKCompiler) { + if (JAVA_VERSION.isBefore("10")) { + // https://bugs.openjdk.java.net/browse/JDK-8180141 + expected.add("breakStatement.1"); + } else { + expected.add("breakStatement"); + } + expected.add("breakStatement.2"); + } else { + expected.add("breakStatement"); + } + + if (isJDKCompiler) { + expected.add("emptyCatch.2"); + } else { + expected.add("emptyCatch"); + expected.add("emptyCatch.1"); + } + + if (isJDKCompiler) { + expected.add("catchNotExecuted.2"); + } else { + expected.add("catchNotExecuted"); + expected.add("catchNotExecuted.1"); + } + + if (isJDKCompiler) { + expected.add("nested.5"); + expected.add("nested.6"); + } else { + expected.add("nested.0"); + expected.add("nested.3"); + } + + if (isJDKCompiler && JAVA_VERSION.isBefore("1.8")) { + expected.add("emptyTry.2"); + } + + if (!isJDKCompiler) { + expected.add("alwaysCompletesAbruptly.0"); + } + + assertEquals(expected, tags); + } + +} diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/FramesTest.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/FramesTest.java index 9ab062b6..2d502c31 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/FramesTest.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/FramesTest.java @@ -9,7 +9,7 @@ * Marc R. Hoffmann - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation; +package org.jacoco.core.test.validation.java5; import static org.junit.Assert.assertEquals; @@ -23,18 +23,17 @@ import org.jacoco.core.internal.instr.InstrSupport; import org.jacoco.core.runtime.IRuntime; import org.jacoco.core.runtime.SystemPropertiesRuntime; import org.jacoco.core.test.TargetLoader; -import org.jacoco.core.test.validation.targets.Target01; -import org.jacoco.core.test.validation.targets.Target02; -import org.jacoco.core.test.validation.targets.Target03; -import org.jacoco.core.test.validation.targets.Target04; -import org.jacoco.core.test.validation.targets.Target05; -import org.jacoco.core.test.validation.targets.Target06; -import org.jacoco.core.test.validation.targets.Target07; -import org.jacoco.core.test.validation.targets.Target08; -import org.jacoco.core.test.validation.targets.Target09; -import org.jacoco.core.test.validation.targets.Target10; -import org.jacoco.core.test.validation.targets.Target11; -import org.jacoco.core.test.validation.targets.Target12; +import org.jacoco.core.test.validation.java5.targets.BooleanExpressionsTarget; +import org.jacoco.core.test.validation.java5.targets.ClassInitializerTarget; +import org.jacoco.core.test.validation.java5.targets.ConstructorsTarget; +import org.jacoco.core.test.validation.java5.targets.ControlStructureBeforeSuperConstructorTarget; +import org.jacoco.core.test.validation.java5.targets.ControlStructuresTarget; +import org.jacoco.core.test.validation.java5.targets.ExceptionsTarget; +import org.jacoco.core.test.validation.java5.targets.ExplicitInitialFrameTarget; +import org.jacoco.core.test.validation.java5.targets.FieldInitializationInTwoConstructorsTarget; +import org.jacoco.core.test.validation.java5.targets.ImplicitFieldInitializationTarget; +import org.jacoco.core.test.validation.java5.targets.InterfaceClassInitializerTarget; +import org.jacoco.core.test.validation.java5.targets.StructuredLockingTarget; import org.junit.Test; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; @@ -117,63 +116,59 @@ public class FramesTest { } @Test - public void testTarget01() throws IOException { - testFrames(Target01.class); + public void boolean_expressions() throws IOException { + testFrames(BooleanExpressionsTarget.class); } @Test - public void testTarget02() throws IOException { - testFrames(Target02.class); + public void class_initializer() throws IOException { + testFrames(ClassInitializerTarget.class); } @Test - public void testTarget03() throws IOException { - testFrames(Target03.class); + public void constructors() throws IOException { + testFrames(ConstructorsTarget.class); } @Test - public void testTarget04() throws IOException { - testFrames(Target04.class); + public void control_structures() throws IOException { + testFrames(ControlStructuresTarget.class); } @Test - public void testTarget05() throws IOException { - testFrames(Target05.class); + public void control_structure_before_super_constructor() + throws IOException { + testFrames(ControlStructureBeforeSuperConstructorTarget.class); } @Test - public void testTarget06() throws IOException { - testFrames(Target06.class); + public void exceptions() throws IOException { + testFrames(ExceptionsTarget.class); } @Test - public void testTarget07() throws IOException { - testFrames(Target07.class); + public void explicit_initial_frame() throws IOException { + testFrames(ExplicitInitialFrameTarget.class); } @Test - public void testTarget08() throws IOException { - testFrames(Target08.class); + public void field_initialization_in_two_constructors() throws IOException { + testFrames(FieldInitializationInTwoConstructorsTarget.class); } @Test - public void testTarget09() throws IOException { - testFrames(Target09.class); + public void implicit_field_initialization() throws IOException { + testFrames(ImplicitFieldInitializationTarget.class); } @Test - public void testTarget10() throws IOException { - testFrames(Target10.class); + public void interface_class_initializer() throws IOException { + testFrames(InterfaceClassInitializerTarget.class); } @Test - public void testTarget11() throws IOException { - testFrames(Target11.class); - } - - @Test - public void testTarget12() throws IOException { - testFrames(Target12.class); + public void structured_locking() throws IOException { + testFrames(StructuredLockingTarget.class); } } diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/ImplicitFieldInitializationTest.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/ImplicitFieldInitializationTest.java index 769593d7..d87d039b 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/ImplicitFieldInitializationTest.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/ImplicitFieldInitializationTest.java @@ -9,10 +9,11 @@ * Marc R. Hoffmann - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation; +package org.jacoco.core.test.validation.java5; import org.jacoco.core.analysis.ICounter; -import org.jacoco.core.test.validation.targets.Target08; +import org.jacoco.core.test.validation.ValidationTestBase; +import org.jacoco.core.test.validation.java5.targets.ImplicitFieldInitializationTarget; import org.junit.Test; /** @@ -21,7 +22,7 @@ import org.junit.Test; public class ImplicitFieldInitializationTest extends ValidationTestBase { public ImplicitFieldInitializationTest() { - super(Target08.class); + super(ImplicitFieldInitializationTarget.class); } @Test diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/InterfaceClassInitializerTest.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/InterfaceClassInitializerTest.java index 5675dbb0..9e13debb 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/InterfaceClassInitializerTest.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/InterfaceClassInitializerTest.java @@ -9,10 +9,11 @@ * Marc R. Hoffmann - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation; +package org.jacoco.core.test.validation.java5; import org.jacoco.core.analysis.ICounter; -import org.jacoco.core.test.validation.targets.Target04; +import org.jacoco.core.test.validation.ValidationTestBase; +import org.jacoco.core.test.validation.java5.targets.InterfaceClassInitializerTarget; import org.junit.Test; /** @@ -21,7 +22,7 @@ import org.junit.Test; public class InterfaceClassInitializerTest extends ValidationTestBase { public InterfaceClassInitializerTest() { - super(Target04.class); + super(InterfaceClassInitializerTarget.class); } @Override diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/StructuredLockingTest.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/StructuredLockingTest.java index 823ab787..8243c4bc 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/StructuredLockingTest.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/StructuredLockingTest.java @@ -9,7 +9,7 @@ * Marc R. Hoffmann - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation; +package org.jacoco.core.test.validation.java5; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -24,7 +24,7 @@ import org.jacoco.core.internal.BytecodeVersion; import org.jacoco.core.runtime.IRuntime; import org.jacoco.core.runtime.SystemPropertiesRuntime; import org.jacoco.core.test.TargetLoader; -import org.jacoco.core.test.validation.targets.Target12; +import org.jacoco.core.test.validation.java5.targets.StructuredLockingTarget; import org.junit.Test; import org.objectweb.asm.ClassReader; import org.objectweb.asm.Opcodes; @@ -55,12 +55,9 @@ import org.objectweb.asm.tree.analysis.Interpreter; public class StructuredLockingTest { @Test - public void testTarget12() throws Exception { - testMonitorExit(Target12.class); - } - - private void testMonitorExit(Class<?> target) throws Exception { - assertStructuredLocking(TargetLoader.getClassDataAsBytes(target)); + public void testMonitorExit() throws Exception { + assertStructuredLocking(TargetLoader + .getClassDataAsBytes(StructuredLockingTarget.class)); } private void assertStructuredLocking(byte[] source) throws Exception { @@ -89,7 +86,8 @@ public class StructuredLockingTest { } @Override - protected Frame<BasicValue> newFrame(Frame<? extends BasicValue> src) { + protected Frame<BasicValue> newFrame( + Frame<? extends BasicValue> src) { return new LockFrame(src); } }; diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/SynchronizedTest.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/SynchronizedTest.java new file mode 100644 index 00000000..c1498be1 --- /dev/null +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/SynchronizedTest.java @@ -0,0 +1,74 @@ +/******************************************************************************* + * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Evgeny Mandrikov - initial API and implementation + * + *******************************************************************************/ +package org.jacoco.core.test.validation.java5; + +import org.jacoco.core.analysis.ICounter; +import org.jacoco.core.test.validation.ValidationTestBase; +import org.jacoco.core.test.validation.java5.targets.SynchronizedTarget; +import org.junit.Test; + +/** + * Test of filtering of a bytecode that is generated for a synchronized + * statement. + */ +public class SynchronizedTest extends ValidationTestBase { + + public SynchronizedTest() { + super(SynchronizedTarget.class); + } + + /** + * {@link SynchronizedTarget#normal()} + */ + @Test + public void normal() { + assertLine("before", ICounter.FULLY_COVERED); + // when compiled with ECJ next line covered partly without filter: + assertLine("monitorEnter", ICounter.FULLY_COVERED); + assertLine("body", ICounter.FULLY_COVERED); + if (isJDKCompiler) { + // without filter next line covered partly: + assertLine("monitorExit", ICounter.FULLY_COVERED); + } else { + assertLine("monitorExit", ICounter.EMPTY); + } + assertLine("after", ICounter.FULLY_COVERED); + } + + /** + * {@link SynchronizedTarget#explicitException()} + */ + @Test + public void explicitException() { + assertLine("explicitException.monitorEnter", ICounter.FULLY_COVERED); + assertLine("explicitException.exception", ICounter.FULLY_COVERED); + // when compiled with javac next line covered fully without filter: + assertLine("explicitException.monitorExit", ICounter.EMPTY); + } + + /** + * {@link SynchronizedTarget#implicitException()} + */ + @Test + public void implicitException() { + assertLine("implicitException.monitorEnter", isJDKCompiler + ? ICounter.FULLY_COVERED : ICounter.PARTLY_COVERED); + assertLine("implicitException.exception", ICounter.NOT_COVERED); + if (isJDKCompiler) { + // without filter next line covered partly: + assertLine("implicitException.monitorExit", ICounter.NOT_COVERED); + } else { + assertLine("implicitException.monitorExit", ICounter.EMPTY); + } + } + +} diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/PrivateEmptyDefaultConstructorTest.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/SyntheticTest.java index 1d144b7d..f1f8372e 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/PrivateEmptyDefaultConstructorTest.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/SyntheticTest.java @@ -6,33 +6,33 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Marc R. Hoffmann - initial API and implementation - * + * Evgeny Mandrikov - initial API and implementation + * *******************************************************************************/ -package org.jacoco.core.test.validation; +package org.jacoco.core.test.validation.java5; import org.jacoco.core.analysis.ICounter; -import org.jacoco.core.test.validation.targets.Target07; +import org.jacoco.core.test.validation.ValidationTestBase; +import org.jacoco.core.test.validation.java5.targets.SyntheticTarget; import org.junit.Test; /** - * Test of a private empty default constructor. - * - * @see ImplicitDefaultConstructorTest + * Test of filtering of synthetic methods. */ -public class PrivateEmptyDefaultConstructorTest extends ValidationTestBase { +public class SyntheticTest extends ValidationTestBase { - public PrivateEmptyDefaultConstructorTest() { - super(Target07.class); + public SyntheticTest() { + super(SyntheticTarget.class); } @Test public void testCoverageResult() { + assertMethodCount(5); assertLine("classdef", ICounter.EMPTY); - assertLine("super", ICounter.EMPTY); - assertLine("constructor", ICounter.EMPTY); + assertLine("field", ICounter.EMPTY); + assertLine("inner.classdef", ICounter.EMPTY); } } diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/AnnotationInitializer.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/AnnotationInitializerTarget.java index f7b9e0af..95171b3b 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/AnnotationInitializer.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/AnnotationInitializerTarget.java @@ -9,12 +9,12 @@ * Evgeny Mandrikov - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation.targets; +package org.jacoco.core.test.validation.java5.targets; /** * This test target is an annotation with an initializer. */ -public @interface AnnotationInitializer { +public @interface AnnotationInitializerTarget { Object CONST = new Object(); // $line-const$ diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/BadCycleClass.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/BadCycleClassTarget.java index c1826646..27b48dcc 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/BadCycleClass.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/BadCycleClassTarget.java @@ -9,9 +9,11 @@ * Evgeny Mandrikov - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation.targets; +package org.jacoco.core.test.validation.java5.targets; -public class BadCycleClass { +import org.jacoco.core.test.validation.targets.Stubs; + +public class BadCycleClassTarget { public static class Base { static final Child b = new Child(); diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target02.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/BooleanExpressionsTarget.java index 62e22ef9..a0b4ff50 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target02.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/BooleanExpressionsTarget.java @@ -9,7 +9,7 @@ * Marc R. Hoffmann - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation.targets; +package org.jacoco.core.test.validation.java5.targets; import static org.jacoco.core.test.validation.targets.Stubs.f; import static org.jacoco.core.test.validation.targets.Stubs.i1; @@ -20,7 +20,7 @@ import static org.jacoco.core.test.validation.targets.Stubs.t; /** * This target exercises boolean expressions. */ -public class Target02 { +public class BooleanExpressionsTarget { public static void main(String[] args) { diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target05.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/ClassInitializerTarget.java index ef5c3989..a8978362 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target05.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/ClassInitializerTarget.java @@ -9,14 +9,16 @@ * Marc R. Hoffmann - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation.targets; +package org.jacoco.core.test.validation.java5.targets; import static org.jacoco.core.test.validation.targets.Stubs.i1; +import org.jacoco.core.test.validation.targets.Stubs; + /** * This test target is a class with a static initializer. */ -public class Target05 { +public class ClassInitializerTarget { // No code required to initialize these fields: @@ -42,7 +44,7 @@ public class Target05 { Stubs.nop(); // $line-staticblock$ } - private Target05() { + private ClassInitializerTarget() { } public static void main(String[] args) { diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/ConstructorsTarget.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/ConstructorsTarget.java new file mode 100644 index 00000000..99ff020d --- /dev/null +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/ConstructorsTarget.java @@ -0,0 +1,77 @@ +/******************************************************************************* + * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Evgeny Mandrikov - initial API and implementation + * + *******************************************************************************/ +package org.jacoco.core.test.validation.java5.targets; + +import static org.jacoco.core.test.validation.targets.Stubs.nop; + +/** + * This test target calls different constructors. + */ +public class ConstructorsTarget { + + ConstructorsTarget() { // $line-packageLocal$ + } + + private ConstructorsTarget(Object arg) { // $line-arg$ + } + + private static class Super extends ConstructorsTarget { + private Super() { + super(null); // $line-super$ + } + } + + private class Inner { + private Inner() { // $line-inner$ + } + } + + private static class InnerStatic { + @SuppressWarnings("unused") + private final Object field = this; + + private InnerStatic() { // $line-innerStatic$ + } + } + + public static class PublicDefault { // $line-publicDefault$ + } + + static class PackageLocalDefault { // $line-packageLocalDefault$ + } + + private static class PrivateDefault { // $line-privateDefault$ + } + + private static class PrivateNonEmptyNoArg { + private PrivateNonEmptyNoArg() { + nop(); // $line-privateNonEmptyNoArg$ + } + } + + private static class PrivateEmptyNoArg { + private PrivateEmptyNoArg() { // $line-privateEmptyNoArg$ + } // $line-return$ + } + + public static void main(String[] args) { + new Super(); + new ConstructorsTarget().new Inner(); + new InnerStatic(); + new PublicDefault(); + new PackageLocalDefault(); + new PrivateDefault(); + new PrivateNonEmptyNoArg(); + new PrivateEmptyNoArg(); + } + +} diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target10.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/ControlStructureBeforeSuperConstructorTarget.java index bb4496e9..ffc1d5f7 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target10.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/ControlStructureBeforeSuperConstructorTarget.java @@ -9,7 +9,7 @@ * Marc R. Hoffmann - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation.targets; +package org.jacoco.core.test.validation.java5.targets; import static org.jacoco.core.test.validation.targets.Stubs.f; import static org.jacoco.core.test.validation.targets.Stubs.t; @@ -20,14 +20,14 @@ import org.jacoco.core.test.validation.targets.Stubs.SuperClass; * This test target has a constructor containing control structures before the * superclass constructor is called. */ -public class Target10 extends SuperClass { +public class ControlStructureBeforeSuperConstructorTarget extends SuperClass { - public Target10() { + public ControlStructureBeforeSuperConstructorTarget() { super(t() || f()); // $line-super$ } public static void main(String[] args) { - new Target10(); + new ControlStructureBeforeSuperConstructorTarget(); } } diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target01.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/ControlStructuresTarget.java index 81d00fa5..3152a8b1 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target01.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/ControlStructuresTarget.java @@ -9,7 +9,7 @@ * Marc R. Hoffmann - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation.targets; +package org.jacoco.core.test.validation.java5.targets; import static org.jacoco.core.test.validation.targets.Stubs.f; import static org.jacoco.core.test.validation.targets.Stubs.i2; @@ -21,7 +21,7 @@ import java.util.Collections; /** * This target exercises a set of common Java control structures. */ -public class Target01 { +public class ControlStructuresTarget { public static void main(String[] args) { diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/EnumConstructorTarget.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/EnumConstructorTarget.java new file mode 100644 index 00000000..7d232bd7 --- /dev/null +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/EnumConstructorTarget.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Evgeny Mandrikov - initial API and implementation + * + *******************************************************************************/ +package org.jacoco.core.test.validation.java5.targets; + +import static org.jacoco.core.test.validation.targets.Stubs.nop; + +/** + * This test target is an enum constructor. + */ +public class EnumConstructorTarget { + + private enum ImplicitConstructor { // $line-implicitConstructor$ + } + + private enum ExplicitNonEmptyConstructor { + ; + + ExplicitNonEmptyConstructor() { + nop(); // $line-explicitNonEmptyConstructor$ + } + } + + @SuppressWarnings("unused") + private enum ExplicitEmptyConstructor { + ; + + ExplicitEmptyConstructor() { + } // $line-explicitEmptyConstructor$ + + ExplicitEmptyConstructor(Object p) { + } // $line-explicitEmptyConstructorWithParameter$ + } + + public static void main(String[] args) { + ImplicitConstructor.values(); + ExplicitEmptyConstructor.values(); + ExplicitNonEmptyConstructor.values(); + } + +} diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/EnumImplicitMethods.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/EnumImplicitMethodsTarget.java index afbc46fd..ff589f78 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/EnumImplicitMethods.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/EnumImplicitMethodsTarget.java @@ -9,9 +9,11 @@ * Evgeny Mandrikov - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation.targets; +package org.jacoco.core.test.validation.java5.targets; -public enum EnumImplicitMethods { // $line-classdef$ +import org.jacoco.core.test.validation.targets.Stubs; + +public enum EnumImplicitMethodsTarget { // $line-classdef$ CONST(Stubs.f() ? new Object() : new Object()); // $line-const$ @@ -19,11 +21,11 @@ public enum EnumImplicitMethods { // $line-classdef$ } // $line-staticblock$ /** - * Unlike in {@link Target07 regular classes}, even if enum has explicit + * Unlike in {@link ConstructorsTarget regular classes}, even if enum has explicit * constructor, {@code clinit} method in any case has a reference to the * line of enum definition. */ - EnumImplicitMethods(Object o) { // $line-super$ + EnumImplicitMethodsTarget(Object o) { // $line-super$ } // $line-constructor$ /** diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/EnumSwitchTarget.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/EnumSwitchTarget.java new file mode 100644 index 00000000..47447e5a --- /dev/null +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/EnumSwitchTarget.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Evgeny Mandrikov - initial API and implementation + * + *******************************************************************************/ +package org.jacoco.core.test.validation.java5.targets; + +import static org.jacoco.core.test.validation.targets.Stubs.nop; + +/** + * This test target is a switch statement with a enum. + */ +public class EnumSwitchTarget { + + private enum E { + V1, V2 + } + + private static void example(E e) { + switch (e) { // $line-switch$ + case V1: + nop("V1"); + break; + case V2: + default: + nop("V2"); + break; + } + } + + public static void main(String[] args) { + example(E.V1); + example(E.V2); + } + +} diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target03.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/ExceptionsTarget.java index b4418edd..1896e64d 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target03.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/ExceptionsTarget.java @@ -9,7 +9,7 @@ * Marc R. Hoffmann - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation.targets; +package org.jacoco.core.test.validation.java5.targets; import static org.jacoco.core.test.validation.targets.Stubs.ex; import static org.jacoco.core.test.validation.targets.Stubs.f; @@ -20,7 +20,7 @@ import org.jacoco.core.test.validation.targets.Stubs.StubException; /** * This target produces exception based control flow examples. */ -public class Target03 { +public class ExceptionsTarget { public static void main(String[] args) { diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target11.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/ExplicitInitialFrameTarget.java index d393cb7f..bc089fc7 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target11.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/ExplicitInitialFrameTarget.java @@ -9,7 +9,7 @@ * Marc R. Hoffmann - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation.targets; +package org.jacoco.core.test.validation.java5.targets; import static org.jacoco.core.test.validation.targets.Stubs.f; import static org.jacoco.core.test.validation.targets.Stubs.nop; @@ -18,7 +18,7 @@ import static org.jacoco.core.test.validation.targets.Stubs.nop; * This test target needs an explicit initial frame as the first instruction * already is a jump target. */ -public class Target11 { +public class ExplicitInitialFrameTarget { public static void main(String[] args) { diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target09.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/FieldInitializationInTwoConstructorsTarget.java index a8589d1d..58bf6890 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target09.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/FieldInitializationInTwoConstructorsTarget.java @@ -9,26 +9,26 @@ * Marc R. Hoffmann - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation.targets; +package org.jacoco.core.test.validation.java5.targets; /** * This test target has instance members with initialization in two * constructors. */ -public class Target09 { +public class FieldInitializationInTwoConstructorsTarget { Object field1 = null; // $line-field1$ int field2 = 123; // $line-field2$ - public Target09() { + public FieldInitializationInTwoConstructorsTarget() { } // $line-constr1$ - public Target09(String arg) { + public FieldInitializationInTwoConstructorsTarget(String arg) { } // $line-constr2$ public static void main(String[] args) { - new Target09(); + new FieldInitializationInTwoConstructorsTarget(); } } diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/FinallyTarget.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/FinallyTarget.java new file mode 100644 index 00000000..2c317e95 --- /dev/null +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/FinallyTarget.java @@ -0,0 +1,148 @@ +/******************************************************************************* + * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Evgeny Mandrikov - initial API and implementation + * + *******************************************************************************/ +package org.jacoco.core.test.validation.java5.targets; + +import static org.jacoco.core.test.validation.targets.Stubs.ex; +import static org.jacoco.core.test.validation.targets.Stubs.f; +import static org.jacoco.core.test.validation.targets.Stubs.nop; +import static org.jacoco.core.test.validation.targets.Stubs.t; + +public class FinallyTarget { + + /** + * <pre> + * InputStream in = null; + * try { + * in = ...; + * ... + * } finally { + * if (in != null) { + * in.close(); + * } + * } + * </pre> + */ + private static void example(boolean t) { + Object in = null; + try { + in = open(t); + } finally { // $line-example.0$ + if (in != null) { // $line-example.1$ + nop(); // $line-example.2$ + } // $line-example.3$ + } // $line-example.4$ + } + + private static Object open(boolean t) { + ex(t); + return new Object(); + } + + private static void breakStatement() { + for (int i = 0; i < 1; i++) { // $line-breakStatement.for$ + try { + if (f()) { + break; // $line-breakStatement$ + } + } finally { + nop("finally"); // $line-breakStatement.1$ + } // $line-breakStatement.2$ + } + } + + private static void catchNotExecuted() { + try { + nop("try"); + } catch (Exception e) { // $line-catchNotExecuted$ + nop("catch"); // $line-catchNotExecuted.catch$ + } finally { // $line-catchNotExecuted.0$ + nop("finally"); // $line-catchNotExecuted.1$ + } // $line-catchNotExecuted.2$ + } + + private static void emptyCatch() { + try { + nop("try"); + } catch (Exception e) { // $line-emptyCatch$ + // empty + } finally { // $line-emptyCatch.0$ + nop("finally"); // $line-emptyCatch.1$ + } // $line-emptyCatch.2$ + } + + private static void twoRegions() { + try { + // jump to another region associated with same handler: + if (t()) { // $line-twoRegions.if$ + nop(); // $line-twoRegions.region.1$ + return; // $line-twoRegions.return.1$ + } else { + nop(); // $line-twoRegions.region.2$ + return; // $line-twoRegions.return.2$ + } + } finally { // $line-twoRegions.0$ + nop(); // $line-twoRegions.1$ + } // $line-twoRegions.2$ + } + + private static void nested() { + try { + nop(); + } finally { // $line-nested.0$ + try { // $line-nested.1$ + nop(); // $line-nested.2$ + } finally { // $line-nested.3$ + nop(); // $line-nested.4$ + } // $line-nested.5$ + } // $line-nested.6$ + } + + private static void emptyTry() { + try { + // empty + } finally { // $line-emptyTry.0$ + nop(); // $line-emptyTry.1$ + } // $line-emptyTry.2$ + } + + @SuppressWarnings("finally") + private static void alwaysCompletesAbruptly() { + try { + nop(); + } finally { // $line-alwaysCompletesAbruptly.0$ + return; // $line-alwaysCompletesAbruptly.1$ + } // $line-alwaysCompletesAbruptly.2$ + } + + public static void main(String[] args) { + example(false); + try { + example(true); + } catch (Exception ignore) { + } + + breakStatement(); + + catchNotExecuted(); + + emptyCatch(); + + twoRegions(); + + nested(); + + emptyTry(); + + alwaysCompletesAbruptly(); + } + +} diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target08.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/ImplicitFieldInitializationTarget.java index 1fe938aa..6ddf8cbd 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target08.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/ImplicitFieldInitializationTarget.java @@ -9,12 +9,12 @@ * Marc R. Hoffmann - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation.targets; +package org.jacoco.core.test.validation.java5.targets; /** * This test target has instance members with implicit initializers. */ -public class Target08 { // $line-classdef$ +public class ImplicitFieldInitializationTarget { // $line-classdef$ Object field1; // $line-field1$ @@ -25,7 +25,7 @@ public class Target08 { // $line-classdef$ int field4 = 2000; // $line-field4$ public static void main(String[] args) { - new Target08(); + new ImplicitFieldInitializationTarget(); } } diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target04.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/InterfaceClassInitializerTarget.java index 8384744b..2debf6bd 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target04.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/InterfaceClassInitializerTarget.java @@ -9,14 +9,14 @@ * Marc R. Hoffmann - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation.targets; +package org.jacoco.core.test.validation.java5.targets; import static org.jacoco.core.test.validation.targets.Stubs.i1; /** * This test target is an interface with a class initializer. */ -public interface Target04 { +public interface InterfaceClassInitializerTarget { // No code required to initialize these fields: diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target12.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/StructuredLockingTarget.java index 5ee2e324..1e561ae1 100644 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target12.java +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/StructuredLockingTarget.java @@ -9,14 +9,14 @@ * Marc R. Hoffmann - initial API and implementation * *******************************************************************************/ -package org.jacoco.core.test.validation.targets; +package org.jacoco.core.test.validation.java5.targets; import static org.jacoco.core.test.validation.targets.Stubs.nop; /** * This target uses synchronized blocks which compile to try/catch statements. */ -public class Target12 { +public class StructuredLockingTarget { static void simple() { Object lock1 = new Object(); diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/SynchronizedTarget.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/SynchronizedTarget.java new file mode 100644 index 00000000..5bea5758 --- /dev/null +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/SynchronizedTarget.java @@ -0,0 +1,60 @@ +/******************************************************************************* + * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Evgeny Mandrikov - initial API and implementation + * + *******************************************************************************/ +package org.jacoco.core.test.validation.java5.targets; + +import static org.jacoco.core.test.validation.targets.Stubs.ex; +import static org.jacoco.core.test.validation.targets.Stubs.nop; + +import org.jacoco.core.test.validation.targets.Stubs.StubException; + +/** + * This test target is a synchronized statement. + */ +public class SynchronizedTarget { + + private static final Object lock = new Object(); + + private static void normal() { + nop(); // $line-before$ + synchronized (lock) { // $line-monitorEnter$ + nop(); // $line-body$ + } // $line-monitorExit$ + nop(); // $line-after$ + } + + private static void explicitException() { + synchronized (lock) { // $line-explicitException.monitorEnter$ + throw new StubException(); // $line-explicitException.exception$ + } // $line-explicitException.monitorExit$ + } + + private static void implicitException() { + synchronized (lock) { // $line-implicitException.monitorEnter$ + ex(); // $line-implicitException.exception$ + } // $line-implicitException.monitorExit$ + } + + public static void main(String[] args) { + normal(); + + try { + explicitException(); + } catch (StubException e) { + } + + try { + implicitException(); + } catch (StubException e) { + } + } + +} diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/SyntheticTarget.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/SyntheticTarget.java new file mode 100644 index 00000000..c5cc3fee --- /dev/null +++ b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/java5/targets/SyntheticTarget.java @@ -0,0 +1,64 @@ +/******************************************************************************* + * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Evgeny Mandrikov - initial API and implementation + * + *******************************************************************************/ +package org.jacoco.core.test.validation.java5.targets; + +/** + * This test target results in synthetic methods. + */ +public class SyntheticTarget { // $line-classdef$ + + private static int counter; // $line-field$ + + /** + * {@link org.jacoco.core.test.validation.java5.targets.ImplicitDefaultConstructorTarget + * Default constructor will refer to a line of class definition}, so that we + * define constructor explicitly in order to verify that we filter all other + * constructions here that might refer to line of class definition. + */ + private SyntheticTarget() { + } + + static class Inner extends SyntheticTarget { // $line-inner.classdef$ + + Inner() { + } + + /** + * Access to private field of outer class causes creation of synthetic + * methods in it. In case of javac those methods refer to the line of + * outer class definition, in case of ECJ - to the line of field. + */ + private static void inc() { + counter = counter + 2; + } + + /** + * Difference of return type with overridden method causes creation of + * synthetic bridge method in this class. In case of javac this method + * refers to the line of inner class definition, in case of EJC - to the + * first line of file. + */ + @Override + public String get() { + return null; + } + } + + public Object get() { + return null; + } + + public static void main(String[] args) { + Inner.inc(); + } + +} diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target06.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target06.java deleted file mode 100644 index f6bc75e8..00000000 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target06.java +++ /dev/null @@ -1,25 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Marc R. Hoffmann - initial API and implementation - * - *******************************************************************************/ -package org.jacoco.core.test.validation.targets; - -/** - * This test target is a class with a implicit default constructor. - * - * @see Target07 explicit constructor - */ -public class Target06 { // $line-classdef$ - - public static void main(String[] args) { - new Target06(); - } - -} diff --git a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target07.java b/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target07.java deleted file mode 100644 index 18c3ba52..00000000 --- a/org.jacoco.core.test.validation.java5/src/org/jacoco/core/test/validation/targets/Target07.java +++ /dev/null @@ -1,27 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Marc R. Hoffmann - initial API and implementation - * - *******************************************************************************/ -package org.jacoco.core.test.validation.targets; - -/** - * This test target is a private empty default constructor. - * - * @see Target06 implicit constructor - */ -public class Target07 { // $line-classdef$ - - private Target07() { // $line-super$ - } // $line-constructor$ - - public static void main(String[] args) { - } - -} |