/*******************************************************************************
* Copyright (c) 2010 Red Hat Inc. 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
*******************************************************************************/
package org.eclipse.linuxtools.changelog.ui.tests.swtbot;
import static org.eclipse.swtbot.eclipse.finder.matchers.WidgetMatcherFactory.withPartName;
import static org.hamcrest.core.AllOf.allOf;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.bindings.keys.KeyStroke;
import org.eclipse.linuxtools.changelog.ui.tests.utils.ProjectExplorer;
import org.eclipse.linuxtools.changelog.ui.tests.utils.ProjectExplorerTreeItemAppearsCondition;
import org.eclipse.linuxtools.changelog.ui.tests.utils.SVNProject;
import org.eclipse.linuxtools.changelog.ui.tests.utils.SVNProjectCreatedCondition;
import org.eclipse.swtbot.eclipse.finder.waits.Conditions;
import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotEclipseEditor;
import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotEditor;
import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
import org.eclipse.swtbot.swt.finder.keyboard.Keystrokes;
import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem;
import org.eclipse.ui.IEditorReference;
import org.hamcrest.Matcher;
import org.hamcrest.core.IsInstanceOf;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
/**
*
* UI tests for "Prepare ChangeLog" (CTRL+ALT+P) and the clipboard magic
* (CTRL+ALT+V).
*
*/
@Ignore
public class PrepareChangelogSWTBotTest extends AbstractSWTBotTest {
private SVNProject subversionProject;
private IProject project;
// The name of the test project, we create
private final String PROJECT_NAME = "org.eclipse.linuxtools.changelog.tests";
// An available SVN repo
private final String SVN_PROJECT_URL = "svn://dev.eclipse.org/svnroot/technology/" +
"org.eclipse.linuxtools/changelog/trunk";
@Before
public void setUp() throws Exception {
// Do an SVN checkout of the changelog.tests plugin
subversionProject = new SVNProject(bot);
project = subversionProject.setProjectName(PROJECT_NAME).setRepoURL(SVN_PROJECT_URL).checkoutProject();
bot.waitUntil(new SVNProjectCreatedCondition(PROJECT_NAME));
ProjectExplorer.openView();
}
@After
public void tearDown() throws Exception {
this.project.delete(true, null);
// discard existing repo from previous test runs
try {
subversionProject.discardRepositoryLocation();
} catch (WidgetNotFoundException e) {
// Ignore case if repository not existing
}
}
/**
* Basic prepare changelog test.
*
* @throws Exception
*/
@Test
@Ignore
public void canPrepareChangeLog() throws Exception {
// Find manifest file
IResource manifest = project.findMember(new Path("/META-INF/MANIFEST.MF"));
assertNotNull(manifest);
// delete it
manifest.delete(true, null);
project.refreshLocal(IResource.DEPTH_INFINITE, null);
// select ChangeLog file
String teamProviderString = "[changelog/trunk/" + PROJECT_NAME + "]";
SWTBotTreeItem projectItem = ProjectExplorer.expandProject(projectExplorerViewTree, PROJECT_NAME, teamProviderString);
SWTBotTreeItem changeLogItem = ProjectExplorer.getProjectItem(projectItem, "ChangeLog");
changeLogItem.select();
bot.menu("Prepare ChangeLog").click(); // Should be unique
long oldTimeout = SWTBotPreferences.TIMEOUT;
SWTBotPreferences.TIMEOUT = 3 * 5000;
// Wait for ChangeLog editor to open
Matcher<IEditorReference> editorMatcher = allOf(
IsInstanceOf.instanceOf(IEditorReference.class),
withPartName("ChangeLog")
);
bot.waitUntil(Conditions.waitForEditor(editorMatcher));
SWTBotPreferences.TIMEOUT = oldTimeout;
SWTBotEditor swtBoteditor = bot.activeEditor();
swtBoteditor.save(); // save to avoid "save changes"-pop-up
assertEquals("ChangeLog", swtBoteditor.getTitle());
SWTBotEclipseEditor eclipseEditor = swtBoteditor.toTextEditor();
// make sure expected entry has been added.
assertTrue(matchHead(eclipseEditor.getText(), "\t* META-INF/MANIFEST.MF:", 3));
}
/**
* Should be able to save changes to ChangeLog file in clipboard.
* Tests CTRL + ALT + V functionality.
*
* @throws Exception
*/
@Test
@Ignore
public void canPrepareChangeLogAndSaveChangesInChangeLogFileToClipboard() throws Exception {
// Find manifest file
IResource manifest = project.findMember(new Path("/META-INF/MANIFEST.MF"));
assertNotNull(manifest);
// delete it
manifest.delete(true, null);
project.refreshLocal(IResource.DEPTH_INFINITE, null);
// select ChangeLog file
String teamProviderString = "[changelog/trunk/" + PROJECT_NAME + "]";
SWTBotTreeItem projectItem = ProjectExplorer.expandProject(projectExplorerViewTree, PROJECT_NAME, teamProviderString);
long oldTimeout = SWTBotPreferences.TIMEOUT;
SWTBotPreferences.TIMEOUT = 5000;
bot.waitUntil(new ProjectExplorerTreeItemAppearsCondition(projectExplorerViewTree, PROJECT_NAME, teamProviderString, "ChangeLog"));
SWTBotPreferences.TIMEOUT = oldTimeout;
SWTBotTreeItem changeLogItem = ProjectExplorer.getProjectItem(projectItem, "ChangeLog");
changeLogItem.select();
// CTRL + ALT + P
bot.activeShell().pressShortcut(Keystrokes.CTRL, Keystrokes.ALT, KeyStroke.getInstance("P"));
oldTimeout = SWTBotPreferences.TIMEOUT;
SWTBotPreferences.TIMEOUT = 3 * 5000;
// Wait for ChangeLog editor to open
Matcher<IEditorReference> editorMatcher = allOf(
IsInstanceOf.instanceOf(IEditorReference.class),
withPartName("ChangeLog")
);
bot.waitUntil(Conditions.waitForEditor(editorMatcher));
SWTBotEditor swtBoteditor = bot.activeEditor();
swtBoteditor.save(); // save to avoid "save changes"-pop-up
assertEquals("ChangeLog", swtBoteditor.getTitle());
SWTBotEclipseEditor eclipseEditor = swtBoteditor.toTextEditor();
// make sure expected entry has been added.
assertTrue(matchHead(eclipseEditor.getText(), "\t* META-INF/MANIFEST.MF:", 3));
eclipseEditor.selectLine(0); // select first line
final String expectedFirstLineContent = eclipseEditor.getSelection();
// save changes to clipboard: CTRL + ALT + V
eclipseEditor.pressShortcut(Keystrokes.CTRL, Keystrokes.ALT, KeyStroke.getInstance("V"));
// create and open a new file for pasting
String pasteFile = "newFile";
IFile newFile = project.getFile(new Path(pasteFile));
newFile.create(new ByteArrayInputStream("".getBytes()) /* empty content */, false, null);
project.refreshLocal(IResource.DEPTH_INFINITE, null);
assertNotNull(project.findMember(new Path(pasteFile)));
ProjectExplorer.expandProject(projectExplorerViewTree, PROJECT_NAME,
teamProviderString).expandNode(pasteFile).select().doubleClick();
//bot.activeShell().pressShortcut(Keystrokes.F3); // open file
editorMatcher = allOf(
IsInstanceOf.instanceOf(IEditorReference.class),
withPartName(pasteFile)
);
bot.waitUntil(Conditions.waitForEditor(editorMatcher));
SWTBotPreferences.TIMEOUT = oldTimeout;
swtBoteditor = bot.activeEditor();
assertEquals(pasteFile, swtBoteditor.getTitle());
eclipseEditor = swtBoteditor.toTextEditor();
// go to beginning of editor
eclipseEditor.selectRange(0, 0, 0);
// paste
eclipseEditor.pressShortcut(Keystrokes.CTRL, KeyStroke.getInstance("V"));
swtBoteditor.save();
// make sure proper content was pasted
assertTrue(matchHead(eclipseEditor.getText(), "\t* META-INF/MANIFEST.MF:", 3));
eclipseEditor.selectLine(0); // select first line
final String actualFirstLineContent = eclipseEditor.getSelection();
assertEquals(expectedFirstLineContent, actualFirstLineContent);
}
/**
* Determine if first <code>i</code> lines in <code>text</code> contain
* the string <code>matchText</code>.
*
* @param text The text to compare to.
* @param matchText The match string to look for.
* @param i The number of lines in text to consider.
* @return
*
* @throws IllegalArgumentException if <code>i</code> is invalid.
*/
private boolean matchHead(String text, String matchText, int i) throws IllegalArgumentException {
if ( i < 0 ) {
throw new IllegalArgumentException();
}
String[] lines = text.split("\n");
if ( lines.length < i ) {
throw new IllegalArgumentException();
}
// arguments appear to be good
for (int j = 0; j < i; j++) {
if (lines[j].contains(matchText)) {
return true;
}
}
return false; // no match
}
}