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.matchers;
7e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
8e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.ArgumentMatcher;
92637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffinimport org.mockito.internal.matchers.text.ValuePrinter;
10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
11e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.io.Serializable;
12e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
132637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffinpublic class Equals implements ArgumentMatcher<Object>, ContainsExtraTypeInfo, Serializable {
14e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
15e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private final Object wanted;
16e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public Equals(Object wanted) {
18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        this.wanted = wanted;
19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public boolean matches(Object actual) {
22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return Equality.areEqual(this.wanted, actual);
23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
252637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    public String toString() {
262637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        return describe(wanted);
27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
28e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
292637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    private String describe(Object object) {
302637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        return ValuePrinter.print(object);
31e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
32e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
33e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    protected final Object getWanted() {
34e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return wanted;
35e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
36e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
37e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    @Override
38e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public boolean equals(Object o) {
39e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (o == null || !this.getClass().equals(o.getClass())) {
40e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            return false;
41e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
42e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        Equals other = (Equals) o;
43e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return this.wanted == null && other.wanted == null || this.wanted != null && this.wanted.equals(other.wanted);
44e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
45e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
46e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    @Override
47e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public int hashCode() {
48e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return 1;
49e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
50e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
512637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    public String toStringWithType() {
522637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        return "("+ wanted.getClass().getSimpleName() +") " + describe(wanted);
53e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
54e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
552637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    public boolean typeMatches(Object target) {
562637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        return wanted != null && target != null && target.getClass() == wanted.getClass();
57e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
582637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin}
59