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.matchers;
6e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
7e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.io.Serializable;
8e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
9e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.hamcrest.*;
10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.debugging.LocationImpl;
11e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.invocation.Location;
12e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
13e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson@SuppressWarnings("unchecked")
14e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpublic class LocalizedMatcher implements Matcher, ContainsExtraTypeInformation, CapturesArguments, MatcherDecorator, Serializable {
15e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
16e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private static final long serialVersionUID = 6748641229659825725L;
17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private final Matcher actualMatcher;
18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private Location location;
19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public LocalizedMatcher(Matcher actualMatcher) {
21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        this.actualMatcher = actualMatcher;
22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        this.location = new LocationImpl();
23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
25e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void _dont_implement_Matcher___instead_extend_BaseMatcher_() {
26e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        // yeah right
27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
28e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
29e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public boolean matches(Object item) {
30e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return actualMatcher.matches(item);
31e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
32e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
33e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void describeTo(Description description) {
34e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        actualMatcher.describeTo(description);
35e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
36e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
37e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public Location getLocation() {
38e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return location;
39e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
40e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
41e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    @Override
42e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public String toString() {
43e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return "Localized: " + this.actualMatcher;
44e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
45e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
46e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public SelfDescribing withExtraTypeInfo() {
47e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (actualMatcher instanceof ContainsExtraTypeInformation) {
48e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            return ((ContainsExtraTypeInformation) actualMatcher).withExtraTypeInfo();
49e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        } else {
50e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            return this;
51e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
52e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
53e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
54e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public boolean typeMatches(Object object) {
55e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return actualMatcher instanceof ContainsExtraTypeInformation
56e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                && ((ContainsExtraTypeInformation) actualMatcher).typeMatches(object);
57e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
58e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
59e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void captureFrom(Object argument) {
60e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (actualMatcher instanceof CapturesArguments) {
61e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            ((CapturesArguments) actualMatcher).captureFrom(argument);
62e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
63e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
64e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
65e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    //TODO: refactor other 'delegated interfaces' to use the MatcherDecorator feature
66e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public Matcher getActualMatcher() {
67e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return actualMatcher;
68e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
69e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson}