package org.eclipse.recommenders.internal.calls.rcp; import static com.google.common.base.Optional.fromNullable; import static org.eclipse.recommenders.internal.calls.rcp.CallCompletionContextFunctions.*; import static org.eclipse.recommenders.utils.Recommendation.newRecommendation; import static org.hamcrest.Matchers.*; import static org.junit.Assert.assertThat; import static org.mockito.Matchers.*; import static org.mockito.Mockito.*; import java.util.Collections; import java.util.List; import javax.inject.Provider; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.internal.codeassist.complete.CompletionOnJavadocMessageSend; import org.eclipse.jdt.internal.codeassist.complete.CompletionOnMessageSend; import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment; import org.eclipse.recommenders.calls.ICallModel; import org.eclipse.recommenders.calls.ICallModelProvider; import org.eclipse.recommenders.completion.rcp.CompletionContextKey; import org.eclipse.recommenders.completion.rcp.IProposalNameProvider; import org.eclipse.recommenders.completion.rcp.IRecommendersCompletionContext; import org.eclipse.recommenders.coordinates.ProjectCoordinate; import org.eclipse.recommenders.internal.completion.rcp.ProposalNameProvider; import org.eclipse.recommenders.models.UniqueTypeName; import org.eclipse.recommenders.models.rcp.IProjectCoordinateProvider; import org.eclipse.recommenders.rcp.SharedImages; import org.eclipse.recommenders.utils.Recommendation; import org.eclipse.recommenders.utils.Result; import org.eclipse.recommenders.utils.names.IMethodName; import org.eclipse.recommenders.utils.names.ITypeName; import org.eclipse.recommenders.utils.names.VmMethodName; import org.eclipse.recommenders.utils.names.VmTypeName; import org.junit.Test; import org.mockito.Mockito; import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; @SuppressWarnings("restriction") public class CallCompletionSessionProcessorTest { private static final ITypeName OBJECT = VmTypeName.get("Ljava/lang/Object"); private static final IMethodName OBJECT_HASH_CODE = VmMethodName.get("Ljava/lang/Object.hashCode()I"); private static final IMethodName OBJECT_EQUALS = VmMethodName.get("Ljava/lang/Object.equals(Ljava/lang/Object;)Z"); private static final IMethodName OBJECT_VOID = VmMethodName.get("Ljava/lang/Object.wait()V"); private static final ProjectCoordinate JRE_1_6_0 = new ProjectCoordinate("jre", "jre", "1.6.0"); private static final String ANY_TYPE_SIGNATURE = null; private static final List<IMethodName> NO_OBSERVATIONS = Collections.emptyList(); private static final List<Recommendation<IMethodName>> NO_RECOMMENDATIONS = Collections.emptyList(); private static final IType OBJECT_TYPE = mock(IType.class); private Provider<IProjectCoordinateProvider> pcMetaProvider; private Provider<ICallModelProvider> modelMetaProvider; private IProposalNameProvider proposalNameProvider = new ProposalNameProvider(); private IRecommendersCompletionContext context; @Test public void testCompletionOnObjectWithoutRecommendations() { setUp(CompletionOnMessageSend.class, new UniqueTypeName(JRE_1_6_0, OBJECT), OBJECT_TYPE, NO_OBSERVATIONS, "", NO_RECOMMENDATIONS); CallCompletionSessionProcessor sut = new CallCompletionSessionProcessor(pcMetaProvider, modelMetaProvider, proposalNameProvider, createDefaultPreferences(), new SharedImages()); boolean shouldProcess = sut.startSession(context); assertThat(shouldProcess, is(equalTo(false))); } @Test public void testCompletionOnObjectWithRecommendations() { setUp(CompletionOnMessageSend.class, new UniqueTypeName(JRE_1_6_0, OBJECT), OBJECT_TYPE, NO_OBSERVATIONS, "", ImmutableList.of(newRecommendation(OBJECT_EQUALS, 0.5))); CallsRcpPreferences pref = createDefaultPreferences(); CallCompletionSessionProcessor sut = new CallCompletionSessionProcessor(pcMetaProvider, modelMetaProvider, proposalNameProvider, pref, new SharedImages()); boolean shouldProcess = sut.startSession(context); assertThat(shouldProcess, is(equalTo(true))); } @Test public void testCompletionOnObjectWith100PercentMinProposalProbability() { setUp(CompletionOnMessageSend.class, new UniqueTypeName(JRE_1_6_0, OBJECT), OBJECT_TYPE, NO_OBSERVATIONS, "", ImmutableList.of(newRecommendation(OBJECT_HASH_CODE, 0.5))); CallsRcpPreferences pref = createPreferencesWithMinimalProposalProbability(100); CallCompletionSessionProcessor sut = new CallCompletionSessionProcessor(pcMetaProvider, modelMetaProvider, proposalNameProvider, pref, new SharedImages()); boolean shouldProcess = sut.startSession(context); assertThat(shouldProcess, is(equalTo(false))); } @Test public void testCompletionOnObjectWithObservedMethods() { setUp(CompletionOnMessageSend.class, new UniqueTypeName(JRE_1_6_0, OBJECT), OBJECT_TYPE, ImmutableList.of(OBJECT_HASH_CODE), "", NO_RECOMMENDATIONS); CallCompletionSessionProcessor sut = new CallCompletionSessionProcessor(pcMetaProvider, modelMetaProvider, proposalNameProvider, createDefaultPreferences(), new SharedImages()); boolean shouldProcess = sut.startSession(context); assertThat(shouldProcess, is(equalTo(true))); } @Test public void testCannotGetCompletionNode() { setUp(null, new UniqueTypeName(JRE_1_6_0, OBJECT), OBJECT_TYPE, NO_OBSERVATIONS, ANY_TYPE_SIGNATURE, ImmutableList.of(newRecommendation(OBJECT_HASH_CODE, 0.5))); CallCompletionSessionProcessor sut = new CallCompletionSessionProcessor(pcMetaProvider, modelMetaProvider, proposalNameProvider, createDefaultPreferences(), new SharedImages()); boolean shouldProcess = sut.startSession(context); assertThat(shouldProcess, is(equalTo(false))); } @Test public void testUnsupportedCompletionRequest() { setUp(CompletionOnJavadocMessageSend.class, new UniqueTypeName(JRE_1_6_0, OBJECT), OBJECT_TYPE, NO_OBSERVATIONS, ANY_TYPE_SIGNATURE, ImmutableList.of(newRecommendation(OBJECT_HASH_CODE, 0.5))); CallCompletionSessionProcessor sut = new CallCompletionSessionProcessor(pcMetaProvider, modelMetaProvider, proposalNameProvider, createDefaultPreferences(), new SharedImages()); boolean shouldProcess = sut.startSession(context); assertThat(shouldProcess, is(equalTo(false))); } @Test public void testCannotDetermineReceiverType() { setUp(CompletionOnMessageSend.class, new UniqueTypeName(JRE_1_6_0, OBJECT), null, ImmutableList.of(OBJECT_HASH_CODE), "", ImmutableList.of(newRecommendation(OBJECT_EQUALS, 0.5))); CallCompletionSessionProcessor sut = new CallCompletionSessionProcessor(pcMetaProvider, modelMetaProvider, proposalNameProvider, createDefaultPreferences(), new SharedImages()); boolean shouldProcess = sut.startSession(context); assertThat(shouldProcess, is(equalTo(false))); } @Test public void testCannotObtainUniqueNameForReceiverType() { setUp(CompletionOnMessageSend.class, null, OBJECT_TYPE, ImmutableList.of(OBJECT_HASH_CODE), "", ImmutableList.of(newRecommendation(OBJECT_EQUALS, 0.5))); CallCompletionSessionProcessor sut = new CallCompletionSessionProcessor(pcMetaProvider, modelMetaProvider, proposalNameProvider, createDefaultPreferences(), new SharedImages()); boolean shouldProcess = sut.startSession(context); assertThat(shouldProcess, is(equalTo(false))); } @Test public void testCannotAcquireModel() { setUp(CompletionOnMessageSend.class, new UniqueTypeName(JRE_1_6_0, OBJECT), OBJECT_TYPE, ImmutableList.of(OBJECT_HASH_CODE), "", null); CallCompletionSessionProcessor sut = new CallCompletionSessionProcessor(pcMetaProvider, modelMetaProvider, proposalNameProvider, createDefaultPreferences(), new SharedImages()); boolean shouldProcess = sut.startSession(context); assertThat(shouldProcess, is(equalTo(false))); } @Test public void testCompletionOnObjectWithNullExpectedTypeSignature() { setUp(CompletionOnMessageSend.class, new UniqueTypeName(JRE_1_6_0, OBJECT), OBJECT_TYPE, NO_OBSERVATIONS, ANY_TYPE_SIGNATURE, ImmutableList.of(newRecommendation(OBJECT_HASH_CODE, 0.5))); CallCompletionSessionProcessor sut = new CallCompletionSessionProcessor(pcMetaProvider, modelMetaProvider, proposalNameProvider, createDefaultPreferences(), new SharedImages()); boolean shouldProcess = sut.startSession(context); assertThat(shouldProcess, is(equalTo(true))); } @Test public void testExpectedTypeSignatureWithVoidReturnRecommendation() { setUp(CompletionOnMessageSend.class, new UniqueTypeName(JRE_1_6_0, OBJECT), OBJECT_TYPE, NO_OBSERVATIONS, "", ImmutableList.of(newRecommendation(OBJECT_VOID, 0.5))); CallCompletionSessionProcessor sut = new CallCompletionSessionProcessor(pcMetaProvider, modelMetaProvider, proposalNameProvider, createDefaultPreferences(), new SharedImages()); boolean shouldProcess = sut.startSession(context); assertThat(shouldProcess, is(equalTo(false))); } private CallsRcpPreferences createDefaultPreferences() { return createPreferences(0, 7); } private CallsRcpPreferences createPreferencesWithMinimalProposalProbability(int minProposalProbability) { return createPreferences(minProposalProbability, 7); } private CallsRcpPreferences createPreferences(int minProposalProbability, int maxNumberOfProposals) { CallsRcpPreferences pref = new CallsRcpPreferences(); pref.maxNumberOfProposals = maxNumberOfProposals; pref.minProposalPercentage = minProposalProbability; return pref; } private void setUp(Class<? extends ASTNode> completionType, UniqueTypeName uniqueTypeName, IType receiverType, List<IMethodName> observedCalls, String expectedTypeSignature, List<Recommendation<IMethodName>> recommendations) { LookupEnvironment lookupEnvironment = mock(LookupEnvironment.class); context = mock(IRecommendersCompletionContext.class); when(context.get(CompletionContextKey.LOOKUP_ENVIRONMENT)).thenReturn(Optional.of(lookupEnvironment)); Optional<ASTNode> completionNode = completionType == null ? Optional.<ASTNode>absent() : Optional.<ASTNode>of(mock(completionType)); when(context.getCompletionNode()).thenReturn(completionNode); when(context.getExpectedTypeSignature()).thenReturn( expectedTypeSignature == null ? Optional.<String>absent() : Optional.<String>of(expectedTypeSignature)); when(context.get(RECEIVER_TYPE2, null)).thenReturn(receiverType); when(context.get(eq(RECEIVER_CALLS), anyListOf(IMethodName.class))).thenReturn(observedCalls); IProjectCoordinateProvider pcProvider = mock(IProjectCoordinateProvider.class); when(pcProvider.tryToUniqueName(receiverType)).thenReturn(Result.fromNullable(uniqueTypeName)); pcMetaProvider = Mockito.mock(Provider.class); when(pcMetaProvider.get()).thenReturn(pcProvider); ICallModelProvider modelProvider = mock(ICallModelProvider.class); ICallModel model; if (recommendations == null) { model = null; } else { model = mock(ICallModel.class); when(model.recommendCalls()).thenReturn(recommendations); } modelMetaProvider = Mockito.mock(Provider.class); when(modelMetaProvider.get()).thenReturn(modelProvider); if (uniqueTypeName != null) { when(modelProvider.acquireModel(uniqueTypeName)).thenReturn(fromNullable(model)); } } }