Home | History | Annotate | Download | only in flow
      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  *******************************************************************************/
     12 package org.jacoco.core.internal.flow;
     13 
     14 import static org.junit.Assert.assertEquals;
     15 import static org.junit.Assert.assertFalse;
     16 import static org.junit.Assert.assertNull;
     17 import static org.junit.Assert.assertSame;
     18 import static org.junit.Assert.assertTrue;
     19 
     20 import org.junit.Before;
     21 import org.junit.Test;
     22 import org.objectweb.asm.Label;
     23 import org.objectweb.asm.Opcodes;
     24 import org.objectweb.asm.tree.InsnNode;
     25 
     26 /**
     27  * Unit tests for {@link LabelInfoTest}.
     28  */
     29 public class LabelInfoTest {
     30 
     31 	private Label label;
     32 
     33 	@Before
     34 	public void setup() {
     35 		label = new Label();
     36 	}
     37 
     38 	@Test
     39 	public void testDefaults() {
     40 		assertFalse(LabelInfo.isMultiTarget(label));
     41 		assertFalse(LabelInfo.isSuccessor(label));
     42 		assertFalse(LabelInfo.isMethodInvocationLine(label));
     43 		assertFalse(LabelInfo.isDone(label));
     44 		assertEquals(LabelInfo.NO_PROBE, LabelInfo.getProbeId(label));
     45 		assertNull(LabelInfo.getIntermediateLabel(label));
     46 		assertNull(LabelInfo.getInstruction(label));
     47 	}
     48 
     49 	@Test
     50 	public void testOtherInfoObject() {
     51 		label.info = new Object();
     52 		assertFalse(LabelInfo.isSuccessor(label));
     53 	}
     54 
     55 	@Test
     56 	public void testSuccessor() {
     57 		LabelInfo.setSuccessor(label);
     58 		assertFalse(LabelInfo.isMultiTarget(label));
     59 		assertTrue(LabelInfo.isSuccessor(label));
     60 	}
     61 
     62 	@Test
     63 	public void testMultiTarget1() {
     64 		LabelInfo.setTarget(label);
     65 		assertFalse(LabelInfo.isMultiTarget(label));
     66 		assertFalse(LabelInfo.isSuccessor(label));
     67 
     68 		LabelInfo.setTarget(label);
     69 		assertTrue(LabelInfo.isMultiTarget(label));
     70 		assertFalse(LabelInfo.isSuccessor(label));
     71 	}
     72 
     73 	@Test
     74 	public void testMultiTarget2() {
     75 		LabelInfo.setSuccessor(label);
     76 		assertFalse(LabelInfo.isMultiTarget(label));
     77 		assertTrue(LabelInfo.isSuccessor(label));
     78 
     79 		LabelInfo.setTarget(label);
     80 		assertTrue(LabelInfo.isMultiTarget(label));
     81 		assertTrue(LabelInfo.isSuccessor(label));
     82 	}
     83 
     84 	@Test
     85 	public void testMultiTarget3() {
     86 		LabelInfo.setTarget(label);
     87 		assertFalse(LabelInfo.isMultiTarget(label));
     88 		assertFalse(LabelInfo.isSuccessor(label));
     89 
     90 		LabelInfo.setSuccessor(label);
     91 		assertTrue(LabelInfo.isMultiTarget(label));
     92 		assertTrue(LabelInfo.isSuccessor(label));
     93 	}
     94 
     95 	@Test
     96 	public void testMethodInvocationLine() {
     97 		LabelInfo.setMethodInvocationLine(label);
     98 		assertTrue(LabelInfo.isMethodInvocationLine(label));
     99 	}
    100 
    101 	@Test
    102 	public void testNeedsProbe() {
    103 		testNeedsProbe(false, false, false, false);
    104 		testNeedsProbe(true, false, false, false);
    105 		testNeedsProbe(false, true, false, false);
    106 		testNeedsProbe(true, true, false, false);
    107 		testNeedsProbe(false, false, true, false);
    108 		testNeedsProbe(true, false, true, true);
    109 		testNeedsProbe(false, true, true, true);
    110 		testNeedsProbe(true, true, true, true);
    111 	}
    112 
    113 	private void testNeedsProbe(boolean multitarget,
    114 			boolean methodinvocationline, boolean successor, boolean expected) {
    115 		if (multitarget) {
    116 			LabelInfo.setTarget(label);
    117 			LabelInfo.setTarget(label);
    118 		}
    119 		if (methodinvocationline) {
    120 			LabelInfo.setMethodInvocationLine(label);
    121 		}
    122 		if (successor) {
    123 			LabelInfo.setSuccessor(label);
    124 		}
    125 		assertTrue(expected == LabelInfo.needsProbe(label));
    126 
    127 		// Reset:
    128 		label = new Label();
    129 	}
    130 
    131 	@Test
    132 	public void testSetResetDone1() {
    133 		LabelInfo.setDone(label);
    134 		assertTrue(LabelInfo.isDone(label));
    135 
    136 		LabelInfo.resetDone(label);
    137 		assertFalse(LabelInfo.isDone(label));
    138 	}
    139 
    140 	@Test
    141 	public void testSetResetDone2() {
    142 		LabelInfo.setDone(label);
    143 		assertTrue(LabelInfo.isDone(label));
    144 
    145 		LabelInfo.resetDone(new Label[] { label, new Label() });
    146 		assertFalse(LabelInfo.isDone(label));
    147 	}
    148 
    149 	@Test
    150 	public void testSetProbeId() {
    151 		LabelInfo.setProbeId(label, 123);
    152 		assertEquals(123, LabelInfo.getProbeId(label));
    153 	}
    154 
    155 	@Test
    156 	public void testSetIntermediateLabel() {
    157 		final Label i = new Label();
    158 		LabelInfo.setIntermediateLabel(label, i);
    159 		assertSame(i, LabelInfo.getIntermediateLabel(label));
    160 	}
    161 
    162 	@Test
    163 	public void testSetInstruction() {
    164 		final Instruction instruction = new Instruction(
    165 				new InsnNode(Opcodes.NOP), 123);
    166 		LabelInfo.setInstruction(label, instruction);
    167 		assertSame(instruction, LabelInfo.getInstruction(label));
    168 	}
    169 
    170 }
    171