blob: 4136ebb4fc0e1c5c4b37178e297bb752be9cd69e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2017 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.tests.multieditor;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.ILog;
import org.eclipse.core.runtime.ILogListener;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorRegistry;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.PartSite;
import org.eclipse.ui.internal.WorkbenchPage;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.part.MultiEditorInput;
import org.eclipse.ui.tests.TestPlugin;
import org.eclipse.ui.tests.harness.util.UITestCase;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@RunWith(JUnit4.class)
public class AbstractMultiEditorTest {
private static final String PROJECT_NAME = "TiledEditorProject";
private static final String TILED_EDITOR_ID = "org.eclipse.ui.tests.multieditor.ConcreteAbstractMultiEditor";
// tiled editor test files
private static final String DATA_FILES_DIR = "/data/org.eclipse.newMultiEditor/";
private static final String TEST01_TXT = "test01.txt";
private static final String TEST03_ETEST = "test03.etest";
private EditorErrorListener fErrorListener;
@Test
public void testBug317102() throws Throwable {
final String[] simpleFiles = { TEST01_TXT, TEST03_ETEST };
IWorkbenchWindow window = UITestCase.openTestWindow();
WorkbenchPage page = (WorkbenchPage) window.getActivePage();
IProject testProject = findOrCreateProject(PROJECT_NAME);
MultiEditorInput input = generateEditorInput(simpleFiles, testProject);
IEditorPart editor = page.openEditor(input,
AbstractMultiEditorTest.TILED_EDITOR_ID);
// did we get a multieditor back?
assertTrue(editor instanceof ConcreteAbstractMultiEditor);
ConcreteAbstractMultiEditor multiEditor = (ConcreteAbstractMultiEditor) editor;
IEditorPart[] innerEditors = multiEditor.getInnerEditors();
IEditorPart activeEditor = multiEditor.getActiveEditor();
assertEquals(activeEditor, innerEditors[0]);
multiEditor.activateEditor(innerEditors[1]);
// activate another view
IViewPart view = page.showView(IPageLayout.ID_PROBLEM_VIEW);
assertEquals(view, page.getActivePart());
fakeActivation(innerEditors[0]);
}
private void fakeActivation(IWorkbenchPart part) {
try {
setupErrorListener();
Event event = new Event();
event.type = SWT.Activate;
((Control) ((PartSite) part.getSite()).getModel().getWidget())
.setFocus();
assertTrue("Nothing should have been logged",
fErrorListener.messages.isEmpty());
} finally {
removeErrorListener();
}
}
/**
* Set up to catch any editor initialization exceptions.
*
*/
private void setupErrorListener() {
final ILog log = WorkbenchPlugin.getDefault().getLog();
fErrorListener = new EditorErrorListener();
log.addLogListener(fErrorListener);
}
/**
* Remove the editor error listener.
*/
private void removeErrorListener() {
final ILog log = WorkbenchPlugin.getDefault().getLog();
if (fErrorListener != null) {
log.removeLogListener(fErrorListener);
fErrorListener = null;
}
}
/**
* Create the multi editor input in the given project. Creates the files in
* the project from template files in the classpath if they don't already
* exist.
*
* @param simpleFiles
* the array of filenames to copy over
* @param testProject
* the project to create the files in
* @return the editor input used to open the multieditor
* @throws CoreException
* @throws IOException
*/
private MultiEditorInput generateEditorInput(String[] simpleFiles,
IProject testProject) throws CoreException, IOException {
String[] ids = new String[simpleFiles.length];
IEditorInput[] inputs = new IEditorInput[simpleFiles.length];
IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
for (int f = 0; f < simpleFiles.length; ++f) {
IFile f1 = createFile(testProject, simpleFiles[f]);
ids[f] = registry.getDefaultEditor(f1.getName()).getId();
inputs[f] = new FileEditorInput(f1);
}
return new MultiEditorInput(ids, inputs);
}
/**
* Create the project to work in. If it already exists, just open it.
*
* @param projectName
* the name of the project to create
* @return the newly opened project
* @throws CoreException
*/
private static IProject findOrCreateProject(String projectName)
throws CoreException {
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IProject testProject = workspace.getRoot().getProject(projectName);
if (!testProject.exists()) {
testProject.create(null);
}
testProject.open(null);
return testProject;
}
private static IFile createFile(IProject testProject, String simpleFile)
throws CoreException, IOException {
IFile file = testProject.getFile(simpleFile);
if (!file.exists()) {
URL url = FileLocator.toFileURL(TestPlugin.getDefault().getBundle()
.getEntry(DATA_FILES_DIR + simpleFile));
file.create(url.openStream(), true, null);
}
return file;
}
/**
* Close any editors at the beginner of a test, so the test can be clean.
*/
@Before
public void doSetUp() throws Exception {
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getActivePage();
page.closeAllEditors(false);
}
/**
* Listens for the standard message that indicates the MultiEditor failed
* ... usually caused by incorrect framework initialization that doesn't set
* the innerChildren.
*
* @since 3.1
*
*/
public static class EditorErrorListener implements ILogListener {
public ArrayList<String> messages = new ArrayList<>();
@Override
public void logging(IStatus status, String plugin) {
String msg = status.getMessage();
Throwable ex = status.getException();
if (ex != null) {
msg += ": " + ex.getMessage();
}
messages.add(msg);
}
}
}