ReturnsAndArgPassing.testProxyReturns RUNNING
ReturnsAndArgPassing.testProxyReturns PASSED
ReturnsAndArgPassing.testProxyArgPassing RUNNING
ReturnsAndArgPassing.testProxyArgPassing PASSED
Invoke public abstract void Shapes.circle(int)
 0: 3
--- circle 3
Success: method circle res=null
Invoke public abstract int Quads.rectangle(int,int)
 0: 10
 1: 20
--- rectangle 10,20
Success: method rectangle res=4
Invoke public abstract java.lang.String Shapes.blob()
 (no args)
--- blob
Success: method blob res=mix
Invoke public abstract int Quads.rectangle(int,int)
 0: 15
 1: 25
--- rectangle 15,25
Success: method rectangle res=4
Invoke public abstract int Quads.trapezoid(int,double,int)
 0: 6
 1: 81.18
 2: 4
--- trap 6,4,81.18
Success: method trapezoid res=8
Invoke public abstract int Colors.red(float)
 0: 1.0
--- red 1.0
Success: method red res=0
Invoke public abstract double Colors.blue(int)
 0: 777
--- blue 777
Success: method blue res=2.54
Invoke public abstract int Colors.mauve(java.lang.String)
 0: sorry
--- mauve sorry
Success: method mauve res=3
Invoke public abstract java.lang.String Shapes.blob()
 (no args)
--- blob
Success: method blob res=mix
Invoke public abstract void Shapes.upChuck()
 (no args)
Got expected ioobe
Invoke public abstract void Shapes.upCheck() throws java.lang.InterruptedException
 (no args)
Got expected ie

Proxy interfaces: [interface Quads, interface Colors]
Proxy methods: [public final java.lang.String $Proxy1.blob(), public final double $Proxy1.blue(int), public final R0a $Proxy1.checkMe(), public final R0aa $Proxy1.checkMe(), public final R0base $Proxy1.checkMe(), public final void $Proxy1.circle(int), public final boolean $Proxy1.equals(java.lang.Object), public final int $Proxy1.green(double), public final int $Proxy1.hashCode(), public final int $Proxy1.mauve(java.lang.String), public final int $Proxy1.rectangle(int,int), public final int $Proxy1.red(float), public final int $Proxy1.square(int,int), public final java.lang.String $Proxy1.toString(), public final int $Proxy1.trapezoid(int,double,int), public final void $Proxy1.upCheck() throws java.lang.InterruptedException, public final void $Proxy1.upChuck()]
Decl annos: []
Param annos (0) : []
Dupe threw expected exception
Clash threw expected exception
Clash2 threw expected exception
Clash3 threw expected exception
Clash4 threw expected exception
Invoke public abstract void InterfaceW1.throwFunky()
 (no args)
Got expected UTE
Invoke public abstract void InterfaceW1.throwFunky2() throws BaseException,java.lang.NoSuchMethodException,java.io.IOException
 (no args)
Got expected IOE
Invoke public abstract void InterfaceW1.throwFunky2() throws BaseException,java.lang.NoSuchMethodException,java.io.IOException
 (no args)
Got expected IOE
Invoke public abstract void InterfaceW1.throwException() throws BaseException
 (no args)
Got expected UTE
Invoke public abstract void InterfaceW1.throwBase() throws BaseException
 (no args)
Got expected UTE
Invoke public abstract void InterfaceW1.throwSub() throws BaseException
 (no args)
Got expected exception
Invoke public abstract void InterfaceW1.throwSubSub() throws BaseException
 (no args)
Got expected exception
Invoke public abstract void InterfaceW1.bothThrowBase() throws BaseException,SubException,SubSubException
 (no args)
Got expected exception
Proxy methods: [public final boolean $Proxy7.equals(java.lang.Object), public final java.lang.Object $Proxy7.foo(), public final java.lang.String $Proxy7.foo(), public final int $Proxy7.hashCode(), public final java.lang.String $Proxy7.toString()]
Invocation of public abstract java.lang.String NarrowingTest$I2.foo()
Invoking foo using I2 type: hello
Invocation of public abstract java.lang.Object NarrowingTest$I1.foo()
Invoking foo using I1 type: 1
Invocation of public abstract java.lang.String NarrowingTest$I2.foo()
Got expected exception
Proxy narrowed invocation return type passed
