/******************************************************************************* * Copyright (C) 2012, 2013 IBM Corporation 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.egit.ui.test.team.actions; import static org.junit.Assert.assertEquals; import java.io.ByteArrayInputStream; import java.io.File; import java.net.URI; import java.util.Arrays; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.egit.core.internal.CoreText; import org.eclipse.egit.core.op.CommitOperation; import org.eclipse.egit.ui.common.CreatePatchWizard; import org.eclipse.egit.ui.common.CreatePatchWizard.NoChangesPopup; import org.eclipse.egit.ui.common.LocalRepositoryTestCase; import org.eclipse.egit.ui.internal.UIText; import org.eclipse.egit.ui.test.TestUtil; import org.eclipse.jgit.util.FileUtils; import org.eclipse.jgit.util.IO; import org.eclipse.swt.dnd.Clipboard; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.widgets.Display; import org.eclipse.swtbot.swt.finder.waits.Conditions; import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell; import org.junit.Before; import org.junit.Test; /** * Tests for the Team->Create Patch action */ public class CreatePatchActionTest extends LocalRepositoryTestCase { private static final String PATCH_FILE = "test.patch"; private static final String EXPECTED_PATCH_CONTENT = // "diff --git a/GeneralProject/folder/test.txt b/GeneralProject/folder/test.txt\n" + "index e256dbb..d070357 100644\n" + "--- a/GeneralProject/folder/test.txt\n" + "+++ b/GeneralProject/folder/test.txt\n" + "@@ -1 +1 @@\n" + "-oldContent\n" + "\\ No newline at end of file\n" + "+newContent\n" // + "\\ No newline at end of file\n"; private static final String EXPECTED_WORKSPACE_PATCH_CONTENT = // "### Eclipse Workspace Patch 1.0\n" // + "#P " + PROJ1 + "\n" + "diff --git folder/test.txt folder/test.txt\n" // + "index e256dbb..d070357 100644\n" // + "--- folder/test.txt\n" // + "+++ folder/test.txt\n" // + "@@ -1 +1 @@\n" // + "-oldContent\n" // + "\\ No newline at end of file\n" // + "+newContent\n" // + "\\ No newline at end of file\n" + "diff --git folder/test2.txt folder/test2.txt\n" + "deleted file mode 100644\n" // + "index 8f4e8d3..0000000\n" // + "--- folder/test2.txt\n" // + "+++ /dev/null\n" // + "@@ -1 +0,0 @@\n" // + "-Some more content\n" // + "\\ No newline at end of file\n" // + "#P " + PROJ2 + "\n" // + "diff --git test.txt test.txt\n" // + "new file mode 100644\n" // + "index 0000000..dbe9dba\n" // + "--- /dev/null\n" // + "+++ test.txt\n" // + "@@ -0,0 +1 @@\n" // + "+Hello, world\n" // + "\\ No newline at end of file\n"; @Before public void setup() throws Exception { createProjectAndCommitToRepository(); IFile[] commitables = getAllFiles(); CommitOperation cop = new CommitOperation(commitables, Arrays.asList(commitables), TestUtil.TESTAUTHOR, TestUtil.TESTCOMMITTER, "Initial commit"); cop.setAmending(true); cop.execute(null); } private static IFile[] getAllFiles() { IProject firstProject = ResourcesPlugin.getWorkspace().getRoot() .getProject(PROJ1); IProject secondProject = ResourcesPlugin.getWorkspace().getRoot() .getProject(PROJ2); IFolder folder = firstProject.getFolder(FOLDER); IFile textFile = folder.getFile(FILE1); IFile textFile2 = folder.getFile(FILE2); IFolder secondfolder = secondProject.getFolder(FOLDER); IFile secondtextFile = secondfolder.getFile(FILE1); IFile secondtextFile2 = secondfolder.getFile(FILE2); return new IFile[] { firstProject.getFile(".project"), textFile, textFile2, secondProject.getFile(".project"), secondtextFile, secondtextFile2 }; } @Test public void testNoChanges() throws Exception { CreatePatchWizard.openWizard(PROJ1); NoChangesPopup popup = new NoChangesPopup( bot.shell(UIText.GitCreatePatchAction_cannotCreatePatch)); popup.cancelPopup(); } @Test public void testNoChangesInSelection() throws Exception { IFile fileToStage = touch(PROJ1, "folder/test.txt", "new content in " + PROJ1); stage(fileToStage); touch(PROJ2, "folder/test.txt", "new content in " + PROJ2); CreatePatchWizard.openWizard(PROJ1); NoChangesPopup popup = new NoChangesPopup( bot.shell(UIText.GitCreatePatchAction_cannotCreatePatch)); popup.cancelPopup(); } @Test public void testClipboard() throws Exception { touchAndSubmit("oldContent", null); touch("newContent"); CreatePatchWizard createPatchWizard = openCreatePatchWizard(); LocationPage locationPage = createPatchWizard.getLocationPage(); locationPage.selectClipboard(); createPatchWizard.finishWithNoneFormat(); bot.waitUntil(Conditions.shellCloses(createPatchWizard.getShell())); assertClipboard(EXPECTED_PATCH_CONTENT); } @Test public void testFilesystem() throws Exception { touchAndSubmit("oldContent", null); touch("newContent"); CreatePatchWizard createPatchWizard = openCreatePatchWizard(); LocationPage locationPage = createPatchWizard.getLocationPage(); IProject project = ResourcesPlugin.getWorkspace().getRoot() .getProject(PROJ1); File patch = new File(project.getLocation().toFile(), PATCH_FILE); locationPage.selectFilesystem(patch.toString()); createPatchWizard.finishWithNoneFormat(); bot.waitUntil(Conditions.shellCloses(createPatchWizard.getShell())); byte[] bytes = IO.readFully(patch); String patchContent = new String(bytes, "UTF-8"); assertEquals(EXPECTED_PATCH_CONTENT, patchContent); } @Test public void testWorkspace() throws Exception { touchAndSubmit("oldContent", null); touch("newContent"); CreatePatchWizard createPatchWizard = openCreatePatchWizard(); LocationPage locationPage = createPatchWizard.getLocationPage(); locationPage.selectWorkspace("/" + PROJ1 + "/" + PATCH_FILE); createPatchWizard.finishWithNoneFormat(); bot.waitUntil(Conditions.shellCloses(createPatchWizard.getShell())); IFile patch = ResourcesPlugin.getWorkspace().getRoot() .getProject(PROJ1).getFile(PATCH_FILE); byte[] bytes = IO.readFully(patch.getLocation().toFile()); String patchContent = new String(bytes, patch.getCharset()); assertEquals(EXPECTED_PATCH_CONTENT, patchContent); } @Test public void testWorkspaceHeader() throws Exception { touchAndSubmit("oldContent", null); touch("newContent"); URI fileLocationUri = ResourcesPlugin.getWorkspace().getRoot() .getProject(PROJ1).getFolder(FOLDER).getFile(FILE2) .getLocationURI(); FileUtils.delete(new File(fileLocationUri)); IProject secondProject = ResourcesPlugin.getWorkspace().getRoot() .getProject(PROJ2); IFile newFile = secondProject.getFile(FILE1); newFile.create( new ByteArrayInputStream("Hello, world".getBytes(secondProject .getDefaultCharset())), false, null); CreatePatchWizard createPatchWizard = openCreatePatchWizard(); LocationPage locationPage = createPatchWizard.getLocationPage(); locationPage.selectWorkspace("/" + PROJ1 + "/" + PATCH_FILE); OptionsPage optionsPage = locationPage.nextToOptionsPage(); optionsPage.setFormat(CoreText.DiffHeaderFormat_Workspace); createPatchWizard.finish(); bot.waitUntil(Conditions.shellCloses(createPatchWizard.getShell())); IFile patch = ResourcesPlugin.getWorkspace().getRoot() .getProject(PROJ1).getFile(PATCH_FILE); byte[] bytes = IO.readFully(patch.getLocation().toFile()); String patchContent = new String(bytes, patch.getCharset()); assertEquals(EXPECTED_WORKSPACE_PATCH_CONTENT, patchContent); } private CreatePatchWizard openCreatePatchWizard() throws Exception { CreatePatchWizard.openWizard(PROJ1, PROJ2); SWTBotShell shell = bot .shell(UIText.GitCreatePatchWizard_CreatePatchTitle); return new CreatePatchWizard(shell); } private static void assertClipboard(final String expected) { final String[] value = { null }; Display.getDefault().syncExec(new Runnable() { @Override public void run() { Clipboard clp = new Clipboard(Display.getCurrent()); value[0] = (String) clp.getContents(TextTransfer.getInstance()); clp.dispose(); } }); assertEquals(expected, value[0]); } }