blob: 8d97da8353f48862394997ff34864b8db1822727 [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
import groovy.test.GroovyTestCase
class ExpandoPropertyTest extends GroovyTestCase {
void testExpandoProperty() {
def foo = new Expando()
foo.cheese = "Cheddar"
foo.name = "Gromit"
assert foo.cheese == "Cheddar"
assert foo.name == "Gromit"
assert foo.properties.size() == 2
}
void testExpandoMethods() {
def foo = new Expando()
foo.cheese = "Cheddar"
foo.fullName = "Gromit"
foo.nameLength = { return fullName.length() }
foo.multiParam = { a, b, c -> return a + b + c }
assert foo.cheese == "Cheddar"
assert foo.fullName == "Gromit"
assert foo.nameLength() == 6, foo.nameLength()
assert foo.multiParam(1, 2, 3) == 6
// lets test using wrong number of parameters
shouldFail { foo.multiParam(1) }
shouldFail { foo.nameLength(1, 2) }
}
void testExpandoMethodCloning() {
def foo = new Expando()
def c = {
assert delegate instanceof Expando
1
}
foo.one = c
assert foo.one() == 1
assert !(c.delegate instanceof Expando)
}
void testExpandoConstructorAndToString() {
def foo = new Expando(type: "sometype", value: 42)
assert foo.toString() == "{type=sometype, value=42}"
assert "${foo}" == "{type=sometype, value=42}"
}
void testExpandoMethodOverrides() {
def equals = { Object obj -> return obj.value == value }
def foo = new Expando(type: "myfoo", value: 42, equals: equals)
def bar = new Expando(type: "mybar", value: 43, equals: equals)
def zap = new Expando(type: "myzap", value: 42, equals: equals)
assert foo.equals(bar) == false
assert foo.equals(zap) == true
def list = []
list << foo
list << bar
assert list.contains(foo) == true
assert list.contains(bar) == true
assert list.contains(zap) == true
assert list.indexOf(bar) == 1
assert list.indexOf(foo) == 0
foo.hashCode = { return value }
assert foo.hashCode() == foo.value
foo.toString = { return "Type: ${type}, Value: ${value}" }
assert foo.toString() == "Type: myfoo, Value: 42"
}
void testArrayAccessOnThis() {
def a = new FancyExpando([a: 1, b: 2])
a.update([b: 5, a: 2])
assert a.a == 2
assert a.b == 5
}
void testExpandoClassProperty() {
def e = new Expando()
e.class = "hello world"
assert e.class == "hello world"
}
}
class FancyExpando extends Expando {
FancyExpando(args) { super(args) }
def update(args) {
for (e in args) this[e.key] = e.value // using 'this'
}
String toString() { dump() }
}