/******************************************************************************* * Copyright (c) 2012-2015 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.editor; import junit.framework.TestCase; import org.eclipse.che.ide.Resources; import org.eclipse.che.ide.api.editor.EditorPartPresenter; 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.PropertyListener; import org.eclipse.che.ide.part.editor.EditorPartStackPresenter; import org.eclipse.che.ide.part.editor.EditorPartStackView; import org.eclipse.che.ide.texteditor.openedfiles.ListOpenedFilesPresenter; import com.google.gwt.dom.client.Element; import com.google.gwt.event.logical.shared.CloseHandler; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.AcceptsOneWidget; import com.google.gwtmockito.GwtMockitoTestRunner; import com.google.web.bindery.event.shared.EventBus; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.Mockito; import org.vectomatic.dom.svg.OMSVGSVGElement; import org.vectomatic.dom.svg.ui.SVGImage; import org.vectomatic.dom.svg.ui.SVGResource; import java.util.List; import static junit.framework.TestCase.assertTrue; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; /** * @author Alexander Andrienko */ @RunWith(GwtMockitoTestRunner.class) public class EditorPartStackPresenterTest { @Mock private PartStackUIResources partStackUIResources; @Mock private Resources resources; @Mock private EditorPartPresenter part1; @Mock private EditorPartPresenter part2; @Mock private EditorPartPresenter part3; @Mock private List<PartPresenter> parts; @Mock private PartStackView.TabItem item; @Mock private PartStackView.TabItem item2; @Mock private PartStackView.TabItem item3; /* * Variables for constructor */ @Mock private EditorPartStackView view; @Mock private EventBus eventBus; @Mock private EditorPartStackPresenter.PartStackEventHandler partStackEventHandler; @Mock private ListOpenedFilesPresenter listOpenedFilesPresenter; @Mock private PartStackView.ActionDelegate actionDelegate; @Mock private AsyncCallback asyncCallback; @Mock private SVGImage svgImage; @Mock private SVGResource titleSVGResource; @Mock private OMSVGSVGElement svgElem; private String partTitle1 = "someTitle"; private String toolTip1 = "someToolTipe"; private EditorPartStackPresenter presenter; @Before public void setUp() { presenter = new EditorPartStackPresenter(view, eventBus, partStackEventHandler, listOpenedFilesPresenter); doReturn(svgElem).when(titleSVGResource).getSvg(); doReturn(Mockito.mock(Element.class)).when(svgElem).getElement(); //define behavior part1 doReturn(titleSVGResource).when(part1).getTitleSVGImage(); doReturn(svgImage).when(part1).decorateIcon(any(SVGImage.class)); doReturn(partTitle1).when(part1).getTitle(); doReturn(toolTip1).when(part1).getTitleToolTip(); //define behavior part2 doReturn(titleSVGResource).when(part2).getTitleSVGImage(); doReturn(svgImage).when(part2).decorateIcon(any(SVGImage.class)); doReturn(partTitle1).when(part2).getTitle(); doReturn(toolTip1).when(part2).getTitleToolTip(); //define behavior part3 doReturn(titleSVGResource).when(part3).getTitleSVGImage(); doReturn(svgImage).when(part3).decorateIcon(any(SVGImage.class)); doReturn(partTitle1).when(part3).getTitle(); doReturn(toolTip1).when(part3).getTitleToolTip(); doReturn(item).when(view).addTab(svgImage, partTitle1, toolTip1, null, true); } @Test public void closeTabTest() { presenter.addPart(part1); presenter.addPart(part2); presenter.addPart(part3); assertEquals(presenter.getActivePart(), part3); assertTrue(presenter.getNumberOfParts() == 3); presenter.close(part1); //check closing first tab ArgumentCaptor<AsyncCallback> asyncRequestCallbackCaptor = ArgumentCaptor.forClass(AsyncCallback.class); verify(part1).onClose(asyncRequestCallbackCaptor.capture()); AsyncCallback callback1 = asyncRequestCallbackCaptor.getValue(); callback1.onSuccess(null); verify(view).removeTab(anyInt()); assertTrue(presenter.getNumberOfParts() == 2); verify(part1).removePropertyListener(any(PropertyListener.class)); // verify(partStackEventHandler, never()).onActivePartChanged(part2); } @Test public void closeAllTabsTest() throws Throwable { presenter.addPart(part1); presenter.addPart(part2); presenter.addPart(part3); assertEquals(presenter.getActivePart(), part3); assertTrue(presenter.getNumberOfParts() == 3); presenter.close(part1); //check closing first tab ArgumentCaptor<AsyncCallback> asyncRequestCallbackCaptor = ArgumentCaptor.forClass(AsyncCallback.class); verify(part1).onClose(asyncRequestCallbackCaptor.capture()); AsyncCallback callback1 = asyncRequestCallbackCaptor.getValue(); callback1.onSuccess(null); verify(view).removeTab(anyInt()); assertTrue(presenter.getNumberOfParts() == 2); verify(part1).removePropertyListener(any(PropertyListener.class)); // verify(partStackEventHandler, never()).onActivePartChanged(part2); } @Test public void setNewActivePartTest() { presenter.addPart(part1); presenter.setActivePart(part1); TestCase.assertEquals(presenter.getActivePart(), part1); verify(view).setActiveTab(0); assertEquals(presenter.getActivePart(), part1); } @Test public void addFirstPartWithoutIconTest() { doReturn(null).when(part1).decorateIcon(any(SVGImage.class)); doReturn(item).when(view).addTab(null, partTitle1, toolTip1, null, true); int amountOfPartsBefore = presenter.getNumberOfParts(); presenter.addPart(part1); int amountOfPartsAfter = presenter.getNumberOfParts(); assertTrue(++amountOfPartsBefore == amountOfPartsAfter); verify(part1).addPropertyListener(any(PropertyListener.class)); verify(part1).getTitleSVGImage(); verify(view).addTab(null, partTitle1, toolTip1, null, true); // verify(item).addClickHandler(any(ClickHandler.class)); verify(item).addCloseHandler(any(CloseHandler.class)); verify(part1).go(any(AcceptsOneWidget.class)); assertEquals(presenter.getActivePart(), part1); //because this is first tab verify(view).setActiveTab(eq(0)); verify(partStackEventHandler).onRequestFocus(eq(presenter)); } @Test public void addFirstPartWithIconTest() { presenter.addPart(part1); verify(part1).getTitleSVGImage(); verify(part1).decorateIcon(any(SVGImage.class)); } @Test public void addTabWhichIsAlreadyExistTest() { presenter.addPart(part1); presenter.addPart(part2); reset(partStackEventHandler); reset(view); reset(part1); presenter.addPart(part1); assertTrue(presenter.getNumberOfParts() == 2); verify(view).setActiveTab(eq(0)); verify(partStackEventHandler, times(1)).onRequestFocus(presenter); verify(part1, never()).addPropertyListener(any(PropertyListener.class)); verify(view, never()).addTab(svgImage, partTitle1, toolTip1, null, true); verify(part1, never()).go(any(AcceptsOneWidget.class)); assertEquals(presenter.getActivePart(), part1); } }