/*******************************************************************************
* Copyright (c) 2012-2016 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.ext.java.client.navigation.filestructure;
import org.eclipse.che.api.promises.client.Function;
import org.eclipse.che.api.promises.client.Operation;
import org.eclipse.che.api.promises.client.Promise;
import org.eclipse.che.api.promises.client.PromiseError;
import org.eclipse.che.api.workspace.shared.dto.ProjectConfigDto;
import org.eclipse.che.ide.api.app.AppContext;
import org.eclipse.che.ide.api.app.CurrentProject;
import org.eclipse.che.ide.api.editor.EditorAgent;
import org.eclipse.che.ide.api.editor.EditorInput;
import org.eclipse.che.ide.api.project.node.HasProjectConfig;
import org.eclipse.che.ide.api.project.node.Node;
import org.eclipse.che.ide.api.project.tree.VirtualFile;
import org.eclipse.che.ide.ext.java.client.navigation.service.JavaNavigationService;
import org.eclipse.che.ide.ext.java.client.project.node.JavaNodeManager;
import org.eclipse.che.ide.ext.java.shared.dto.Region;
import org.eclipse.che.ide.ext.java.shared.dto.model.CompilationUnit;
import org.eclipse.che.ide.ext.java.shared.dto.model.Member;
import org.eclipse.che.ide.jseditor.client.document.Document;
import org.eclipse.che.ide.jseditor.client.texteditor.EmbeddedTextEditorPresenter;
import org.eclipse.che.ide.part.explorer.project.ProjectExplorerPresenter;
import org.eclipse.che.ide.ui.loaders.request.LoaderFactory;
import org.eclipse.che.ide.ui.loaders.request.MessageLoader;
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.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class FileStructurePresenterTest {
private final static String SOME_TEXT = "text";
private final static String PROJECT_PATH = "path";
private final static String CLASS_NAME = "Class.java";
@Mock
private FileStructure view;
@Mock
private JavaNavigationService javaNavigationService;
@Mock
private AppContext context;
@Mock
private EditorAgent editorAgent;
@Mock
private MessageLoader loader;
@Mock
private LoaderFactory loaderFactory;
@Mock
private ProjectExplorerPresenter projectExplorer;
@Mock
private JavaNodeManager javaNodeManager;
@Mock
private EmbeddedTextEditorPresenter editorPartPresenter;
@Mock
private EditorInput editorInput;
@Mock
private VirtualFile virtualFile;
@Mock
private HasProjectConfig hasProjectConfig;
@Mock
private ProjectConfigDto profileConfig;
@Mock
private CurrentProject currentProject;
@Mock
private Promise<CompilationUnit> promice;
@Mock
private Promise<Node> nodePromise;
@Mock
private CompilationUnit compilationUnit;
@Mock
private Member member;
@Mock
private Node node;
@Mock
private Region region;
@Mock
private Document document;
@Captor
private ArgumentCaptor<Operation<CompilationUnit>> operationSuccessCapture;
@Captor
private ArgumentCaptor<Operation<PromiseError>> operationErrorCapture;
@Captor
private ArgumentCaptor<Operation<Node>> operationNodeCapture;
@Captor
private ArgumentCaptor<Function<Node, Node>> functionNodeCapture;
@Captor
private ArgumentCaptor<EditorAgent.OpenEditorCallback> openEditorCallbackArgumentCaptor;
private FileStructurePresenter presenter;
@Before
public void setUp() throws Exception {
when(editorPartPresenter.getEditorInput()).thenReturn(editorInput);
when(editorPartPresenter.getDocument()).thenReturn(document);
when(editorInput.getFile()).thenReturn(virtualFile);
when(virtualFile.getName()).thenReturn(CLASS_NAME);
when(virtualFile.getProject()).thenReturn(hasProjectConfig);
when(hasProjectConfig.getProjectConfig()).thenReturn(profileConfig);
when(profileConfig.getPath()).thenReturn(PROJECT_PATH);
when(javaNavigationService.getCompilationUnit(anyString(), anyString(), anyBoolean())).thenReturn(promice);
when(promice.then(Matchers.<Operation<CompilationUnit>>anyObject())).thenReturn(promice);
when(promice.catchError(Matchers.<Operation<PromiseError>>anyObject())).thenReturn(promice);
when(context.getCurrentProject()).thenReturn(currentProject);
when(currentProject.getProjectConfig()).thenReturn(profileConfig);
when(member.getLibId()).thenReturn(1);
when(member.getRootPath()).thenReturn(PROJECT_PATH);
when(member.getFileRegion()).thenReturn(region);
when(region.getOffset()).thenReturn(1);
when(region.getLength()).thenReturn(2);
when(loaderFactory.newLoader()).thenReturn(loader);
presenter = new FileStructurePresenter(view,
javaNavigationService,
context,
editorAgent,
loaderFactory,
projectExplorer,
javaNodeManager);
}
@Test
public void fileStructureShouldBeShow() throws Exception {
presenter.show(editorPartPresenter);
verify(loader).show();
verify(view).setTitle(CLASS_NAME);
verify(profileConfig).getPath();
verify(javaNavigationService).getCompilationUnit(PROJECT_PATH, "Class", false);
verify(promice).then(operationSuccessCapture.capture());
operationSuccessCapture.getValue().apply(compilationUnit);
verify(view).setStructure(compilationUnit, false);
verify(loader).hide();
}
@Test
public void loaderShouldBeHideIfSomethingIsWrong() throws Exception {
PromiseError promiseError = Mockito.mock(PromiseError.class);
presenter.show(editorPartPresenter);
verify(promice).catchError(operationErrorCapture.capture());
operationErrorCapture.getValue().apply(promiseError);
verify(view, never()).setStructure(compilationUnit, false);
verify(promiseError).getMessage();
verify(loader).hide();
}
@Test
public void binaryClassShouldBeOpenedIfMemberIsBinary() throws Exception {
when(member.isBinary()).thenReturn(true);
when(javaNodeManager.getClassNode(profileConfig, 1, PROJECT_PATH)).thenReturn(nodePromise);
when(nodePromise.then(Matchers.<Operation<Node>>anyObject())).thenReturn(nodePromise);
presenter.show(editorPartPresenter);
}
@Test
public void selectMemberIfItIsNotBinary() throws Exception {
when(member.isBinary()).thenReturn(false);
when(projectExplorer.getNodeByPath(Matchers.anyObject())).thenReturn(nodePromise);
when(nodePromise.then(Matchers.<Function<Node, Node>>anyObject())).thenReturn(nodePromise);
presenter.show(editorPartPresenter);
}
}