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 Parkinsonpackage org.mockito.internal.stubbing;
6e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
7e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.stubbing.answers.CallsRealMethods;
8e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.stubbing.answers.Returns;
9e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.stubbing.answers.ThrowsException;
10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.stubbing.answers.ThrowsExceptionClass;
11e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.stubbing.DeprecatedOngoingStubbing;
12e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.stubbing.OngoingStubbing;
13e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
14e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpublic abstract class BaseStubbing<T> implements OngoingStubbing<T>, DeprecatedOngoingStubbing<T> {
15e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public OngoingStubbing<T> thenReturn(T value) {
16e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return thenAnswer(new Returns(value));
17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public OngoingStubbing<T> thenReturn(T value, T... values) {
20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        OngoingStubbing<T> stubbing = thenReturn(value);
21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (values == null) {
22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            return stubbing.thenReturn(null);
23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        for (T v: values) {
25e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            stubbing = stubbing.thenReturn(v);
26e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return stubbing;
28e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
29e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
30e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private OngoingStubbing<T> thenThrow(Throwable throwable) {
31e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return thenAnswer(new ThrowsException(throwable));
32e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
33e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
34e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public OngoingStubbing<T> thenThrow(Throwable... throwables) {
35e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (throwables == null) {
36e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            thenThrow((Throwable) null);
37e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
38e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        OngoingStubbing<T> stubbing = null;
39e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        for (Throwable t: throwables) {
40e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            if (stubbing == null) {
41e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                stubbing = thenThrow(t);
42e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            } else {
43e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                stubbing = stubbing.thenThrow(t);
44e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            }
45e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
46e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return stubbing;
47e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
48e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
49e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private OngoingStubbing<T> thenThrow(Class<? extends Throwable> throwableClass) {
50e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return thenAnswer(new ThrowsExceptionClass(throwableClass));
51e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
52e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
53e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public OngoingStubbing<T> thenThrow(Class<? extends Throwable>... throwableClasses) {
54e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (throwableClasses == null) {
55e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            thenThrow((Throwable) null);
56e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
57e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        OngoingStubbing<T> stubbing = null;
58e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        for (Class<? extends Throwable> t: throwableClasses) {
59e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            if (stubbing == null) {
60e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                stubbing = thenThrow(t);
61e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            } else {
62e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                stubbing = stubbing.thenThrow(t);
63e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            }
64e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
65e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return stubbing;
66e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
67e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
68e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public OngoingStubbing<T> thenCallRealMethod() {
69e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return thenAnswer(new CallsRealMethods());
70e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
71e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
72e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public DeprecatedOngoingStubbing<T> toReturn(T value) {
73e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return toAnswer(new Returns(value));
74e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
75e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
76e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public DeprecatedOngoingStubbing<T> toThrow(Throwable throwable) {
77e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return toAnswer(new ThrowsException(throwable));
78e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
79e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson}
80