blob: 482890e91f5a643633166ad4681db48ddeddd006 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2019 Thomas Wolf 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
*******************************************************************************/
package org.eclipse.ui.editors.tests;
import static org.junit.Assert.assertTrue;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.eclipse.swt.widgets.Display;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.filebuffers.tests.ResourceHelper;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.internal.editors.text.EditorsPlugin;
import org.eclipse.ui.intro.IIntroPart;
import org.eclipse.ui.texteditor.AbstractTextEditor;
import org.eclipse.ui.texteditor.ITextEditor;
/**
* Tests opening large files in a text editor.
*/
public class LargeFileTest {
private IFile fLargeFile;
private IPreferenceStore preferenceStore;
boolean initialWordWrap;
@Before
public void setUp() throws Exception {
IIntroPart intro = PlatformUI.getWorkbench().getIntroManager().getIntro();
if (intro != null) {
PlatformUI.getWorkbench().getIntroManager().closeIntro(intro);
}
IFolder folder = ResourceHelper.createFolder("LargeFileTestProject/test/");
fLargeFile = ResourceHelper.createFile(folder, "large.txt", "");
IFileStore store = EFS.getLocalFileSystem().getStore(fLargeFile.getLocationURI());
try (BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(store.openOutputStream(EFS.NONE, null), StandardCharsets.UTF_8))) {
for (int i = 1; i <= 40000; i++) {
writer.write("This is line # " + i);
writer.newLine();
}
}
fLargeFile.refreshLocal(IResource.DEPTH_ZERO, null);
preferenceStore = EditorsPlugin.getDefault().getPreferenceStore();
initialWordWrap = preferenceStore.getBoolean(AbstractTextEditor.PREFERENCE_WORD_WRAP_ENABLED);
}
@After
public void tearDown() throws Exception {
fLargeFile.deleteMarkers(IMarker.BOOKMARK, true, IResource.DEPTH_INFINITE);
ResourceHelper.deleteProject("LargeFileTestProject");
fLargeFile= null;
preferenceStore.setValue(AbstractTextEditor.PREFERENCE_WORD_WRAP_ENABLED, initialWordWrap);
TestUtil.cleanUp();
}
@Test
public void openLargeFileWithAnnotation() throws Exception {
IWorkbench workbench= PlatformUI.getWorkbench();
Display display = workbench.getDisplay();
IWorkbenchPage page= workbench.getActiveWorkbenchWindow().getActivePage();
// Set word-wrap (makes the StyledText have variable line height)
preferenceStore.setValue(AbstractTextEditor.PREFERENCE_WORD_WRAP_ENABLED, true);
// Let's get an idea how long it takes to open the file at all. Open the
// file twice; the first time takes longer.
long[] baseline = new long[1];
for (int i = 0; i < 2; i++) {
baseline[0] = System.nanoTime();
IEditorPart part = IDE.openEditor(page, fLargeFile);
display.asyncExec(() -> {
baseline[0] = System.nanoTime() - baseline[0];
});
TestUtil.runEventLoop();
assertTrue("Expected a text editor", part instanceof ITextEditor);
page.closeEditor(part, false);
TestUtil.runEventLoop();
}
// Create a marker on the file
Map<String, Object> attributes = Map.of(IMarker.LOCATION, "line 1", //
IMarker.MESSAGE, "Just a test marker", //
IMarker.LINE_NUMBER, 1, //
IMarker.CHAR_START, 8, //
IMarker.CHAR_END, 12 ,//
IMarker.USER_EDITABLE, false
);
fLargeFile.createMarker(IMarker.BOOKMARK, attributes);
TestUtil.runEventLoop();
// Open it again
long[] withMarker = { System.nanoTime() };
IEditorPart part = IDE.openEditor(page, fLargeFile);
display.asyncExec(() -> {
withMarker[0] = System.nanoTime() - withMarker[0];
});
TestUtil.runEventLoop();
assertTrue("Expected a text editor", part instanceof ITextEditor);
page.closeEditor(part, false);
TestUtil.runEventLoop();
// Be generous here; all this timing is approximate. Fail if the attempt
// with the marker takes more than twice as long. If the OverviewRuler
// is badly implemented, opening with the marker will take much longer.
assertTrue("Opening large file took too long: " + (withMarker[0] / 1000000.0f) + "ms with marker vs. "
+ (baseline[0] / 1000000.0f) + "ms without",
withMarker[0] / 2 <= baseline[0]);
}
}