blob: 07246209d8fea9874f794c45d501b09ebe32a98c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 groovy.transform.stc
/**
* Unit tests for static type checking : closure parameter type inference for {@link org.codehaus.groovy.runtime.StringGroovyMethods}.
*/
class StringGMClosureParamTypeInferenceSTCTest extends StaticTypeCheckingTestCase {
void testCollectReplacements() {
assertScript '''
assert "Groovy".collectReplacements { s -> s.equalsIgnoreCase('O') ? s.toUpperCase() : s } == 'GrOOvy'
'''
}
void testDropWhile() {
assertScript '''
def text = "Groovy"
assert text.dropWhile{ it.charAt(0) < (char)'Z' } == 'roovy'
assert text.dropWhile{ !it.equalsIgnoreCase('V') } == 'vy'
assert text.dropWhile{ char it -> it < (char)'Z' } == 'roovy'
assert text.dropWhile{ Character it -> it != (char)'v' } == 'vy'
'''
}
void testEachLine() {
assertScript '''
def text = """abc
def
ghi"""
text.eachLine { line -> assert line.length() == 3 }
text.eachLine { assert it.length() == 3 }
text.eachLine { line, nb -> assert line.length() <= 3+nb }
'''
}
void testEachLineWithStartValue() {
assertScript '''
def text = """abc
def
ghi"""
text.eachLine(3) { line -> assert line.length() == 3 }
text.eachLine(3) { assert it.length() == 3 }
text.eachLine(3) { line, nb -> assert line.length() <= nb }
'''
}
void testEachMatch() {
shouldFailWithMessages '''
'groovy'.eachMatch('(groo)(vy)') { groups ->
}
''', 'More than one target method matches'
assertScript '''
'groovy'.eachMatch('(groo)(vy)') { List groups ->
assert groups.size()==3
assert groups[0] == 'groovy'
assert groups[1] == 'groo'
}
'''
assertScript '''
'groovy'.eachMatch('(groo)(vy)') { full, a, b ->
assert full == 'groovy'
assert a.toUpperCase() == 'GROO'
}
'''
}
void testEachMatchWithPattern() {
shouldFailWithMessages '''
'groovy'.eachMatch(~'(groo)(vy)') { groups ->
}
''', 'More than one target method matches'
assertScript '''
'groovy'.eachMatch(~'(groo)(vy)') { List groups ->
assert groups.size()==3
assert groups[0] == 'groovy'
assert groups[1] == 'groo'
}
'''
assertScript '''
'groovy'.eachMatch(~'(groo)(vy)') { full, a, b ->
assert full == 'groovy'
assert a.toUpperCase() == 'GROO'
}
'''
}
void testFind() {
checkFind("'foobarbaz'")
checkFind('''"${'foobarbaz'}"''')
checkFind("new StringBuilder('foobarbaz')")
}
private checkFind(CharSequence s) {
assertScript 'assert ' + s + '.find("b(a)(r)") { full, a, r -> assert "BAR"=="B" + a.toUpperCase() + r.toUpperCase() }'
}
void testFindPattern() {
checkFindPattern("'foobarbaz'")
checkFindPattern('''"${'foobarbaz'}"''')
checkFindPattern("new StringBuilder('foobarbaz')")
}
private checkFindPattern(CharSequence s) {
assertScript 'assert ' + s + '.find(~"b(a)(r)") { full, a, r -> assert "BAR"=="B" + a.toUpperCase() + r.toUpperCase() }'
}
void testFindAll() {
checkFindAll("'foobarbaz'")
checkFindAll('''"${'foobarbaz'}"''')
checkFindAll("new StringBuilder('foobarbaz')")
}
private checkFindAll(CharSequence s) {
assertScript 'assert ' + s + '.findAll("b(a)([rz])") { full, a, rz -> assert "BA"=="B" + a.toUpperCase() }.size() == 2'
}
void testFindAllPattern() {
checkFindAllPattern("'foobarbaz'")
checkFindAllPattern('''"${'foobarbaz'}"''')
checkFindAllPattern("new StringBuilder('foobarbaz')")
}
private checkFindAllPattern(CharSequence s) {
assertScript 'assert ' + s + '.findAll(~"b(a)([rz])") { full, a, rz -> assert "BA"=="B" + a.toUpperCase() }.size() == 2'
}
void testReplaceAll() {
assertScript '''
assert 'foobarbaz'.replaceAll('b(ar|az)') { List<String> it -> it[1].toUpperCase() } == 'fooARAZ'
assert 'foobarbaz'.replaceAll('b(ar|az)') { full, sub -> full.toUpperCase() } == 'fooBARBAZ'
'''
}
void testReplaceAllWithPattern() {
assertScript '''
assert 'foobarbaz'.replaceAll(~'b(ar|az)') { List<String> it -> it[1].toUpperCase() } == 'fooARAZ\'
assert 'foobarbaz'.replaceAll(~'b(ar|az)') { full, sub -> full.toUpperCase() } == 'fooBARBAZ\'
'''
}
void testReplaceFirst() {
assertScript '''
assert 'foobarbaz'.replaceFirst('b(ar|az)') { List<String> it -> it[1].toUpperCase() } == 'fooARbaz'
assert 'foobarbaz'.replaceFirst('b(ar|az)') { full, sub -> full.toUpperCase() } == 'fooBARbaz'
'''
}
void testReplaceFirstWithPattern() {
assertScript '''
assert 'foobarbaz'.replaceFirst(~'b(ar|az)') { List<String> it -> it[1].toUpperCase() } == 'fooARbaz'
assert 'foobarbaz'.replaceFirst(~'b(ar|az)') { full, sub -> full.toUpperCase() } == 'fooBARbaz'
'''
}
void testSplitEachLine() {
assertScript '''
def text="""a,c
d:f
g,i"""
text.splitEachLine('([,:])') { a -> println a[0].toUpperCase() }
'''
}
void testTakeWhileOnCharSeq() {
assertScript '''
String foo(CharSequence cs) { cs.takeWhile { it.charAt(0) < (char) 'j' }}
assert foo("abcdefghijklmnopqrstuvwxyz") == 'abcdefghi'
'''
}
}