blob: e0a1ee227495ad6616d240ee554b057d6bfb5b98 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016-2021 Red Hat Inc. and others
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Andrew Obuchowicz (Red Hat Inc.)
* Christoph Läubrich - [Generic Editor] misses quick fix if not at start of line
*******************************************************************************/
package org.eclipse.ui.genericeditor.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
import org.junit.After;
import org.junit.Test;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.core.resources.IMarker;
import org.eclipse.jface.text.tests.util.DisplayHelper;
import org.eclipse.ui.genericeditor.tests.contributions.MarkerResolutionGenerator;
import org.eclipse.ui.texteditor.ITextEditorActionConstants;
import org.eclipse.ui.texteditor.TextOperationAction;
/**
* @since 1.2
*/
public class TestQuickAssist extends AbstratGenericEditorTest {
private static final String FIXME_PROPOSAL= "org.eclipse.ui.genericeditor.tests.contributions.MarkerResolutionGenerator.fixme";
private static final String DEFAULT_PROPOSAL= "QUICK ASSIST PROPOSAL";
private Shell completionShell;
@Test
public void testCompletion() throws Exception {
final Set<Shell> beforeShells = Arrays.stream(editor.getSite().getShell().getDisplay().getShells()).filter(Shell::isVisible).collect(Collectors.toSet());
openQuickAssist();
this.completionShell= CompletionTest.findNewShell(beforeShells, editor.getSite().getShell().getDisplay());
final Table completionProposalList = CompletionTest.findCompletionSelectionControl(completionShell);
checkCompletionContent(completionProposalList, new String[] { DEFAULT_PROPOSAL });
}
@Test
public void testMarkerQuickAssist() throws Exception {
final Set<Shell> beforeShells= Arrays.stream(editor.getSite().getShell().getDisplay().getShells()).filter(Shell::isVisible).collect(Collectors.toSet());
DisplayHelper.driveEventQueue(Display.getDefault());
IMarker marker= null;
try {
marker= this.file.createMarker(IMarker.PROBLEM);
marker.setAttribute(IMarker.LINE_NUMBER, 1);
marker.setAttribute(IMarker.CHAR_START, 0);
marker.setAttribute(IMarker.CHAR_END, 5);
marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR);
marker.setAttribute(IMarker.MESSAGE, "We have a problem");
marker.setAttribute(MarkerResolutionGenerator.FIXME, true);
openQuickAssist();
this.completionShell= CompletionTest.findNewShell(beforeShells, editor.getSite().getShell().getDisplay());
final Table completionProposalList= CompletionTest.findCompletionSelectionControl(completionShell);
checkCompletionContent(completionProposalList, new String[] { DEFAULT_PROPOSAL, FIXME_PROPOSAL });
} finally {
if (marker != null && marker.exists()) {
marker.delete();
}
}
}
@Test
public void testMarkerQuickAssistLineOnly() throws Exception {
final Set<Shell> beforeShells= Arrays.stream(editor.getSite().getShell().getDisplay().getShells()).filter(Shell::isVisible).collect(Collectors.toSet());
DisplayHelper.driveEventQueue(Display.getDefault());
IMarker marker= null;
try {
marker= this.file.createMarker(IMarker.PROBLEM);
marker.setAttribute(IMarker.LINE_NUMBER, 1);
marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR);
marker.setAttribute(IMarker.MESSAGE, "We have a problem");
marker.setAttribute(MarkerResolutionGenerator.FIXME, true);
openQuickAssist();
this.completionShell= CompletionTest.findNewShell(beforeShells, editor.getSite().getShell().getDisplay());
final Table completionProposalList= CompletionTest.findCompletionSelectionControl(completionShell);
checkCompletionContent(completionProposalList, new String[] { DEFAULT_PROPOSAL, FIXME_PROPOSAL });
} finally {
if (marker != null && marker.exists()) {
marker.delete();
}
}
}
private void openQuickAssist() {
editor.selectAndReveal(3, 0);
TextOperationAction action = (TextOperationAction) editor.getAction(ITextEditorActionConstants.QUICK_ASSIST);
action.update();
action.run();
waitAndDispatch(100);
}
/**
* Checks that a mock quick assist proposal comes up
*
* @param completionProposalList the quick assist proposal list
* @param proposals expected proposals
*/
private void checkCompletionContent(final Table completionProposalList, String[] proposals) {
// should be instantaneous, but happens to go asynchronous on CI so let's allow a wait
new DisplayHelper() {
@Override
protected boolean condition() {
return completionProposalList.getItemCount() >= proposals.length;
}
}.waitForCondition(completionProposalList.getDisplay(), 200);
assertEquals(proposals.length, completionProposalList.getItemCount());
Set<String> existing= Arrays.stream(completionProposalList.getItems()).map(TableItem::getText).collect(Collectors.toSet());
for (String proposal : proposals) {
assertTrue("Missing quick assist proposal '" + proposal + "', found " + existing, existing.contains(proposal)); //$NON-NLS-1$ //$NON-NLS-2$
}
}
@After
public void closeShell() {
if (this.completionShell != null && !completionShell.isDisposed()) {
completionShell.close();
}
}
}