/******************************************************************************* * 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.user.client.ui.AcceptsOneWidget; import com.google.gwtmockito.GwtMockitoTestRunner; import com.google.web.bindery.event.shared.EventBus; import org.eclipse.che.ide.api.constraints.Constraints; import org.eclipse.che.ide.api.editor.EditorPartPresenter; import org.eclipse.che.ide.api.event.EditorDirtyStateChangedEvent; import org.eclipse.che.ide.api.parts.PartPresenter; import org.eclipse.che.ide.api.parts.PartStackView; import org.eclipse.che.ide.api.parts.PropertyListener; import org.eclipse.che.ide.api.parts.base.BasePresenter; import org.eclipse.che.ide.menu.PartMenu; import org.eclipse.che.ide.part.widgets.TabItemFactory; import org.eclipse.che.ide.part.PartStackPresenter.PartStackEventHandler; import org.eclipse.che.ide.part.widgets.partbutton.PartButton; import org.eclipse.che.ide.workspace.WorkBenchPartController; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Matchers; import org.mockito.Mock; import org.vectomatic.dom.svg.ui.SVGResource; import java.util.List; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.CoreMatchers.sameInstance; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; /** * @author Roman Nikitenko * @author Dmitry Shnurenko */ @RunWith(GwtMockitoTestRunner.class) public class PartStackPresenterTest { private static final String SOME_TEXT = "someText"; private static final double PART_SIZE = 170; //constructor mocks @Mock private EventBus eventBus; @Mock private PartMenu partMenu; @Mock private WorkBenchPartController workBenchPartController; @Mock private PartsComparator partsComparator; @Mock private PartStackEventHandler partStackHandler; @Mock private TabItemFactory tabItemFactory; @Mock private PartStackView view; @Mock private PropertyListener propertyListener; //additional mocks @Mock private AcceptsOneWidget container; @Mock private PartPresenter partPresenter; @Mock private Constraints constraints; @Mock private BasePresenter basePresenter; @Mock private SVGResource resource; @Mock private PartButton partButton; @Mock private EditorPartPresenter editorPartPresenter; @Captor public ArgumentCaptor<PropertyListener> listenerCaptor; private PartStackPresenter presenter; @Before public void setUp() { when(basePresenter.getTitle()).thenReturn(SOME_TEXT); when(basePresenter.getTitleToolTip()).thenReturn(SOME_TEXT); when(basePresenter.getTitleImage()).thenReturn(resource); when(partPresenter.getTitle()).thenReturn(SOME_TEXT); when(partPresenter.getTitleToolTip()).thenReturn(SOME_TEXT); when(partPresenter.getTitleImage()).thenReturn(resource); when(tabItemFactory.createPartButton(SOME_TEXT)).thenReturn(partButton); when(partButton.setTooltip(SOME_TEXT)).thenReturn(partButton); when(partButton.setIcon(resource)).thenReturn(partButton); presenter = new PartStackPresenter(eventBus, partMenu, partStackHandler, tabItemFactory, partsComparator, view, workBenchPartController); } @Test public void partShouldBeUpdated() { presenter.addPart(partPresenter); verify(partPresenter).addPropertyListener(listenerCaptor.capture()); listenerCaptor.getValue().propertyChanged(partPresenter, PartPresenter.TITLE_PROPERTY); verify(view).updateTabItem(partPresenter); } @Test public void dirtyStateChangedEventShouldBeFired() { presenter.addPart(partPresenter); verify(partPresenter).addPropertyListener(listenerCaptor.capture()); listenerCaptor.getValue().propertyChanged(editorPartPresenter, EditorPartPresenter.PROP_DIRTY); verify(eventBus).fireEvent(Matchers.<EditorDirtyStateChangedEvent>anyObject()); } @Test public void goShouldBeActioned() { presenter.go(container); verify(container).setWidget(view); } @Test public void partShouldBeAddedWithoutConstraints() { presenter.addPart(basePresenter); verify(basePresenter).setPartStack(presenter); verify(tabItemFactory).createPartButton(SOME_TEXT); verify(partButton).setTooltip(SOME_TEXT); verify(partButton).setIcon(resource); verify(partButton).setDelegate(presenter); verify(view).addTab(partButton, basePresenter); verify(view).setTabPositions(Matchers.<List<PartPresenter>>anyObject()); verify(partStackHandler).onRequestFocus(presenter); } @Test public void partShouldBeSelectedIfItIsAddedTwice() { presenter.addPart(partPresenter); reset(view); presenter.addPart(partPresenter); verify(view).selectTab(partPresenter); } @Test public void partShouldBeContained() { presenter.addPart(basePresenter); boolean isContained = presenter.containsPart(basePresenter); assertThat(isContained, is(true)); } @Test public void activePartShouldBeReturned() { presenter.addPart(partPresenter); presenter.setActivePart(partPresenter); assertThat(presenter.getActivePart(), sameInstance(partPresenter)); } @Test public void focusShouldBeSet() { presenter.setFocus(true); verify(view).setFocus(true); } @Test public void activePartShouldNotBeSet() { presenter.setActivePart(partPresenter); assertThat(presenter.getActivePart(), nullValue()); } @Test public void partShouldBeHidden() { presenter.addPart(partPresenter); presenter.setActivePart(partPresenter); presenter.minimize(); verify(workBenchPartController).getSize(); verify(workBenchPartController).setSize(0); assertThat(presenter.getActivePart(), nullValue()); } @Test public void partShouldBeRemoved() { presenter.addPart(partPresenter); presenter.removePart(partPresenter); verify(view).removeTab(partPresenter); } @Test public void previousActivePartShouldNotBeDisplayedWhenActivePartIsNull() { presenter.openPreviousActivePart(); verify(view, never()).selectTab(partPresenter); } @Test public void previousPartShouldBeOpened() { presenter.addPart(partPresenter); presenter.setActivePart(partPresenter); reset(view); presenter.openPreviousActivePart(); verify(view).selectTab(partPresenter); } @Test public void requestShouldBeOnFocus() { presenter.onRequestFocus(); verify(partStackHandler).onRequestFocus(presenter); } @Test public void onTabShouldBeClicked() { reset(workBenchPartController); presenter.addPart(partPresenter); presenter.onTabClicked(partButton); verify(workBenchPartController).setHidden(false); verify(view).selectTab(partPresenter); } @Test public void shouldSetCurrentSizeForPart() { reset(workBenchPartController); presenter.addPart(partPresenter); when(workBenchPartController.getSize()).thenReturn(0d); presenter.onTabClicked(partButton); verify(workBenchPartController).setHidden(false); verify(view).selectTab(partPresenter); } @Test public void shouldSetInitialSizeForPart() { reset(workBenchPartController); presenter.addPart(partPresenter); when(workBenchPartController.getSize()).thenReturn(PART_SIZE); presenter.onTabClicked(partButton); verify(workBenchPartController).setHidden(false); verify(view).selectTab(partPresenter); } }