gt: 		SWTBotTree tree = getOrOpenView().bot().tree();
context: /*******************************************************************************
   * Copyright (c) 2010, 2013 SAP AG 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:
   *    Mathias Kinzler (SAP AG) - initial implementation
   *******************************************************************************/
  package org.eclipse.egit.ui.view.repositories;
  
  import static org.eclipse.swtbot.swt.finder.waits.Conditions.shellCloses;
  import static org.hamcrest.CoreMatchers.not;
  import static org.hamcrest.Matchers.hasItem;
  import static org.junit.Assert.assertEquals;
  import static org.junit.Assert.assertNotEquals;
  import static org.junit.Assert.assertNotNull;
  import static org.junit.Assert.assertNull;
  import static org.junit.Assert.assertThat;
  import static org.junit.Assert.assertTrue;
  
  import java.io.File;
  import java.util.Arrays;
  import java.util.List;
  
  import org.eclipse.core.resources.IProject;
  import org.eclipse.core.resources.IResource;
  import org.eclipse.core.resources.ResourcesPlugin;
  import org.eclipse.core.runtime.IAdaptable;
  import org.eclipse.egit.core.internal.Utils;
  import org.eclipse.egit.core.project.RepositoryMapping;
  import org.eclipse.egit.ui.Activator;
  import org.eclipse.egit.ui.JobFamilies;
  import org.eclipse.egit.ui.internal.UIText;
  import org.eclipse.egit.ui.test.ContextMenuHelper;
  import org.eclipse.egit.ui.test.TestUtil;
  import org.eclipse.jface.dialogs.IDialogConstants;
  import org.eclipse.jgit.lib.Constants;
  import org.eclipse.jgit.lib.Repository;
  import org.eclipse.osgi.util.NLS;
  import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
  import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
  import org.eclipse.swtbot.swt.finder.utils.TableCollection;
  import org.eclipse.swtbot.swt.finder.waits.Conditions;
  import org.eclipse.swtbot.swt.finder.widgets.SWTBotButton;
  import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
  import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
  import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem;
  import org.eclipse.ui.IPageLayout;
  import org.eclipse.ui.IWorkingSet;
  import org.eclipse.ui.IWorkingSetManager;
  import org.eclipse.ui.PlatformUI;
  import org.junit.Before;
  import org.junit.Ignore;
  import org.junit.Test;
  import org.junit.runner.RunWith;
  
  /**
   * SWTBot Tests for the Git Repositories View.
   *
   * <pre>
   * TODO
   * global copy and paste command
   * bare repository support including copy of path from workdir
   * copy path from file and folder
   * paste with empty and invalid path
   * create branch with selection not on a ref
   * tags altogether
   * fetch and push to configured remote
   * import wizard outside the "golden path"
   * </pre>
   */
  @RunWith(SWTBotJunit4ClassRunner.class)
  public class GitRepositoriesViewTest extends GitRepositoriesViewTestBase {
  
  	private File repositoryFile;
  
  	@Before
  	public void beforeClass() throws Exception {
  		setVerboseBranchMode(false);
  		repositoryFile = createProjectAndCommitToRepository();
  		Activator.getDefault().getRepositoryUtil().addConfiguredRepository(
  				repositoryFile);
  	}
  
  	/**
  	 * First level should have 5 children
  	 *
  	 * @throws Exception
  	 */
  	@Test
  	public void testExpandFirstLevel() throws Exception {
  		SWTBotTree tree = getOrOpenView().bot().tree();
  		SWTBotTreeItem item = myRepoViewUtil.getRootItem(tree, repositoryFile)
  				.expand();
  		SWTBotTreeItem[] children = item.getItems();
  		assertEquals("Wrong number of children", 5, children.length);
  	}
  
  	/**
  	 * Open (expand, file->editor, branch->checkout)
  	 *
  	 * @throws Exception
  	 */
  	@Test
  	public void testOpen() throws Exception {
  		// expand first level
  		SWTBotTree tree = getOrOpenView().bot().tree();
  		SWTBotTreeItem item = myRepoViewUtil.getRootItem(tree, repositoryFile);
  		item.collapse();
  		refreshAndWait();
  		item = myRepoViewUtil.getRootItem(tree, repositoryFile);
  		assertTrue("Item should not be expanded", !item.isExpanded());
  		item.doubleClick();
  		assertTrue("Item should be expanded", item.isExpanded());
  		// open a file in editor
  		item = myRepoViewUtil.getWorkdirItem(tree, repositoryFile).expand();
  		SWTBotTreeItem fileiItem = item.getNode(PROJ1).expand().getNode(FOLDER)
  				.expand().getNode(FILE1).select();
  		fileiItem.doubleClick();
  		assertTrue(bot.activeEditor().getTitle().equals(FILE1));
  		bot.activeEditor().close();
  		// open a branch (checkout)
  		checkoutWithDoubleClick(tree, "master");
  		String contentMaster = getTestFileContent();
  		checkoutWithDoubleClick(tree, "stable");
  		TestUtil.joinJobs(JobFamilies.CHECKOUT);
  		String contentStable = getTestFileContent();
  		assertNotEquals("Content of master and stable should differ",
  				contentMaster, contentStable);
  	}
  
  	private void checkoutWithDoubleClick(SWTBotTree tree, String branch)
  			throws Exception {
  		myRepoViewUtil.getLocalBranchesItem(tree, repositoryFile).expand()
  				.getNode(branch).doubleClick();
  		SWTBotShell shell = bot
  				.shell(UIText.RepositoriesView_CheckoutConfirmationTitle);
  		shell.bot().button(IDialogConstants.OK_LABEL).click();
  		refreshAndWait();
  	}
  
  	/**
  	 * Checks for the Symbolic Reference node
  	 *
  	 * @throws Exception
  	 */
  	@Test
  	public void testExpandSymbolicRef() throws Exception {
  		SWTBotTree tree = getOrOpenView().bot().tree();
  		SWTBotTreeItem item = myRepoViewUtil.getSymbolicRefsItem(tree,
  				repositoryFile).expand();
  		List<String> children = item.getNodes();
  		boolean found = false;
  		for (String child : children)
  			if (child.contains(Constants.HEAD))
  				found = true;
  		assertTrue(found);
  	}
  
  	/**
  	 * Checks the first level of the working directory
  	 *
  	 * @throws Exception
  	 */
  	@Test
  	public void testExpandWorkDir() throws Exception {
  		SWTBotTree tree = getOrOpenView().bot().tree();
  		Repository myRepository = lookupRepository(repositoryFile);
  		List<String> children = Arrays
  				.asList(myRepository.getWorkTree().list());
  		List<String> treeChildren = myRepoViewUtil.getWorkdirItem(tree,
  				repositoryFile).expand().getNodes();
  		assertTrue(children.containsAll(treeChildren)
  				&& treeChildren.containsAll(children));
  		myRepoViewUtil.getWorkdirItem(tree, repositoryFile).expand().getNode(
  				PROJ1).expand().getNode(FOLDER).expand().getNode(FILE1);
  	}
  
  	/**
  	 * Checks is some context menus are available, should be replaced with real
  	 * tests
  	 *
  	 * @throws Exception
  	 */
  	@Test
  	public void testContextMenuRepository() throws Exception {
  		// We just check if the dialogs open, the actual commit and import projects
  		// is tested elsewhere
  		SWTBotTree tree = getOrOpenView().bot().tree();
  		SWTBotTreeItem item = myRepoViewUtil.getRootItem(tree, repositoryFile);
  		item.select();
  		assertClickOpens(tree,
  				myUtil.getPluginLocalizedValue("RepoViewCommit.label"),
  				UIText.CommitDialog_CommitChanges);
  		assertClickOpens(tree,
  				myUtil.getPluginLocalizedValue("RepoViewImportProjects.label"),
  				NLS.bind(UIText.GitCreateProjectViaWizardWizard_WizardTitle,
  						repositoryFile));
  	}
  
  	/**
  	 * Show properties
  	 *
  	 * @throws Exception
  	 */
  	@Test
  	public void testShowProperties() throws Exception {
  		SWTBotTree tree = getOrOpenView().bot().tree();
  		SWTBotTreeItem item = myRepoViewUtil.getRootItem(tree, repositoryFile);
  		item.select();
  		ContextMenuHelper.clickContextMenuSync(tree,
  				myUtil.getPluginLocalizedValue("ShowIn"),
  				"Properties");
  		SWTBotView propertieView = bot.viewById(IPageLayout.ID_PROP_SHEET);
  		assertTrue(propertieView.isActive());
  	}
  
  	/**
  	 * Import wizard golden path test
  	 *
  	 * @throws Exception
  	 */
  	@Test
  	public void testImportWizard() throws Exception {
  		deleteAllProjects();
  		assertProjectExistence(PROJ1, false);
  		SWTBotTree tree = getOrOpenView().bot().tree();
  		SWTBotTreeItem item = myRepoViewUtil.getRootItem(tree, repositoryFile);
  		String wizardTitle = NLS.bind(
  				UIText.GitCreateProjectViaWizardWizard_WizardTitle,
  				repositoryFile.getPath());
  		// start wizard from root item
  		item.select();
  		ContextMenuHelper.clickContextMenu(tree, myUtil
  				.getPluginLocalizedValue("ImportProjectsCommand"));
  		SWTBotShell shell = bot.shell(wizardTitle);
  		bot.radio(UIText.GitSelectWizardPage_ImportExistingButton).click();
  		TableCollection selected = shell.bot().tree().selection();
  		String wizardNode = selected.get(0, 0);
  		// wizard directory should be working dir
  		assertEquals(myRepoViewUtil.getWorkdirItem(tree, repositoryFile)
  				.getText(), wizardNode);
  		shell.close();
  		// start wizard from .git
  		myRepoViewUtil.getWorkdirItem(tree, repositoryFile).expand().getNode(
  				Constants.DOT_GIT).select();
  		ContextMenuHelper.clickContextMenu(tree, myUtil
  				.getPluginLocalizedValue("ImportProjectsCommand"));
  		shell = bot.shell(wizardTitle);
  		selected = shell.bot().tree().selection();
  		wizardNode = selected.get(0, 0);
  		// wizard directory should be .git
  		assertEquals(Constants.DOT_GIT, wizardNode);
  		shell.bot().button(IDialogConstants.NEXT_LABEL).click();
  		shell.bot().label("Import Projects"); // wait for import projects page
  		assertEquals(0, shell.bot().tree().getAllItems().length);
  		shell.bot().button(IDialogConstants.BACK_LABEL).click();
  		// go to project with .project
  		shell.bot().tree().getAllItems()[0].getNode(PROJ1).select();
  		// next is 1
  		shell.bot().button(IDialogConstants.NEXT_LABEL).click();
  		bot.button(UIText.WizardProjectsImportPage_deselectAll).click();
  		assertEquals(1, shell.bot().tree().getAllItems().length);
  		assertTrue(!shell.bot().button(IDialogConstants.FINISH_LABEL)
  				.isEnabled());
  		shell.bot().button(UIText.WizardProjectsImportPage_selectAll).click();
  		assertTrue(shell.bot().button(IDialogConstants.FINISH_LABEL)
  				.isEnabled());
  		shell.bot().button(IDialogConstants.FINISH_LABEL).click();
  		bot.waitUntil(Conditions.shellCloses(shell));
  		assertProjectExistence(PROJ1, true);
  		assertProjectIsShared(PROJ1, true);
  	}
  
  	@Test
  	public void testImportWizardGeneralProject() throws Exception {
  		deleteAllProjects();
  		assertProjectExistence(PROJ2, false);
  		SWTBotTree tree = getOrOpenView().bot().tree();
  		String wizardTitle = NLS.bind(
  				UIText.GitCreateProjectViaWizardWizard_WizardTitle,
  				repositoryFile.getPath());
  		// start wizard from PROJ2
  		myRepoViewUtil.getWorkdirItem(tree, repositoryFile).expand().getNode(
  				PROJ2).select();
  		ContextMenuHelper.clickContextMenu(tree, myUtil
  				.getPluginLocalizedValue("ImportProjectsCommand"));
  		SWTBotShell shell = bot.shell(wizardTitle);
  		shell = bot.shell(wizardTitle);
  		// try import existing project first
  		bot.radio(UIText.GitSelectWizardPage_ImportExistingButton).click();
  		TableCollection selected = shell.bot().tree().selection();
  		String wizardNode = selected.get(0, 0);
  		// wizard directory should be PROJ2
  		assertEquals(PROJ2, wizardNode);
  		shell.bot().button(IDialogConstants.NEXT_LABEL).click();
  		shell.bot().text(" " + UIText.GitProjectsImportPage_NoProjectsMessage);
  		assertEquals(0, shell.bot().tree().getAllItems().length);
  		shell.bot().button(IDialogConstants.BACK_LABEL).click();
  		// import as general
  		shell.bot().radio(UIText.GitSelectWizardPage_ImportAsGeneralButton).click();
  		shell.bot().button(IDialogConstants.NEXT_LABEL).click();
  		assertEquals(PROJ2, shell.bot().textWithLabel(
  				UIText.GitCreateGeneralProjectPage_ProjectNameLabel).getText());
  		// switch to a sub directory and see if this is used
  		shell.bot().button(IDialogConstants.BACK_LABEL).click();
  		shell.bot().tree().getAllItems()[0].expand().getNode(PROJ2).expand()
  				.getNode(FOLDER).select();
  		shell.bot().button(IDialogConstants.NEXT_LABEL).click();
  		String name = shell.bot().textWithLabel(
  				UIText.GitCreateGeneralProjectPage_ProjectNameLabel).getText();
  		assertEquals(FOLDER, name);
  		shell.bot().button(IDialogConstants.BACK_LABEL).click();
  		// switch back to the root directory
  		shell.bot().tree().getAllItems()[0].expand().getNode(PROJ2).select();
  		shell.bot().button(IDialogConstants.NEXT_LABEL).click();
  		assertEquals(PROJ2, shell.bot().textWithLabel(
  				UIText.GitCreateGeneralProjectPage_ProjectNameLabel).getText());
  
  		shell.bot().button(IDialogConstants.FINISH_LABEL).click();
  		bot.waitUntil(Conditions.shellCloses(shell));
  		assertProjectExistence(PROJ2, true);
  		assertProjectIsShared(PROJ2, true);
  	}
  
  	@Test
  	public void testImportWizardGeneralProjectWithWorkingSet() throws Exception {
  		deleteAllProjects();
  		assertProjectExistence(PROJ1, false);
  		String workingSetName = "myWorkingSet";
  		removeWorkingSet(workingSetName);
  		SWTBotTree tree = getOrOpenView().bot().tree();
  		String wizardTitle = NLS.bind(
  				UIText.GitCreateProjectViaWizardWizard_WizardTitle,
  				repositoryFile.getPath());
  		// start wizard from PROJ1
  		myRepoViewUtil.getWorkdirItem(tree, repositoryFile).expand().getNode(
  				PROJ1).select();
  		ContextMenuHelper.clickContextMenu(tree, myUtil
  				.getPluginLocalizedValue("ImportProjectsCommand"));
  		SWTBotShell shell = bot.shell(wizardTitle);
  		shell = bot.shell(wizardTitle);
  		// try import existing project first
  		bot.radio(UIText.GitSelectWizardPage_ImportExistingButton).click();
  		SWTBotButton button = shell.bot().button(IDialogConstants.NEXT_LABEL);
  		// Set focus on the next button. If this is not done, Wizard Framework restores
  		// the focus to the "Import as &General Project" radio button. Setting the focus on
  		// the radio button selects the button and causes the test to fail.
  		// See also SWTBot Bug 337465
  		button.setFocus();
  		button.click();
  		shell.bot().text(UIText.WizardProjectsImportPage_ImportProjectsDescription);
  		shell.bot().tree().getAllItems()[0].check();
  		// add to working set
  		shell.bot().checkBox("Add project to working sets").select();
  		// create new working set
  		shell.bot().button("Select...").click();
  		SWTBotShell workingSetDialog = bot.shell("Select Working Sets");
  		workingSetDialog.bot().button("New...").click();
  		SWTBotShell newDialog = bot.shell("New Working Set");
  		newDialog.bot().table().select("Java");
  		newDialog.bot().button(IDialogConstants.NEXT_LABEL).click();
  		newDialog.bot().text(0).setText(workingSetName);
  		newDialog.bot().button(IDialogConstants.FINISH_LABEL).click();
  		workingSetDialog.bot().table().getTableItem(workingSetName).check();
  		workingSetDialog.bot().button(IDialogConstants.OK_LABEL).click();
  		shell.bot().button(IDialogConstants.FINISH_LABEL).click();
  		bot.waitUntil(Conditions.shellCloses(shell));
  		assertProjectExistence(PROJ1, true);
  		assertProjectInWorkingSet(workingSetName, PROJ1);
  		assertProjectIsShared(PROJ1, true);
  		removeWorkingSet(workingSetName);
  	}
  
  	private void assertProjectInWorkingSet(String workingSetName,
  			String projectName) {
  		IWorkingSetManager workingSetManager = PlatformUI.getWorkbench()
  				.getWorkingSetManager();
  		IWorkingSet workingSet = workingSetManager
  				.getWorkingSet(workingSetName);
  		IAdaptable[] elements = workingSet.getElements();
  		assertEquals("Wrong number of projects in working set", 1,
  				elements.length);
  		IProject project = Utils.getAdapter(elements[0], IProject.class);
  		assertEquals("Wrong project in working set", projectName, project
  				.getName());
  	}
  
  	private void removeWorkingSet(String name) {
  		IWorkingSetManager workingSetManager = PlatformUI.getWorkbench()
  				.getWorkingSetManager();
  		IWorkingSet workingSet = workingSetManager.getWorkingSet(name);
  		if (workingSet != null)
  			workingSetManager.removeWorkingSet(workingSet);
  	}
  
  	private void assertProjectIsShared(String projectName,
  			boolean shouldBeShared) {
  		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(
  				projectName);
  		RepositoryMapping mapping = RepositoryMapping.getMapping(project);
  		if (shouldBeShared) {
  			assertNotNull(mapping);
  			assertNotNull(mapping.getRepository());
  		} else
  			assertNull(mapping);
  	}
  
  	@Test
  	public void testLinkWithSelectionNavigator() throws Exception {
  		deleteAllProjects();
  		shareProjects(repositoryFile);
  