package org.eclipse.recommenders.internal.snipmatch.rcp.completion;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.*;
import org.eclipse.jface.text.Region;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.text.templates.Template;
import org.eclipse.jface.text.templates.TemplateContext;
import org.eclipse.recommenders.snipmatch.ISnippet;
import org.eclipse.recommenders.snipmatch.model.SnippetRepositoryConfiguration;
import org.eclipse.recommenders.utils.Recommendation;
import org.eclipse.swt.graphics.Device;
import org.eclipse.swt.graphics.Image;
import org.junit.Before;
import org.junit.Test;
public class ProposalSorterTest {
private ProposalSorter sut;
@Before
public void setUp() {
sut = new ProposalSorter();
}
@Test
public void testCompareSnippetsByRepositoryPriority() throws Exception {
SnippetProposal first = mockSnippetProposal(0, 1.0, "snippet");
SnippetProposal second = mockSnippetProposal(1, 1.0, "snippet");
assertThatFirstProposalComesFirst(first, second);
}
@Test
public void testCompareSnippetsByRelevance() throws Exception {
SnippetProposal first = mockSnippetProposal(0, 1.0, "snippet");
SnippetProposal second = mockSnippetProposal(0, 0.5, "snippet");
assertThatFirstProposalComesFirst(first, second);
}
@Test
public void testCompareSnippetsByName() throws Exception {
SnippetProposal first = mockSnippetProposal(0, 1.0, "snippet1");
SnippetProposal second = mockSnippetProposal(0, 1.0, "snippet2");
assertThatFirstProposalComesFirst(first, second);
}
@Test
public void testCompareRepositories() throws Exception {
RepositoryProposal first = mockRepositoryProposal(0, "repository");
RepositoryProposal second = mockRepositoryProposal(1, "repository");
assertThatFirstProposalComesFirst(first, second);
}
@Test
public void testCompareRepositoryWithOwnSnippet() throws Exception {
RepositoryProposal first = mockRepositoryProposal(0, "repository");
SnippetProposal second = mockSnippetProposal(0, 1.0, "snippet");
assertThatFirstProposalComesFirst(first, second);
}
@Test
public void testCompareRepositoryWithSnippetFromHigherPriorityRepository() throws Exception {
RepositoryProposal first = mockRepositoryProposal(0, "repository");
SnippetProposal second = mockSnippetProposal(1, 1.0, "snippet");
assertThatFirstProposalComesFirst(first, second);
}
@Test
public void testCompareRepositoryWithSnippetFromLowPriorityRepository() throws Exception {
SnippetProposal first = mockSnippetProposal(0, 1.0, "snippet");
RepositoryProposal second = mockRepositoryProposal(1, "repository");
assertThatFirstProposalComesFirst(first, second);
}
private void assertThatFirstProposalComesFirst(ICompletionProposal first, ICompletionProposal second) {
assertThat(sut.compare(first, second), is(lessThan(0)));
assertThat(sut.compare(second, first), is(greaterThan(0)));
}
@SuppressWarnings("unchecked")
private SnippetProposal mockSnippetProposal(int repositoryPriority, double relevance, String name) throws Exception {
ISnippet snippet = mock(ISnippet.class);
when(snippet.getName()).thenReturn(name);
Recommendation<ISnippet> recommendation = mock(Recommendation.class);
when(recommendation.getProposal()).thenReturn(snippet);
when(recommendation.getRelevance()).thenReturn(relevance);
Template template = mock(Template.class);
TemplateContext context = mock(TemplateContext.class);
Region region = mock(Region.class);
Device device = mock(Device.class);
Image image = new Image(device, 1, 1);
return SnippetProposal.newSnippetProposal(recommendation, repositoryPriority, template, context, region, image);
}
private RepositoryProposal mockRepositoryProposal(int repositoryPriority, String name) {
SnippetRepositoryConfiguration config = mock(SnippetRepositoryConfiguration.class);
when(config.getName()).thenReturn(name);
return new RepositoryProposal(config, repositoryPriority, 1);
}
}