package org.eclipse.recommenders.internal.snipmatch.rcp.completion; import static org.eclipse.recommenders.coordinates.DependencyInfo.PROJECT_NAME; import static org.eclipse.recommenders.internal.snipmatch.rcp.completion.RepositoryProposalMatcher.repository; import static org.eclipse.recommenders.internal.snipmatch.rcp.util.SearchContextMatcher.context; import static org.eclipse.recommenders.internal.snipmatch.rcp.util.SnippetProposalMatcher.snippet; import static org.hamcrest.Matchers.*; import static org.junit.Assert.assertThat; import static org.mockito.Matchers.*; import static org.mockito.Mockito.*; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.UUID; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.ui.text.IJavaPartitions; import org.eclipse.jdt.ui.text.java.JavaContentAssistInvocationContext; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.recommenders.coordinates.DependencyInfo; import org.eclipse.recommenders.coordinates.DependencyType; import org.eclipse.recommenders.coordinates.IDependencyListener; import org.eclipse.recommenders.coordinates.ProjectCoordinate; import org.eclipse.recommenders.internal.snipmatch.rcp.Repositories; import org.eclipse.recommenders.models.rcp.IProjectCoordinateProvider; import org.eclipse.recommenders.rcp.SharedImages; import org.eclipse.recommenders.snipmatch.ISnippet; import org.eclipse.recommenders.snipmatch.ISnippetRepository; import org.eclipse.recommenders.snipmatch.Location; import org.eclipse.recommenders.snipmatch.Snippet; import org.eclipse.recommenders.snipmatch.rcp.model.EclipseGitSnippetRepositoryConfiguration; import org.eclipse.recommenders.snipmatch.rcp.model.SnipmatchRcpModelFactory; import org.eclipse.recommenders.snipmatch.rcp.model.SnippetRepositoryConfigurations; import org.eclipse.recommenders.utils.Recommendation; import org.eclipse.recommenders.utils.Result; import org.eclipse.swt.graphics.Point; import org.eclipse.ui.IEditorPart; import org.junit.Test; import com.google.common.base.Optional; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; public class JavaContentAssistProcessorTest { private static final String REPO_NAME_1 = "my repo 1"; private static final String REPO_NAME_2 = "my repo 2"; private static final String SNIPPET_CODE = "code"; private static final String ANY_SEARCH_TERM = ""; private static final String SEARCH_TERM = "searchTerm"; private static final List<String> NO_EXTRA_SEARCH_TERMS = Collections.emptyList(); private static final List<String> NO_TAGS = Collections.emptyList(); private static final List<String> NO_FILENAME_RESTRICTIONS = Collections.emptyList(); private static final ImmutableSet<DependencyInfo> NO_DEPENDENCIES = ImmutableSet.of(); private static final String NO_SELECTION = null; private static final Document DOCUMENT = new Document("Document"); private static final ProjectCoordinate EXAMPLE_COORDINATE = new ProjectCoordinate("org.example", "example", "1.0.0"); private static final Set<ProjectCoordinate> NO_PROJECT_COORDINATES = ImmutableSet.of(); private static final Set<ProjectCoordinate> PROJECT_COORDINATES = ImmutableSet.of(EXAMPLE_COORDINATE); private static final File PROJECT_DIR = new File("/tmp/example"); private static final DependencyInfo PROJECT_INFO = new DependencyInfo(PROJECT_DIR, DependencyType.PROJECT, ImmutableMap.of(PROJECT_NAME, "example")); private static final ImmutableSet<DependencyInfo> DEPENDENCIES = ImmutableSet.of(PROJECT_INFO); private SnippetRepositoryConfigurations configs; private Repositories repos; private JavaContentAssistProcessor sut; private ITextViewer viewer; public void setUp(Document document, Point selectedRange, ImmutableSet<DependencyInfo> dependencies) { IDependencyListener dependencyListener = mock(IDependencyListener.class); IProjectCoordinateProvider pcProvider = mock(IProjectCoordinateProvider.class); IJavaProject javaProject = mock(IJavaProject.class, RETURNS_DEEP_STUBS); when(javaProject.getProject().getLocation().toFile()).thenReturn(PROJECT_DIR); when(javaProject.getElementName()).thenReturn("example"); when(pcProvider.tryResolve(PROJECT_INFO)).thenReturn(Result.of(EXAMPLE_COORDINATE)); when(dependencyListener.getDependenciesForProject(PROJECT_INFO)).thenReturn(dependencies); ICompilationUnit compilationUnit = mock(ICompilationUnit.class); when(compilationUnit.getJavaProject()).thenReturn(javaProject); configs = SnipmatchRcpModelFactory.eINSTANCE.createSnippetRepositoryConfigurations(); repos = mock(Repositories.class); viewer = mock(ITextViewer.class); when(viewer.getDocument()).thenReturn(document); when(viewer.getSelectedRange()).thenReturn(selectedRange); JavaContentAssistInvocationContext context = spy( new JavaContentAssistInvocationContext(viewer, 0, mock(IEditorPart.class))); doReturn(compilationUnit).when(context).getCompilationUnit(); sut = new JavaContentAssistProcessor(configs, repos, pcProvider, dependencyListener, new SharedImages()); sut.setFilename("Test.java"); sut.setContext(context); } @Test public void testEmptySearchText() { setUp(DOCUMENT, new Point(2, 0), NO_DEPENDENCIES); ISnippetRepository repo = mockRepository(REPO_NAME_1, 10, ANY_SEARCH_TERM, Location.JAVA_FILE, NO_PROJECT_COORDINATES, "snippet"); sut.setTerms(""); verifyZeroInteractions(repo); List<ICompletionProposal> result = Arrays.asList(sut.computeCompletionProposals(viewer, 0)); assertThat(result.isEmpty(), is(true)); } @Test public void testSnippetIsFound() { setUp(DOCUMENT, new Point(2, 0), NO_DEPENDENCIES); ISnippetRepository repo = mockRepository(REPO_NAME_1, 10, SEARCH_TERM, Location.JAVA_FILE, NO_PROJECT_COORDINATES, "snippet"); sut.setTerms(SEARCH_TERM); List<ICompletionProposal> result = Arrays.asList(sut.computeCompletionProposals(viewer, 0)); verify(repo).search(argThat(context(SEARCH_TERM, Location.JAVA_FILE, NO_PROJECT_COORDINATES))); assertThat(result, hasItem(repository(REPO_NAME_1, 1, 0))); assertThat(result, hasItem(snippet("snippet", 0, NO_SELECTION))); assertThat(result.size(), is(2)); } @Test public void testSnippetsAreFound() { setUp(DOCUMENT, new Point(2, 0), NO_DEPENDENCIES); ISnippetRepository repo = mockRepository(REPO_NAME_1, 10, SEARCH_TERM, Location.JAVA_FILE, NO_PROJECT_COORDINATES, "snippet1", "snippet2"); sut.setTerms(SEARCH_TERM); List<ICompletionProposal> result = Arrays.asList(sut.computeCompletionProposals(viewer, 0)); verify(repo).search(argThat(context(SEARCH_TERM, Location.JAVA_FILE, NO_PROJECT_COORDINATES))); assertThat(result, hasItem(repository(REPO_NAME_1, 2, 0))); assertThat(result, hasItem(snippet("snippet1", 0, NO_SELECTION))); assertThat(result, hasItem(snippet("snippet2", 0, NO_SELECTION))); assertThat(result.size(), is(3)); } @Test public void testSnippetsInTwoRepos() { setUp(DOCUMENT, new Point(2, 0), NO_DEPENDENCIES); ISnippetRepository repo1 = mockRepository(REPO_NAME_1, 20, SEARCH_TERM, Location.JAVA_FILE, NO_PROJECT_COORDINATES, "snippet1"); ISnippetRepository repo2 = mockRepository(REPO_NAME_2, 10, SEARCH_TERM, Location.JAVA_FILE, NO_PROJECT_COORDINATES, "snippet2"); sut.setTerms(SEARCH_TERM); List<ICompletionProposal> result = Arrays.asList(sut.computeCompletionProposals(viewer, 0)); verify(repo1).search(argThat(context(SEARCH_TERM, Location.JAVA_FILE, NO_PROJECT_COORDINATES))); verify(repo2).search(argThat(context(SEARCH_TERM, Location.JAVA_FILE, NO_PROJECT_COORDINATES))); assertThat(result, hasItem(repository(REPO_NAME_1, 1, 1))); assertThat(result, hasItem(snippet("snippet1", 1, NO_SELECTION))); assertThat(result, hasItem(repository(REPO_NAME_2, 1, 0))); assertThat(result, hasItem(snippet("snippet2", 0, NO_SELECTION))); assertThat(result.size(), is(4)); } @Test public void testLocationIsPassedToSearch() { setUp(DOCUMENT, new Point(2, 0), NO_DEPENDENCIES); ISnippetRepository repo1 = mockRepository(REPO_NAME_1, 10, SEARCH_TERM, Location.JAVADOC, NO_PROJECT_COORDINATES, "snippet1"); ISnippetRepository repo2 = mockRepository(REPO_NAME_2, 20, SEARCH_TERM, Location.JAVA_FILE, NO_PROJECT_COORDINATES, "snippet2"); sut.setTerms(SEARCH_TERM); List<ICompletionProposal> result = Arrays.asList(sut.computeCompletionProposals(viewer, 0)); verify(repo1).search(argThat(context(SEARCH_TERM, Location.JAVA_FILE, NO_PROJECT_COORDINATES))); verify(repo2).search(argThat(context(SEARCH_TERM, Location.JAVA_FILE, NO_PROJECT_COORDINATES))); assertThat(result, hasItem(repository(REPO_NAME_2, 1, 1))); assertThat(result, hasItem(snippet("snippet2", 1, NO_SELECTION))); assertThat(result.size(), is(2)); } @Test public void testSelection() { setUp(DOCUMENT, new Point(2, 2), NO_DEPENDENCIES); ISnippetRepository repo = mockRepository(REPO_NAME_1, 10, SEARCH_TERM, Location.JAVA_FILE, NO_PROJECT_COORDINATES, "snippet"); sut.setTerms(SEARCH_TERM); List<ICompletionProposal> result = Arrays.asList(sut.computeCompletionProposals(viewer, 0)); verify(repo).search(argThat(context(SEARCH_TERM, Location.JAVA_FILE, NO_PROJECT_COORDINATES))); assertThat(result, hasItem(repository(REPO_NAME_1, 1, 0))); assertThat(result, hasItem(snippet("snippet", 0, "cu"))); assertThat(result.size(), is(2)); } @Test public void testDependency() throws Exception { Document document = spy(DOCUMENT); doReturn(IJavaPartitions.JAVA_DOC).when(document).getContentType(eq("___java_partitioning"), eq(0), eq(true)); setUp(document, new Point(2, 0), DEPENDENCIES); ISnippetRepository repo = mockRepository(REPO_NAME_1, 10, SEARCH_TERM, Location.JAVADOC, PROJECT_COORDINATES, "snippet"); sut.setTerms(SEARCH_TERM); List<ICompletionProposal> result = Arrays.asList(sut.computeCompletionProposals(viewer, 0)); verify(repo).search(argThat(context(SEARCH_TERM, Location.JAVADOC, PROJECT_COORDINATES))); assertThat(result, hasItem(repository(REPO_NAME_1, 1, 0))); assertThat(result, hasItem(snippet("snippet", 0, NO_SELECTION))); assertThat(result.size(), is(2)); } private ISnippetRepository mockRepository(String name, int priority, String searchTerm, Location location, Set<ProjectCoordinate> dependencies, String... snippetNames) { ArrayList<Recommendation<ISnippet>> recommendations = Lists.newArrayList(); for (String snippetName : snippetNames) { recommendations.add(createRecommendation(snippetName)); } ISnippetRepository repo = mock(ISnippetRepository.class); when(repo.search(argThat(context(searchTerm, location, dependencies)))).thenReturn(recommendations); String id = UUID.randomUUID().toString(); when(repos.getRepository(id)).thenReturn(Optional.of(repo)); EclipseGitSnippetRepositoryConfiguration config = SnipmatchRcpModelFactory.eINSTANCE .createEclipseGitSnippetRepositoryConfiguration(); config.setPriority(priority); config.setId(id); config.setName(name); configs.getRepos().add(config); return repo; } private Recommendation<ISnippet> createRecommendation(String name) { ISnippet snippet = new Snippet(UUID.randomUUID(), name, ANY_SEARCH_TERM, NO_EXTRA_SEARCH_TERMS, NO_TAGS, SNIPPET_CODE, Location.JAVA_FILE, NO_FILENAME_RESTRICTIONS, Collections.<ProjectCoordinate>emptySet()); return Recommendation.newRecommendation(snippet, 1.0); } }