blob: b1d83fe8d5a54a338b1ce36a3e943f79f48297e0 [file] [log] [blame]
/*
* Copyright 2003-2010 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 groovy
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 -> println("Called with ${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)
println foo
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)
println(foo)
assert foo.equals(bar) == false
assert foo.equals(zap) == true
def list = []
list << foo
list << bar
println list
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
println "hashCode: " + foo.hashCode()
foo.hashCode = { return value }
println("hashCode: " + foo.hashCode())
assert foo.hashCode() == foo.value
println("toString: " + foo.toString())
foo.toString = { return "Type: ${type}, Value: ${value}" }
println("toString: " + foo.toString())
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() }
}