1e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov/******************************************************************************* 2b9d1b54e300318b470d9fedccc69d75187016444Evgeny Mandrikov * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors 3e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * All rights reserved. This program and the accompanying materials 4e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * are made available under the terms of the Eclipse Public License v1.0 5e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * which accompanies this distribution, and is available at 6e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * http://www.eclipse.org/legal/epl-v10.html 7e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * 8e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Contributors: 9e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Marc R. Hoffmann - initial API and implementation 10e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * 11e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *******************************************************************************/ 12e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovpackage org.jacoco.core.analysis; 13e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 14e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport java.util.Collection; 15e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 16e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport org.jacoco.core.internal.analysis.CounterImpl; 17e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 18e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov/** 19e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Base implementation for coverage data nodes. 20e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */ 21e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovpublic class CoverageNodeImpl implements ICoverageNode { 22e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 23e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov private final ElementType elementType; 24e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 25e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov private final String name; 26e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 27e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov /** Counter for branches. */ 28e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov protected CounterImpl branchCounter; 29e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 30e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov /** Counter for instructions. */ 31e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov protected CounterImpl instructionCounter; 32e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 33e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov /** Counter for lines */ 34e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov protected CounterImpl lineCounter; 35e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 36e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov /** Counter for complexity. */ 37e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov protected CounterImpl complexityCounter; 38e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 39e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov /** Counter for methods. */ 40e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov protected CounterImpl methodCounter; 41e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 42e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov /** Counter for classes. */ 43e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov protected CounterImpl classCounter; 44e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 45e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov /** 46e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Creates a new coverage data node. 47e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * 48e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * @param elementType 49e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * type of the element represented by this instance 50e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * @param name 51e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * name of this node 52e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */ 53e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public CoverageNodeImpl(final ElementType elementType, final String name) { 54e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov this.elementType = elementType; 55e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov this.name = name; 56e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov this.branchCounter = CounterImpl.COUNTER_0_0; 57e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov this.instructionCounter = CounterImpl.COUNTER_0_0; 58e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov this.complexityCounter = CounterImpl.COUNTER_0_0; 59e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov this.methodCounter = CounterImpl.COUNTER_0_0; 60e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov this.classCounter = CounterImpl.COUNTER_0_0; 61e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov this.lineCounter = CounterImpl.COUNTER_0_0; 62e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 63e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 64e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov /** 65e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Increments the counters by the values given by another element. 66e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * 67e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * @param child 68e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * counters to add 69e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */ 70e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public void increment(final ICoverageNode child) { 71e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov instructionCounter = instructionCounter.increment(child 72e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov .getInstructionCounter()); 73e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov branchCounter = branchCounter.increment(child.getBranchCounter()); 74e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov lineCounter = lineCounter.increment(child.getLineCounter()); 75e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov complexityCounter = complexityCounter.increment(child 76e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov .getComplexityCounter()); 77e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov methodCounter = methodCounter.increment(child.getMethodCounter()); 78e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov classCounter = classCounter.increment(child.getClassCounter()); 79e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 80e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 81e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov /** 82e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Increments the counters by the values given by the collection of 83e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * elements. 84e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * 85e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * @param children 86e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * list of nodes, which counters will be added to this node 87e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */ 88e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public void increment(final Collection<? extends ICoverageNode> children) { 89e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov for (final ICoverageNode child : children) { 90e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov increment(child); 91e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 92e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 93e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 94e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov // === ICoverageDataNode === 95e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 96e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public ElementType getElementType() { 97e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov return elementType; 98e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 99e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 100e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public String getName() { 101e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov return name; 102e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 103e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 104e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public ICounter getInstructionCounter() { 105e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov return instructionCounter; 106e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 107e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 108e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public ICounter getBranchCounter() { 109e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov return branchCounter; 110e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 111e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 112e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public ICounter getLineCounter() { 113e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov return lineCounter; 114e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 115e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 116e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public ICounter getComplexityCounter() { 117e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov return complexityCounter; 118e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 119e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 120e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public ICounter getMethodCounter() { 121e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov return methodCounter; 122e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 123e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 124e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public ICounter getClassCounter() { 125e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov return classCounter; 126e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 127e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 128e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public ICounter getCounter(final CounterEntity entity) { 129e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov switch (entity) { 130e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov case INSTRUCTION: 131e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov return getInstructionCounter(); 132e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov case BRANCH: 133e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov return getBranchCounter(); 134e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov case LINE: 135e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov return getLineCounter(); 136e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov case COMPLEXITY: 137e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov return getComplexityCounter(); 138e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov case METHOD: 139e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov return getMethodCounter(); 140e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov case CLASS: 141e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov return getClassCounter(); 142e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 143e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov throw new AssertionError(entity); 144e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 145e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 146e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public ICoverageNode getPlainCopy() { 147e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov final CoverageNodeImpl copy = new CoverageNodeImpl(elementType, name); 148e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov copy.instructionCounter = CounterImpl.getInstance(instructionCounter); 149e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov copy.branchCounter = CounterImpl.getInstance(branchCounter); 150e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov copy.lineCounter = CounterImpl.getInstance(lineCounter); 151e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov copy.complexityCounter = CounterImpl.getInstance(complexityCounter); 152e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov copy.methodCounter = CounterImpl.getInstance(methodCounter); 153e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov copy.classCounter = CounterImpl.getInstance(classCounter); 154e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov return copy; 155e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 156e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 157e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov @Override 158e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public String toString() { 159e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov final StringBuilder sb = new StringBuilder(); 160e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov sb.append(name).append(" [").append(elementType).append("]"); 161e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov return sb.toString(); 162e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 163e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 164e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov} 165