/******************************************************************************
* Copyright (c) 2014 Tasktop Technologies.
* 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:
* Tomasz Zarna (Tasktop) - initial API and implementation
*****************************************************************************/
package org.eclipse.egit.ui.internal.actions;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.File;
import org.eclipse.core.expressions.EvaluationContext;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.egit.ui.common.LocalRepositoryTestCase;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.ISources;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.services.IServiceLocator;
import org.junit.Before;
import org.junit.Test;
public class SwitchToMenuTest extends LocalRepositoryTestCase {
private SwitchToMenu switchToMenu;
private IHandlerService handlerService;
@Before
public void setUp() throws Exception {
switchToMenu = new SwitchToMenu();
handlerService = mock(IHandlerService.class);
IServiceLocator serviceLocator = mock(IServiceLocator.class);
when(serviceLocator.getService(IHandlerService.class)).thenReturn(
handlerService);
switchToMenu.initialize(serviceLocator);
}
@Test
public void emptySelection() {
mockSelection(new EmptySelection());
MenuItem[] items = fillMenu();
assertEquals(0, items.length);
}
@Test
public void selectionNotAdaptableToRepository() {
mockSelection(
new StructuredSelection(new Object()));
MenuItem[] items = fillMenu();
assertEquals(0, items.length);
}
@Test
public void selectionWithProj1() throws Exception {
createProjectAndCommitToRepository();
selectionWithProj1Common();
}
@Test
public void selectionWithProj1AndReflog() throws Exception {
File gitDir = createProjectAndCommitToRepository();
// create additional reflog entries
try (Git git = new Git(lookupRepository(gitDir))) {
git.checkout().setName("stable").call();
git.checkout().setName("master").call();
}
selectionWithProj1Common();
// delete reflog again to not confuse other tests
new File(gitDir, Constants.LOGS + "/" + Constants.HEAD).delete();
}
private void selectionWithProj1Common() {
IProject project = ResourcesPlugin.getWorkspace().getRoot()
.getProject(PROJ1);
mockSelection(new StructuredSelection(project));
MenuItem[] items = fillMenu();
assertEquals(6, items.length);
assertTextEquals(UIText.SwitchToMenu_NewBranchMenuLabel, items[0]);
assertStyleEquals(SWT.SEPARATOR, items[1]);
assertTextEquals("master", items[2]);
assertTextEquals("stable", items[3]);
assertStyleEquals(SWT.SEPARATOR, items[4]);
assertTextEquals(UIText.SwitchToMenu_OtherMenuLabel, items[5]);
}
@Test
public void selectionWithRepositoryHavingOver20Branches() throws Exception {
Repository repo = lookupRepository(createProjectAndCommitToRepository());
for (int i = 0; i < SwitchToMenu.MAX_NUM_MENU_ENTRIES; i++) {
createBranch(repo, "refs/heads/change/" + i);
}
IProject project = ResourcesPlugin.getWorkspace().getRoot()
.getProject(PROJ1);
mockSelection(new StructuredSelection(project));
MenuItem[] items = fillMenu();
assertEquals(24, items.length);
assertTextEquals(UIText.SwitchToMenu_NewBranchMenuLabel, items[0]);
assertStyleEquals(SWT.SEPARATOR, items[1]);
assertTextEquals("change/0", items[2]);
assertTextEquals("change/1", items[3]);
assertTextEquals("change/2", items[4]);
assertTextEquals("change/3", items[5]);
assertTextEquals("change/4", items[6]);
assertTextEquals("change/5", items[7]);
assertTextEquals("change/6", items[8]);
assertTextEquals("change/7", items[9]);
assertTextEquals("change/8", items[10]);
assertTextEquals("change/9", items[11]);
assertTextEquals("change/10", items[12]);
assertTextEquals("change/11", items[13]);
assertTextEquals("change/12", items[14]);
assertTextEquals("change/13", items[15]);
assertTextEquals("change/14", items[16]);
assertTextEquals("change/15", items[17]);
assertTextEquals("change/16", items[18]);
assertTextEquals("change/17", items[19]);
assertTextEquals("change/18", items[20]);
assertTextEquals("change/19", items[21]);
// "master" and "stable" didn't make it
assertStyleEquals(SWT.SEPARATOR, items[22]);
assertTextEquals(UIText.SwitchToMenu_OtherMenuLabel, items[23]);
}
private void mockSelection(ISelection selection) {
EvaluationContext context = new EvaluationContext(null, new Object());
context.addVariable(ISources.ACTIVE_MENU_SELECTION_NAME, selection);
when(handlerService.getCurrentState()).thenReturn(context);
}
private MenuItem[] fillMenu() {
final MenuItem[][] items = new MenuItem[1][];
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
Menu menu = new Menu(new Shell(Display.getDefault()));
switchToMenu.fill(menu, 0 /* index */);
items[0] = menu.getItems();
}
});
return items[0];
}
private static class EmptySelection implements ISelection {
@Override
public boolean isEmpty() {
return true;
}
}
private static void assertTextEquals(final String expectedText,
final MenuItem item) {
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
assertEquals(expectedText, item.getText());
}
});
}
private static void assertStyleEquals(final int expectedStyle,
final MenuItem item) {
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
assertEquals(expectedStyle, item.getStyle());
}
});
}
}