blob: 0302e621b383b18f5764167401011ae18a6ef7e3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 Vasili Gulevich and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Vasili Gulevich <vasili.gulevich@xored.com> - initial implementation
* Andrey Loskutov <loskutov@gmx.de> - polishing and integration
*******************************************************************************/
package org.eclipse.ui.workbench.texteditor.tests;
import java.lang.reflect.Method;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.widgets.Display;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.runtime.ILog;
import org.eclipse.core.runtime.ILogListener;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.WorkbenchException;
import org.eclipse.ui.ide.FileStoreEditorInput;
import org.eclipse.ui.internal.PartSite;
import org.eclipse.ui.texteditor.AbstractTextEditor;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.editors.text.EditorsUI;
import org.eclipse.ui.editors.text.ForwardingDocumentProvider;
import org.eclipse.ui.editors.text.TextEditor;
public class StatusEditorTest {
private IWorkbenchWindow window;
private Display display;
private IWorkbenchPage page;
@Before
public void before() throws WorkbenchException {
window = PlatformUI.getWorkbench().openWorkbenchWindow(null);
display = window.getShell().getDisplay();
page = window.getActivePage();
processEvents();
}
@After
public void after() {
window.close();
page = null;
processEvents();
}
/*
* https://bugs.eclipse.org/bugs/attachment.cgi?bugid=320672
*
* No exceptions are thrown when a status editor displaying an erroneous status is activated with a mouse click.
* @throws Exception
*/
@Test
public void doNotThrowOnActivationInStale() throws Exception {
IEditorPart editor1 = openNonExistentFile(page, new URI("file:/1.txt"));
openNonExistentFile(page, new URI("file:/2.txt"));
ILog log = Platform.getLog(Platform.getBundle("org.eclipse.e4.ui.workbench"));
List<String> logEvents = new ArrayList<>();
ILogListener listener = (status, plugin) -> logEvents.add(status.toString());
log.addLogListener(listener);
// Clicks are not equivalent to activation from API, so we need this
// hack to imitate tab clicks.
CTabFolder folder = (CTabFolder) (((PartSite) editor1.getSite()).getModel().getParent().getWidget());
try {
folder.setSelection(0);
processEvents();
folder.setSelection(1);
processEvents();
} finally {
log.removeLogListener(listener);
}
if(!logEvents.isEmpty()) {
Assert.assertEquals("Unexpected errors logged", "", logEvents.toString());
}
}
private void processEvents() {
while (display.readAndDispatch()) {
//
}
}
private IEditorPart openNonExistentFile(IWorkbenchPage page1, URI uri) throws Exception {
FileStoreEditorInput input = new FileStoreEditorInput(EFS.getStore(uri));
TextEditor editor = (TextEditor) page1.openEditor(input, EditorsUI.DEFAULT_TEXT_EDITOR_ID, true);
Method setMethod= AbstractTextEditor.class.getDeclaredMethod("setDocumentProvider", IDocumentProvider.class);
setMethod.setAccessible(true);
setMethod.invoke(editor, new ErrorDocumentProvider(editor.getDocumentProvider()));
editor.setInput(input);
processEvents();
return editor;
}
private static class ErrorDocumentProvider extends ForwardingDocumentProvider {
public ErrorDocumentProvider(IDocumentProvider parent) {
super("", ignored -> { /**/ }, parent);
}
@Override
public IStatus getStatus(Object element) {
return new Status(IStatus.ERROR, "org.eclipse.ui.workbench.texteditor.tests",
0, "This document provider always fails", null);
}
}
}