diff options
Diffstat (limited to 'org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/StatusEditorTest.java')
-rw-r--r-- | org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/StatusEditorTest.java | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/StatusEditorTest.java b/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/StatusEditorTest.java new file mode 100644 index 00000000000..0302e621b38 --- /dev/null +++ b/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/StatusEditorTest.java @@ -0,0 +1,128 @@ +/******************************************************************************* + * 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); + } + } +} |