diff --git a/java/junit.ant.ui/src/org/netbeans/modules/junit/ant/ui/AntJUnitNodeOpener.java b/java/junit.ant.ui/src/org/netbeans/modules/junit/ant/ui/AntJUnitNodeOpener.java index 7742482d8225..455c69743785 100644 --- a/java/junit.ant.ui/src/org/netbeans/modules/junit/ant/ui/AntJUnitNodeOpener.java +++ b/java/junit.ant.ui/src/org/netbeans/modules/junit/ant/ui/AntJUnitNodeOpener.java @@ -38,6 +38,8 @@ import org.netbeans.modules.gsf.testrunner.api.CommonUtils; import org.netbeans.modules.gsf.testrunner.ui.api.TestMethodNode; import org.netbeans.modules.gsf.testrunner.ui.api.TestsuiteNode; +import org.netbeans.modules.java.testrunner.JavaRegexpPatterns; +import org.netbeans.modules.java.testrunner.JavaRegexpUtils; import org.openide.ErrorManager; import org.openide.filesystems.FileObject; import org.netbeans.modules.junit.api.JUnitTestSuite; @@ -157,30 +159,47 @@ public void openCallstackFrame(Node node, String frameInfo) { } // Method node might belong to an inner class FileObject testfo = methodNode.getTestcase().getClassFileObject(true); - if(testfo == null) { - return; - } + String fqMethodNameParen = methodNode.getTestcase().getClassName() + '.' + methodNode.getTestcase().getName()+'('; + if (testfo == null) { + return; + } final int[] lineNumStorage = new int[1]; FileObject file = UIJavaUtils.getFile(frameInfo, lineNumStorage, locator); //lineNumStorage -1 means no regexp for stacktrace was matched. if ((file == null) && (methodNode.getTestcase().getTrouble() != null) && lineNumStorage[0] == -1) { - //213935 we could not recognize the stack trace line and map it to known file - //if it's a failure text, grab the testcase's own line from the stack. - boolean methodNodeParentOfStackTraceNode = false; String[] st = methodNode.getTestcase().getTrouble().getStackTrace(); if ((st != null) && (st.length > 0)) { - int index = st.length - 1; - //213935 we need to find the testcase linenumber to jump to. + int index = 0;//st.length - 1; + //Jump to the first line matching the fully qualified test method name. // and ignore the infrastructure stack lines in the process - while (!testfo.equals(file) && index != -1 && !methodNodeParentOfStackTraceNode) { - file = UIJavaUtils.getFile(st[index], lineNumStorage, locator); - index = index - 1; - // if frameInfo.isEmpty() == true, user clicked on a failed method node. - // Try to find if the stack trace node is relevant to the method node - if(file != null && frameInfo.isEmpty()) { - methodNodeParentOfStackTraceNode = FileUtil.isParentOf(testfo.getParent(), file); + while (index < st.length) { + if (st[index].contains(fqMethodNameParen)) { + file = UIJavaUtils.getFile(st[index], lineNumStorage, locator); + break; + } + index++; + } + // if not found, return top line of stack trace. + if (index == st.length) { + for (index = 0; index < st.length; index++) { + String trimmed = JavaRegexpUtils.specialTrim(st[index]); + if (trimmed.startsWith(JavaRegexpUtils.CALLSTACK_LINE_PREFIX_CATCH) + || trimmed.startsWith(JavaRegexpUtils.CALLSTACK_LINE_PREFIX)) { + file = UIJavaUtils.getFile(st[index], lineNumStorage, locator); + if (testfo.equals(file)) { + break; + } else { + file = null; + lineNumStorage[0] = -1; + } + } } } + // if that fails, return the test file object. + if (file == null) { + openTestMethod(methodNode); + return; + } } } UIJavaUtils.openFile(file, lineNumStorage[0]);