1/*
2 * Copyright 2001-2009 OFFIS, Tammo Freese
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.easymock;
17
18import java.io.Serializable;
19
20import org.easymock.internal.ArgumentToString;
21
22/**
23 * A convenience implementation of {@link ArgumentsMatcher}. A subclass that
24 * does not redefine any method will behave like
25 * {@link MockControl#EQUALS_MATCHER}.
26 *
27 * @deprecated Since EasyMock 2.0, <code>ArgumentsMatcher</code>s are only supported
28 * for the legacy <code>MockControl</code>. For mock objects generated by the methods
29 * on <code>EasyMock</code>, there are per-argument matchers available. For more
30 * information, see the EasyMock documentation.
31 */
32@Deprecated
33public abstract class AbstractMatcher implements ArgumentsMatcher, Serializable {
34
35    private static final long serialVersionUID = -5463061331694985383L;
36
37    /**
38     * Checks whether an expected argument matches an actual argument; the method
39     * is used by
40     * {@link AbstractMatcher#matches(Object[], Object[])}. The arguments
41     * provided to this method are always not <code>null</code>.
42     *
43     * @param expected
44     *            the expected argument.
45     * @param actual
46     *            the actual argument.
47     * @return true if the arguments match, false otherwise.
48     */
49    protected boolean argumentMatches(Object expected, Object actual) {
50        return expected.equals(actual);
51    }
52
53    /**
54     * Converts an argument to a String, used by
55     * {@link AbstractMatcher#toString(Object[])}.
56     *
57     * @param argument
58     *            the argument to convert to a String.
59     * @return a <code>String</code> representation of the argument.
60     */
61    protected String argumentToString(Object argument) {
62        StringBuffer result = new StringBuffer();
63        ArgumentToString.appendArgument(argument, result);
64        return result.toString();
65    }
66
67    /**
68     * Checks whether an expected argument array matches an actual argument array.
69     * This convenience implementation uses
70     * <code>argumentMatches(Object, Object)</code> to check whether arguments
71     * pairs match. If all the arguments match, true is returned, otherwise
72     * false. In two cases, <code>argumentMatches(Object, Object)</code> is
73     * not called: If both argument arrays are null, they match; if one and only
74     * one is null, they do not match.
75     *
76     * @param expected
77     *            the expected arguments.
78     * @param actual
79     *            the actual arguments.
80     * @return true if the arguments match, false otherwise.
81     */
82    public boolean matches(Object[] expected, Object[] actual) {
83        if (expected == actual) {
84            return true;
85        }
86        if (expected == null || actual == null) {
87            return false;
88        }
89        if (expected.length != actual.length) {
90            return false;
91        }
92        for (int i = 0; i < expected.length; i++) {
93            Object expectedObject = expected[i];
94            Object actualObject = actual[i];
95
96            if (expectedObject == null && actualObject == null) {
97                continue;
98            }
99
100            if (expectedObject == null && actualObject != null) {
101                return false;
102            }
103
104            if (expectedObject != null && actualObject == null) {
105                return false;
106            }
107
108            if (!argumentMatches(expectedObject, actualObject)) {
109                return false;
110            }
111        }
112        return true;
113    }
114
115    /**
116     * Returns a string representation of the matcher. This convenience
117     * implementation calls {@link AbstractMatcher#argumentToString(Object)}
118     * for every argument in the given array and returns the string representations
119     * of the arguments separated by commas.
120     *
121     * @param arguments
122     *            the arguments to be used in the string representation.
123     * @return a string representation of the matcher.
124     */
125    public String toString(Object[] arguments) {
126        if (arguments == null)
127            arguments = new Object[0];
128
129        StringBuilder result = new StringBuilder();
130
131        for (int i = 0; i < arguments.length; i++) {
132            if (i > 0) {
133                result.append(", ");
134            }
135            result.append(argumentToString(arguments[i]));
136        }
137        return result.toString();
138    }
139}
140