expandopropertytest.groovy

来自「Groovy动态语言 运行在JVM中的动态语言 可以方便的处理业务逻辑变化大的业」· GROOVY 代码 · 共 99 行

GROOVY
99
字号
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 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() }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?