MethodAnalyzerTest should not violate contracts of ASM API (#480)

In particular visitLineNumber methods must be called after the labels
passed as arguments have been visited. This is important because
otherwise test does not simulate behavior of reading from bytecode.
diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/MethodAnalyzerTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/MethodAnalyzerTest.java
index bdc5e6b..6bcbd63 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/MethodAnalyzerTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/MethodAnalyzerTest.java
@@ -26,6 +26,7 @@
 import org.objectweb.asm.Opcodes;
 import org.objectweb.asm.tree.MethodNode;
 import org.objectweb.asm.tree.TryCatchBlockNode;
+import org.objectweb.asm.util.CheckMethodAdapter;
 
 /**
  * Unit tests for {@link MethodAnalyzer}.
@@ -55,9 +56,13 @@
 	// === Scenario: linear Sequence without branches ===
 
 	private void createLinearSequence() {
-		method.visitLineNumber(1001, new Label());
+		final Label l0 = new Label();
+		method.visitLabel(l0);
+		method.visitLineNumber(1001, l0);
 		method.visitInsn(Opcodes.NOP);
-		method.visitLineNumber(1002, new Label());
+		final Label l1 = new Label();
+		method.visitLabel(l1);
+		method.visitLineNumber(1002, l1);
 		method.visitInsn(Opcodes.RETURN);
 	}
 
@@ -95,11 +100,15 @@
 	// === Scenario: simple if branch ===
 
 	private void createIfBranch() {
-		method.visitLineNumber(1001, new Label());
+		final Label l0 = new Label();
+		method.visitLabel(l0);
+		method.visitLineNumber(1001, l0);
 		method.visitVarInsn(Opcodes.ILOAD, 1);
 		Label l1 = new Label();
 		method.visitJumpInsn(Opcodes.IFEQ, l1);
-		method.visitLineNumber(1002, new Label());
+		final Label l2 = new Label();
+		method.visitLabel(l2);
+		method.visitLineNumber(1002, l2);
 		method.visitLdcInsn("a");
 		method.visitInsn(Opcodes.ARETURN);
 		method.visitLabel(l1);
@@ -156,11 +165,15 @@
 	// === Scenario: branch which merges back ===
 
 	private void createIfBranchMerge() {
-		method.visitLineNumber(1001, new Label());
+		final Label l0 = new Label();
+		method.visitLabel(l0);
+		method.visitLineNumber(1001, l0);
 		method.visitVarInsn(Opcodes.ILOAD, 1);
 		Label l1 = new Label();
 		method.visitJumpInsn(Opcodes.IFEQ, l1);
-		method.visitLineNumber(1002, new Label());
+		final Label l2 = new Label();
+		method.visitLabel(l2);
+		method.visitLineNumber(1002, l2);
 		method.visitInsn(Opcodes.NOP);
 		method.visitLabel(l1);
 		method.visitLineNumber(1003, l1);
@@ -216,7 +229,9 @@
 	// === Scenario: branch which jump backwards ===
 
 	private void createJumpBackwards() {
-		method.visitLineNumber(1001, new Label());
+		final Label l0 = new Label();
+		method.visitLabel(l0);
+		method.visitLineNumber(1001, l0);
 		final Label l1 = new Label();
 		method.visitJumpInsn(Opcodes.GOTO, l1);
 		final Label l2 = new Label();
@@ -302,7 +317,9 @@
 	// === Scenario: table switch ===
 
 	private void createTableSwitch() {
-		method.visitLineNumber(1001, new Label());
+		final Label l0 = new Label();
+		method.visitLabel(l0);
+		method.visitLineNumber(1001, l0);
 		method.visitVarInsn(Opcodes.ILOAD, 1);
 		Label l1 = new Label();
 		Label l2 = new Label();
@@ -312,14 +329,18 @@
 		method.visitLineNumber(1002, l1);
 		method.visitIntInsn(Opcodes.BIPUSH, 11);
 		method.visitVarInsn(Opcodes.ISTORE, 2);
-		method.visitLineNumber(1003, new Label());
+		final Label l4 = new Label();
+		method.visitLabel(l4);
+		method.visitLineNumber(1003, l4);
 		Label l5 = new Label();
 		method.visitJumpInsn(Opcodes.GOTO, l5);
 		method.visitLabel(l2);
 		method.visitLineNumber(1004, l2);
 		method.visitIntInsn(Opcodes.BIPUSH, 22);
 		method.visitVarInsn(Opcodes.ISTORE, 2);
-		method.visitLineNumber(1005, new Label());
+		final Label l6 = new Label();
+		method.visitLabel(l6);
+		method.visitLineNumber(1005, l6);
 		method.visitJumpInsn(Opcodes.GOTO, l5);
 		method.visitLabel(l3);
 		method.visitLineNumber(1006, l3);
@@ -402,10 +423,14 @@
 	// === Scenario: table switch with merge ===
 
 	private void createTableSwitchMerge() {
-		method.visitLineNumber(1001, new Label());
+		final Label l0 = new Label();
+		method.visitLabel(l0);
+		method.visitLineNumber(1001, l0);
 		method.visitInsn(Opcodes.ICONST_0);
 		method.visitVarInsn(Opcodes.ISTORE, 2);
-		method.visitLineNumber(1002, new Label());
+		final Label l1 = new Label();
+		method.visitLabel(l1);
+		method.visitLineNumber(1002, l1);
 		method.visitVarInsn(Opcodes.ILOAD, 1);
 		Label l2 = new Label();
 		Label l3 = new Label();
@@ -559,7 +584,9 @@
 				probes);
 		final MethodProbesAdapter probesAdapter = new MethodProbesAdapter(
 				analyzer, this);
-		method.accept(probesAdapter);
+		// note that CheckMethodAdapter verifies that this test does not violate
+		// contracts of ASM API
+		method.accept(new CheckMethodAdapter(probesAdapter));
 		result = analyzer.getCoverage();
 	}