/*
* Copyright 2009-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.eclipse.jdt.core.groovy.tests.search;
import org.eclipse.jdt.core.tests.util.GroovyUtils;
import org.junit.Ignore;
import org.junit.Test;
public final class DGMInferencingTests extends InferencingTestSuite {
@Test
public void testDGM1() throws Exception {
String contents = "[1].collectNested { it }";
String str = "it";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.Integer");
}
@Test
public void testDGM2() throws Exception {
String contents = "[1].collectNested { it }";
String str = "it";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.Integer");
}
@Test
public void testDGM3() throws Exception {
String contents = "1.with { it.intValue() }";
String str = "it";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.Integer");
}
@Test
public void testDGM4() throws Exception {
String contents = "1.addShutdownHook { it.intValue() }";
String str = "it";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.Integer");
}
@Test
public void testDGM5() throws Exception {
String contents = "[key:1].every { key, value -> key.toUpperCase() + value.intValue() }";
String str = "key";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.String");
}
@Test
public void testDGM6() throws Exception {
String contents = "[key:1].any { key, value -> key.toUpperCase() + value.intValue() }";
String str = "value";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.Integer");
}
@Test
public void testDGM7() throws Exception {
String contents = "[key:1].every { key, value -> key.toUpperCase() + value.intValue() }";
String str = "key";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.String");
}
@Test
public void testDGM8() throws Exception {
String contents = "[key:1].any { key, value -> key.toUpperCase() + value.intValue() }";
String str = "value";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.Integer");
}
@Test
public void testDGM9() throws Exception {
String contents = "[1].collectMany { [it.intValue()] }";
String str = "it";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.Integer");
}
@Test @Ignore
public void testDGM10() throws Exception {
// this one is not working since Inferencing Engine gets tripped up with the different variants of 'metaClass'
String contents = "Integer.metaClass { this }";
String str = "this";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "groovy.lang.MetaClass");
}
@Test
public void testDGM11() throws Exception {
String contents = "([1] ).collectEntries { index -> index.intValue() }";
String str = "index";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.Integer");
}
@Test
public void testDGM12() throws Exception {
String contents = "[key:1].findResult(1) { key, value -> key.toUpperCase() + value.intValue() }";
String str = "key";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.String");
}
@Test
public void testDGM13() throws Exception {
String contents = "[key:1].findResult(1) { key, value -> key.toUpperCase() + value.intValue() }";
String str = "value";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.Integer");
}
@Test
public void testDGM14() throws Exception {
String contents = "[1].findResults { it.intValue() }";
String str = "it";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.Integer");
}
@Test
public void testDGM15() throws Exception {
String contents = "[key:1].findResults { it.getKey().toUpperCase() + it.getValue().intValue() }";
String str = "it";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.util.Map$Entry<java.lang.String,java.lang.Integer>");
}
@Test
public void testDGM16() throws Exception {
String contents = "[key:1].findResults { key, value -> key.toUpperCase() + value.intValue() }";
String str = "key";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.String");
}
@Test
public void testDGM17() throws Exception {
String contents = "[key:1].findResults { key, value -> key.toUpperCase() + value.intValue() }";
String str = "value";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.Integer");
}
@Test
public void testDGM18() throws Exception {
String contents = "[key:1].findAll { key, value -> key.toUpperCase() + value.intValue() }";
String str = "key";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.String");
}
@Test
public void testDGM19() throws Exception {
String contents = "[key:1].findAll { key, value -> key.toUpperCase() + value.intValue() }";
String str = "value";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.Integer");
}
@Test
public void testDGM20() throws Exception {
String contents = "[key:1].groupBy { key, value -> key.toUpperCase() + value.intValue() }";
String str = "key";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.String");
}
@Test
public void testDGM21() throws Exception {
String contents = "[key:1].groupBy { key, value -> key.toUpperCase() + value.intValue() }";
String str = "value";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.Integer");
}
@Test
public void testDGM22() throws Exception {
String contents = "([1]).countBy { it.intValue() }";
String str = "it";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.Integer");
}
@Test
public void testDGM23() throws Exception {
String contents = "[key:1].groupEntriesBy { key, value -> key.toUpperCase() + value.intValue() }";
String str = "key";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.String");
}
@Test
public void testDGM24() throws Exception {
String contents = "[key:1].groupEntriesBy { key, value -> key.toUpperCase() + value.intValue() }";
String str = "value";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.Integer");
}
@Test
public void testDGM25() throws Exception {
String contents = "[key:1].inject(1) { key, value -> key.toUpperCase() + value.intValue() }";
String str = "key";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.String");
}
@Test
public void testDGM26() throws Exception {
String contents = "[key:1].inject(1) { key, value -> key.toUpperCase() + value.intValue() }";
String str = "value";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.Integer");
}
@Test
public void testDGM27() throws Exception {
String contents = "[key:1].withDefault { key, value -> key.toUpperCase() + value.intValue() }";
String str = "key";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.String");
}
@Test
public void testDGM28() throws Exception {
String contents = "[key:1].withDefault { key, value -> key.toUpperCase() + value.intValue() }";
String str = "value";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.Integer");
}
@Test
public void testDGM29() throws Exception {
String contents = "new FileOutputStream().withStream { it }";
String str = "it";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.io.OutputStream");
}
@Test
public void testDGM30() throws Exception {
String contents = "new File(\"test\").eachFileMatch(FileType.FILES, 1) { it.getName() }";
String str = "it";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.io.File");
}
@Test
public void testDGM31() throws Exception {
String contents = "new File(\"test\").eachDirMatch(FileType.FILES, 1) { it.getName() }";
String str = "it";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.io.File");
}
@Test
public void testDGM32() throws Exception {
String contents = "new File(\"test\").withReader { it.reset() }";
String str = "it";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.io.BufferedReader");
}
@Test
public void testDGM33() throws Exception {
String contents = "new FileReader(new File(\"test\")).filterLine(new FileWriter(new File(\"test\"))) { it.toUpperCase() }";
String str = "it";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.String");
}
@Test
public void testDGM34() throws Exception {
String contents = "new File(\"test\").withOutputStream { it.flush() }";
String str = "it";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.io.OutputStream");
}
@Test
public void testDGM35() throws Exception {
String contents = "new File(\"test\").withInputStream { it.flush() }";
String str = "it";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.io.InputStream");
}
@Test
public void testDGM36() throws Exception {
String contents = "new File(\"test\").withDataOutputStream { it.flush() }";
String str = "it";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.io.DataOutputStream");
}
@Test
public void testDGM37() throws Exception {
String contents = "new File(\"test\").withDataInputStream { it.flush() }";
String str = "it";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.io.DataInputStream");
}
@Test
public void testDGM38() throws Exception {
String contents = "new File(\"test\").withWriter { it.flush() }";
String str = "it";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.io.BufferedWriter");
}
@Test
public void testDGM39() throws Exception {
String contents = "new File(\"test\").withWriterAppend { it.flush() }";
String str = "it";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.io.BufferedWriter");
}
@Test
public void testDGM40() throws Exception {
String contents = "new File(\"test\").withPrintWriter { it.flush() }";
String str = "it";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.io.PrintWriter");
}
@Test
public void testDGM41() throws Exception {
String contents = "new FileReader(new File(\"test\")).transformChar(new FileWriter(new File(\"test\"))) { it.toUpperCase() }";
String str = "it";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.String");
}
@Test
public void testDGM42() throws Exception {
String contents = "new FileReader(new File(\"test\")).transformLine(new FileWriter(new File(\"test\"))) { it.toUpperCase() }";
String str = "it";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.String");
}
@Test
public void testDGM43() throws Exception {
String contents = "\"\".eachMatch(\"\") { it.toLowerCase() }";
String str = "it";
int start = contents.lastIndexOf(str);
int end = start + str.length();
assertType(contents, start, end, "java.lang.String");
}
@Test // GRECLIPSE-1695
public void testDGM44() throws Exception {
String contents = "List<String> myList = new ArrayList<String>()\n" +
"myList.toSorted { a, b ->\n" +
" a.trim() <=> b.trim()\n" +
"}.each {\n" +
" it\n" +
"}\n";
int start = contents.lastIndexOf("it");
int end = start + "it".length();
assertType(contents, start, end, "java.lang.String");
}
@Test // GRECLIPSE-1695 redux
public void testDGM45() throws Throwable {
// Java 8 adds default method sort(Comparator) to List interface...
// TypeInferencingVisitorWithRequestor.lookupExpressionType replaces DGM (from CategoryTypeLookup) with JDK (from SimpleTypeLookup)
String contents = "List<String> myList = new ArrayList<String>()\n" +
"myList.sort { a, b ->\n" +
" a.trim() <=> b.trim()\n" +
"}.each {\n" +
" it\n" +
"}\n";
int start = contents.lastIndexOf("it");
int end = start + "it".length();
assertTypeOneOf(contents, start, end, "java.lang.Void", "java.lang.String");
}
@Test
public void testDGM46() throws Exception {
String contents = "java.util.regex.Pattern[] pats = [~/one/, ~/two/]\n" +
"pats.eachWithIndex { pat, idx ->\n" + // T <T> eachWithIndex(T self, Closure task)
" \n" +
"}\n";
int start = contents.indexOf("eachWithIndex");
int end = start + "eachWithIndex".length();
assertType(contents, start, end, "java.util.regex.Pattern[]");
}
@Test
public void testDGM47() throws Exception {
String contents = "java.util.regex.Pattern[] pats = [~/one/, ~/two/]\n" +
"pats.eachWithIndex { pat, idx ->\n" +
" \n" +
"}.collect {\n" + // T <T> collect(Object self, Closure<T> task)
" it\n" +
"}\n";
int start = contents.indexOf("collect");
int end = start + "collect".length();
assertType(contents, start, end, "java.util.List<T>"); // better than 'unknown'
}
@Test
public void testDGM48() throws Exception {
String contents = "int[] ints = [1, 2, 3]\n" +
"String dgm(Object[] arr) { null }\n" +
"Object dgm(Object obj) { null }\n" +
"def result = dgm(ints)\n";
int start = contents.indexOf("result");
int end = start + "result".length();
assertType(contents, start, end, "java.lang.Object");
}
@Test
public void testDGM48a() throws Exception {
// TODO: runtime preference seems to be the Object method
String contents = "int[] ints = [1, 2, 3]\n" +
"Object dgm(Object obj) { null }\n" +
"String dgm(Object[] arr) { null }\n" +
"def result = dgm(ints)\n";
int start = contents.indexOf("result");
int end = start + "result".length();
assertType(contents, start, end, "java.lang.String");
}
@Test
public void testDGM49() throws Exception {
// primitive array is not compatible with boxed-type array
String contents = "int[] ints = [1, 2, 3]\n" +
"Integer dgm(Integer[] arr) { null }\n" +
"Object dgm(Object obj) { null }\n" +
"def result = dgm(ints)\n";
int start = contents.indexOf("result");
int end = start + "result".length();
assertType(contents, start, end, "java.lang.Object");
}
@Test
public void testDGM50() throws Exception {
// SimpleTypeLookup returns first method in case of no type-compatible matches
// TODO: primitive array is not compatible with derived-from-boxed-type array
String contents = "int[] ints = [1, 2, 3]\n" +
"Number dgm(Number[] arr) { null }\n" +
"def result = dgm(ints)\n";
int start = contents.indexOf("result");
int end = start + "result".length();
assertType(contents, start, end, "java.lang.Number");
//assertUnknownConfidence(contents, start, end, "java.lang.Object", false);
}
@Test
public void testDGM50a() throws Exception {
String contents = "Integer[] ints = [1, 2, 3]\n" +
"Number dgm(Number[] arr) { null }\n" +
"def result = dgm(ints)\n";
int start = contents.indexOf("result");
int end = start + "result".length();
assertType(contents, start, end, "java.lang.Number");
}
@Test
public void testDGMDeclaring1() throws Exception {
// With groovy 2.0, there are some new DGM classes. Need to ensure that we are using those classes as the declaring type, but only for 2.0 or later.
String contents = "\"\".eachLine";
String str = "eachLine";
int start = contents.lastIndexOf(str);
int end = start + str.length();
if (GroovyUtils.GROOVY_LEVEL >= 20) {
assertDeclaringType(contents, start, end, "org.codehaus.groovy.runtime.StringGroovyMethods");
} else {
assertDeclaringType(contents, start, end, "org.codehaus.groovy.runtime.DefaultGroovyMethods");
}
}
@Test
public void testDGMDeclaring2() throws Exception {
String contents = "new File().eachLine";
String str = "eachLine";
int start = contents.lastIndexOf(str);
int end = start + str.length();
if (GroovyUtils.GROOVY_LEVEL >= 20) {
assertDeclaringType(contents, start, end, "org.codehaus.groovy.runtime.ResourceGroovyMethods");
} else {
assertDeclaringType(contents, start, end, "org.codehaus.groovy.runtime.DefaultGroovyMethods");
}
}
@Test
public void testDGMDeclaring3() throws Exception {
String contents = "Writer w\nw.leftShift";
String str = "leftShift";
int start = contents.lastIndexOf(str);
int end = start + str.length();
if (GroovyUtils.GROOVY_LEVEL >= 20) {
assertDeclaringType(contents, start, end, "org.codehaus.groovy.runtime.IOGroovyMethods");
} else {
assertDeclaringType(contents, start, end, "org.codehaus.groovy.runtime.DefaultGroovyMethods");
}
}
}