15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 2007 Mockito contributors
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This program is made available under the terms of the MIT License.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)package org.mockito.internal.matchers;
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.hamcrest.Description;
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.hamcrest.SelfDescribing;
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.mockito.ArgumentMatcher;
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.io.Serializable;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public class Equals extends ArgumentMatcher<Object> implements ContainsExtraTypeInformation, Serializable {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private static final long serialVersionUID = -3395637450058086891L;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private final Object wanted;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public Equals(Object wanted) {
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        this.wanted = wanted;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean matches(Object actual) {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return Equality.areEqual(this.wanted, actual);
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void describeTo(Description description) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        description.appendText(describe(wanted));
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public String describe(Object object) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        String text = quoting();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        text+="" + object;
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        text+= quoting();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return text;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private String quoting() {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (wanted instanceof String) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return "\"";
41        } else if (wanted instanceof Character) {
42            return "'";
43        } else {
44            return "";
45        }
46    }
47
48    protected final Object getWanted() {
49        return wanted;
50    }
51
52    @Override
53    public boolean equals(Object o) {
54        if (o == null || !this.getClass().equals(o.getClass())) {
55            return false;
56        }
57        Equals other = (Equals) o;
58        return this.wanted == null && other.wanted == null || this.wanted != null && this.wanted.equals(other.wanted);
59    }
60
61    @Override
62    public int hashCode() {
63        return 1;
64    }
65
66    public SelfDescribing withExtraTypeInfo() {
67        return new SelfDescribing() {
68            public void describeTo(Description description) {
69                description.appendText(describe("("+ wanted.getClass().getSimpleName() +") " + wanted));
70            }};
71    }
72
73    public boolean typeMatches(Object object) {
74        return wanted != null && object != null && object.getClass() == wanted.getClass();
75    }
76}