/******************************************************************************* * 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.editor; import com.google.common.base.Optional; import com.google.web.bindery.event.shared.EventBus; import com.google.web.bindery.event.shared.HandlerRegistration; import org.eclipse.che.ide.api.editor.EditorInput; import org.eclipse.che.ide.api.editor.annotation.AnnotationModel; import org.eclipse.che.ide.api.editor.document.Document; 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.JavaLocalizationConstant; import org.eclipse.che.ide.ext.java.shared.dto.HighlightedPosition; import org.eclipse.che.ide.ext.java.shared.dto.ReconcileResult; import org.eclipse.che.ide.project.ResolvingProjectStateHolder; import org.eclipse.che.ide.project.ResolvingProjectStateHolderRegistry; import org.eclipse.che.ide.resource.Path; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import java.util.ArrayList; import java.util.Collections; import java.util.List; import static org.eclipse.che.ide.project.ResolvingProjectStateHolder.ResolvingProjectState.IN_PROGRESS; import static org.eclipse.che.ide.project.ResolvingProjectStateHolder.ResolvingProjectState.RESOLVED; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; /** * @author Roman Nikitenko */ @RunWith(MockitoJUnitRunner.class) public class JavaReconcilerStrategyTest { private static final String FILE_NAME = "TestClass.java"; @Mock private EventBus eventBus; @Mock private TextEditor editor; @Mock private JavaCodeAssistProcessor codeAssistProcessor; @Mock private AnnotationModel annotationModel; @Mock private HandlerRegistration handlerRegistration; @Mock private SemanticHighlightRenderer highlighter; @Mock private JavaReconcileClient client; @Mock private ReconcileResult reconcileResult; @Mock private File file; @Mock private ResolvingProjectStateHolder resolvingProjectStateHolder; @Mock private ResolvingProjectStateHolderRegistry resolvingProjectStateHolderRegistry; @Mock private JavaLocalizationConstant localizationConstant; @Captor private ArgumentCaptor<JavaReconcileClient.ReconcileCallback> reconcileCallbackCaptor; @InjectMocks private JavaReconcilerStrategy javaReconcilerStrategy; @Before public void setUp() throws Exception { EditorInput editorInput = mock(EditorInput.class); Optional project = mock(Optional.class); Project projectConfig = mock(Project.class); Optional<Resource> srcFolder = mock(Optional.class); Container startPoint = mock(Container.class); when(editor.getEditorInput()).thenReturn(editorInput); when(editorInput.getFile()).thenReturn(file); when(file.getName()).thenReturn(FILE_NAME); when(file.getRelatedProject()).thenReturn(project); when(file.getLocation()).thenReturn(Path.valueOf("some/path/to/file")); when(project.get()).thenReturn(projectConfig); when(projectConfig.getLocation()).thenReturn(Path.valueOf("some/path/to/project")); when(project.isPresent()).thenReturn(true); when(file.getParentWithMarker(any())).thenReturn(srcFolder); when(srcFolder.isPresent()).thenReturn(true); when(srcFolder.get()).thenReturn(startPoint); when(startPoint.getLocation()).thenReturn(Path.valueOf("some/path")); when(resolvingProjectStateHolderRegistry.getResolvingProjectStateHolder(anyString())).thenReturn(resolvingProjectStateHolder); when(localizationConstant.codeAssistErrorMessageResolvingProject()).thenReturn("error"); javaReconcilerStrategy.setDocument(mock(Document.class)); } @Test public void shouldDisableReconcilerWhenResolvingProjectIsInProgress() throws Exception { when(resolvingProjectStateHolder.getState()).thenReturn(IN_PROGRESS); javaReconcilerStrategy.parse(); verify(client).reconcile(anyString(), anyString(), reconcileCallbackCaptor.capture()); JavaReconcileClient.ReconcileCallback reconcileCallback = reconcileCallbackCaptor.getValue(); reconcileCallback.onReconcile(reconcileResult); verify(reconcileResult, never()).getProblems(); verify(reconcileResult, never()).getHighlightedPositions(); verify(codeAssistProcessor, never()).enableCodeAssistant(); verify(codeAssistProcessor).disableCodeAssistant(anyString()); verify(highlighter).reconcile(eq(Collections.<HighlightedPosition>emptyList())); } @Test public void shouldDoParseWhenResolvingProjectHasResolved() throws Exception { when(resolvingProjectStateHolder.getState()).thenReturn(RESOLVED); HighlightedPosition highlightedPosition = mock(HighlightedPosition.class); List<HighlightedPosition> positions = new ArrayList<>(); positions.add(highlightedPosition); when(reconcileResult.getHighlightedPositions()).thenReturn(positions); javaReconcilerStrategy.parse(); verify(client).reconcile(anyString(), anyString(), reconcileCallbackCaptor.capture()); JavaReconcileClient.ReconcileCallback reconcileCallback = reconcileCallbackCaptor.getValue(); reconcileCallback.onReconcile(reconcileResult); verify(reconcileResult).getProblems(); verify(reconcileResult).getHighlightedPositions(); verify(codeAssistProcessor).enableCodeAssistant(); verify(codeAssistProcessor, never()).disableCodeAssistant(anyString()); verify(highlighter).reconcile(eq(positions)); } }