/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* 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:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.part;
import com.google.gwt.event.dom.client.ContextMenuEvent;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.gwt.user.client.ui.DeckLayoutPanel;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwtmockito.GwtMockitoTestRunner;
import org.eclipse.che.ide.api.parts.PartPresenter;
import org.eclipse.che.ide.api.parts.PartStackUIResources;
import org.eclipse.che.ide.api.parts.PartStackView;
import org.eclipse.che.ide.api.parts.PartStackView.ActionDelegate;
import org.eclipse.che.ide.api.parts.PartStackView.TabItem;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import java.util.Arrays;
import static org.eclipse.che.ide.api.parts.PartStackView.TabPosition.BELOW;
import static org.eclipse.che.ide.api.parts.PartStackView.TabPosition.LEFT;
import static org.eclipse.che.ide.api.parts.PartStackView.TabPosition.RIGHT;
import static org.mockito.Answers.RETURNS_DEEP_STUBS;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
/**
* @author Dmitry Shnurenko
* @author Valeriy Svydenko
*/
@RunWith(GwtMockitoTestRunner.class)
public class PartStackViewImplTest {
private static final String SOME_TEXT = "someText";
@Mock(answer = RETURNS_DEEP_STUBS)
PartStackUIResources resources;
@Mock
DeckLayoutPanel contentPanel;
@Mock
FlowPanel tabsPanel;
//additional mocks
@Mock
private MouseDownEvent event;
@Mock
private ContextMenuEvent contextMenuEvent;
@Mock
private ActionDelegate delegate;
@Mock
private TabItem tabItem;
@Mock
private TabItem tabItem2;
@Mock
private PartPresenter partPresenter;
@Mock
private PartPresenter partPresenter2;
@Mock
private IsWidget widget;
@Mock
private IsWidget widget2;
@Mock
private Widget focusedWidget;
@Mock
private Element element;
@Captor
private ArgumentCaptor<AcceptsOneWidget> contentCaptor;
private PartStackViewImpl view;
@Before
public void setUp() {
when(focusedWidget.getElement()).thenReturn(element);
when(tabItem.getView()).thenReturn(widget);
when(partPresenter.getView()).thenReturn(widget);
when(resources.partStackCss().idePartStackContent()).thenReturn(SOME_TEXT);
view = new PartStackViewImpl(resources, contentPanel, BELOW, tabsPanel);
view.setDelegate(delegate);
}
@Test
public void constructorShouldBeVerifiedInPositionBelow() {
verify(contentPanel).setStyleName(SOME_TEXT);
verifyNoMoreInteractions(tabsPanel);
}
@Test
public void constructorShouldBeVerifiedInPositionLeft() {
when(resources.partStackCss().idePartStackContent()).thenReturn(SOME_TEXT);
reset(contentPanel);
reset(tabsPanel);
view = new PartStackViewImpl(resources, contentPanel, LEFT, tabsPanel);
verify(contentPanel).setStyleName(SOME_TEXT);
}
@Test
public void constructorShouldBeVerifiedInPositionRight() {
when(resources.partStackCss().idePartStackContent()).thenReturn(SOME_TEXT);
reset(contentPanel);
reset(tabsPanel);
view = new PartStackViewImpl(resources, contentPanel, RIGHT, tabsPanel);
verify(contentPanel).setStyleName(SOME_TEXT);
}
@Test
public void onPartStackMouseShouldBeDown() {
view.onMouseDown(event);
verify(delegate).onRequestFocus();
}
@Test
public void onPartStackContextMenuShouldBeClicked() {
view.onContextMenu(contextMenuEvent);
verify(delegate).onRequestFocus();
}
@Test
public void tabShouldBeAdded() {
view.addTab(tabItem, partPresenter);
verify(tabItem).setTabPosition(BELOW);
verify(tabsPanel).add(widget);
verify(partPresenter).go(contentCaptor.capture());
contentCaptor.getValue().setWidget(widget);
verify(contentPanel).add(widget);
}
@Test
public void tabShouldBeRemoved() {
view.addTab(tabItem, partPresenter);
view.removeTab(partPresenter);
verify(tabsPanel).remove(widget);
verify(contentPanel).remove(widget);
}
@Test
public void tabPositionsShouldBeSet() {
view.addTab(tabItem, partPresenter);
view.addTab(tabItem2, partPresenter2);
when(partPresenter2.getView()).thenReturn(widget2);
view.setTabPositions(Arrays.asList(partPresenter, partPresenter2));
verify(tabsPanel).insert(widget, 0);
}
@Test
public void tabShouldBeSelectedWhenContentExist() {
view.addTab(tabItem, partPresenter);
view.selectTab(partPresenter);
verify(contentPanel).getWidgetIndex(widget);
verify(contentPanel).showWidget(0);
verify(tabItem).select();
verify(delegate).onRequestFocus();
verify(tabItem).setTabPosition((PartStackView.TabPosition)any());
}
@Test
public void tabShouldBeSelectedWhenContentIsAbsent() {
view.addTab(tabItem, partPresenter);
view.selectTab(partPresenter);
verify(contentPanel).getWidgetIndex(widget);
verify(partPresenter).go(contentCaptor.capture());
verify(contentPanel).showWidget(0);
verify(tabItem).select();
verify(delegate).onRequestFocus();
}
@Test
public void partShouldBeFocused() {
when(contentPanel.getVisibleWidget()).thenReturn(focusedWidget);
view.setFocus(true);
verify(contentPanel).getVisibleWidget();
verify(element).setAttribute("focused", "");
}
@Test
public void partShouldNotBeFocused() {
when(contentPanel.getVisibleWidget()).thenReturn(focusedWidget);
view.setFocus(false);
verify(contentPanel).getVisibleWidget();
verify(focusedWidget, never()).getElement();
}
@Test
public void tabItemShouldBeUpdated() {
view.addTab(tabItem, partPresenter);
view.updateTabItem(partPresenter);
verify(tabItem).update(partPresenter);
}
}