blob: 3e4dbd8a3c9cab17acb1acecb78641f243c90f10 [file] [log] [blame]
/*******************************************************************************
* 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.filter;
import org.jacoco.core.analysis.ICounter;
import org.jacoco.core.test.filter.targets.TryWithResources;
import org.jacoco.core.test.validation.ValidationTestBase;
import org.junit.Test;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Test of filtering of a bytecode that is generated for a try-with-resources
* statement.
*/
public class TryWithResourcesTest extends ValidationTestBase {
public TryWithResourcesTest() {
super("src-java7", TryWithResources.class);
}
/**
* {@link TryWithResources#test()}
*/
@Test
public void test() {
assertLine("test.before", ICounter.FULLY_COVERED);
// without filter next line covered partly:
assertLine("test.try", ICounter.FULLY_COVERED);
assertLine("test.open1", ICounter.FULLY_COVERED);
assertLine("test.open2", ICounter.FULLY_COVERED);
assertLine("test.open3", ICounter.FULLY_COVERED);
assertLine("test.body", ICounter.FULLY_COVERED);
// without filter next line has branches:
assertLine("test.close", ICounter.EMPTY);
assertLine("test.catch", ICounter.NOT_COVERED);
assertLine("test.finally", ICounter.FULLY_COVERED);
}
/**
* {@link TryWithResources#test2()}
*/
@Test
public void test2() {
assertLine("test2.before", ICounter.FULLY_COVERED);
// without filter next line covered partly:
assertLine("test2.try", ICounter.FULLY_COVERED);
assertLine("test2.open1", ICounter.FULLY_COVERED);
assertLine("test2.open2", ICounter.FULLY_COVERED);
assertLine("test2.open3", ICounter.FULLY_COVERED);
assertLine("test2.body", ICounter.FULLY_COVERED);
// without filter next line has branches:
assertLine("test2.close", ICounter.EMPTY);
assertLine("test2.catch", ICounter.NOT_COVERED);
assertLine("test2.finally", ICounter.FULLY_COVERED);
assertLine("test2.after", ICounter.FULLY_COVERED);
}
/**
* {@link TryWithResources#returnInBody()}
*/
@Test
public void returnInBody() {
// without filter next line covered partly:
assertLine("returnInBody.try", ICounter.FULLY_COVERED);
assertLine("returnInBody.open", ICounter.FULLY_COVERED);
// without filter next line has branches:
if (isJDKCompiler) {
// https://bugs.openjdk.java.net/browse/JDK-8134759
// javac 7 and 8 up to 8u92 are affected
final String jdkVersion = System.getProperty("java.version");
final Matcher m = Pattern.compile("1\\.8\\.0_(\\d++)(-ea)?")
.matcher(jdkVersion);
if (jdkVersion.startsWith("1.7.0_")
|| (m.matches() && Integer.parseInt(m.group(1)) < 92)) {
assertLine("returnInBody.close", ICounter.FULLY_COVERED, 0, 0);
} else {
assertLine("returnInBody.close", ICounter.EMPTY);
}
} else {
assertLine("returnInBody.close", ICounter.EMPTY);
}
assertLine("returnInBody.return", ICounter.FULLY_COVERED);
}
/**
* {@link TryWithResources#nested()}
*/
@Test
public void nested() {
// without filter next line covered partly:
assertLine("nested.try1", ICounter.FULLY_COVERED);
assertLine("nested.open1", ICounter.FULLY_COVERED);
assertLine("nested.catch1", ICounter.NOT_COVERED);
// without filter next line covered partly:
assertLine("nested.try2", ICounter.FULLY_COVERED);
assertLine("nested.body", ICounter.FULLY_COVERED);
assertLine("nested.catch2", ICounter.NOT_COVERED);
assertLine("nested.finally2", ICounter.FULLY_COVERED);
// next lines not covered on exceptional path:
assertLine("nested.try3", ICounter.FULLY_COVERED, 0, 0);
assertLine("nested.open3", ICounter.FULLY_COVERED, 0, 0);
assertLine("nested.body3", ICounter.FULLY_COVERED, 0, 0);
assertLine("nested.catch3", ICounter.NOT_COVERED);
assertLine("nested.finally3", ICounter.FULLY_COVERED, 0, 0);
// without filter next lines have branches:
assertLine("nested.close3", ICounter.EMPTY);
assertLine("nested.close2", ICounter.EMPTY);
assertLine("nested.close1", ICounter.EMPTY);
}
/**
* {@link TryWithResources#returnInCatch()}
*/
@Test
public void returnInCatch() {
// without filter next line covered partly:
assertLine("returnInCatch.try1", ICounter.FULLY_COVERED);
assertLine("returnInCatch.open", ICounter.FULLY_COVERED);
assertLine("returnInCatch.finally1", ICounter.PARTLY_COVERED, 1, 1);
// without filter next line has branches:
assertLine("returnInCatch.close", ICounter.EMPTY);
assertLine("returnInCatch.try2", ICounter.EMPTY);
assertLine("returnInCatch.finally2", ICounter.PARTLY_COVERED, 1, 1);
}
/*
* Corner cases
*/
/**
* {@link TryWithResources#handwritten()}
*/
@Test
public void handwritten() {
if (isJDKCompiler) {
assertLine("handwritten", /* partly when ECJ: */ICounter.EMPTY);
}
}
/**
* {@link TryWithResources#empty()}
*/
@Test
public void empty() {
assertLine("empty.try", ICounter.FULLY_COVERED, 0, 0);
assertLine("empty.open", ICounter.FULLY_COVERED);
// empty when EJC:
if (isJDKCompiler) {
final String jdkVersion = System.getProperty("java.version");
if (jdkVersion.startsWith("9") || jdkVersion.startsWith("10")) {
assertLine("empty.close", ICounter.FULLY_COVERED, 0, 0);
} else {
// branches with javac 7 and 8
assertLine("empty.close", ICounter.PARTLY_COVERED);
}
}
}
/**
* {@link TryWithResources#throwInBody()}
*/
@Test
public void throwInBody() {
// not filtered
assertLine("throwInBody.try", ICounter.NOT_COVERED);
assertLine("throwInBody.close", ICounter.NOT_COVERED);
}
}