Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java128
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);
+ }
+ }
+}

Back to the top