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.internal.flow;
13e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
14e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport static org.junit.Assert.assertEquals;
15e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport static org.junit.Assert.assertFalse;
16e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport static org.junit.Assert.assertNull;
17e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport static org.junit.Assert.assertSame;
18e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport static org.junit.Assert.assertTrue;
19e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
20e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport org.junit.Before;
21e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport org.junit.Test;
22e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport org.objectweb.asm.Label;
23eaef191fe12fc5abc81435016dbbd69cb55d1f68Evgeny Mandrikovimport org.objectweb.asm.Opcodes;
24eaef191fe12fc5abc81435016dbbd69cb55d1f68Evgeny Mandrikovimport org.objectweb.asm.tree.InsnNode;
25e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
26e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov/**
27e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Unit tests for {@link LabelInfoTest}.
28e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */
29e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovpublic class LabelInfoTest {
30e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
31e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	private Label label;
32e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
33e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	@Before
34e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void setup() {
35e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		label = new Label();
36e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
37e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
38e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	@Test
39e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void testDefaults() {
40e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertFalse(LabelInfo.isMultiTarget(label));
41e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertFalse(LabelInfo.isSuccessor(label));
42873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann		assertFalse(LabelInfo.isMethodInvocationLine(label));
43e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertFalse(LabelInfo.isDone(label));
44e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertEquals(LabelInfo.NO_PROBE, LabelInfo.getProbeId(label));
45e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertNull(LabelInfo.getIntermediateLabel(label));
46e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertNull(LabelInfo.getInstruction(label));
47e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
48e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
49e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	@Test
50e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void testOtherInfoObject() {
51e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		label.info = new Object();
52e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertFalse(LabelInfo.isSuccessor(label));
53e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
54e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
55e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	@Test
56e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void testSuccessor() {
57e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		LabelInfo.setSuccessor(label);
58e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertFalse(LabelInfo.isMultiTarget(label));
59e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertTrue(LabelInfo.isSuccessor(label));
60e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
61e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
62e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	@Test
63e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void testMultiTarget1() {
64e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		LabelInfo.setTarget(label);
65e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertFalse(LabelInfo.isMultiTarget(label));
66e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertFalse(LabelInfo.isSuccessor(label));
67e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
68e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		LabelInfo.setTarget(label);
69e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertTrue(LabelInfo.isMultiTarget(label));
70e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertFalse(LabelInfo.isSuccessor(label));
71e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
72e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
73e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	@Test
74e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void testMultiTarget2() {
75e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		LabelInfo.setSuccessor(label);
76e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertFalse(LabelInfo.isMultiTarget(label));
77e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertTrue(LabelInfo.isSuccessor(label));
78e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
79e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		LabelInfo.setTarget(label);
80e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertTrue(LabelInfo.isMultiTarget(label));
81e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertTrue(LabelInfo.isSuccessor(label));
82e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
83e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
84e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	@Test
85e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void testMultiTarget3() {
86e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		LabelInfo.setTarget(label);
87e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertFalse(LabelInfo.isMultiTarget(label));
88e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertFalse(LabelInfo.isSuccessor(label));
89e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
90e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		LabelInfo.setSuccessor(label);
91e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertTrue(LabelInfo.isMultiTarget(label));
92e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertTrue(LabelInfo.isSuccessor(label));
93e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
94e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
95e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	@Test
96873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann	public void testMethodInvocationLine() {
97873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann		LabelInfo.setMethodInvocationLine(label);
98873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann		assertTrue(LabelInfo.isMethodInvocationLine(label));
99873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann	}
100873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann
101873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann	@Test
102873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann	public void testNeedsProbe() {
103873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann		testNeedsProbe(false, false, false, false);
104873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann		testNeedsProbe(true, false, false, false);
105873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann		testNeedsProbe(false, true, false, false);
106873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann		testNeedsProbe(true, true, false, false);
107873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann		testNeedsProbe(false, false, true, false);
108873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann		testNeedsProbe(true, false, true, true);
109873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann		testNeedsProbe(false, true, true, true);
110873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann		testNeedsProbe(true, true, true, true);
111873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann	}
112873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann
113873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann	private void testNeedsProbe(boolean multitarget,
114873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann			boolean methodinvocationline, boolean successor, boolean expected) {
115873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann		if (multitarget) {
116873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann			LabelInfo.setTarget(label);
117873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann			LabelInfo.setTarget(label);
118873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann		}
119873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann		if (methodinvocationline) {
120873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann			LabelInfo.setMethodInvocationLine(label);
121873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann		}
122873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann		if (successor) {
123873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann			LabelInfo.setSuccessor(label);
124873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann		}
125873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann		assertTrue(expected == LabelInfo.needsProbe(label));
126873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann
127873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann		// Reset:
128873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann		label = new Label();
129873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann	}
130873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann
131873114568ee148ea2e15cd036d57bf7b43ba154dMarc R. Hoffmann	@Test
132e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void testSetResetDone1() {
133e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		LabelInfo.setDone(label);
134e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertTrue(LabelInfo.isDone(label));
135e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
136e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		LabelInfo.resetDone(label);
137e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertFalse(LabelInfo.isDone(label));
138e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
139e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
140e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	@Test
141e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void testSetResetDone2() {
142e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		LabelInfo.setDone(label);
143e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertTrue(LabelInfo.isDone(label));
144e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
145e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		LabelInfo.resetDone(new Label[] { label, new Label() });
146e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertFalse(LabelInfo.isDone(label));
147e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
148e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
149e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	@Test
150e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void testSetProbeId() {
151e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		LabelInfo.setProbeId(label, 123);
152e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertEquals(123, LabelInfo.getProbeId(label));
153e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
154e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
155e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	@Test
156e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void testSetIntermediateLabel() {
157e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		final Label i = new Label();
158e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		LabelInfo.setIntermediateLabel(label, i);
159e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertSame(i, LabelInfo.getIntermediateLabel(label));
160e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
161e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
162e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	@Test
163e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void testSetInstruction() {
164eaef191fe12fc5abc81435016dbbd69cb55d1f68Evgeny Mandrikov		final Instruction instruction = new Instruction(
165eaef191fe12fc5abc81435016dbbd69cb55d1f68Evgeny Mandrikov				new InsnNode(Opcodes.NOP), 123);
166e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		LabelInfo.setInstruction(label, instruction);
167e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		assertSame(instruction, LabelInfo.getInstruction(label));
168e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
169e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
170e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov}
171