summaryrefslogtreecommitdiff
path: root/platform/testRunner/src/com/intellij/execution/testframework/stacktrace/DiffHyperlink.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/testRunner/src/com/intellij/execution/testframework/stacktrace/DiffHyperlink.java')
-rw-r--r--platform/testRunner/src/com/intellij/execution/testframework/stacktrace/DiffHyperlink.java88
1 files changed, 83 insertions, 5 deletions
diff --git a/platform/testRunner/src/com/intellij/execution/testframework/stacktrace/DiffHyperlink.java b/platform/testRunner/src/com/intellij/execution/testframework/stacktrace/DiffHyperlink.java
index b60770692d9b..f8ff62996eca 100644
--- a/platform/testRunner/src/com/intellij/execution/testframework/stacktrace/DiffHyperlink.java
+++ b/platform/testRunner/src/com/intellij/execution/testframework/stacktrace/DiffHyperlink.java
@@ -22,14 +22,20 @@ package com.intellij.execution.testframework.stacktrace;
import com.intellij.execution.ExecutionBundle;
import com.intellij.execution.filters.HyperlinkInfo;
+import com.intellij.execution.testframework.AbstractTestProxy;
import com.intellij.execution.testframework.Printable;
import com.intellij.execution.testframework.Printer;
import com.intellij.execution.ui.ConsoleViewContentType;
+import com.intellij.icons.AllIcons;
+import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.diff.*;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import javax.swing.*;
import java.io.File;
public class DiffHyperlink implements Printable {
@@ -56,21 +62,93 @@ public class DiffHyperlink implements Printable {
myPrintOneLine = printOneLine;
}
- public void openDiff(final Project project) {
+ public void openDiff(Project project) {
+ openMultiDiff(project, null);
+ }
+
+ public void openMultiDiff(final Project project,
+ final AbstractTestProxy.AssertEqualsDiffChain chain) {
+ final SimpleDiffRequest diffData = createRequest(project, chain, myFilePath, myExpected, myActual);
+ DiffManager.getInstance().getIdeaDiffTool().show(diffData);
+ }
+
+ private SimpleDiffRequest createRequest(final Project project,
+ final AbstractTestProxy.AssertEqualsDiffChain chain,
+ String filePath, String expected, String actual) {
String expectedTitle = ExecutionBundle.message("diff.content.expected.title");
final DiffContent expectedContent;
final VirtualFile vFile;
- if (myFilePath != null && (vFile = LocalFileSystem.getInstance().findFileByPath(myFilePath)) != null) {
+ if (filePath != null && (vFile = LocalFileSystem.getInstance().findFileByPath(filePath)) != null) {
expectedContent = DiffContent.fromFile(project, vFile);
expectedTitle += " (" + vFile.getPresentableUrl() + ")";
- } else expectedContent = new SimpleContent(myExpected);
+ } else {
+ expectedContent = new SimpleContent(expected);
+ }
final SimpleDiffRequest diffData = new SimpleDiffRequest(project, getTitle());
- diffData.setContents(expectedContent, new SimpleContent(myActual));
+ if (chain != null) {
+ diffData.setToolbarAddons(new DiffRequest.ToolbarAddons() {
+ @Override
+ public void customize(DiffToolbar toolbar) {
+ toolbar.addAction(new NextPrevAction("Compare Previous Failure", AllIcons.Actions.Prevfile, chain) {
+ {
+ registerCustomShortcutSet(ActionManager.getInstance().getAction("PreviousTab").getShortcutSet(), null);
+ }
+
+ @Override
+ protected AbstractTestProxy.AssertEqualsMultiDiffViewProvider getNextId() {
+ return chain.getPrevious();
+ }
+ });
+ toolbar.addAction(new NextPrevAction("Compare Next Failure", AllIcons.Actions.Nextfile, chain) {
+ {
+ registerCustomShortcutSet(ActionManager.getInstance().getAction("NextTab").getShortcutSet(), null);
+ }
+
+ @Override
+ protected AbstractTestProxy.AssertEqualsMultiDiffViewProvider getNextId() {
+ return chain.getNext();
+ }
+ });
+ }
+ });
+ }
+ diffData.setContents(expectedContent, new SimpleContent(actual));
diffData.setContentTitles(expectedTitle, ExecutionBundle.message("diff.content.actual.title"));
diffData.addHint(DiffTool.HINT_SHOW_FRAME);
diffData.addHint(DiffTool.HINT_DO_NOT_IGNORE_WHITESPACES);
diffData.setGroupKey("#com.intellij.execution.junit2.states.ComparisonFailureState$DiffDialog");
- DiffManager.getInstance().getIdeaDiffTool().show(diffData);
+ return diffData;
+ }
+
+ abstract class NextPrevAction extends AnAction {
+
+ private final AbstractTestProxy.AssertEqualsDiffChain myChain;
+
+ public NextPrevAction(@Nullable String text, @Nullable Icon icon,
+ final AbstractTestProxy.AssertEqualsDiffChain chain) {
+ super(text, text, icon);
+ myChain = chain;
+ }
+
+ @Override
+ public void actionPerformed(@NotNull AnActionEvent e) {
+ final DiffViewer viewer = e.getData(PlatformDataKeys.DIFF_VIEWER);
+ final Project project = e.getData(CommonDataKeys.PROJECT);
+ final AbstractTestProxy.AssertEqualsMultiDiffViewProvider nextProvider = getNextId();
+ myChain.setCurrent(nextProvider);
+ final SimpleDiffRequest nextRequest =
+ createRequest(project, myChain, nextProvider.getFilePath(), nextProvider.getExpected(), nextProvider.getActual());
+ viewer.setDiffRequest(nextRequest);
+ }
+
+ @Override
+ public void update(@NotNull AnActionEvent e) {
+ final DiffViewer viewer = e.getData(PlatformDataKeys.DIFF_VIEWER);
+ final Project project = e.getData(CommonDataKeys.PROJECT);
+ e.getPresentation().setEnabled(project != null && viewer != null);
+ }
+
+ protected abstract AbstractTestProxy.AssertEqualsMultiDiffViewProvider getNextId();
}
protected String getTitle() {