/*
* Copyright (c) 2007 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockito.internal.verification.checkers;
import static java.util.Arrays.*;
import java.util.LinkedList;
import org.junit.Before;
import org.junit.Test;
import org.mockito.exceptions.Reporter;
import org.mockito.internal.invocation.InvocationBuilder;
import org.mockito.internal.invocation.InvocationMatcher;
import org.mockito.invocation.DescribedInvocation;
import org.mockito.invocation.Invocation;
import org.mockito.invocation.Location;
import org.mockitoutil.TestBase;
public class NumberOfInvocationsCheckerTest extends TestBase {
private NumberOfInvocationsChecker checker;
private ReporterStub reporterStub;
private InvocationMatcher wanted;
private LinkedList<Invocation> invocations;
private InvocationsFinderStub finderStub;
@Before
public void setup() {
reporterStub = new ReporterStub();
finderStub = new InvocationsFinderStub();
checker = new NumberOfInvocationsChecker(reporterStub, finderStub);
wanted = new InvocationBuilder().toInvocationMatcher();
invocations = new LinkedList<Invocation>(asList(new InvocationBuilder().toInvocation()));
}
@Test
public void shouldReportTooLittleActual() throws Exception {
finderStub.actualToReturn.add(new InvocationBuilder().toInvocation());
checker.check(invocations, wanted, 100);
assertEquals(1, reporterStub.actualCount);
assertEquals(100, reporterStub.wantedCount);
assertEquals(wanted, reporterStub.wanted);
}
@Test
public void shouldReportWithLastInvocationStackTrace() throws Exception {
Invocation first = new InvocationBuilder().toInvocation();
Invocation second = new InvocationBuilder().toInvocation();
finderStub.actualToReturn.addAll(asList(first, second));
checker.check(invocations, wanted, 100);
assertSame(second.getLocation(), reporterStub.location);
}
@Test
public void shouldNotReportWithLastInvocationStackTraceIfNoInvocationsFound() throws Exception {
assertTrue(finderStub.actualToReturn.isEmpty());
checker.check(invocations, wanted, 100);
assertNull(reporterStub.location);
}
@Test
public void shouldReportWithFirstUndesiredInvocationStackTrace() throws Exception {
Invocation first = new InvocationBuilder().toInvocation();
Invocation second = new InvocationBuilder().toInvocation();
Invocation third = new InvocationBuilder().toInvocation();
finderStub.actualToReturn.addAll(asList(first, second, third));
checker.check(invocations, wanted, 2);
assertSame(third.getLocation(), reporterStub.location);
}
@Test
public void shouldReportTooManyActual() throws Exception {
finderStub.actualToReturn.add(new InvocationBuilder().toInvocation());
finderStub.actualToReturn.add(new InvocationBuilder().toInvocation());
checker.check(invocations, wanted, 1);
assertEquals(2, reporterStub.actualCount);
assertEquals(1, reporterStub.wantedCount);
assertEquals(wanted, reporterStub.wanted);
}
@Test
public void shouldReportNeverWantedButInvoked() throws Exception {
Invocation invocation = new InvocationBuilder().toInvocation();
finderStub.actualToReturn.add(invocation);
checker.check(invocations, wanted, 0);
assertEquals(wanted, reporterStub.wanted);
assertEquals(invocation.getLocation(), reporterStub.location);
}
@Test
public void shouldMarkInvocationsAsVerified() throws Exception {
Invocation invocation = new InvocationBuilder().toInvocation();
finderStub.actualToReturn.add(invocation);
assertFalse(invocation.isVerified());
checker.check(invocations, wanted, 1);
assertTrue(invocation.isVerified());
}
class ReporterStub extends Reporter {
private int wantedCount;
private int actualCount;
private DescribedInvocation wanted;
private Location location;
@Override public void tooLittleActualInvocations(org.mockito.internal.reporting.Discrepancy discrepancy, DescribedInvocation wanted, Location lastActualLocation) {
this.wantedCount = discrepancy.getWantedCount();
this.actualCount = discrepancy.getActualCount();
this.wanted = wanted;
this.location = lastActualLocation;
}
@Override public void tooManyActualInvocations(int wantedCount, int actualCount, DescribedInvocation wanted, Location firstUndesired) {
this.wantedCount = wantedCount;
this.actualCount = actualCount;
this.wanted = wanted;
this.location = firstUndesired;
}
@Override
public void neverWantedButInvoked(DescribedInvocation wanted, Location firstUndesired) {
this.wanted = wanted;
this.location = firstUndesired;
}
}
}