| 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() } |
| } |