/******************************************************************************* * Copyright (c) 2009, 2015 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.analysis; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.jacoco.core.internal.analysis.ClassCoverageImpl; import org.jacoco.core.internal.analysis.CounterImpl; import org.jacoco.core.internal.analysis.MethodCoverageImpl; import org.junit.Before; import org.junit.Test; /** * Unit tests for {@link CoverageBuilder}. */ public class CoverageBuilderTest { private CoverageBuilder coverageBuilder; @Before public void setup() { coverageBuilder = new CoverageBuilder(); } @Test public void testCreateClassMissed() { final MethodCoverageImpl method = new MethodCoverageImpl("doit", "()V", null); method.increment(CounterImpl.COUNTER_1_0, CounterImpl.COUNTER_0_0, 6); method.increment(CounterImpl.COUNTER_1_0, CounterImpl.COUNTER_0_0, 7); method.increment(CounterImpl.COUNTER_1_0, CounterImpl.COUNTER_0_0, 8); method.incrementMethodCounter(); addClass(123L, false, "Sample", null, method); final Collection classes = coverageBuilder.getClasses(); assertEquals(1, classes.size()); IClassCoverage c = classes.iterator().next(); assertEquals("Sample", c.getName()); assertEquals(1, c.getClassCounter().getTotalCount()); assertEquals(0, c.getClassCounter().getCoveredCount()); assertEquals(1, c.getMethodCounter().getTotalCount()); assertEquals(0, c.getMethodCounter().getCoveredCount()); assertEquals(3, c.getLineCounter().getTotalCount()); assertEquals(0, c.getLineCounter().getCoveredCount()); final Collection methods = c.getMethods(); assertEquals(1, methods.size()); IMethodCoverage m = methods.iterator().next(); assertEquals("doit", m.getName()); assertEquals("()V", m.getDesc()); assertEquals(1, m.getMethodCounter().getTotalCount()); assertEquals(0, m.getMethodCounter().getCoveredCount()); assertEquals(3, m.getLineCounter().getTotalCount()); assertEquals(0, m.getLineCounter().getCoveredCount()); } @Test public void testCreateClassCovered() { final MethodCoverageImpl method = new MethodCoverageImpl("doit", "()V", null); method.increment(CounterImpl.COUNTER_0_1, CounterImpl.COUNTER_0_0, 6); method.increment(CounterImpl.COUNTER_0_1, CounterImpl.COUNTER_0_0, 7); method.increment(CounterImpl.COUNTER_0_1, CounterImpl.COUNTER_0_0, 8); method.incrementMethodCounter(); addClass(123L, false, "Sample", null, method); final Collection classes = coverageBuilder.getClasses(); assertEquals(1, classes.size()); IClassCoverage c = classes.iterator().next(); assertEquals("Sample", c.getName()); assertEquals(1, c.getClassCounter().getTotalCount()); assertEquals(1, c.getClassCounter().getCoveredCount()); assertEquals(1, c.getMethodCounter().getTotalCount()); assertEquals(1, c.getMethodCounter().getCoveredCount()); assertEquals(3, c.getLineCounter().getTotalCount()); assertEquals(3, c.getLineCounter().getCoveredCount()); final Collection methods = c.getMethods(); assertEquals(1, methods.size()); IMethodCoverage m = methods.iterator().next(); assertEquals("doit", m.getName()); assertEquals("()V", m.getDesc()); assertEquals(1, m.getMethodCounter().getTotalCount()); assertEquals(1, m.getMethodCounter().getCoveredCount()); assertEquals(3, m.getLineCounter().getTotalCount()); assertEquals(3, m.getLineCounter().getCoveredCount()); } @Test public void testIgnoreClassesWithoutCode() { final MethodCoverageImpl method = new MethodCoverageImpl("doit", "()V", null); addClass(123L, false, "Sample", null, method); final Collection classes = coverageBuilder.getClasses(); assertTrue(classes.isEmpty()); } @Test(expected = IllegalStateException.class) public void testDuplicateClassNameDifferent() { MethodCoverageImpl method = new MethodCoverageImpl("doit", "()V", null); method.increment(CounterImpl.COUNTER_1_0, CounterImpl.COUNTER_0_0, 3); addClass(123L, false, "Sample", null, method); // Add class with different id must fail: method = new MethodCoverageImpl("doit", "()V", null); method.increment(CounterImpl.COUNTER_1_0, CounterImpl.COUNTER_0_0, 3); addClass(345L, false, "Sample", null, method); } @Test public void testDuplicateClassNameIdentical() { MethodCoverageImpl method = new MethodCoverageImpl("doit", "()V", null); method.increment(CounterImpl.COUNTER_1_0, CounterImpl.COUNTER_0_0, 3); addClass(123L, false, "Sample", null, method); // Add class with same id: method = new MethodCoverageImpl("doit", "()V", null); method.increment(CounterImpl.COUNTER_1_0, CounterImpl.COUNTER_0_0, 3); addClass(123L, false, "Sample", null, method); // Second add must be ignored: final Collection classes = coverageBuilder.getClasses(); assertEquals(1, classes.size()); } @Test public void testCreateSourceFile() { final MethodCoverageImpl method1 = new MethodCoverageImpl("doit", "()V", null); method1.increment(CounterImpl.COUNTER_1_0, CounterImpl.COUNTER_0_0, 3); addClass(123L, false, "Sample", "Sample.java", method1); final MethodCoverageImpl method2 = new MethodCoverageImpl("doit", "()V", null); method2.increment(CounterImpl.COUNTER_1_0, CounterImpl.COUNTER_0_0, 6); addClass(234L, false, "Second", "Sample.java", method2); final Collection sourcefiles = coverageBuilder .getSourceFiles(); assertEquals(1, sourcefiles.size()); ISourceFileCoverage s = sourcefiles.iterator().next(); assertEquals(2, s.getClassCounter().getTotalCount()); assertEquals(0, s.getClassCounter().getCoveredCount()); } @Test public void testGetBundle() { final MethodCoverageImpl method1 = new MethodCoverageImpl("doit", "()V", null); method1.increment(CounterImpl.COUNTER_1_0, CounterImpl.COUNTER_0_0, 3); addClass(1, false, "org/jacoco/examples/Sample1", null, method1); final MethodCoverageImpl method2 = new MethodCoverageImpl("doit", "()V", null); method2.increment(CounterImpl.COUNTER_1_0, CounterImpl.COUNTER_0_0, 6); addClass(2, false, "org/jacoco/examples/Sample2", null, method2); final MethodCoverageImpl method3 = new MethodCoverageImpl("doit", "()V", null); method3.increment(CounterImpl.COUNTER_1_0, CounterImpl.COUNTER_0_0, 1); addClass(3, false, "Sample3", null, method3); IBundleCoverage bundle = coverageBuilder.getBundle("testbundle"); assertEquals("testbundle", bundle.getName()); final Collection packages = bundle.getPackages(); assertEquals(2, packages.size()); Map packagesByName = new HashMap(); for (IPackageCoverage p : packages) { packagesByName.put(p.getName(), p); } IPackageCoverage p1 = packagesByName.get("org/jacoco/examples"); assertNotNull(p1); assertEquals( new HashSet(Arrays.asList( "org/jacoco/examples/Sample1", "org/jacoco/examples/Sample2")), getNames(p1.getClasses())); IPackageCoverage p2 = packagesByName.get(""); assertNotNull(p2); assertEquals(Collections.singleton("Sample3"), getNames(p2.getClasses())); } @Test public void testGetNoMatchClasses() { MethodCoverageImpl m = new MethodCoverageImpl("doit", "()V", null); m.increment(CounterImpl.COUNTER_1_0, CounterImpl.COUNTER_0_0, 1); addClass(1, true, "Sample1", null, m); m = new MethodCoverageImpl("doit", "()V", null); m.increment(CounterImpl.COUNTER_1_0, CounterImpl.COUNTER_0_0, 2); addClass(2, true, "Sample2", null, m); m = new MethodCoverageImpl("doit", "()V", null); m.increment(CounterImpl.COUNTER_1_0, CounterImpl.COUNTER_0_0, 3); addClass(3, false, "Sample3", null, m); final Set actual = getNames(coverageBuilder.getNoMatchClasses()); final Set expected = new HashSet(Arrays.asList( "Sample1", "Sample2")); assertEquals(expected, actual); } private Set getNames(Collection nodes) { Set result = new HashSet(); for (ICoverageNode n : nodes) { result.add(n.getName()); } return result; } private void addClass(long id, boolean nomatch, String name, String source, MethodCoverageImpl... methods) { final ClassCoverageImpl coverage = new ClassCoverageImpl(name, id, nomatch, null, "java/lang/Object", new String[0]); coverage.setSourceFileName(source); for (MethodCoverageImpl m : methods) { coverage.addMethod(m); } coverageBuilder.visitCoverage(coverage); } }