blob: 1f71fcf4d8c58a4fa2d5654b5de7e164e78e7b21 [file] [log] [blame]
package groovy.mock.interceptor
import junit.framework.AssertionFailedError
/**
Testing Groovy Stub support for multiple calls to the Collaborator with
demanding one or two methods multiple and and various ranges.
@author Dierk Koenig
*/
class StubCallSequenceTest extends GroovyTestCase {
StubFor stub
void setUp() {
stub = new StubFor(Collaborator.class)
}
void testUndemandedCallFailsEarly() {
// no demand here
stub.use {
def caller = new Caller()
shouldFail(AssertionFailedError.class) { caller.collaborateOne() }
}
}
void testOneDemandedTwoCalledFailsEarly() {
stub.demand.one { 1 }
stub.use {
def caller = new Caller()
caller.collaborateOne()
shouldFail(AssertionFailedError.class) { caller.collaborateOne() }
}
}
void testOneDemandedDefaultRange() {
stub.demand.one(1..1) { 1 }
stub.use {
def caller = new Caller()
assertEquals 1, caller.collaborateOne()
}
}
void testOneDemandedExactRange() {
stub.demand.one(2..2) { 1 }
stub.use {
def caller = new Caller()
assertEquals 1, caller.collaborateOne()
assertEquals 1, caller.collaborateOne()
shouldFail(AssertionFailedError.class) { caller.collaborateOne() }
}
}
void testOneDemandedRealRange() {
stub.demand.one(1..2) { 1 }
stub.use {
def caller = new Caller()
assertEquals 1, caller.collaborateOne()
assertEquals 1, caller.collaborateOne()
shouldFail(AssertionFailedError.class) { caller.collaborateOne() }
}
}
void testOneDemandedOptionalRange() {
stub.demand.one(0..2) { 1 }
stub.use {
def caller = new Caller()
assertEquals 1, caller.collaborateOne()
assertEquals 1, caller.collaborateOne()
shouldFail(AssertionFailedError.class) { caller.collaborateOne() }
}
}
void testTwoDemandedNoRange() {
stub.demand.one() { 1 }
stub.demand.two() { 2 }
stub.use {
def caller = new Caller()
assertEquals 1, caller.collaborateOne()
assertEquals 2, caller.collaborateTwo()
shouldFail(AssertionFailedError.class) { caller.collaborateTwo() }
}
}
void testTwoDemandedFirstRangeExploited() {
stub.demand.one(1..2) { 1 }
stub.demand.two() { 2 }
stub.use {
def caller = new Caller()
assertEquals 1, caller.collaborateOne()
assertEquals 1, caller.collaborateOne()
assertEquals 2, caller.collaborateTwo()
shouldFail(AssertionFailedError.class) { caller.collaborateTwo() }
}
}
void testTwoDemandedFirstRangeNotExploited() {
stub.demand.one(1..2) { 1 }
stub.demand.two() { 2 }
stub.use {
def caller = new Caller()
assertEquals 1, caller.collaborateOne()
assertEquals 2, caller.collaborateTwo()
shouldFail(AssertionFailedError.class) { caller.collaborateTwo() }
}
}
void testTwoDemandedFirstOptionalOmitted() {
stub.demand.one(0..2) { 1 }
stub.demand.two() { 2 }
stub.use {
def caller = new Caller()
assertEquals 2, caller.collaborateTwo()
shouldFail(AssertionFailedError.class) { caller.collaborateTwo() }
}
}
void testMixedDemandedMinimumOutOfSequence() {
stub.demand.one(0..1) { 1 }
stub.demand.two() { 2 }
stub.demand.one() { 1 }
stub.demand.two(0..2) { 2 }
stub.demand.one() { 1 }
stub.use {
def caller = new Caller()
assertEquals 1, caller.collaborateOne()
assertEquals 1, caller.collaborateOne()
assertEquals 1, caller.collaborateOne()
assertEquals 2, caller.collaborateTwo()
assertEquals 2, caller.collaborateTwo()
}
stub.expect.verify()
}
void testMixedDemandedMaximum() {
stub.demand.one(0..1) { 1 }
stub.demand.two() { 2 }
stub.demand.one() { 1 }
stub.demand.two(0..2) { 2 }
stub.demand.one() { 1 }
stub.use {
def caller = new Caller()
assertEquals 1, caller.collaborateOne()
assertEquals 2, caller.collaborateTwo()
assertEquals 1, caller.collaborateOne()
// 2.times( assertEquals(2, caller.collaborateTwo()) ) // todo: why this not possible?
assertEquals 2, caller.collaborateTwo()
assertEquals 2, caller.collaborateTwo()
assertEquals 1, caller.collaborateOne()
shouldFail(AssertionFailedError.class) { caller.collaborateTwo() }
shouldFail(AssertionFailedError.class) { caller.collaborateOne() }
}
}
void testMixedDemandedOutOfSequenceFailsEarly() {
stub.demand.one(0..1) { 1 }
stub.demand.two() { 2 }
stub.demand.one() { 1 }
stub.demand.two(0..2) { 2 }
stub.demand.one() { 1 }
shouldFail(AssertionFailedError.class) { // fails on verify
stub.use {
def caller = new Caller()
assertEquals 1, caller.collaborateOne()
assertEquals 2, caller.collaborateTwo()
shouldFail(AssertionFailedError.class) { caller.collaborateTwo() }
}
}
}
void testRangeDemandedOutOfSequenceCalls() {
stub.demand.one(0..3) { 1 }
stub.demand.two(0..3) { 2 }
stub.use {
def caller = new Caller()
assertEquals 1, caller.collaborateOne()
assertEquals 2, caller.collaborateTwo()
assertEquals 1, caller.collaborateOne()
assertEquals 2, caller.collaborateTwo()
assertEquals 1, caller.collaborateOne()
assertEquals 2, caller.collaborateTwo()
shouldFail(AssertionFailedError.class) { caller.collaborateOne() }
}
stub.expect.verify()
}
void testUnreachedDemandFailsOnVerify() {
stub.demand.one { 1 }
// nothing used
shouldFail(AssertionFailedError.class) { stub.expect.verify() }
}
void testRangeDemandedButNotExploitedFailsOnVerify() {
stub.demand.one(2..4) { 1 }
shouldFail(AssertionFailedError.class) { // fails on verify
stub.use {
def caller = new Caller()
assertEquals 1, caller.collaborateOne()
}
stub.expect.verify()
}
}
void testReversedRangesNotAllowed() {
shouldFail(IllegalArgumentException.class) { stub.demand.one(1..0) { 1 } }
}
}