package org.eclipse.recommenders.completion.rcp.it;
import static org.eclipse.jdt.ui.PreferenceConstants.CODEASSIST_FAVORITE_STATIC_MEMBERS;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat;
import java.util.Collection;
import java.util.LinkedList;
import java.util.Set;
import org.eclipse.jdt.ui.PreferenceConstants;
import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
import org.eclipse.recommenders.completion.rcp.IRecommendersCompletionContext;
import org.eclipse.recommenders.testing.CodeBuilder;
import org.eclipse.recommenders.testing.rcp.completion.rules.TemporaryWorkspace;
import org.hamcrest.Matcher;
import org.junit.After;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
/**
* Test that Content Assist Favorites, i.e., static members that are always considered to be imported, are collected as
* proposals.
*
* @see <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=437045">Bug 437045</a>
*/
@RunWith(Parameterized.class)
public class Bug437045Test {
@ClassRule
public static final TemporaryWorkspace WORKSPACE = new TemporaryWorkspace();
private final String expected;
private final String preference;
private String previousPreference;
public Bug437045Test(String expected, String preference) {
this.expected = expected;
this.preference = preference;
}
@Parameters(name = "{index}: favorites {2} => {1}")
public static Collection<Object[]> scenarios() {
LinkedList<Object[]> scenarios = Lists.newLinkedList();
scenarios.add(scenario("sqrt", "java.lang.Math.sqrt"));
scenarios.add(scenario("sqrt", "java.lang.Math.*"));
scenarios.add(scenario("currentTimeMillis", "java.lang.System.currentTimeMillis", "java.lang.Math.sqrt"));
scenarios.add(scenario("currentTimeMillis", "java.lang.Math.sqrt", "java.lang.System.currentTimeMillis"));
scenarios.add(scenario("currentTimeMillis", "java.lang.System.currentTimeMillis", "java.lang.Math.*"));
scenarios.add(scenario("currentTimeMillis", "java.lang.Math.*", "java.lang.System.currentTimeMillis"));
return scenarios;
}
private static Object[] scenario(String expected, String... favorites) {
return new Object[] { expected, Joiner.on(';').join(favorites) };
}
@Before
public void setUp() {
previousPreference = PreferenceConstants.getPreferenceStore().getString(CODEASSIST_FAVORITE_STATIC_MEMBERS);
PreferenceConstants.getPreferenceStore().setValue(CODEASSIST_FAVORITE_STATIC_MEMBERS, preference);
}
@After
public void tearDown() {
PreferenceConstants.getPreferenceStore().setValue(CODEASSIST_FAVORITE_STATIC_MEMBERS, previousPreference);
}
@Test
public void testReceiverTypeOfInstanceMethod() throws Exception {
CharSequence code = CodeBuilder.method("$");
IRecommendersCompletionContext sut = WORKSPACE.createProject().createFile(code).triggerContentAssist();
Set<IJavaCompletionProposal> proposals = sut.getProposals().keySet();
assertThat(proposals, hasItem(hasDisplayString(startsWith(expected))));
}
private static Matcher<IJavaCompletionProposal> hasDisplayString(Matcher<String> matcher) {
return hasProperty("displayString", matcher);
}
}