1/*******************************************************************************
2 * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 *    Marc R. Hoffmann - initial API and implementation
10 *
11 *******************************************************************************/
12package org.jacoco.core.analysis;
13
14import static org.jacoco.core.analysis.ICoverageNode.ElementType.GROUP;
15import static org.junit.Assert.assertEquals;
16import static org.junit.Assert.assertTrue;
17
18import java.util.Comparator;
19
20import org.jacoco.core.analysis.ICoverageNode.CounterEntity;
21import org.jacoco.core.internal.analysis.CounterImpl;
22import org.junit.Test;
23
24/**
25 * Unit tests for {@link CounterComparator}.
26 */
27public class CounterComparatorTest {
28
29	@Test
30	public void testTotalItemsComparator() {
31		final Comparator<ICounter> cmp = CounterComparator.TOTALITEMS;
32		assertCmpLess(cmp, 19, 5, 19, 6);
33		assertCmpEquals(cmp, 20, 5, 19, 6);
34		assertCmpGreater(cmp, 21, 5, 19, 6);
35	}
36
37	@Test
38	public void testCoveredItemsComparator() {
39		final Comparator<ICounter> cmp = CounterComparator.COVEREDITEMS;
40		assertCmpLess(cmp, 73, 7, 42, 8);
41		assertCmpEquals(cmp, 42, 8, 82, 8);
42		assertCmpGreater(cmp, 21, 9, 32, 8);
43	}
44
45	@Test
46	public void testMissedItemsComparator() {
47		final Comparator<ICounter> cmp = CounterComparator.MISSEDITEMS;
48		assertCmpLess(cmp, 10, 40, 11, 80);
49		assertCmpEquals(cmp, 10, 40, 10, 80);
50		assertCmpGreater(cmp, 11, 39, 10, 80);
51	}
52
53	@Test
54	public void testCoveredRatioComparator() {
55		final Comparator<ICounter> cmp = CounterComparator.COVEREDRATIO;
56		assertCmpLess(cmp, 25, 25, 44, 46);
57		assertCmpEquals(cmp, 40, 10, 64, 16);
58		assertCmpGreater(cmp, 25, 25, 46, 44);
59	}
60
61	@Test
62	public void testMissedRatioComparator() {
63		final Comparator<ICounter> cmp = CounterComparator.MISSEDRATIO;
64		assertCmpLess(cmp, 25, 25, 46, 44);
65		assertCmpEquals(cmp, 40, 10, 64, 16);
66		assertCmpGreater(cmp, 25, 25, 44, 46);
67	}
68
69	@Test
70	public void testReverseComparator() {
71		final Comparator<ICounter> cmp = CounterComparator.TOTALITEMS.reverse();
72		assertCmpGreater(cmp, 19, 5, 19, 6);
73		assertCmpEquals(cmp, 20, 5, 19, 6);
74		assertCmpLess(cmp, 21, 5, 19, 6);
75	}
76
77	@Test
78	public void testReverseReverseComparator() {
79		final Comparator<ICounter> cmp = CounterComparator.TOTALITEMS.reverse()
80				.reverse();
81		assertCmpGreater(cmp, 21, 5, 19, 6);
82		assertCmpEquals(cmp, 20, 5, 19, 6);
83		assertCmpLess(cmp, 19, 5, 19, 6);
84	}
85
86	@Test
87	public void testNodeComparator1() {
88		ICoverageNode d1 = new MockNode(18);
89		ICoverageNode d2 = new MockNode(15);
90		final Comparator<ICoverageNode> cmp = CounterComparator.TOTALITEMS
91				.on(CounterEntity.INSTRUCTION);
92		assertTrue(cmp.compare(d1, d2) > 0);
93	}
94
95	@Test
96	public void testNodeComparator2() {
97		ICoverageNode d1 = new MockNode(18);
98		ICoverageNode d2 = new MockNode(15);
99		final Comparator<ICoverageNode> cmp = CounterComparator.TOTALITEMS
100				.on(CounterEntity.LINE);
101		assertEquals(0, cmp.compare(d1, d2), 0.0);
102	}
103
104	private void assertCmpEquals(Comparator<ICounter> cmp, int missed1,
105			int covered1, int missed2, int covered2) {
106		assertEquals(0,
107				cmp.compare(ctr(missed1, covered1), ctr(missed2, covered2)),
108				0.0);
109	}
110
111	private void assertCmpLess(Comparator<ICounter> cmp, int missed1,
112			int covered1, int missed2, int covered2) {
113		assertTrue(cmp.compare(ctr(missed1, covered1), ctr(missed2, covered2)) < 0);
114	}
115
116	private void assertCmpGreater(Comparator<ICounter> cmp, int missed1,
117			int covered1, int missed2, int covered2) {
118		assertTrue(cmp.compare(ctr(missed1, covered1), ctr(missed2, covered2)) > 0);
119	}
120
121	private CounterImpl ctr(int missed, int covered) {
122		return CounterImpl.getInstance(missed, covered);
123	}
124
125	private static final class MockNode extends CoverageNodeImpl {
126		MockNode(int total) {
127			super(GROUP, "mock");
128			instructionCounter = CounterImpl.getInstance(total, 0);
129		}
130	}
131
132}
133