/*******************************************************************************
* Copyright (c) 2013 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.recommenders.calls.rcp.it;
import static com.google.common.base.Optional.fromNullable;
import static org.eclipse.recommenders.coordinates.ProjectCoordinate.UNKNOWN;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Mockito.*;
import java.util.List;
import java.util.Set;
import javax.inject.Provider;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor;
import org.eclipse.recommenders.calls.ICallModel;
import org.eclipse.recommenders.calls.ICallModelProvider;
import org.eclipse.recommenders.completion.rcp.it.MockedIntelligentCompletionProposalComputer;
import org.eclipse.recommenders.completion.rcp.processable.SessionProcessorDescriptor;
import org.eclipse.recommenders.internal.calls.rcp.CallCompletionSessionProcessor;
import org.eclipse.recommenders.internal.calls.rcp.CallsRcpPreferences;
import org.eclipse.recommenders.internal.completion.rcp.CompletionRcpPreferences;
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.eclipse.ui.IEditorPart;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
@SuppressWarnings({ "restriction", "rawtypes", "unchecked" })
public class Stubs {
private static final class CallModelSpy implements ICallModel {
private Set<IMethodName> observedCalls = Sets.newHashSet();
private IMethodName overriddenMethod;
private IMethodName definedBy;
private DefinitionKind defType;
@Override
public ITypeName getReceiverType() {
return null;
}
@Override
public void reset() {
}
@Override
public boolean setObservedCalls(Set<IMethodName> observedCalls) {
this.observedCalls = observedCalls;
return true;
}
@Override
public boolean setObservedOverrideContext(IMethodName overriddenMethod) {
this.overriddenMethod = overriddenMethod;
return true;
}
@Override
public boolean setObservedDefiningMethod(IMethodName definedBy) {
this.definedBy = definedBy;
return true;
}
@Override
public boolean setObservedDefinitionKind(DefinitionKind defType) {
this.defType = defType;
return true;
}
@Override
public boolean setObservedPattern(String patternName) {
return true;
}
@Override
public Optional<IMethodName> getObservedOverrideContext() {
return fromNullable(overriddenMethod);
}
@Override
public Optional<IMethodName> getObservedDefiningMethod() {
return fromNullable(definedBy);
}
@Override
public Optional<DefinitionKind> getObservedDefinitionKind() {
return fromNullable(defType);
}
@Override
public ImmutableSet<IMethodName> getObservedCalls() {
return ImmutableSet.copyOf(observedCalls);
}
@Override
public ImmutableSet<IMethodName> getKnownCalls() {
return ImmutableSet.of();
}
@Override
public ImmutableSet<IMethodName> getKnownDefiningMethods() {
return ImmutableSet.of();
}
@Override
public ImmutableSet<IMethodName> getKnownOverrideContexts() {
return ImmutableSet.of();
}
@Override
public ImmutableSet<String> getKnownPatterns() {
return ImmutableSet.of();
}
@Override
public List<Recommendation<IMethodName>> recommendDefinitions() {
return ImmutableList.of();
}
@Override
public List<Recommendation<String>> recommendPatterns() {
return ImmutableList.of();
}
@Override
public List<Recommendation<IMethodName>> recommendCalls() {
return ImmutableList.of();
}
@Override
public ImmutableSet<DefinitionKind> getKnownDefinitionKinds() {
return ImmutableSet.of();
}
}
public static MockedIntelligentCompletionProposalComputer newCallComputer() {
IProjectCoordinateProvider pcProvider = mock(IProjectCoordinateProvider.class);
when(pcProvider.tryToUniqueName((IType) anyObject())).thenAnswer(new Answer<Result<UniqueTypeName>>() {
@Override
public Result<UniqueTypeName> answer(InvocationOnMock invocation) throws Throwable {
// wanna refine this later.
return Result.of(new UniqueTypeName(UNKNOWN, VmTypeName.OBJECT));
}
});
// refine later
when(pcProvider.toName((IType) anyObject())).thenReturn(VmTypeName.OBJECT);
when(pcProvider.toName((IMethod) anyObject())).thenReturn(Optional.of(VmMethodName.NULL));
Provider pcMetaProvider = mock(Provider.class);
when(pcMetaProvider.get()).thenReturn(pcProvider);
ICallModelProvider modelProvider = mock(ICallModelProvider.class);
when(modelProvider.acquireModel((UniqueTypeName) anyObject()))
.thenReturn(Optional.<ICallModel>of(new CallModelSpy()));
Provider modelMetaProvider = mock(Provider.class);
when(modelMetaProvider.get()).thenReturn(modelProvider);
CallCompletionSessionProcessor sut = new CallCompletionSessionProcessor(pcMetaProvider, modelMetaProvider,
new ProposalNameProvider(), new CallsRcpPreferences(), new SharedImages());
CompletionRcpPreferences preferences = mock(CompletionRcpPreferences.class);
SessionProcessorDescriptor sessionProcessor = new SessionProcessorDescriptor("", "", "", null, 0, true, "",
sut);
when(preferences.getEnabledSessionProcessors()).thenReturn(ImmutableSet.of(sessionProcessor));
return new MockedIntelligentCompletionProposalComputer(sut, preferences, new Provider<IEditorPart>() {
@Override
public IEditorPart get() {
return (IEditorPart) new CompilationUnitEditor();
}
});
}
}