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}