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