blob: 8fc82f7141c8b3a8a546772c2040608db01b72db [file] [log] [blame]
/**
* Tests the respondsTo functionality of Groovy
* @author Graeme Rocher
* @since 1.1
*
* Created: Sep 7, 2007
* Time: 4:35:19 PM
*
*/
package groovy.lang
class RespondsToTest extends GroovyTestCase {
void testRespondsToForMethodEvaluation() {
RespondsToTestClass.metaClass.invokeMethod = {String name, args ->
def methods = RespondsToTestClass.metaClass.respondsTo(delegate,name, args*.getClass() as Object[])
def result
if(methods) {
// only way to get var-args to work is to do this at the moment. Yuck!
if(methods[0].parameterTypes.length == 1 && methods[0].parameterTypes[0].cachedClass == Object[].class)
result = methods[0].invoke(delegate, [args] as Object[])
else
result = methods[0].invoke(delegate, args)
}
else {
result = "foo"
}
result
}
def t = new RespondsToTestClass()
assertEquals "one", t.noArgsMethod()
assertEquals "two", t.varArgsMethod(1,2)
assertEquals "two", t.varArgsMethod(null,null)
assertEquals "three", t.typedArgsMethod("one",1)
assertEquals "three", t.typedArgsMethod(null,1)
assertEquals "three", t.typedArgsMethod(null,null)
assertEquals "four", t.overloadedMethod("one")
assertEquals "five", t.overloadedMethod(1)
assertEquals "four", t.overloadedMethod(null)
assertEquals "six", t.overloadedMethod()
assertEquals "foo", t.doStuff()
}
void testRespondsTo() {
RTTest2.metaClass.newM = {-> "foo" }
def t = new RTTest2()
assert t.metaClass.respondsTo(t,"one")
assert t.metaClass.respondsTo(t,"three")
assert t.metaClass.respondsTo(t,"one", String)
assert t.metaClass.respondsTo(t,"foo", String)
assert t.metaClass.respondsTo(t,"bar", String)
assert t.metaClass.respondsTo(t,"stuff")
//assert t.metaClass.respondsTo(t,"two") THIS DOESN'T WORK! Should responds to deal with closure properties?
assert t.metaClass.respondsTo(t,"getFive")
assert t.metaClass.respondsTo(t,"setFive")
assert t.metaClass.respondsTo(t,"setFive", String)
assert t.metaClass.respondsTo(t,"newM")
assert !t.metaClass.respondsTo(t,"one", String, Integer)
}
void testHasProperty() {
RTTest2.metaClass.getNewProp = {-> "new" }
def t = new RTTest2()
assert t.metaClass.hasProperty(t,"two")
assert t.metaClass.hasProperty(t,"five")
assert t.metaClass.hasProperty(t,"six")
assert t.metaClass.hasProperty(t,"seven")
assert t.metaClass.hasProperty(t,"eight")
assert t.metaClass.hasProperty(t,"newProp")
}
}
class RespondsToTestClass {
def noArgsMethod() { "one" }
def varArgsMethod(Object[] args) { "two" }
def typedArgsMethod(String one, Integer two) { "three" }
def overloadedMethod(String one) { "four" }
def overloadedMethod(Integer one) { "five" }
def overloadedMethod() { "six" }
}
class RTTest1 {
String five
def two = { "three" }
def one() { "two"}
def one(String one) { "two: $one" }
def three(String one) { "four" }
def three(Integer one) { "four" }
def foo(String name) {
"bar"
}
String getSeven() { "seven" }
}
class RTTest2 extends RTTest1 {
String six
def bar(String name) { "foo" }
static stuff() { "goodie" }
String getEight() { "eight" }
}