/*
 * Copyright (c) 2007 Mockito contributors
 * This program is made available under the terms of the MIT License.
 */
package org.mockito.internal.invocation;

import org.junit.Test;
import org.mockito.internal.verification.InOrderContextImpl;
import org.mockito.invocation.Invocation;
import org.mockito.invocation.MatchableInvocation;
import org.mockitoutil.TestBase;

import java.util.Arrays;
import java.util.concurrent.atomic.AtomicReference;

import static junit.framework.TestCase.*;

public class InvocationMarkerTest extends TestBase {

    @Test
    public void shouldMarkInvocationAsVerified() {
        //given
        Invocation i = new InvocationBuilder().toInvocation();
        InvocationMatcher im = new InvocationBuilder().toInvocationMatcher();
        assertFalse(i.isVerified());

        //when
        InvocationMarker.markVerified(Arrays.asList(i), im);

        //then
        assertTrue(i.isVerified());
    }

    @Test
    public void shouldCaptureArguments() {
        //given
        Invocation i = new InvocationBuilder().toInvocation();
        final AtomicReference<Invocation> box = new AtomicReference<Invocation>();
        MatchableInvocation c = new InvocationMatcher(i) {
            public void captureArgumentsFrom(Invocation i) {
                box.set(i);
            }};

        //when
        InvocationMarker.markVerified(Arrays.asList(i), c);

        //then
        assertEquals(i, box.get());
    }

    @Test
    public void shouldMarkInvocationsAsVerifiedInOrder() {
        //given
        InOrderContextImpl context = new InOrderContextImpl();

        Invocation i = new InvocationBuilder().toInvocation();
        InvocationMatcher im = new InvocationBuilder().toInvocationMatcher();
        assertFalse(context.isVerified(i));
        assertFalse(i.isVerified());

        //when
        InvocationMarker.markVerifiedInOrder(Arrays.asList(i), im, context);

        //then
        assertTrue(context.isVerified(i));
        assertTrue(i.isVerified());
    }
}
