package org.eclipse.recommenders.completion.rcp.it;
import static org.eclipse.recommenders.testing.CodeBuilder.classDeclaration;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.assertThat;
import static org.junit.Assume.assumeThat;
import java.util.Collection;
import java.util.LinkedList;
import org.eclipse.jdt.core.IType;
import org.eclipse.recommenders.completion.rcp.IRecommendersCompletionContext;
import org.eclipse.recommenders.testing.rcp.completion.rules.TemporaryWorkspace;
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.collect.Lists;
/**
* Test that generic types and their (first) bound are taken into account when completion is triggered on a generic
* return value.
*
* @see <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=404751">Bug 404751</a>
*/
@RunWith(Parameterized.class)
public class Bug404751Test {
@ClassRule
public static final TemporaryWorkspace WORKSPACE = new TemporaryWorkspace();
private final boolean ignore;
private final String expectedType;
private final String typeParameters;
private final String typeArguments;
public Bug404751Test(boolean ignore, String expectedType, String typeParameters, String typeArguments) {
this.ignore = ignore;
this.expectedType = expectedType;
this.typeParameters = typeParameters;
this.typeArguments = typeArguments;
}
@Parameters(name = "{index}")
public static Collection<Object[]> scenarios() {
LinkedList<Object[]> scenarios = Lists.newLinkedList();
scenarios.add(scenario("Object", null, null));
scenarios.add(scenario("Number", null, "Number"));
scenarios.add(scenario("Number", "Number", null));
scenarios.add(scenario("Integer", "Number", "Integer"));
scenarios.add(scenario("List", "List", null));
scenarios.add(scenario("List", "List<?>", null));
scenarios.add(scenario("List", "List<?>", "List"));
scenarios.add(scenario("ArrayList", "List<?>", "ArrayList"));
scenarios.add(scenario("List", "List<?>", "List<?>"));
scenarios.add(scenario("ArrayList", "List<?>", "ArrayList<?>"));
scenarios.add(scenario("List", "List<T>", null));
// See <https://bugs.eclipse.org/bugs/show_bug.cgi?id=461562>
scenarios.add(ignoredScenario("List", "List & Closeable", null));
scenarios.add(ignoredScenario("Closeable", "Closeable & List", null));
scenarios.add(ignoredScenario("Number", "Number & List", null));
scenarios.add(ignoredScenario("Number", "Number & List & Closeable", null));
return scenarios;
}
private static Object[] scenario(String expectedType, String tExtends, String t) {
return scenario(false, expectedType, tExtends, t);
}
private static Object[] ignoredScenario(String expectedType, String tExtends, String t) {
return scenario(true, expectedType, tExtends, t);
}
private static Object[] scenario(boolean ignore, String expectedType, String tExtends, String t) {
String typeParameters = tExtends == null ? "<T>" : "<T extends " + tExtends + ">";
String typeArguments = t == null ? "" : "<" + t + ">";
return new Object[] { ignore, expectedType, typeParameters, typeArguments };
}
@Test
public void testReceiverTypeOfInstanceMethod() throws Exception {
assumeThat(ignore, is(equalTo(false)));
String producerMethod = "T produce() { return null; }";
String consumerMethod = "static void consume() { new TestClass" + typeArguments + "().produce().$; }";
CharSequence code = classDeclaration("class TestClass" + typeParameters, producerMethod + consumerMethod);
IRecommendersCompletionContext sut = WORKSPACE.createProject().createFile(code).triggerContentAssist();
IType receiverType = sut.getReceiverType().get();
assertThat(receiverType.getElementName(), is(equalTo(expectedType)));
}
@Test
public void testReceiverTypeOfStaticMethod() throws Exception {
assumeThat(ignore, is(equalTo(false)));
String producerMethod = "static " + typeParameters + " T produce() { return null; }";
String consumerMethod = "static void consume() { TestClass." + typeArguments + "produce().$; }";
CharSequence code = classDeclaration("class TestClass", producerMethod + consumerMethod);
IRecommendersCompletionContext sut = WORKSPACE.createProject().createFile(code).triggerContentAssist();
IType receiverType = sut.getReceiverType().get();
assertThat(receiverType.getElementName(), is(equalTo(expectedType)));
}
}