1e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/*
2e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Copyright (c) 2007 Mockito contributors
3e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * This program is made available under the terms of the MIT License.
4e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */
5e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
6e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpackage org.mockito.internal.progress;
7e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
8e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.MockSettings;
9e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.exceptions.Reporter;
10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.configuration.GlobalConfiguration;
11e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.debugging.Localized;
12e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.debugging.LocationImpl;
13e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.listeners.MockingProgressListener;
14e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.listeners.MockingStartedListener;
15e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.invocation.Invocation;
16e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.invocation.Location;
17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.verification.VerificationMode;
18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson@SuppressWarnings("unchecked")
20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpublic class MockingProgressImpl implements MockingProgress {
21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private final Reporter reporter = new Reporter();
23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private final ArgumentMatcherStorage argumentMatcherStorage = new ArgumentMatcherStorageImpl();
24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
25e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    IOngoingStubbing iOngoingStubbing;
26e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private Localized<VerificationMode> verificationMode;
27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private Location stubbingInProgress = null;
28e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private MockingProgressListener listener;
29e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
30e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void reportOngoingStubbing(IOngoingStubbing iOngoingStubbing) {
31e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        this.iOngoingStubbing = iOngoingStubbing;
32e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
33e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
34e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public IOngoingStubbing pullOngoingStubbing() {
35e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        IOngoingStubbing temp = iOngoingStubbing;
36e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        iOngoingStubbing = null;
37e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return temp;
38e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
39e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
40e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void verificationStarted(VerificationMode verify) {
41e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        validateState();
42e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        resetOngoingStubbing();
43e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        verificationMode = new Localized(verify);
44e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
45e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
46e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    /* (non-Javadoc)
47e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * @see org.mockito.internal.progress.MockingProgress#resetOngoingStubbing()
48e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     */
49e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void resetOngoingStubbing() {
50e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        iOngoingStubbing = null;
51e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
52e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
53e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public VerificationMode pullVerificationMode() {
54e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (verificationMode == null) {
55e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            return null;
56e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
57e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
58e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        VerificationMode temp = verificationMode.getObject();
59e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        verificationMode = null;
60e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return temp;
61e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
62e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
63e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void stubbingStarted() {
64e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        validateState();
65e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        stubbingInProgress = new LocationImpl();
66e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
67e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
68e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void validateState() {
69e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        validateMostStuff();
70e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
71e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        //validate stubbing:
72e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (stubbingInProgress != null) {
73e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            Location temp = stubbingInProgress;
74e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            stubbingInProgress = null;
75e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            reporter.unfinishedStubbing(temp);
76e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
77e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
78e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
79e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private void validateMostStuff() {
80e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        //State is cool when GlobalConfiguration is already loaded
81e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        //this cannot really be tested functionally because I cannot dynamically mess up org.mockito.configuration.MockitoConfiguration class
82e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        GlobalConfiguration.validate();
83e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
84e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (verificationMode != null) {
85e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            Location location = verificationMode.getLocation();
86e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            verificationMode = null;
87e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            reporter.unfinishedVerificationException(location);
88e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
89e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
90e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        getArgumentMatcherStorage().validateState();
91e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
92e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
93e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void stubbingCompleted(Invocation invocation) {
94e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        stubbingInProgress = null;
95e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
96e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
97e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public String toString() {
98e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return  "iOngoingStubbing: " + iOngoingStubbing +
99e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ", verificationMode: " + verificationMode +
100e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ", stubbingInProgress: " + stubbingInProgress;
101e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
102e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
103e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void reset() {
104e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        stubbingInProgress = null;
105e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        verificationMode = null;
106e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        getArgumentMatcherStorage().reset();
107e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
108e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
109e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public ArgumentMatcherStorage getArgumentMatcherStorage() {
110e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return argumentMatcherStorage;
111e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
112e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
113e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void mockingStarted(Object mock, Class classToMock) {
114e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (listener != null && listener instanceof MockingStartedListener) {
115e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            ((MockingStartedListener) listener).mockingStarted(mock, classToMock);
116e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
117e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        validateMostStuff();
118e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
119e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
120e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void setListener(MockingProgressListener listener) {
121e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        this.listener = listener;
122e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
123e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson}