blob: 855f71d72f5d9cbae868bd154dcd1c65b1455cc1 [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.operator
import groovy.test.GroovyTestCase
/**
* Test the spread map operator "*:".
*
* For an example,
* m = ['a':11, 'aa':22, 'aaa':33]
* z = ['c':100, *:m]
*
* m = ['a':11, 'aa':22, 'aaa':33]
* w = ['c':100]
* m.each {w[it.key] = it.value }*
* assert z == w
*
*/
class SpreadMapOperatorTest extends GroovyTestCase {
def f(m) {
println m.c
}
def func(m, i, j, k) {
// The first argument m is a map.
println m
println i
println j
println k
}
def fn() {
return [1: 'ein', 2: 'zwei', 3: 'drei']
}
void testSpreadMap() {
try {
def m = ["a": 100, "b": 200]
def x = ['tt': 55, *: m]
println x.size()
println x
x = ['tt': 55, 'yy': 77]
println x
x = [*: m, *: m]
println x
assert x == m
x = [*: x, *: fn(), 100: 'hundred']
println x
println(x.getClass())
assert x instanceof Map
def y = [1: 1, 2: 2, *: [3: 3, 4: 4, *: [5: 5], 6: 6], 7: 7]
println y
println(y.getClass())
assert y == [1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7]
}
catch (Exception e) {
e.printStackTrace()
}
}
void testSpreadMapVsWithClosure() {
def m = ['a': 11, 'aa': 22, 'aaa': 33]
def z = ['c': 100, *: m]
def w = ['c': 100]
m.each { w[it.key] = it.value }
println z
println w
assert z == w
def z2 = [*: m, 'c': 100]
def w2 = m
w2['c'] = 100
println z2
println w2
assert z2 == w2
assert z == z2
assert w == w2
}
void testSpecialSpreadMapIndexNotation() {
assertScript '''
@groovy.transform.ToString
class Person { String name; int age }
assert Person[ name:'Dave', age:32 ].toString() == 'Person(Dave, 32)'
def timMap = [ name:'Tim', age:49 ]
assert Person[ *:timMap ].toString() == 'Person(Tim, 49)'
assert Person[ *:[ name:'John', age:29 ] ].toString() == 'Person(John, 29)'
def ppl = [ [ name:'Tim', age:49 ], [ name:'Dave', age:32 ], [ name:'Steve', age:18 ] ]
assert ppl.collect { Person [ *:it ] }*.age == [49, 32, 18]
'''
}
void testSpreadMapFunctionCall() {
def m = ['a': 10, 'b': 20, 'c': 30]
f(*: m) // Call with only one spread map argument
f(*: m, 'e': 50) // Call with one spread map argument and one named argument
f('e': 100, *: m) // Call with one named argument and one spread map argument
func('e': 100, 1, 2, 3, *: m)
// Call with one named argument, three usual arguments, and one spread map argument
def l = [4, 5]
func('e': 100, *l, *: m, 6)
// Call with one named argument, one spread list argument, one spread map argument, and one usual argument
func(7, 'e': 100, *l, *: m)
// Call with one usual argument, one named argument, one spread list argument, and one spread map argument
}
}