|  | // Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | package com.android.tools.r8.jdwp; | 
|  |  | 
|  | import java.util.HashMap; | 
|  | import java.util.Map; | 
|  | import org.apache.harmony.jpda.tests.framework.jdwp.Method; | 
|  | import org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket; | 
|  | import org.apache.harmony.jpda.tests.jdwp.Method.JDWPMethodTestCase; | 
|  | import org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer; | 
|  |  | 
|  | public class LineTableDuplicatesTest extends JDWPMethodTestCase { | 
|  |  | 
|  | protected String getDebuggeeClassName() { | 
|  | return LineTableDuplicatesDebuggee.class.getName(); | 
|  | } | 
|  |  | 
|  | public void testLineTableDuplicatesTest001() { | 
|  | logWriter.println("testLineTableDuplicatesTest001 started"); | 
|  | synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY); | 
|  |  | 
|  | long classID = getClassIDBySignature(getDebuggeeClassSignature()); | 
|  |  | 
|  | Method[] methodsInfo = debuggeeWrapper.vmMirror.getMethods(classID); | 
|  | assertEquals("Invalid number of methods", 5, methodsInfo.length); | 
|  |  | 
|  | Map<String, Map<Integer, Integer>> methodLines = new HashMap<>(); | 
|  | for (int i = 0; i < methodsInfo.length; i++) { | 
|  | String name = getMethodName(classID, methodsInfo[i].getMethodID()); | 
|  | logWriter.println("method = " + name); | 
|  | ReplyPacket reply = getLineTable(classID, methodsInfo[i].getMethodID()); | 
|  | long start = reply.getNextValueAsLong(); | 
|  | logWriter.println("start = " + start); | 
|  | long end = reply.getNextValueAsLong(); | 
|  | logWriter.println("end = " + end); | 
|  | int lines = reply.getNextValueAsInt(); | 
|  | logWriter.println("lines = "+lines); | 
|  | Map<Integer, Integer> lineCounts = new HashMap<>(); | 
|  | for (int j = 0; j < lines; j++) { | 
|  | long lineCodeIndex = reply.getNextValueAsLong(); | 
|  | logWriter.println("lineCodeIndex = "+lineCodeIndex); | 
|  | int lineNumber = reply.getNextValueAsInt(); | 
|  | logWriter.println("lineNumber = "+lineNumber); | 
|  | lineCounts.put(lineNumber, 1 + lineCounts.getOrDefault(lineNumber, 0)); | 
|  | } | 
|  | methodLines.put(name, lineCounts); | 
|  | } | 
|  |  | 
|  | assertEquals( | 
|  | "methodWithSingleLineMultipleLocals", | 
|  | 1, | 
|  | methodLines.get("methodWithSingleLineMultipleLocals").getOrDefault(13, -1).intValue()); | 
|  |  | 
|  | assertEquals( | 
|  | "methodWithSingleLineMultipleDuplicates", | 
|  | 2, | 
|  | methodLines.get("methodWithSingleLineMultipleDuplicates").getOrDefault(22, -1).intValue()); | 
|  |  | 
|  | synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE); | 
|  | } | 
|  | } |