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.invocation;
7e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
8e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.hamcrest.Matcher;
9e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.exceptions.Reporter;
10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.matchers.LocalizedMatcher;
11e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.progress.ArgumentMatcherStorage;
12e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.invocation.Invocation;
13e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
14e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.io.Serializable;
15e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.util.List;
16e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson@SuppressWarnings("unchecked")
18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpublic class MatchersBinder implements Serializable {
19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private static final long serialVersionUID = -311433939339443463L;
21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public InvocationMatcher bindMatchers(ArgumentMatcherStorage argumentMatcherStorage, Invocation invocation) {
23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        List<LocalizedMatcher> lastMatchers = argumentMatcherStorage.pullLocalizedMatchers();
24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        validateMatchers(invocation, lastMatchers);
25e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
26e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        InvocationMatcher invocationWithMatchers = new InvocationMatcher(invocation, (List<Matcher>)(List) lastMatchers);
27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return invocationWithMatchers;
28e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
29e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
30e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private void validateMatchers(Invocation invocation, List<LocalizedMatcher> lastMatchers) {
31e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (!lastMatchers.isEmpty()) {
32e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            int recordedMatchersSize = lastMatchers.size();
33e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            int expectedMatchersSize = invocation.getArguments().length;
34e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            if (expectedMatchersSize != recordedMatchersSize) {
35e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                new Reporter().invalidUseOfMatchers(expectedMatchersSize, lastMatchers);
36e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            }
37e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
38e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
39e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson}