/*
* Copyright (c) 2006-2011 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit;
import org.junit.*;
@SuppressWarnings({"UnusedDeclaration"})
public final class VerificationsWithPartialOrderingTest
{
public static class Dependency
{
public void setSomething(int value) {}
public void setSomethingElse(String value) {}
public void editABunchMoreStuff() {}
public void notifyBeforeSave() {}
public void prepare() {}
public void save() {}
}
@Mocked private Dependency mock;
private void exerciseCodeUnderTest()
{
mock.prepare();
mock.setSomething(123);
mock.setSomethingElse("anotherValue");
mock.editABunchMoreStuff();
mock.notifyBeforeSave();
mock.save();
}
@Test
public void verifyFirstCallOnly()
{
exerciseCodeUnderTest();
new VerificationsInOrder()
{{
mock.prepare();
unverifiedInvocations();
}};
}
@Test
public void verifyFirstCallWhichWasRecordedWithAConstraint()
{
new NonStrictExpectations() {{
mock.prepare(); times = 1;
}};
exerciseCodeUnderTest();
new VerificationsInOrder() {{
mock.prepare();
mock.setSomething(anyInt);
unverifiedInvocations();
}};
}
@Test(expected = AssertionError.class)
public void verifyFirstCallWhenOutOfOrder()
{
mock.setSomething(123);
mock.prepare();
new VerificationsInOrder()
{{
mock.prepare();
unverifiedInvocations();
}};
}
@Test
public void verifyLastCallOnly()
{
exerciseCodeUnderTest();
new VerificationsInOrder()
{{
unverifiedInvocations();
mock.save();
}};
}
@Test
public void verifyLastTwoCalls()
{
exerciseCodeUnderTest();
new VerificationsInOrder()
{{
unverifiedInvocations();
mock.notifyBeforeSave();
mock.save();
}};
}
@Test(expected = AssertionError.class)
public void verifyLastCallWhenOutOfOrder()
{
mock.setSomething(123);
mock.save();
mock.editABunchMoreStuff();
new VerificationsInOrder()
{{
unverifiedInvocations();
mock.save();
}};
}
@Test(expected = AssertionError.class)
public void verifyLastTwoCallsWhenOutOfOrder()
{
mock.setSomething(123);
mock.save();
mock.notifyBeforeSave();
new VerificationsInOrder()
{{
unverifiedInvocations();
mock.notifyBeforeSave();
mock.save();
}};
}
@Test(expected = AssertionError.class)
public void verifyFirstAndLastCallsWhenOutOfOrder()
{
mock.prepare();
mock.setSomething(123);
mock.setSomethingElse("anotherValue");
mock.notifyBeforeSave();
mock.editABunchMoreStuff();
mock.save();
new VerificationsInOrder()
{{
mock.prepare();
unverifiedInvocations();
mock.notifyBeforeSave();
mock.save();
}};
}
@Test
public void verifyFirstCallThenOthersInAnyOrder()
{
exerciseCodeUnderTest();
new VerificationsInOrder()
{{
mock.prepare();
unverifiedInvocations();
}};
new Verifications()
{{
mock.setSomethingElse("anotherValue");
mock.setSomething(123);
}};
}
@Test(expected = AssertionError.class)
public void verifySomeCallsInAnyOrderThenFirstCallWhenOutOfOrder()
{
mock.setSomething(123);
mock.editABunchMoreStuff();
mock.prepare();
new Verifications()
{{
mock.setSomething(123);
}};
new VerificationsInOrder()
{{
mock.prepare(); times = 1;
unverifiedInvocations();
}};
}
@Test
public void verifySomeCallsInAnyOrderThenLastCall()
{
exerciseCodeUnderTest();
new Verifications()
{{
mock.setSomethingElse("anotherValue");
mock.setSomething(123);
}};
new VerificationsInOrder()
{{
unverifiedInvocations();
mock.save(); times = 1;
}};
}
@Test(expected = IllegalArgumentException.class)
public void attemptToUseOrderedVerificationsAsAlreadyVerified()
{
mock.prepare();
mock.editABunchMoreStuff();
mock.save();
final Verifications verified = new VerificationsInOrder()
{{
mock.prepare();
mock.editABunchMoreStuff();
}};
new VerificationsInOrder() {{
verifiedInvocations(verified);
}};
}
@Test
public void verifyThatSomeCallsInAnyRelativeOrderOccurBeforeAllOthers()
{
// These can occur in any order, but before any others:
mock.prepare();
mock.setSomethingElse("anotherValue");
mock.setSomethingElse(null);
// Not verified, but must occur after all others:
mock.setSomething(123);
mock.save();
final Verifications initialGroupOfInvocations = new Verifications() {{
mock.prepare();
mock.setSomethingElse(anyString);
}};
new VerificationsInOrder() {{
verifiedInvocations(initialGroupOfInvocations);
unverifiedInvocations();
}};
}
@Test(expected = AssertionError.class)
public void verifyThatSomeCallsInAnyRelativeOrderOccurBeforeAllOthers_outOfOrder()
{
// Not verified, but should occur *after* the verified invocations:
mock.save();
// Verified:
mock.prepare();
mock.editABunchMoreStuff();
// Not verified:
mock.setSomething(123);
final Verifications initialGroupOfInvocations = new Verifications() {{
mock.prepare();
mock.editABunchMoreStuff();
}};
new VerificationsInOrder() {{
verifiedInvocations(initialGroupOfInvocations);
unverifiedInvocations();
}};
}
@Test
public void verifyThatSomeCallsInAnyRelativeOrderOccurAfterAllOthers()
{
// Not verified:
mock.prepare();
mock.setSomething(123);
// Verified in any order:
mock.setSomethingElse("anotherValue");
mock.save();
mock.setSomethingElse(null);
final Verifications finalGroupOfInvocations = new Verifications() {{
mock.setSomethingElse(anyString);
mock.save();
}};
new VerificationsInOrder() {{
unverifiedInvocations();
verifiedInvocations(finalGroupOfInvocations);
}};
}
@Test(expected = AssertionError.class)
public void verifyThatSomeCallsInAnyRelativeOrderOccurAfterAllOthers_outOfOrder()
{
// Not verified:
mock.prepare();
// Verified in any order:
mock.setSomethingElse("anotherValue");
mock.setSomethingElse(null);
mock.save();
// Not verified, but should occur *before* the verified ones:
mock.setSomething(123);
final Verifications finalGroupOfInvocations = new Verifications() {{
mock.setSomethingElse(anyString);
mock.save();
}};
new VerificationsInOrder() {{
unverifiedInvocations();
verifiedInvocations(finalGroupOfInvocations);
}};
}
@Test(expected = AssertionError.class)
public void verifyThatUnorderedGroupOfCallsOccursAfterOneOtherCall_outOfOrder()
{
mock.setSomething(123);
mock.editABunchMoreStuff();
mock.prepare();
final Verifications v = new Verifications() {{
mock.editABunchMoreStuff();
mock.setSomething(anyInt);
}};
new VerificationsInOrder() {{
mock.prepare();
verifiedInvocations(v);
}};
}
@Test
public void verifyThatAnOrderedGroupOfCallsOccursBetweenTwoOtherGroupsOfCalls(final Runnable aCallback)
{
// First group, happening before everything else in any order:
mock.prepare();
aCallback.run();
// Verified intermediate invocations, occurring in this order:
mock.setSomething(123);
mock.setSomethingElse("anotherValue");
mock.setSomethingElse(null);
mock.editABunchMoreStuff();
// Second group, happening after everything else in any order:
mock.notifyBeforeSave();
mock.save();
final Verifications before = new Verifications() {{
aCallback.run();
mock.prepare();
}};
final Verifications after = new Verifications() {{
mock.save();
mock.notifyBeforeSave();
}};
new VerificationsInOrder() {{
verifiedInvocations(before);
mock.setSomething(anyInt);
mock.setSomethingElse(anyString); times = 2;
mock.editABunchMoreStuff();
verifiedInvocations(after);
}};
}
@Test(expected = AssertionError.class)
public void verifyThatAnOrderedGroupOfCallsOccursBetweenTwoOtherGroupsOfCalls_outOfOrder(final Runnable aCallback)
{
// First verified group, happening before everything else in any order:
mock.prepare();
aCallback.run();
// Verified intermediate invocations, occurring in this order:
mock.setSomething(123);
mock.setSomethingElse("anotherValue");
mock.setSomethingElse(null);
mock.editABunchMoreStuff();
// Unexpected (and unverified):
mock.setSomethingElse("");
// Second verified group, happening after everything else in any order:
mock.notifyBeforeSave();
mock.save();
final Verifications before = new Verifications() {{
aCallback.run();
mock.prepare();
}};
final Verifications after = new Verifications() {{
mock.save();
mock.notifyBeforeSave();
}};
new VerificationsInOrder() {{
verifiedInvocations(before);
mock.setSomething(anyInt);
mock.setSomethingElse(anyString); times = 2;
mock.editABunchMoreStuff();
verifiedInvocations(after);
}};
}
@Test
public void verifyThatAnUnverifiedGroupOfCallsOccursBetweenTwoOtherGroupsOfCalls(final Runnable aCallback)
{
// Initial invocation:
mock.prepare();
// First group, happening before everything else in any order:
mock.setSomething(123);
mock.setSomething(-56);
// Intermediate invocations, occurring in any order:
mock.setSomethingElse("anotherValue");
mock.editABunchMoreStuff();
mock.setSomethingElse(null);
// Second group, happening after everything else in any order:
aCallback.run();
mock.save();
final Verifications before = new Verifications() {{
mock.setSomething(anyInt);
}};
final Verifications after = new Verifications() {{
mock.save();
aCallback.run();
}};
new VerificationsInOrder() {{
mock.prepare();
verifiedInvocations(before);
unverifiedInvocations();
verifiedInvocations(after);
}};
}
@Test(expected = AssertionError.class)
public void verifyThatAnUnverifiedGroupOfCallsOccursBetweenTwoOtherGroupsOfCalls_outOfOrder(final Runnable aCallback)
{
// First group, happening before everything else in any order:
mock.setSomething(123);
mock.setSomething(-56);
// Unverified intermediate invocations, occurring in any order:
mock.setSomethingElse("anotherValue");
// Second group, happening after everything else in any order:
aCallback.run();
mock.editABunchMoreStuff(); // out of place
mock.save();
final Verifications before = new Verifications() {{
mock.setSomething(anyInt);
times = 2;
}};
final Verifications after = new Verifications() {{
aCallback.run();
mock.save();
}};
new VerificationsInOrder() {{
verifiedInvocations(before);
unverifiedInvocations();
verifiedInvocations(after);
}};
}
@Test
public void verifyFirstAndLastCalls()
{
exerciseCodeUnderTest();
new VerificationsInOrder()
{{
mock.prepare();
unverifiedInvocations();
mock.notifyBeforeSave();
mock.save();
}};
}
@Test(expected = AssertionError.class)
public void verifyFirstAndLastCallsWithFirstOutOfOrder()
{
mock.editABunchMoreStuff();
mock.prepare();
mock.save();
new VerificationsInOrder()
{{
mock.prepare();
unverifiedInvocations();
mock.save();
}};
}
@Test(expected = AssertionError.class)
public void verifyFirstAndLastInvocationsWithSomeInvocationsInBetweenImplicitlyVerified()
{
new NonStrictExpectations()
{
{
mock.setSomething(anyInt); minTimes = 1;
}
};
exerciseCodeUnderTest();
new VerificationsInOrder()
{{
mock.prepare();
// unverifiedInvocations() should be called here, even if verification occurs implicitly.
mock.setSomethingElse(anyString);
unverifiedInvocations();
mock.save();
}};
}
@Test(expected = AssertionError.class)
public void verifyFirstAndLastCallsWithLastOutOfOrder()
{
mock.prepare();
mock.editABunchMoreStuff();
mock.save();
mock.notifyBeforeSave();
new VerificationsInOrder()
{{
mock.prepare();
unverifiedInvocations();
mock.save();
}};
}
@Test
public void verifyFirstAndLastCallsWithOthersInBetweenInAnyOrderWithYetAnotherCallAnywhere()
{
mock.prepare(); // first call
mock.editABunchMoreStuff();
mock.notifyBeforeSave();
mock.save(); // last call
mock.setSomething(3); // could occur anywhere
new Verifications() {{ mock.setSomething(anyInt); }};
new VerificationsInOrder()
{{
mock.prepare();
unverifiedInvocations();
mock.save();
}};
}
@Test
public void verifyTwoOrderedCallsAfterVerifyingDifferentCallsToSameMethodInAnyOrder()
{
mock.setSomething(1);
mock.prepare();
mock.setSomething(2);
mock.save();
mock.setSomething(3);
new Verifications() {{ mock.setSomething(anyInt); times = 3; }};
new VerificationsInOrder()
{{
mock.prepare();
mock.save();
}};
}
@Test
public void verifyFirstAndLastCallsWithOthersInBetweenInAnyOrder()
{
exerciseCodeUnderTest();
new VerificationsInOrder()
{{
mock.prepare();
unverifiedInvocations();
mock.notifyBeforeSave();
mock.save();
}};
new Verifications()
{{
mock.setSomething(123);
mock.setSomethingElse("anotherValue");
}};
}
@Test(expected = AssertionError.class)
public void verifyFirstAndLastCallsWithOthersInBetweenInAnyOrderWhenOutOfOrder()
{
mock.prepare();
mock.setSomething(123);
mock.setSomethingElse("anotherValue");
mock.notifyBeforeSave();
mock.editABunchMoreStuff();
mock.save();
new Verifications()
{{
mock.setSomethingElse("anotherValue");
mock.setSomething(anyInt);
}};
new VerificationsInOrder()
{{
mock.prepare();
unverifiedInvocations();
mock.notifyBeforeSave();
mock.save();
}};
}
@Test
public void verifyConsecutiveInvocations()
{
exerciseCodeUnderTest();
new VerificationsInOrder()
{{
mock.prepare();
unverifiedInvocations();
mock.setSomething(123);
mock.setSomethingElse("anotherValue");
unverifiedInvocations();
mock.save();
}};
}
@Test(expected = AssertionError.class)
public void verifyConsecutiveInvocationsWhenNotConsecutive()
{
mock.prepare();
mock.setSomething(123);
mock.setSomethingElse("anotherValue");
mock.setSomething(45);
mock.save();
new VerificationsInOrder()
{{
unverifiedInvocations();
mock.setSomething(123);
mock.setSomething(45);
unverifiedInvocations();
}};
}
@Test
public void verifyConsecutiveInvocationsInTwoSequences()
{
exerciseCodeUnderTest();
new VerificationsInOrder()
{{
mock.prepare();
unverifiedInvocations();
mock.setSomething(123);
mock.setSomethingElse(anyString);
unverifiedInvocations();
mock.notifyBeforeSave();
unverifiedInvocations();
}};
}
@Test(expected = AssertionError.class)
public void verifyConsecutiveInvocationsInTwoSequencesWhenNotConsecutive()
{
mock.prepare();
mock.setSomething(123);
mock.setSomething(45);
mock.setSomethingElse("anotherValue");
mock.notifyBeforeSave();
mock.save();
new VerificationsInOrder()
{{
unverifiedInvocations();
mock.setSomething(123);
mock.setSomething(45);
unverifiedInvocations();
mock.save();
unverifiedInvocations();
}};
}
}