Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Comment on lines +189 to +194
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, I missed this on the first pass:

Suggested change
if (testfo.equals(file)) {
break;
}
if (testfo.equals(file)) {
break;
} else {
file = null;
lineNumStorage[0] = -1;
}

if the match is in the wrong file we need to reset the values so that the fallback in line 196 can correctly be hit.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Implemented as suggested.

}
}
}
// if that fails, return the test file object.
if (file == null) {
openTestMethod(methodNode);
return;
}
}
}
UIJavaUtils.openFile(file, lineNumStorage[0]);
Expand Down