/*******************************************************************************
* 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.ext.java.client.navigation.filestructure;
import com.google.common.base.Optional;
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.ide.api.app.AppContext;
import org.eclipse.che.ide.api.data.tree.Node;
import org.eclipse.che.ide.api.editor.EditorAgent;
import org.eclipse.che.ide.api.editor.EditorInput;
import org.eclipse.che.ide.api.editor.document.Document;
import org.eclipse.che.ide.api.editor.text.LinearRange;
import org.eclipse.che.ide.api.editor.texteditor.TextEditor;
import org.eclipse.che.ide.api.resources.Container;
import org.eclipse.che.ide.api.resources.File;
import org.eclipse.che.ide.api.resources.Project;
import org.eclipse.che.ide.api.resources.Resource;
import org.eclipse.che.ide.ext.java.client.navigation.service.JavaNavigationService;
import org.eclipse.che.ide.ext.java.client.resource.SourceFolderMarker;
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.resource.Path;
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.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class FileStructurePresenterTest {
@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 TextEditor editor;
@Mock
private EditorInput editorInput;
@Mock
private File file;
@Mock
private Project relatedProject;
@Mock
private Container srcFolder;
@Mock
private Promise<CompilationUnit> promise;
@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(editor.getEditorInput()).thenReturn(editorInput);
when(editor.getDocument()).thenReturn(document);
when(editorInput.getFile()).thenReturn(file);
when(editor.getCursorOffset()).thenReturn(0);
when(file.getRelatedProject()).thenReturn(Optional.of(relatedProject));
when(file.getParentWithMarker(eq(SourceFolderMarker.ID))).thenReturn(Optional.of(srcFolder));
when(file.getName()).thenReturn("A.java");
when(file.getExtension()).thenReturn("java");
when(file.getResourceType()).thenReturn(Resource.FILE);
when(file.getLocation()).thenReturn(Path.valueOf("/project/src/a/b/c/A.java"));
when(srcFolder.getLocation()).thenReturn(Path.valueOf("/project/src"));
when(relatedProject.getLocation()).thenReturn(Path.valueOf("/project"));
when(javaNavigationService.getCompilationUnit(any(Path.class), anyString(), anyBoolean())).thenReturn(promise);
when(promise.then(Matchers.<Operation<CompilationUnit>>anyObject())).thenReturn(promise);
when(promise.catchError(Matchers.<Operation<PromiseError>>anyObject())).thenReturn(promise);
when(loaderFactory.newLoader()).thenReturn(loader);
presenter = new FileStructurePresenter(view,
javaNavigationService,
context,
editorAgent,
loaderFactory);
}
@Test
public void fileStructureShouldBeShow() throws Exception {
presenter.show(editor);
verify(loader).show();
verify(view).setTitle("A.java");
verify(promise).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(editor);
verify(promise).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(nodePromise.then(Matchers.<Operation<Node>>anyObject())).thenReturn(nodePromise);
presenter.show(editor);
}
@Test
public void selectMemberIfItIsNotBinary() throws Exception {
when(member.isBinary()).thenReturn(false);
when(nodePromise.then(Matchers.<Function<Node, Node>>anyObject())).thenReturn(nodePromise);
presenter.show(editor);
}
@Test
public void cursorShouldBeReturnedInPreviousPositionAfterDialogClosingByEscapeButton() {
presenter.show(editor);
presenter.onEscapeClicked();
verify(editor).setFocus();
verify(editor).getDocument();
verify(document).setSelectedRange(Matchers.<LinearRange>anyObject(), eq(true));
}
}