/*
* Copyright (c) 2006-2011 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package integrationTests;
import java.lang.reflect.*;
import java.util.*;
import static java.lang.reflect.Modifier.*;
import org.junit.*;
import mockit.coverage.data.*;
import mockit.coverage.data.dataItems.*;
import mockit.coverage.paths.*;
public class CoverageTest extends Assert
{
static final Map<String, FileCoverageData> data = CoverageData.instance().getFileToFileDataMap();
protected static FileCoverageData fileData;
protected MethodCoverageData methodData;
private int currentPathIndex = -1;
private static String testedClassSimpleName;
@Before
public void findCoverageData() throws Exception
{
Field testedField = getClass().getDeclaredField("tested");
Class<?> testedClass = testedField.getType();
String classFilePath = testedClass.getName().replace('.', '/') + ".java";
fileData = data.get(classFilePath);
assertNotNull("FileCoverageData not found for " + classFilePath);
if (!testedClass.isEnum() && !isAbstract(testedClass.getModifiers()) && !isFinal(testedField.getModifiers())) {
testedField.setAccessible(true);
if (testedField.get(this) == null) {
//noinspection ClassNewInstance
Object newTestedInstance = testedClass.newInstance();
testedField.set(this, newTestedInstance);
}
}
testedClassSimpleName = testedClass.getSimpleName();
}
protected final void assertLines(int startingLine, int endingLine, int expectedLinesExecuted)
{
SortedMap<Integer, LineCoverageData> lineToLineData = fileData.lineToLineData;
assertTrue("Starting line not found", lineToLineData.containsKey(startingLine));
assertTrue("Ending line not found", lineToLineData.containsKey(endingLine));
int linesExecuted = 0;
for (int line = startingLine; line <= endingLine; line++) {
LineCoverageData lineData = lineToLineData.get(line);
if (lineData != null && lineData.getExecutionCount() > 0) {
linesExecuted++;
}
}
assertEquals("Unexpected number of lines executed:", expectedLinesExecuted, linesExecuted);
}
protected final void assertLine(
int line, int expectedSegments, int expectedCoveredSegments, int expectedExecutionCount)
{
LineCoverageData lineData = fileData.lineToLineData.get(line);
assertNotNull("Not an executable line", lineData);
assertEquals("Segments:", expectedSegments, lineData.getNumberOfSegments());
assertEquals("Covered segments:", expectedCoveredSegments, lineData.getNumberOfCoveredSegments());
assertEquals("Execution count:", expectedExecutionCount, lineData.getExecutionCount());
}
protected final void findMethodData(int firstLineOfMethodBody, String methodName)
{
methodData = fileData.firstLineToMethodData.get(firstLineOfMethodBody);
assertNotNull("Method not found with first line " + firstLineOfMethodBody, methodData);
assertEquals(
"No method with name \"" + methodName + "\" found with first line at " +
firstLineOfMethodBody, methodName, methodData.methodName);
}
protected final void assertPaths(int expectedPaths, int expectedCoveredPaths, int expectedExecutionCount)
{
assertEquals("Number of paths:", expectedPaths, methodData.paths.size());
assertEquals("Number of covered paths:", expectedCoveredPaths, methodData.getCoveredPaths());
assertEquals("Execution count for all paths:", expectedExecutionCount, methodData.getExecutionCount());
}
protected final void assertMethodLines(int startingLine, int endingLine)
{
assertEquals(startingLine, methodData.getFirstLineInBody());
assertEquals(endingLine, methodData.getLastLineInBody());
}
protected final void assertPath(int expectedNodeCount, int expectedExecutionCount)
{
int i = currentPathIndex + 1;
currentPathIndex = -1;
Path path = methodData.paths.get(i);
assertEquals("Path node count:", expectedNodeCount, path.getNodes().size());
assertEquals("Path execution count:", expectedExecutionCount, path.getExecutionCount());
currentPathIndex = i;
}
@After
public final void verifyThatAllPathsWereAccountedFor()
{
int nextPathIndex = currentPathIndex + 1;
if (methodData != null && nextPathIndex > 0) {
assertEquals("Path " + nextPathIndex + " was not verified;", nextPathIndex, methodData.paths.size());
}
}
protected final void assertFieldIgnored(String fieldName)
{
String fieldId = testedClassSimpleName + '.' + fieldName;
assertFalse(
"Field " + fieldName + " should not have static coverage data",
fileData.dataCoverageInfo.staticFieldsData.containsKey(fieldId));
assertFalse(
"Field " + fieldName + " should not have instance coverage data",
fileData.dataCoverageInfo.instanceFieldsData.containsKey(fieldId));
}
protected static void assertStaticFieldCovered(String fieldName)
{
assertTrue("Static field " + fieldName + " should be covered", isStaticFieldCovered(fieldName));
}
private static boolean isStaticFieldCovered(String fieldName)
{
String classAndFieldNames = testedClassSimpleName + '.' + fieldName;
StaticFieldData staticFieldData = fileData.dataCoverageInfo.staticFieldsData.get(classAndFieldNames);
return staticFieldData.isCovered();
}
protected static void assertStaticFieldUncovered(String fieldName)
{
assertFalse("Static field " + fieldName + " should not be covered", isStaticFieldCovered(fieldName));
}
protected static void assertInstanceFieldCovered(String fieldName)
{
assertTrue("Instance field " + fieldName + " should be covered", isInstanceFieldCovered(fieldName));
}
private static boolean isInstanceFieldCovered(String fieldName)
{
return getInstanceFieldData(fieldName).isCovered();
}
private static InstanceFieldData getInstanceFieldData(String fieldName)
{
String classAndFieldNames = testedClassSimpleName + '.' + fieldName;
return fileData.dataCoverageInfo.instanceFieldsData.get(classAndFieldNames);
}
protected static void assertInstanceFieldUncovered(String fieldName)
{
assertFalse("Instance field " + fieldName + " should not be covered", isInstanceFieldCovered(fieldName));
}
protected static void assertInstanceFieldUncovered(String fieldName, Object... uncoveredInstances)
{
String msg = "Instance field " + fieldName + " should not be covered";
InstanceFieldData fieldData = getInstanceFieldData(fieldName);
List<Integer> ownerInstances = fieldData.getOwnerInstancesWithUnreadAssignments();
assertEquals(msg, uncoveredInstances.length, ownerInstances.size());
for (Object uncoveredInstance : uncoveredInstances) {
Integer instanceId = System.identityHashCode(uncoveredInstance);
assertTrue(msg, ownerInstances.contains(instanceId));
}
}
protected static void verifyDataCoverage(int expectedItems, int expectedCoveredItems, int expectedCoverage)
{
assertEquals("Total data items:", expectedItems, fileData.dataCoverageInfo.getTotalItems());
assertEquals("Covered data items:", expectedCoveredItems, fileData.dataCoverageInfo.getCoveredItems());
assertEquals("Data coverage:", expectedCoverage, fileData.dataCoverageInfo.getCoveragePercentage());
}
}