This is an automated email from the git hooks/post-receive script. komal-guest pushed a commit to branch master in repository groovy2.
commit e89e124f2796fcc4a3edd68b3be954679f460ebc Author: komal <[email protected]> Date: Thu Jun 25 01:21:30 2015 +0530 Imported Upstream version 2.4.3+dfsg --- buildSrc/src/main/java/JavadocFixTool.java | 350 ------ .../stc/ClosureParamTypeInferenceSTCTest.groovy | 1222 -------------------- 2 files changed, 1572 deletions(-) diff --git a/buildSrc/src/main/java/JavadocFixTool.java b/buildSrc/src/main/java/JavadocFixTool.java deleted file mode 100644 index a85a47b..0000000 --- a/buildSrc/src/main/java/JavadocFixTool.java +++ /dev/null @@ -1,350 +0,0 @@ -/* - * Copyright (c) 2013 Oracle and/or its affiliates. - * All rights reserved. Use is subject to license terms. - * - * License Agreement - * - * PLEASE READ THE FOLLOWING LICENSE TERMS CAREFULLY BEFORE USING THE - * ACCOMPANYING PROGRAM. THESE TERMS CONSTITUTE A LEGAL AGREEMENT BETWEEN - * YOU AND US. - * - * "Oracle" refers to Oracle America, Inc., for and on behalf of itself and its - * subsidiaries and affiliates under common control. "We," "us," and "our" - * refers to Oracle and any Program contributors. "You" and "your" refers to - * the individual or entity that wishes to use the Program. "Program" refers to - * the Java API Documentation Updater Tool, Copyright (c) 2013, Oracle America, - * Inc., and updates or error corrections provided by Oracle or contributors. - * - * WARNING: - * The Program will analyze directory information on your computer - * system and may modify software components on such computer system. You - * should only use the Program on computer systems that you maintain sufficient - * rights to update software components. - * - * If your computer system is owned by a person or entity other than you, - * you should check with such person or entity before using the Program. - * - * It is possible that you may lose some software functionality, and make - * Java API Documentation pages unusable on your computer system after you use - * the Program to update software components. - * - * License Rights and Obligations - * We grant you a perpetual, nonexclusive, limited license to use, modify and - * distribute the Program in binary and/or source code form, only for the - * purpose of analyzing the directory structure of your computer system and - * updating Java API Documentation files. If you distribute the Program, in - * either or both binary or source form, including as modified by you, you - * shall include this License Agreement ("Agreement") with your distribution. - * - * All rights not expressly granted above are hereby reserved. If you want to - * use the Program for any purpose other than as permitted under this - * Agreement, you must obtain a valid license permitting such use from Oracle. - * Neither the name of Oracle nor the names of any Program contributors may be - * used to endorse or promote products derived from this software without - * specific prior written permission. - * - * Ownership and Restrictions - * We retain all ownership and intellectual property rights in the Program as - * provided by us. You retain all ownership and intellectual property rights - * in your modifications. - * - * Export - * You agree to comply fully with export laws and regulations of the United - * States and any other applicable export laws ("Export Laws") to assure that - * neither the Program nor any direct products thereof are: (1) exported, - * directly or indirectly, in violation of this Agreement or Export Laws; or - * (2) used for any purposes prohibited by the Export Laws, including, without - * limitation, nuclear, chemical, or biological weapons proliferation, or - * development of missile technology. - * - * Disclaimer of Warranty and Limitation of Liability - * THE PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. USE AT YOUR - * OWN RISK. WE FURTHER DISCLAIM ALL WARRANTIES, EXPRESS AND IMPLIED, - * INCLUDING WITHOUT LIMITATION, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. - * - * IN NO EVENT SHALL WE BE LIABLE FOR ANY INDIRECT, DIRECT, INCIDENTAL, - * SPECIAL, PUNITIVE OR CONSEQUENTIAL DAMAGES, OR DAMAGES FOR LOSS OF PROFITS, - * REVENUE, DATA OR DATA USE, INCURRED BY YOU OR ANY THIRD PARTY, WHETHER IN AN - * ACTION IN CONTRACT OR TORT, EVEN IF WE HAVE BEEN ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGES. ORACLE SHALL HAVE NO LIABILITY FOR MODIFICATIONS MADE BY - * YOU OR ANY THIRD PARTY. - * - * Entire Agreement - * You agree that this Agreement is the complete agreement for the Program, and - * this Agreement supersedes all prior or contemporaneous agreements or - * representations. If any term of this Agreement is found to be invalid or - * unenforceable, the remaining provisions will remain effective. This - * Agreement is governed by the substantive and procedural laws of California. - * You and Oracle agree to submit to the exclusive jurisdiction of, and venue - * in, the courts of San Francisco or Santa Clara counties in California in - * any dispute between you and Oracle arising out of or relating to this - * Agreement. - * - * Last updated: 14 June 2013 - */ -import java.io.*; - -/* - * Tool for finding and addressing files related to CVE-2013-1571. - * See README file for details. - */ -public class JavadocFixTool { - // Usual suspects - private static final String[] fileNames = {"index.html", - "index.htm", - "toc.html", - "toc.htm"}; - - // If we locate this function but not validURL - we are in trouble - private final String patchString = "function loadFrames() {"; - // Main fix - should be inserted before the loadFrames() function alongside - // the code that calls this function - private static final String[] patchData = - {" if (targetPage != \"\" && !validURL(targetPage))", - " targetPage = \"undefined\";", - " function validURL(url) {", - " var pos = url.indexOf(\".html\");", - " if (pos == -1 || pos != url.length - 5)", - " return false;", - " var allowNumber = false;", - " var allowSep = false;", - " var seenDot = false;", - " for (var i = 0; i < url.length - 5; i++) {", - " var ch = url.charAt(i);", - " if ('a' <= ch && ch <= 'z' ||", - " 'A' <= ch && ch <= 'Z' ||", - " ch == '$' ||", - " ch == '_') {", - " allowNumber = true;", - " allowSep = true;", - " } else if ('0' <= ch && ch <= '9'", - " || ch == '-') {", - " if (!allowNumber)", - " return false;", - " } else if (ch == '/' || ch == '.') {", - " if (!allowSep)", - " return false;", - " allowNumber = false;", - " allowSep = false;", - " if (ch == '.')", - " seenDot = true;", - " if (ch == '/' && seenDot)", - " return false;", - " } else {", - " return false;", - " }", - " }", - " return true;", - " }", - " function loadFrames() {"}; - - private final String quickFixString = "if (!(url.indexOf(\".html\") == url.length - 5))"; - private final String[] quickFix = {" var pos = url.indexOf(\".html\");", - " if (pos == -1 || pos != url.length - 5)"}; - private static String readme = null; - private static String version = "Java Documentation Updater Tool version 1.2 06/14/2013\n"; - - private static boolean doPatch = true; // By default patch file - private static boolean recursive = false; // By default only look in the folder in parameter - - public static void main(String[] args) { - System.out.println(version); - - if (args.length < 1) { - // No arguments - lazily initialize readme, print readme and usage - initReadme(); - if (readme != null) { - System.out.println(readme); - } - printUsage(System.out); - return; - } - - // Last argument should be a path to the document root - String name = args[args.length-1]; - - // Analyze the rest of parameters - for (int i = 0 ; i < args.length -1; i++) { - if ("-R".equalsIgnoreCase(args[i])) { - recursive = true; - } else if ("-C".equalsIgnoreCase(args[i])) { - doPatch = false; - } else { - System.err.println("Unknown option passed: "+args[i]); - printUsage(System.err); - return; - } - } - new JavadocFixTool().proceed(name); - } - - /* - * Print usage information into the provided PrintStream - * @param out PrintStream to write usage information - */ - public static void printUsage(PrintStream out) { - out.println("Usage: java -jar JavadocPatchTool.jar [-R] [-C] <Path to Javadoc root>"); - out.println(" -R : Proceed recursively starting from given folder"); - out.println(" -C : Check only - program will find vulnerable files and print their full paths"); - } - - /* - * Lazily initialize the readme document, reading it from README file inside the jar - */ - public static void initReadme() { - try { - InputStream readmeStream = JavadocFixTool.class.getResourceAsStream("/README"); - if (readmeStream != null) { - BufferedReader readmeReader = new BufferedReader(new InputStreamReader(readmeStream)); - StringBuilder readmeBuilder = new StringBuilder(); - String s; - while ((s = readmeReader.readLine()) != null) { - readmeBuilder.append(s); - readmeBuilder.append("\n"); - } - readme = readmeBuilder.toString(); - } - } catch (IOException ignore) {} // Ignore exception - readme not initialized - } - - /* - * Main procedure - proceed with the searching and/or fixing depending on - * the command line parameters - * @param name Path to the document root - */ - public void proceed(String name) { - try { - File folder = new File(name); - if (folder.exists() && folder.isDirectory() && folder.canRead()) { - searchAndPatch(folder); - } else { - System.err.println("Invalid folder in parameter \""+name+"\""); - printUsage(System.err); - } - } catch (Exception ignored) {} // Die silently - } - - /* - * Find all the files that match the list given in the fileNames array. - * If file found attempt to patch it. - * If global parameter recursive is set to true attempt to go into the enclosed subfolders - * otherwise only patch said files in the folder directly pointed in parameter. - */ - public void searchAndPatch(File folder) { - if (folder == null || !folder.isDirectory() || folder.list() == null) { - // Silently return - return; - } - - for (File file : folder.listFiles()) { - if (file.isDirectory()) { - if(recursive) { - searchAndPatch(file); - } - continue; - } - String name = file.getName(); - for (String s : fileNames) { - if (s.equalsIgnoreCase(name)) { - try { - applyPatch(file, folder); - } catch (Exception ex) { - String filePath; - try { - filePath = file.getCanonicalPath(); - } catch (IOException ioe) { - System.err.println("Can not resolve path to "+file.getName()+" in folder "+folder.getName()); - continue; - } - System.err.println("Patch failed on: "+filePath+" due to the "+ex); - } - } - } - } - } - - /* - * Try to apply patch to the single file in the specific folder - * If global parameter doPatch is false we should only print the location of the vulnerable html file - * and return - */ - public void applyPatch(File file, File currentFolder) throws Exception { - FileInputStream fis = new FileInputStream(file); - BufferedReader br = new BufferedReader(new InputStreamReader(fis)); - String line; - String failedString = patchString; - String[] patch = patchData; - // Attempt to look if file is vulnerable - for (int i = 0 ; i < 80 ; i++) { // Check first 80 lines - if there is no signature it is not our file - line = br.readLine(); - if (line == null) { - // File less than 80 lines long, no signature encountered - return; - } - if (line.trim().equals("function validURL(url) {")) { // Already patched - failedString = null; - patch = null; - continue; - } - if (line.trim().equals(quickFixString)) { // The patch had famous 2-letter bug, update it - failedString = quickFixString; - patch = quickFix; - continue; - } - if (line.trim().equals("function loadFrames() {")) { - fis.close(); // It should not interfere with the file renaming process - if (failedString != null) { - // Vulnerable file - if (!doPatch) { // Report and return - System.out.println("Vulnerable file found: "+file.getCanonicalPath()); - } else { - replaceStringInFile(currentFolder, file, failedString, patch); - } - } - return; - } - } - } - - /* - * Replace one line in the given file in the given folder with the lines given - * @param folder Folder in which file should be created - * @param file Original file to patch - * @param template Trimmed String with the pattern we are have to find - * @param replacement Array of String that has to be written in the place of first line matching the template - */ - public void replaceStringInFile(File folder, File file, String template, String[] replacement) - throws IOException { - System.out.println("Patching file: "+file.getCanonicalPath()); - String name = file.getName(); - File origFile = new File(folder, name+".orig"); - file.renameTo(origFile); - File temporaryFile = new File(folder, name+".tmp"); - if (temporaryFile.exists()) { - temporaryFile.delete(); - } - temporaryFile.createNewFile(); - String line; - FileInputStream fis = new FileInputStream(origFile); - PrintWriter pw = new PrintWriter(temporaryFile); - BufferedReader br = new BufferedReader(new InputStreamReader(fis)); - while ((line = br.readLine()) != null) { - if (line.trim().equals(template)) { - for (String s : replacement) { - pw.println(s); - } - } else { - pw.println(line); - } - } - pw.flush(); - pw.close(); - if (!temporaryFile.renameTo(new File(folder, name))) { - throw new IOException("Unable to rename file in folder "+folder.getName()+ - " from \""+temporaryFile.getName()+"\" into \""+name + - "\n Original file saved as "+origFile.getName()); - } - origFile.delete(); - } -} diff --git a/src/test/groovy/transform/stc/ClosureParamTypeInferenceSTCTest.groovy b/src/test/groovy/transform/stc/ClosureParamTypeInferenceSTCTest.groovy deleted file mode 100644 index 63bc0b4..0000000 --- a/src/test/groovy/transform/stc/ClosureParamTypeInferenceSTCTest.groovy +++ /dev/null @@ -1,1222 +0,0 @@ -/* - * Copyright 2003-2013 the original author or authors. - * - * Licensed under the Apaarraylisstringsicense"); - * you may not use this file except in comparraylistOfStringsicense. - * Ystringshe License at - * - * arraylistOfStringse.org/licenses/LICENSE-2.0 - * - * Unless required by apstrings 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 groovy.transform.stc - -import groovy.transform.NotYetImplemented - -/** - * Unit tests for static type checking : closure parameter type inference. - * - * @author Cedric Champeau - */ -class ClosureParamTypeInferenceSTCTest extends StaticTypeCheckingTestCase { - void testInferenceForDGM_CollectUsingExplicitIt() { - assertScript ''' - ['a','b'].collect { it -> it.toUpperCase() } - ''' - } - - void testInferenceForDGM_CollectUsingExplicitItAndIncorrectType() { - shouldFailWithMessages ''' - ['a','b'].collect { Date it -> it.toUpperCase() } - ''', 'Expected parameter of type java.lang.String but got java.util.Date' - } - - void testInferenceForDGM_CollectUsingImplicitIt() { - assertScript ''' - ['a','b'].collect { it.toUpperCase() } - ''' - } - - void testInferenceForDGM_eachUsingExplicitIt() { - assertScript ''' - ['a','b'].each { it -> it.toUpperCase() } - ''' - } - - void testInferenceForDGM_eachUsingImplicitIt() { - assertScript ''' - ['a','b'].each { it.toUpperCase() } - ''' - } - - void testInferenceForDGM_CollectUsingImplicitItAndLUB() { - assertScript ''' - assert [1234, 3.14].collect { it.intValue() } == [1234,3] - ''' - } - - void testInferenceForDGM_countUsingFirstSignature() { - assertScript ''' - def src = [a: 1, b:2, c:3] - assert src.count { k,v -> v>1 } == 2 - ''' - } - - void testInferenceForDGM_countUsingSecondSignature() { - assertScript ''' - def src = [a: 1, b:2, c:3] - assert src.count { e -> e.value>1 } == 2 - ''' - } - - void testInferenceForDGM_countUsingSecondSignatureAndImplicitIt() { - assertScript ''' - def src = [a: 1, b:2, c:3] - assert src.count { it.value>1 } == 2 - ''' - } - - void testInferenceForDGM_collectManyUsingFirstSignature() { - assertScript ''' -def map = [bread:3, milk:5, butter:2] -def result = map.collectMany{ k, v -> k.startsWith('b') ? k.toList() : [] } -assert result == ['b', 'r', 'e', 'a', 'd', 'b', 'u', 't', 't', 'e', 'r'] -''' - } - - void testInferenceForDGM_collectManyUsingSecondSignature() { - assertScript ''' -def map = [bread:3, milk:5, butter:2] -def result = map.collectMany{ e -> e.key.startsWith('b') ? e.key.toList() : [] } -assert result == ['b', 'r', 'e', 'a', 'd', 'b', 'u', 't', 't', 'e', 'r'] -''' - } - - void testInferenceForDGM_collectManyUsingSecondSignatureAndImplicitIt() { - assertScript ''' -def map = [bread:3, milk:5, butter:2] -def result = map.collectMany{ it.key.startsWith('b') ? it.key.toList() : [] } -assert result == ['b', 'r', 'e', 'a', 'd', 'b', 'u', 't', 't', 'e', 'r'] -''' - } - - void testInferenceForDGM_Collect2() { - assertScript ''' -def items = [] -['a','b','c'].collect(items) { it.toUpperCase() } -''' - } - - void testInferenceForDGM_CollectMap() { - assertScript ''' - assert [a: 'foo',b:'bar'].collect { k,v -> k+v } == ['afoo','bbar'] - assert [a: 'foo',b:'bar'].collect { e -> e.key+e.value } == ['afoo','bbar'] - assert [a: 'foo',b:'bar'].collect { it.key+it.value } == ['afoo','bbar'] -''' - } - - void testInferenceForDGM_CollectMapWithCollection() { - assertScript ''' - assert [a: 'foo',b:'bar'].collect([]) { k,v -> k+v } == ['afoo','bbar'] - assert [a: 'foo',b:'bar'].collect([]) { e -> e.key+e.value } == ['afoo','bbar'] - assert [a: 'foo',b:'bar'].collect([]) { it.key+it.value } == ['afoo','bbar'] -''' - } - - void testInferenceForDGM_collectEntries() { - assertScript ''' - assert ['a','b','c'].collectEntries { [it, it.toUpperCase() ]} == [a:'A',b:'B',c:'C'] -''' - } - - void testInferenceForDGM_collectEntriesWithCollector() { - assertScript ''' - assert ['a','b','c'].collectEntries([:]) { [it, it.toUpperCase() ]} == [a:'A',b:'B',c:'C'] -''' - } - - void testInferenceForDGM_collectEntriesIterator() { - assertScript ''' - assert ['a','b','c'].iterator().collectEntries { [it, it.toUpperCase() ]} == [a:'A',b:'B',c:'C'] -''' - } - - void testInferenceForDGM_collectEntriesIteratorWithCollector() { - assertScript ''' - assert ['a','b','c'].iterator().collectEntries([:]) { [it, it.toUpperCase() ]} == [a:'A',b:'B',c:'C'] -''' - } - - void testInferenceForDGM_collectEntriesOnMap() { - assertScript ''' - assert [a:'a',b:'b',c:'c'].collectEntries { k,v -> [k+k, v.toUpperCase() ]} == [aa:'A',bb:'B',cc:'C'] - assert [a:'a',b:'b',c:'c'].collectEntries { e -> [e.key+e.key, e.value.toUpperCase() ]} == [aa:'A',bb:'B',cc:'C'] - assert [a:'a',b:'b',c:'c'].collectEntries { [it.key+it.key, it.value.toUpperCase() ]} == [aa:'A',bb:'B',cc:'C'] -''' - } - - void testInferenceForDGM_collectEntriesOnMapWithCollector() { - assertScript ''' - assert [a:'a',b:'b',c:'c'].collectEntries([:]) { k,v -> [k+k, v.toUpperCase() ]} == [aa:'A',bb:'B',cc:'C'] - assert [a:'a',b:'b',c:'c'].collectEntries([:]) { e -> [e.key+e.key, e.value.toUpperCase() ]} == [aa:'A',bb:'B',cc:'C'] - assert [a:'a',b:'b',c:'c'].collectEntries([:]) { [it.key+it.key, it.value.toUpperCase() ]} == [aa:'A',bb:'B',cc:'C'] -''' - } - - void testInferenceForDGM_collectEntriesOnArray() { - assertScript ''' - String[] array = ['a','b','c'] - assert array.collectEntries { [it, it.toUpperCase() ]} == [a:'A',b:'B',c:'C'] -''' - } - - void testInferenceForDGM_collectEntriesOnArrayWithCollector() { - assertScript ''' - String[] array = ['a','b','c'] - assert array.collectEntries([:]) { [it, it.toUpperCase() ]} == [a:'A',b:'B',c:'C'] -''' - } - - void testInferenceForDGM_collectManyOnIterable() { - assertScript ''' - assert (0..5).collectMany { [it, 2*it ]} == [0,0,1,2,2,4,3,6,4,8,5,10] -''' - } - - void testInferenceForDGM_collectManyOnIterator() { - assertScript ''' - assert (0..5).iterator().collectMany { [it, 2*it ]} == [0,0,1,2,2,4,3,6,4,8,5,10] -''' - } - - void testInferenceForDGM_collectManyOnIterableWithCollector() { - assertScript ''' - assert (0..5).collectMany([]) { [it, 2*it ]} == [0,0,1,2,2,4,3,6,4,8,5,10] -''' - } - - void testInferenceForDGM_collectManyOnMap() { - assertScript ''' - assert [a:0,b:1,c:2].collectMany { k,v -> [v, 2*v ]} == [0,0,1,2,2,4] - assert [a:0,b:1,c:2].collectMany { e -> [e.value, 2*e.value ]} == [0,0,1,2,2,4] - assert [a:0,b:1,c:2].collectMany { [it.value, 2*it.value ]} == [0,0,1,2,2,4] -''' - } - - void testInferenceForDGM_collectManyOnMapWithCollector() { - assertScript ''' - assert [a:0,b:1,c:2].collectMany([]) { k,v -> [v, 2*v ]} == [0,0,1,2,2,4] - assert [a:0,b:1,c:2].collectMany([]) { e -> [e.value, 2*e.value ]} == [0,0,1,2,2,4] - assert [a:0,b:1,c:2].collectMany([]) { [it.value, 2*it.value ]} == [0,0,1,2,2,4] -''' - } - - void testInferenceForDGM_collectManyOnArray() { - assertScript ''' - Integer[] arr = (0..5) as Integer[] - assert arr.collectMany { [it, 2*it ]} == [0,0,1,2,2,4,3,6,4,8,5,10] -''' - } - - void testInferenceOnNonExtensionMethod() { - assertScript '''import groovy.transform.stc.ClosureParams - import groovy.transform.stc.FirstParam - public <T> T foo(T arg, @ClosureParams(FirstParam) Closure c) { c.call(arg) } - assert foo('a') { it.toUpperCase() } == 'A' -''' - } - - void testFromStringWithSimpleType() { - assertScript '''import groovy.transform.stc.FromString -import groovy.transform.stc.ClosureParams - -void foo(@ClosureParams(value=FromString,options="java.lang.String") Closure cl) { cl.call('foo') } -foo { String str -> println str.toUpperCase()} -''' - - shouldFailWithMessages '''import groovy.transform.stc.FromString -import groovy.transform.stc.ClosureParams - -void foo(@ClosureParams(value=FromString,options="java.lang.String") Closure cl) { cl.call('foo') } -foo { Date str -> println str} -''', 'Expected parameter of type java.lang.String but got java.util.Date' - } - - void testFromStringWithGenericType() { - assertScript '''import groovy.transform.stc.FromString -import groovy.transform.stc.ClosureParams - -void foo(@ClosureParams(value=FromString,options="java.util.List<java.lang.String>") Closure cl) { cl.call(['foo']) } -foo { List<String> str -> str.each { println it.toUpperCase() } } -''' - - shouldFailWithMessages '''import groovy.transform.stc.FromString -import groovy.transform.stc.ClosureParams - -void foo(@ClosureParams(value=FromString,options="java.util.List<java.lang.String>") Closure cl) { cl.call(['foo']) } -foo { List<Date> d -> d.each { println it } } -''', 'Expected parameter of type java.util.List <java.lang.String> but got java.util.List <Date>' - } - - void testFromStringWithDirectGenericPlaceholder() { - - assertScript '''import groovy.transform.stc.FromString -import groovy.transform.stc.ClosureParams - -public <T> void foo(T t, @ClosureParams(value=FromString,options="T") Closure cl) { cl.call(t) } -foo('hey') { println it.toUpperCase() } -''' - - } - - void testFromStringWithGenericPlaceholder() { - assertScript '''import groovy.transform.stc.FromString -import groovy.transform.stc.ClosureParams - -public <T> void foo(T t, @ClosureParams(value=FromString,options="java.util.List<T>") Closure cl) { cl.call([t,t]) } -foo('hey') { List<String> str -> str.each { println it.toUpperCase() } } -''' - - } - - void testFromStringWithGenericPlaceholderFromClass() { - assertScript '''import groovy.transform.stc.FromString -import groovy.transform.stc.ClosureParams - - class Foo<T> { - public void foo(@ClosureParams(value=FromString,options="java.util.List<T>") Closure cl) { cl.call(['hey','ya']) } - } - def foo = new Foo<String>() - - foo.foo { List<String> str -> str.each { println it.toUpperCase() } } -''' - } - - void testFromStringWithGenericPlaceholderFromClassWithTwoGenerics() { - assertScript '''import groovy.transform.stc.FromString -import groovy.transform.stc.ClosureParams - - class Foo<T,U> { - public void foo(@ClosureParams(value=FromString,options="java.util.List<U>") Closure cl) { cl.call(['hey','ya']) } - } - def foo = new Foo<Integer,String>() - - foo.foo { List<String> str -> str.each { println it.toUpperCase() } } -''' - } - - void testFromStringWithGenericPlaceholderFromClassWithTwoGenericsAndNoExplicitSignature() { - assertScript '''import groovy.transform.stc.FromString -import groovy.transform.stc.ClosureParams - - class Foo<T,U> { - public void foo(@ClosureParams(value=FromString,options="java.util.List<U>") Closure cl) { cl.call(['hey','ya']) } - } - def foo = new Foo<Integer,String>() - - foo.foo { it.each { println it.toUpperCase() } } -''' - } - - void testFromStringWithGenericPlaceholderFromClassWithTwoGenericsAndNoExplicitSignatureAndNoFQN() { - assertScript '''import groovy.transform.stc.FromString -import groovy.transform.stc.ClosureParams - - class Foo<T,U> { - public void foo(@ClosureParams(value=FromString,options="List<U>") Closure cl) { cl.call(['hey','ya']) } - } - def foo = new Foo<Integer,String>() - - foo.foo { it.each { println it.toUpperCase() } } -''' - } - - void testFromStringWithGenericPlaceholderFromClassWithTwoGenericsAndNoExplicitSignatureAndNoFQNAndReferenceToSameUnitClass() { - assertScript '''import groovy.transform.stc.FromString -import groovy.transform.stc.ClosureParams - - class Foo { - void bar() { - println 'Haha!' - } - } - - class Tor<D,U> { - public void foo(@ClosureParams(value=FromString,options="List<U>") Closure cl) { cl.call([new Foo(), new Foo()]) } - } - def tor = new Tor<Integer,Foo>() - - tor.foo { it.each { it.bar() } } -''' - } - - void testFromStringWithGenericPlaceholderFromClassWithTwoGenericsAndNoExplicitSignatureAndNoFQNAndReferenceToSameUnitClassAndTwoArgs() { - assertScript '''import groovy.transform.stc.FromString -import groovy.transform.stc.ClosureParams - - class Foo { - void bar() { - println 'Haha!' - } - } - - class Tor<D,U> { - public void foo(@ClosureParams(value=FromString,options=["D,List<U>"]) Closure cl) { cl.call(3, [new Foo(), new Foo()]) } - } - def tor = new Tor<Integer,Foo>() - - tor.foo { r, e -> r.times { e.each { it.bar() } } } -''' - } - - void testFromStringWithGenericPlaceholderFromClassWithTwoGenericsAndPolymorphicSignature() { - assertScript '''import groovy.transform.stc.FromString -import groovy.transform.stc.ClosureParams - - class Foo { - void bar() { - println 'Haha!' - } - } - - class Tor<D,U> { - public void foo(@ClosureParams(value=FromString,options=["D,List<U>", "D"]) Closure cl) { - if (cl.maximumNumberOfParameters==2) { - cl.call(3, [new Foo(), new Foo()]) - } else { - cl.call(3) - } - } - } - def tor = new Tor<Integer,Foo>() - - tor.foo { r, e -> r.times { e.each { it.bar() } } } - tor.foo { it.times { println 'polymorphic' } } -''' - } - - void testStringGroovyMethodsFindMethodWithVargs() { - assertScript ''' - "75001 Paris".find(/(\\d{5}\\s(\\w+))/) { all, zip, city -> println all.toUpperCase() } -''' - - assertScript ''' - "75001 Paris".find(/(\\d{5}\\s(\\w+))/) { String all, String zip, String city -> println all.toUpperCase() } -''' - shouldFailWithMessages ''' - "75001 Paris".find(/(\\d{5}\\s(\\w+))/) { String all, Date zip, String city -> println all.toUpperCase() } -''', 'Expected parameter of type java.lang.String but got java.util.Date' - } - - void testInferenceForDGM_countIterableOrIterator() { - assertScript ''' - assert ['Groovy','Java'].count { it.length() > 4 } == 1 - ''' - assertScript ''' - assert ['Groovy','Java'].iterator().count { it.length() > 4 } == 1 - ''' - } - - void testInferenceForDGM_countMap() { - assertScript ''' - assert [G:'Groovy',J:'Java'].count { k,v -> v.length() > 4 } == 1 - assert [G:'Groovy',J:'Java'].count { e -> e.value.length() > 4 } == 1 - assert [G:'Groovy',J:'Java'].count { it.value.length() > 4 } == 1 - ''' - } - - void testInferenceForDGM_countArray() { - assertScript ''' - String[] array = ['Groovy','Java'] - assert array.count { it.length() > 4 } == 1 - ''' - } - - void testInferenceForDGM_countBy() { - assertScript ''' - assert ['Groovy','yvoorG'].countBy { it.length() } == [6:2] - ''' - assertScript ''' - assert ['Groovy','yvoorG'].iterator().countBy { it.length() } == [6:2] - ''' - } - void testInferenceForDGM_countByArray() { - assertScript ''' - String[] array = ['Groovy','yvoorG'] - assert array.countBy { it.length() } == [6:2] - ''' - } - void testInferenceForDGM_countByMap() { - assertScript ''' - assert [langs:['Groovy','Java']].countBy { k,v -> k.length() } == [5:1] - assert [langs:['Groovy','Java']].countBy { e -> e.key.length() } == [5:1] - assert [langs:['Groovy','Java']].countBy { it.key.length() } == [5:1] - ''' - } - - void testInferenceForDGM_downto() { - assertScript ''' - BigDecimal sum = 0 - 10.0.downto(0) { - sum += 2*it - } - assert sum == 110 - ''' - assertScript ''' - BigInteger sum = 0 - 10G.downto(0) { - sum += 2*it - } - assert sum == 110 - ''' - assertScript ''' - double sum = 0 - 10d.downto(0) { - sum += 2*it - } - assert sum == 110 - ''' - assertScript ''' - Double sum = 0 - new Double(10).downto(0) { - sum += 2*it - } - assert sum == 110 - ''' - assertScript ''' - float sum = 0 - 10f.downto(0) { - sum += 2*it - } - assert sum == 110 - ''' - assertScript ''' - Float sum = 0 - new Float(10).downto(0) { - sum += 2*it - } - assert sum == 110 - ''' - assertScript ''' - long sum = 0 - 10L.downto(0) { - sum += 2*it - } - assert sum == 110 - ''' - assertScript ''' - Long sum = 0 - new Long(10).downto(0) { - sum += 2*it - } - assert sum == 110 - ''' - assertScript ''' - def sum = 0 - new Byte((byte)10).downto(0) { - sum += 2*it - } - assert sum == 110 - ''' - } - - void testInferenceForDGM_upto() { - assertScript ''' - BigDecimal sum = 0 - 0.0.upto(10) { - sum += 2*it - } - assert sum == 110 - ''' - assertScript ''' - BigInteger sum = 0 - 0G.upto(10) { - sum += 2*it - } - assert sum == 110 - ''' - assertScript ''' - double sum = 0 - 0d.upto(10) { - sum += 2*it - } - assert sum == 110 - ''' - assertScript ''' - Double sum = 0 - new Double(0).upto(10) { - sum += 2*it - } - assert sum == 110 - ''' - assertScript ''' - float sum = 0 - 0f.upto(10) { - sum += 2*it - } - assert sum == 110 - ''' - assertScript ''' - Float sum = 0 - new Float(0).upto(10) { - sum += 2*it - } - assert sum == 110 - ''' - assertScript ''' - long sum = 0 - 0L.upto(10) { - sum += 2*it - } - assert sum == 110 - ''' - assertScript ''' - Long sum = 0 - new Long(0).upto(10) { - sum += 2*it - } - assert sum == 110 - ''' - assertScript ''' - def sum = 0 - new Byte((byte)0).upto(10) { - sum += 2*it - } - assert sum == 110 - ''' - } - - void testInferenceForDGM_dropWhileOnIterable() { - assertScript ''' - assert (0..10).dropWhile { it<5 } == (5..10) - assert (0..10).dropWhile { int i -> i<5 } == (5..10) - ''' - } - - void testInferenceForDGM_dropWhileOnList() { - assertScript ''' - assert [0,1,2,3,4,5,6,7,8,9,10].dropWhile { it<5 } == [5,6,7,8,9,10] - assert [0,1,2,3,4,5,6,7,8,9,10].dropWhile { int i -> i<5 } == [5,6,7,8,9,10] - ''' - } - - void testInferenceForDGM_dropWhileOnIterator() { - assertScript ''' - assert [0,1,2,3,4,5,6,7,8,9,10].iterator().dropWhile { it<5 } as List == [5,6,7,8,9,10] - assert [0,1,2,3,4,5,6,7,8,9,10].iterator().dropWhile { int i -> i<5 } as List == [5,6,7,8,9,10] - ''' - } - - void testInferenceForDGM_dropWhileOnArray() { - assertScript ''' - Integer[] array = [0,1,2,3,4,5,6,7,8,9,10] - assert array.iterator().dropWhile { it<5 } as List == [5,6,7,8,9,10] - assert array.iterator().dropWhile { int i -> i<5 } as List == [5,6,7,8,9,10] - ''' - } - - void testInferenceForDGM_eachByte() { - assertScript ''' - byte[] array = new byte[0] - array.eachByte { byte b -> b.intValue() } - array.eachByte { it.intValue() } - ''' - assertScript ''' - Byte[] array = new Byte[0] - array.eachByte { Byte b -> b.intValue() } - array.eachByte { it.intValue() } - ''' - } - - void testInferenceForEachWithIndexOnMap() { - assertScript ''' - [a:'A',bb:'B',ccc:'C'].eachWithIndex { k,v,i -> assert k.toUpperCase() == v*(1+i) } - [a:'A',bb:'B',ccc:'C'].eachWithIndex { e,i -> assert e.key.toUpperCase() == e.value*(1+i) } - ''' - } - void testInferenceForEachWithIndexOnIterable() { - assertScript ''' - ['1','2','3'].eachWithIndex { e,i -> assert e.toUpperCase() == String.valueOf(1+i) } - ''' - } - void testInferenceForEachWithIndexOnIterator() { - assertScript ''' - ['1','2','3'].iterator().eachWithIndex { e,i -> assert e.toUpperCase() == String.valueOf(1+i) } - ''' - } - - void testInferenceForDGM_everyOnMap() { - assertScript ''' - assert [a:'A',b:'B',cc:'CC'].every { String k, String v -> k == v.toLowerCase() } - assert [a:'A',b:'B',cc:'CC'].every { k, v -> k == v.toLowerCase() } - assert [a:'A',b:'B',cc:'CC'].every { e -> e.key == e.value.toLowerCase() } - assert [a:'A',b:'B',cc:'CC'].every { it.key == it.value.toLowerCase() } - ''' - } - void testInferenceForDGM_everyOnIterable() { - assertScript ''' - assert ['foo','bar','baz'].every { String it -> it.length() == 3 } - assert ['foo','bar','baz'].every { it -> it.length() == 3 } - assert ['foo','bar','baz'].every { it.length() == 3 } - ''' - } - void testInferenceForDGM_everyOnIterator() { - assertScript ''' - assert ['foo','bar','baz'].iterator().every { String it -> it.length() == 3 } - assert ['foo','bar','baz'].iterator().every { it -> it.length() == 3 } - assert ['foo','bar','baz'].iterator().every { it.length() == 3 } - ''' - } - - void testInferenceForDGM_findOnCollection() { - assertScript ''' - assert ['a','bbb','ccc'].find { String it -> it.length() == 3 } == 'bbb' - assert ['a','bbb','ccc'].find { it -> it.length() == 3 } == 'bbb' - assert ['a','bbb','ccc'].find { it.length() == 3 } == 'bbb' - ''' - } - void testInferenceForDGM_findOnArray() { - assertScript ''' - String[] arraylistOfStrings = ['a','bbb','ccc'] - assert arraylistOfStrings.find { String it -> it.length() == 3 } == 'bbb' - assert arraylistOfStrings.find { it -> it.length() == 3 } == 'bbb' - assert arraylistOfStrings.find { it.length() == 3 } == 'bbb' - ''' - } - void testInferenceForDGM_findOnMap() { - assertScript ''' - assert [a:2,b:4,c:6].find { String k, int v -> k.toUpperCase()=='C' && 2*v==12 } instanceof Map.Entry - assert [a:2,b:4,c:6].find { k, v -> k.toUpperCase()=='C' && 2*v==12 } instanceof Map.Entry - assert [a:2,b:4,c:6].find { e -> e.key.toUpperCase()=='C' && 2*e.value==12 } instanceof Map.Entry - assert [a:2,b:4,c:6].find { it.key.toUpperCase()=='C' && 2*it.value==12 } instanceof Map.Entry - ''' - } - - void testInferenceForDGM_findAllOnCollection() { - assertScript ''' - assert ['a','bbb','ccc'].findAll { String it -> it.length() == 3 } == ['bbb','ccc'] - assert ['a','bbb','ccc'].findAll { it -> it.length() == 3 } == ['bbb','ccc'] - assert ['a','bbb','ccc'].findAll { it.length() == 3 } == ['bbb','ccc'] - ''' - } - void testInferenceForDGM_findAllOnArray() { - assertScript ''' - String[] arraylistOfStrings = ['a','bbb','ccc'] - assert arraylistOfStrings.findAll { String it -> it.length() == 3 } == ['bbb','ccc'] - assert arraylistOfStrings.findAll { it -> it.length() == 3 } == ['bbb','ccc'] - assert arraylistOfStrings.findAll { it.length() == 3 } == ['bbb','ccc'] - ''' - } - void testInferenceForDGM_findAllOnMap() { - assertScript ''' - assert [a:2,b:4,c:6].findAll { String k, int v -> k.toUpperCase()=='C' && 2*v==12 } == [c:6] - assert [a:2,b:4,c:6].findAll { k, v -> k.toUpperCase()=='C' && 2*v==12 } == [c:6] - assert [a:2,b:4,c:6].findAll { e -> e.key.toUpperCase()=='C' && 2*e.value==12 } == [c:6] - assert [a:2,b:4,c:6].findAll { it.key.toUpperCase()=='C' && 2*it.value==12 } == [c:6] - ''' - } - - void testInferenceForDGM_findResultOnCollection() { - assertScript ''' - assert ['barbar','barbaz','foo'].findResult { it.length() == 3?it.toUpperCase():null } == 'FOO' - assert ['barbar','barbaz','foo'].findResult { String it -> it.length() == 3?it.toUpperCase():null } == 'FOO' - assert ['barbar','barbaz','foo'].findResult { it -> it.length() == 3?it.toUpperCase():null } == 'FOO' - assert ['barbar','barbaz','foo'].findResult(-1) { it.length() == 4?it.toUpperCase():null } == -1 - assert ['barbar','barbaz','foo'].findResult(-1) { String it -> it.length() == 4?it.toUpperCase():null } == -1 - assert ['barbar','barbaz','foo'].findResult(-1) { it -> it.length() == 4?it.toUpperCase():null } == -1 - ''' - } - void testInferenceForDGM_findResultOnIterable() { - assertScript ''' - assert (0..10).findResult { it== 3?2*it:null } == 6 - assert (0..10).findResult { int it -> it==3?2*it:null } == 6 - assert (0..10).findResult { it -> it==3?2*it:null } == 6 - ''' - } - void testInferenceForDGM_findResultOnMap() { - assertScript ''' - assert [a:1, b:2, c:3].findResult { String k, int v -> "${k.toUpperCase()}$v"=='C3'?2*v:null } == 6 - assert [a:1, b:2, c:3].findResult { k, v -> "${k.toUpperCase()}$v"=='C3'?2*v:null } == 6 - assert [a:1, b:2, c:3].findResult { e -> "${e.key.toUpperCase()}$e.value"=='C3'?2*e.value:null } == 6 - assert [a:1, b:2, c:3].findResult { "${it.key.toUpperCase()}$it.value"=='C3'?2*it.value:null } == 6 - - assert [a:1, b:2, c:3].findResult('a') { String k, int v -> "${k.toUpperCase()}$v"=='C4'?2*v:null } == 'a' - assert [a:1, b:2, c:3].findResult('a') { k, v -> "${k.toUpperCase()}$v"=='C4'?2*v:null } == 'a' - assert [a:1, b:2, c:3].findResult('a') { e -> "${e.key.toUpperCase()}$e.value"=='C4'?2*e.value:null } == 'a' - assert [a:1, b:2, c:3].findResult('a') { "${it.key.toUpperCase()}$it.value"=='C4'?2*it.value:null } == 'a' - ''' - } - - void testInferenceForDGM_findResultsOnIterable() { - assertScript ''' - assert (0..10).findResults { it<3?2*it:null } == [0,2,4] - assert (0..10).findResults { int it -> it<3?2*it:null } == [0,2,4] - assert (0..10).findResults { it -> it<3?2*it:null } == [0,2,4] - ''' - } - void testInferenceForDGM_findResultsOnMap() { - assertScript ''' - assert [a:1, b:2, c:3].findResults { String k, int v -> "${k.toUpperCase()}$v"=='C3'?2*v:null } == [6] - assert [a:1, b:2, c:3].findResults { k, v -> "${k.toUpperCase()}$v"=='C3'?2*v:null } == [6] - assert [a:1, b:2, c:3].findResults { e -> "${e.key.toUpperCase()}$e.value"=='C3'?2*e.value:null } == [6] - assert [a:1, b:2, c:3].findResults { "${it.key.toUpperCase()}$it.value"=='C3'?2*it.value:null } == [6] - ''' - } - - void testInferenceForDGM_groupByIterable() { - assertScript ''' - assert ['a','bb','cc','d','eee'].groupBy { it.length() } == [1:['a','d'],2:['bb','cc'],3:['eee']] - ''' - } - void testInferenceForDGM_groupByArray() { - assertScript ''' - String[] array = ['a','bb','cc','d','eee'] - assert array.groupBy { it.length() } == [1:['a','d'],2:['bb','cc'],3:['eee']] - ''' - } - void testInferenceForDGM_groupByMap() { - assertScript ''' - assert [a:'1',b:'2',c:'C'].groupBy { e -> e.key.toUpperCase()==e.value?1:0 } == [0:[a:'1',b:'2'], 1:[c:'C']] - assert [a:'1',b:'2',c:'C'].groupBy { k, v -> k.toUpperCase()==v?1:0 } == [0:[a:'1',b:'2'], 1:[c:'C']] - assert [a:'1',b:'2',c:'C'].groupBy { it.key.toUpperCase()==it.value?1:0 } == [0:[a:'1',b:'2'], 1:[c:'C']] - ''' - } - void testInferenceForDGM_groupEntriesBy() { - assertScript ''' - def result = [a:1,b:2,c:3,d:4,e:5,f:6].groupEntriesBy { k,v -> v % 2 } - result = [a:1,b:2,c:3,d:4,e:5,f:6].groupEntriesBy { it.value % 2 } - result = [a:1,b:2,c:3,d:4,e:5,f:6].groupEntriesBy { e -> e.value % 2 } - assert result[0]*.key == ["b", "d", "f"] - assert result[1]*.value == [1, 3, 5] - ''' - } - - void testInferenceForDGM_injectOnCollectionWithInitialValue() { - assertScript ''' - assert ['a','bb','ccc'].inject(0) { acc, str -> acc += str.length(); acc } == 6 - ''' - } - - void testInferenceForDGM_injectOnArrayWithInitialValue() { - assertScript ''' - String[] array = ['a','bb','ccc'] - assert array.inject(0) { acc, str -> acc += str.length(); acc } == 6 - ''' - } - - void testInferenceForDGM_injectOnIteratorWithInitialValue() { - assertScript ''' - assert ['a','bb','ccc'].iterator().inject(0) { acc, str -> acc += str.length(); acc } == 6 - ''' - } - - void testInferenceForDGM_injectOnCollection() { - assertScript ''' - assert ['a','bb','ccc'].inject { acc, str -> acc += str.toUpperCase(); acc } == 'aBBCCC' - ''' - } - - void testInferenceForDGM_injectOnArray() { - assertScript ''' - String[] array = ['a','bb','ccc'] - assert array.inject { acc, str -> acc += str.toUpperCase(); acc } == 'aBBCCC' - ''' - } - - void testInferenceForDGM_injectOnCollectionWithInitialValueDirect() { - assertScript '''import org.codehaus.groovy.runtime.DefaultGroovyMethods as DGM - assert DGM.inject(['a','bb','ccc'],0) { acc, str -> acc += str.length(); acc } == 6 - ''' - } - - void testInferenceForDGM_injectOnCollectionDirect() { - assertScript '''import org.codehaus.groovy.runtime.DefaultGroovyMethods as DGM - assert DGM.inject(['a','bb','ccc']) { acc, str -> acc += str.toUpperCase(); acc } == 'aBBCCC' - ''' - } - - void testDGM_injectOnMap() { - assertScript ''' - assert [a:1,b:2].inject(0) { acc, entry -> acc += entry.value; acc} == 3 - assert [a:1,b:2].inject(0) { acc, k, v -> acc += v; acc} == 3 - ''' - } - - void testDGM_max() { - assertScript ''' - assert ['a','abc', 'defg','hi'].max { it.length() } == 'defg' - assert ['a','abc', 'defg','hi'].iterator().max { it.length() } == 'defg' - assert (['a','abc', 'defg','hi'] as String[]).max { it.length() } == 'defg' - ''' - } - - void testDGM_maxOnMap() { - assertScript ''' - def result = [a:'a',b:'abc', c:'defg',d:'hi'].max { a,b -> a.value.length() <=> b.value.length() } - assert result.key == 'c' - assert result.value == 'defg' - ''' - assertScript ''' - def result = [a:'a',b:'abc', c:'defg',d:'hi'].max { Map.Entry<String,String> a, Map.Entry<String,String> b -> a.value.length() <=> b.value.length() } - assert result.key == 'c' - assert result.value == 'defg' - ''' - assertScript ''' - def result = [a:'a',b:'abc', c:'defg',d:'hi'].max { e -> e.value.length() } - assert result.key == 'c' - assert result.value == 'defg' - ''' - assertScript ''' - def result = [a:'a',b:'abc', c:'defg',d:'hi'].max { it.value.length() } - assert result.key == 'c' - assert result.value == 'defg' - ''' - } - - void testDGM_min() { - assertScript ''' - assert ['a','abc', 'defg','hi'].min { it.length() } == 'a' - assert ['a','abc', 'defg','hi'].iterator().min { it.length() } == 'a' - assert (['a','abc', 'defg','hi'] as String[]).min { it.length() } == 'a' - ''' - } - - void testDGM_maxOnMin() { - assertScript ''' - def result = [a:'a',b:'abc', c:'defg',d:'hi'].min { a,b -> a.value.length() <=> b.value.length() } - assert result.key == 'a' - assert result.value == 'a' - ''' - assertScript ''' - def result = [a:'a',b:'abc', c:'defg',d:'hi'].min { Map.Entry<String,String> a, Map.Entry<String,String> b -> a.value.length() <=> b.value.length() } - assert result.key == 'a' - assert result.value == 'a' - ''' - assertScript ''' - def result = [a:'a',b:'abc', c:'defg',d:'hi'].min { e -> e.value.length() } - assert result.key == 'a' - assert result.value == 'a' - ''' - assertScript ''' - def result = [a:'a',b:'abc', c:'defg',d:'hi'].min { it.value.length() } - assert result.key == 'a' - assert result.value == 'a' - ''' - } - - void testDGM_removeAllOnCollection() { - assertScript ''' - def list = ['abc','a','groovy','java'] - list.removeAll { it.length() <4 } - assert list == ['groovy','java'] - ''' - } - void testDGM_retainAllOnCollection() { - assertScript ''' - def list = ['abc','a','groovy','java'] - list.retainAll { it.length()>3 } - assert list == ['groovy','java'] - ''' - } - - void testReverseEachOnList() { - assertScript ''' - ['a','b'].reverseEach { println it.toUpperCase() } - ''' - } - void testReverseEachOnArray() { - assertScript ''' - (['a','b'] as String[]).reverseEach { println it.toUpperCase() } - ''' - } - void testReverseEachOnMap() { - assertScript ''' - [a:1,b:2].reverseEach { k,v -> println ((k.toUpperCase())*v) } - [a:1,b:2].reverseEach { e -> println ((e.key.toUpperCase())*e.value) } - [a:1,b:2].reverseEach { println ((it.key.toUpperCase())*it.value) } - ''' - } - - void testDGM_sortOnCollection() { - assertScript ''' - assert ["hi","hey","hello"] == ["hello","hi","hey"].sort { a,b -> a.length() <=> b.length() } - assert ["hi","hey","hello"] == ["hello","hi","hey"].sort { str -> str.length() } - assert ["hi","hey","hello"] == ["hello","hi","hey"].sort { it.length() } - ''' - } - void testDGM_sortOnArray() { - assertScript ''' - String[] array = ["hello","hi","hey"] - assert ["hi","hey","hello"] == array.sort { a,b -> a.length() <=> b.length() } - assert ["hi","hey","hello"] == array.sort { str -> str.length() } - assert ["hi","hey","hello"] == array.sort { it.length() } - ''' - } - void testDGM_sortOnIterator() { - assertScript ''' - assert ["hi","hey","hello"] == ["hello","hi","hey"].iterator().sort { a,b -> a.length() <=> b.length() }.collect() - assert ["hi","hey","hello"] == ["hello","hi","hey"].iterator().sort { str -> str.length() }.collect() - assert ["hi","hey","hello"] == ["hello","hi","hey"].iterator().sort { it.length() }.collect() - ''' - } - void testDGM_sortOnIterable() { - assertScript ''' - def foo(Iterable<String> iterable) { - assert ["hi","hey","hello"] == iterable.sort { a,b -> a.length() <=> b.length() } - assert ["hi","hey","hello"] == iterable.sort { str -> str.length() } - assert ["hi","hey","hello"] == iterable.sort { it.length() } - } - foo(["hello","hi","hey"]) - ''' - } - - void testDGM_sortOnMap() { - assertScript ''' - def map = [a:5, b:3, c:6, d:4].sort { a, b -> a.value <=> b.value } - assert map == [b:3, d:4, a:5, c:6] - ''' - - assertScript ''' - def map = [a:5, b:3, c:6, d:4].sort { a -> a.value } - assert map == [b:3, d:4, a:5, c:6] - ''' - - assertScript ''' - def map = [a:5, b:3, c:6, d:4].sort { it.value } - assert map == [b:3, d:4, a:5, c:6] - ''' - } - - void testDGM_slitOnCollection() { - assertScript ''' - assert [[2,4],[1,3]] == [1,2,3,4].split { it % 2 == 0 } - ''' - } - - void testDGM_takeWhileOnIterable() { - assertScript ''' - class AbcIterable implements Iterable<String> { - Iterator<String> iterator() { "abc".iterator() } - } - def abc = new AbcIterable() - assert abc.takeWhile{ it < 'b' } == ['a'] - assert abc.takeWhile{ it <= 'b' } == ['a', 'b'] -''' - } - void testDGM_takeWhileOnIterator() { - assertScript ''' - class AbcIterable implements Iterable<String> { - Iterator<String> iterator() { "abc".iterator() } - } - def abc = new AbcIterable() - assert abc.iterator().takeWhile{ it < 'b' }.collect() == ['a'] - assert abc.iterator().takeWhile{ it <= 'b' }.collect() == ['a', 'b'] -''' - } - void testDGM_takeWhileOnList() { - assertScript ''' - def abc = ['a','b','c'] - assert abc.iterator().takeWhile{ it < 'b' }.collect() == ['a'] - assert abc.iterator().takeWhile{ it <= 'b' }.collect() == ['a', 'b']''' - } - void testDGM_takeWhileOnArray() { - assertScript ''' - String[] abc = ['a','b','c'] - assert abc.iterator().takeWhile{ it < 'b' }.collect() == ['a'] - assert abc.iterator().takeWhile{ it <= 'b' }.collect() == ['a', 'b']''' - } - void testDGM_takeWhileOnMap() { - assertScript ''' - def shopping = [milk:1, bread:2, chocolate:3] - assert shopping.takeWhile{ it.key.size() < 6 } == [milk:1, bread:2] - assert shopping.takeWhile{ it.value % 2 } == [milk:1] - assert shopping.takeWhile{ k, v -> k.size() + v <= 7 } == [milk:1, bread:2]''' - } - - void testDGM_times() { - assertScript ''' - String foo(int x) { "x"*x } - 10.times { - println foo(it) - } - ''' - } - - void testDGM_unique() { - assertScript ''' - def orig = [1, 3, 4, 5] - def uniq = orig.unique(false) { it % 2 } - assert orig == [1, 3, 4, 5] - assert uniq == [1, 4]''' - - assertScript '''def orig = [2, 3, 3, 4] - def uniq = orig.unique(false) { a, b -> a <=> b } - assert orig == [2, 3, 3, 4] - assert uniq == [2, 3, 4]''' - } - void testDGM_uniqueOnCollection() { - assertScript ''' - def orig = [1, 3, 4, 5] - def uniq = orig.unique { it % 2 } - assert uniq == [1, 4]''' - - assertScript '''def orig = [2, 3, 3, 4] - def uniq = orig.unique { a, b -> a <=> b } - assert uniq == [2, 3, 4]''' - } - void testDGM_uniqueOnIterator() { - assertScript ''' - def orig = [1, 3, 4, 5].iterator() - def uniq = orig.unique { it % 2 }.collect() - assert uniq == [1, 4]''' - - assertScript '''def orig = [2, 3, 3, 4].iterator() - def uniq = orig.unique { a, b -> a <=> b }.collect() - assert uniq == [2, 3, 4]''' - } - - void testDGM_anyOnMap() { - assertScript ''' - assert [a:10, b:1].any { k,v -> k.length() == v } - assert [a:10, b:1].any { e -> e.key.length() == e.value } - assert [a:10, b:1].any {it.key.length() == it.value } - ''' - } - void testDGM_anyOnIterable() { - assertScript ''' - assert ['abc','de','f'].any { it.length() == 2 } - ''' - } - void testDGM_anyOnIterator() { - assertScript ''' - assert ['abc','de','f'].iterator().any { it.length() == 2 } - ''' - } - - void testDGM_mapWithDefault() { - assertScript ''' - def map = [a:'A'].withDefault { it.toUpperCase() } - assert map.b=='B' - ''' - } - - void testFromStringInSameSourceUnit() { - assertScript '''import groovy.transform.stc.ClosureParams -import groovy.transform.stc.FromString - -public <T> void doSomething(T val, @ClosureParams(value=FromString, options="T") Closure cl) { - cl(val) -} - -doSomething('foo') { - println it.toUpperCase() -} - -doSomething(new Date()) { - println it.time -} -''' - - } - - void testInferenceWithSAMTypeCoercion() { - assertScript '''import java.util.concurrent.Callable - -interface Action<T> { - void execute(T thing) -} - -class Wrapper<T> { - - private final T thing - - Wrapper(T thing) { - this.thing = thing - } - - void contravariantTake(Action<? super T> action) { - action.execute(thing) - } - - void invariantTake(Action<T> action) { - action.execute(thing) - } - -} - -static <T> Wrapper<T> wrap(Callable<T> callable) { - new Wrapper(callable.call()) -} - -static Integer dub(Integer integer) { - integer * 2 -} - -wrap { - 1 -} contravariantTake { - dub(it) // fails static compile, 'it' is not known to be Integer -} - -wrap { - 1 -} invariantTake { - dub(it) // passes static compile, 'it' is known to be Integer -} - -''' - } - - void testGroovy6602() { - shouldFailWithMessages '''import groovy.transform.stc.ClosureParams -import groovy.transform.stc.FromString - -void foo(@ClosureParams(value = FromString, options = "java.lang.Number") - Closure cl) { - cl.call(4.5) -} - -foo { Integer i -> println i } -''', 'Expected parameter of type java.lang.Number but got java.lang.Integer' - } - - void testGroovy6729() { - assertScript '''import groovy.transform.stc.ClosureParams -import groovy.transform.stc.FirstParam - - static <T> List<T> callee01(List<T>self, @ClosureParams(FirstParam.FirstGenericType) Closure c) { - self.each { - c.call(it) - } - return self - } - callee01(["a","b","c"]) { a -> - println(a.toUpperCase()) // [Static type checking] - Cannot find matching method java.lang.Object#toUpperCase(). Please check if the declared type is right and if the method exists. - } - ''' - } - - void testGroovy6735() { - assertScript ''' -def extractInfo(String s) { - def squareNums = s.findAll(/\\d+/) { String num -> num.toInteger() }.collect{ Integer num -> num ** 2 } - def wordSizePlusNum = s.findAll(/\\s*(\\w+)\\s*(\\d+)/) { _, String word, String num -> word.size() + num.toInteger() } - def numPlusWordSize = s.findAll(/\\s*(\\w+)\\s*(\\d+)/) { _, word, num -> num.toInteger() + word.size() } - [squareNums, wordSizePlusNum, numPlusWordSize] -} -assert extractInfo(" ab 12 cdef 34 jhg ") == [[144, 1156], [14, 38], [14, 38]] -''' - assertScript ''' -def method() { - assert "foobarbaz".findAll('b(a)([rz])') { full, a, b -> assert "BA"=="B" + a.toUpperCase() }.size() == 2 - assert "foobarbaz".findAll('ba') { String found -> assert "BA" == found.toUpperCase() }.size() == 2 -} - -method() -''' - } -} -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/groovy2.git _______________________________________________ pkg-java-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-java-commits

