/*******************************************************************************
* 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.workspace;
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.part.PartStackPresenter;
import com.google.gwt.junit.GWTMockUtilities;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.web.bindery.event.shared.EventBus;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.runners.MockitoJUnitRunner;
import org.mockito.stubbing.Answer;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* Testing {@link PartStackPresenter} functionality.
*
* @author <a href="mailto:nzamosenchuk@exoplatform.com">Nikolay Zamosenchuk</a>
*/
@RunWith(MockitoJUnitRunner.class)
public class TestPartStackPresenter {
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
PartStackView partStackView;
@Mock
PartStackUIResources resources;
@Mock
EventBus eventBus;
@Mock
PartStackPresenter.PartStackEventHandler handler;
@InjectMocks
PartStackPresenter stack;
@Before
public void disarm() {
// don't throw an exception if GWT.create() invoked
GWTMockUtilities.disarm();
}
@After
public void restore() {
GWTMockUtilities.restore();
}
@Test
public void shouldExposeUItoContainer() {
// setup container mock and display.asWidget return object
AcceptsOneWidget container = mock(AcceptsOneWidget.class);
// perform action
stack.go(container);
// verify view exposed to UI component
verify(container).setWidget(eq(partStackView));
}
@Test
public void shouldNotifyPartChanged() {
PartPresenter part = mock(PartPresenter.class);
when(part.getTitleImage()).thenReturn(null);
stack.addPart(part);
stack.setActivePart(part);
verify(handler, times(2)).onRequestFocus(eq(stack));
assertEquals("should activate part", part, stack.getActivePart());
}
@Test
public void shouldDelegateSetFocusToDisplay() {
stack.setFocus(true);
verify(partStackView).setFocus(eq(true));
}
@Test
public void shouldAddPart() {
PartPresenter part = mock(PartPresenter.class);
stack.addPart(part);
assertTrue("should contain part", stack.containsPart(part));
}
@Test
public void shouldNotAddPartTwice() {
PartPresenter part = mock(PartPresenter.class);
stack.addPart(part);
assertEquals("should contain 1 part", 1, stack.getNumberOfParts());
stack.addPart(part);
assertEquals("should contain 1 part", 1, stack.getNumberOfParts());
}
@Test
public void shouldActivatePartOnAdd() {
PartPresenter part = mock(PartPresenter.class);
PartPresenter part2 = mock(PartPresenter.class);
stack.addPart(part);
stack.setActivePart(part);
assertEquals("should activate part", part, stack.getActivePart());
stack.addPart(part2);
stack.setActivePart(part2);
assertEquals("should activate part2", part2, stack.getActivePart());
}
@Test
public void shouldSetActivatePart() {
PartPresenter part = mock(PartPresenter.class);
PartPresenter part2 = mock(PartPresenter.class);
stack.addPart(part);
stack.addPart(part2);
stack.setActivePart(part);
assertEquals("should activate part", part, stack.getActivePart());
}
@Test
public void shouldNotifyActivatePart() {
PartPresenter part = mock(PartPresenter.class);
PartPresenter part2 = mock(PartPresenter.class);
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
Object[] arguments = invocationOnMock.getArguments();
AsyncCallback<Void> callback = (AsyncCallback<Void>)arguments[0];
callback.onSuccess(null);
return callback;
}
}).when(part).onClose((AsyncCallback<Void>)anyObject());
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
Object[] arguments = invocationOnMock.getArguments();
AsyncCallback<Void> callback = (AsyncCallback<Void>)arguments[0];
callback.onSuccess(null);
return callback;
}
}).when(part2).onClose((AsyncCallback<Void>)anyObject());
reset(handler);
stack.addPart(part);
stack.setActivePart(part);
assertEquals("should activate part", part, stack.getActivePart());
reset(handler);
// check another activated
stack.addPart(part2);
stack.setActivePart(part2);
assertEquals("should activate part 2", part2, stack.getActivePart());
reset(handler);
// check first activated
stack.setActivePart(part);
assertEquals("should activate part", part, stack.getActivePart());
}
}