package groovy | |
class FinallyTest extends GroovyTestCase{ | |
void testBreakInTry() { | |
def called = false | |
while (true){ | |
try { | |
break | |
} finally { | |
called = true | |
} | |
} | |
assert called, "finally block was not called" | |
} | |
void testBreakInFinally() { | |
def called = false | |
while (true){ | |
try { | |
throw new Exception("foo") | |
} catch (e) { | |
assert e.message == "foo" | |
} finally { | |
called = true | |
break | |
} | |
} | |
assert called, "finally block was not called" | |
} | |
void testContinueInTry() { | |
def called = false | |
boolean b = true | |
while (b){ | |
try { | |
b=false | |
continue | |
} finally { | |
called = true | |
} | |
} | |
assert called, "finally block was not called" | |
} | |
void testContinueInFinally() { | |
def called = false | |
boolean b = true | |
while (b){ | |
try { | |
throw new Exception("foo") | |
} catch (e) { | |
assert e.message == "foo" | |
} finally { | |
b=false | |
called = true | |
continue | |
} | |
} | |
assert called, "finally block was not called" | |
} | |
void testReturn() { | |
def map = methodWithReturnInTry() | |
assert map.called, "finally block was not called" | |
def called = methodWithReturnInFinally() | |
assert called, "finally block was not called" | |
} | |
def methodWithReturnInTry(){ | |
def map = [:] | |
try { | |
return map | |
} finally { | |
map.called = true | |
} | |
} | |
def methodWithReturnInFinally(){ | |
try { | |
return false | |
} finally { | |
return true | |
} | |
} | |
void testStackeFinally(){ | |
def calls = methodWithStackedFinally() | |
if (calls==12) { | |
assert false,"wrong order of finally blocks" | |
} | |
assert calls==102 | |
} | |
def methodWithStackedFinally(){ | |
def calls = 0 | |
def first = true; | |
try { | |
try { | |
calls = 0 | |
} finally { | |
calls++ | |
if (first) { | |
first = false | |
} else { | |
calls += 10 | |
} | |
} | |
} finally { | |
calls++ | |
if (first) { | |
first = false | |
} else { | |
calls += 100 | |
} | |
} | |
return calls | |
} | |
def multipleReturn() { | |
try { | |
if (0 == 1) return 1 | |
return 2 | |
} | |
finally { | |
return 3 | |
} | |
} | |
void testMultipleReturn(){ | |
assert multipleReturn() == 3 | |
} | |
} |