147d431f63a66505a645f282416659a9758a91f1cBrett Chabot/*
247d431f63a66505a645f282416659a9758a91f1cBrett Chabot * Copyright 2001-2009 OFFIS, Tammo Freese
347d431f63a66505a645f282416659a9758a91f1cBrett Chabot *
447d431f63a66505a645f282416659a9758a91f1cBrett Chabot * Licensed under the Apache License, Version 2.0 (the "License");
547d431f63a66505a645f282416659a9758a91f1cBrett Chabot * you may not use this file except in compliance with the License.
647d431f63a66505a645f282416659a9758a91f1cBrett Chabot * You may obtain a copy of the License at
747d431f63a66505a645f282416659a9758a91f1cBrett Chabot *
847d431f63a66505a645f282416659a9758a91f1cBrett Chabot *     http://www.apache.org/licenses/LICENSE-2.0
947d431f63a66505a645f282416659a9758a91f1cBrett Chabot *
1047d431f63a66505a645f282416659a9758a91f1cBrett Chabot * Unless required by applicable law or agreed to in writing, software
1147d431f63a66505a645f282416659a9758a91f1cBrett Chabot * distributed under the License is distributed on an "AS IS" BASIS,
1247d431f63a66505a645f282416659a9758a91f1cBrett Chabot * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1347d431f63a66505a645f282416659a9758a91f1cBrett Chabot * See the License for the specific language governing permissions and
1447d431f63a66505a645f282416659a9758a91f1cBrett Chabot * limitations under the License.
1547d431f63a66505a645f282416659a9758a91f1cBrett Chabot */
1647d431f63a66505a645f282416659a9758a91f1cBrett Chabotpackage org.easymock;
1747d431f63a66505a645f282416659a9758a91f1cBrett Chabot
1847d431f63a66505a645f282416659a9758a91f1cBrett Chabotimport java.io.Serializable;
1947d431f63a66505a645f282416659a9758a91f1cBrett Chabot
2047d431f63a66505a645f282416659a9758a91f1cBrett Chabotimport org.easymock.internal.ArgumentToString;
2147d431f63a66505a645f282416659a9758a91f1cBrett Chabot
2247d431f63a66505a645f282416659a9758a91f1cBrett Chabot/**
2347d431f63a66505a645f282416659a9758a91f1cBrett Chabot * A convenience implementation of {@link ArgumentsMatcher}. A subclass that
2447d431f63a66505a645f282416659a9758a91f1cBrett Chabot * does not redefine any method will behave like
2547d431f63a66505a645f282416659a9758a91f1cBrett Chabot * {@link MockControl#EQUALS_MATCHER}.
2647d431f63a66505a645f282416659a9758a91f1cBrett Chabot *
2747d431f63a66505a645f282416659a9758a91f1cBrett Chabot * @deprecated Since EasyMock 2.0, <code>ArgumentsMatcher</code>s are only supported
2847d431f63a66505a645f282416659a9758a91f1cBrett Chabot * for the legacy <code>MockControl</code>. For mock objects generated by the methods
2947d431f63a66505a645f282416659a9758a91f1cBrett Chabot * on <code>EasyMock</code>, there are per-argument matchers available. For more
3047d431f63a66505a645f282416659a9758a91f1cBrett Chabot * information, see the EasyMock documentation.
3147d431f63a66505a645f282416659a9758a91f1cBrett Chabot */
3247d431f63a66505a645f282416659a9758a91f1cBrett Chabot@Deprecated
3347d431f63a66505a645f282416659a9758a91f1cBrett Chabotpublic abstract class AbstractMatcher implements ArgumentsMatcher, Serializable {
3447d431f63a66505a645f282416659a9758a91f1cBrett Chabot
3547d431f63a66505a645f282416659a9758a91f1cBrett Chabot    private static final long serialVersionUID = -5463061331694985383L;
3647d431f63a66505a645f282416659a9758a91f1cBrett Chabot
3747d431f63a66505a645f282416659a9758a91f1cBrett Chabot    /**
3847d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * Checks whether an expected argument matches an actual argument; the method
3947d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * is used by
4047d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * {@link AbstractMatcher#matches(Object[], Object[])}. The arguments
4147d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * provided to this method are always not <code>null</code>.
4247d431f63a66505a645f282416659a9758a91f1cBrett Chabot     *
4347d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * @param expected
4447d431f63a66505a645f282416659a9758a91f1cBrett Chabot     *            the expected argument.
4547d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * @param actual
4647d431f63a66505a645f282416659a9758a91f1cBrett Chabot     *            the actual argument.
4747d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * @return true if the arguments match, false otherwise.
4847d431f63a66505a645f282416659a9758a91f1cBrett Chabot     */
4947d431f63a66505a645f282416659a9758a91f1cBrett Chabot    protected boolean argumentMatches(Object expected, Object actual) {
5047d431f63a66505a645f282416659a9758a91f1cBrett Chabot        return expected.equals(actual);
5147d431f63a66505a645f282416659a9758a91f1cBrett Chabot    }
5247d431f63a66505a645f282416659a9758a91f1cBrett Chabot
5347d431f63a66505a645f282416659a9758a91f1cBrett Chabot    /**
5447d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * Converts an argument to a String, used by
5547d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * {@link AbstractMatcher#toString(Object[])}.
5647d431f63a66505a645f282416659a9758a91f1cBrett Chabot     *
5747d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * @param argument
5847d431f63a66505a645f282416659a9758a91f1cBrett Chabot     *            the argument to convert to a String.
5947d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * @return a <code>String</code> representation of the argument.
6047d431f63a66505a645f282416659a9758a91f1cBrett Chabot     */
6147d431f63a66505a645f282416659a9758a91f1cBrett Chabot    protected String argumentToString(Object argument) {
6247d431f63a66505a645f282416659a9758a91f1cBrett Chabot        StringBuffer result = new StringBuffer();
6347d431f63a66505a645f282416659a9758a91f1cBrett Chabot        ArgumentToString.appendArgument(argument, result);
6447d431f63a66505a645f282416659a9758a91f1cBrett Chabot        return result.toString();
6547d431f63a66505a645f282416659a9758a91f1cBrett Chabot    }
6647d431f63a66505a645f282416659a9758a91f1cBrett Chabot
6747d431f63a66505a645f282416659a9758a91f1cBrett Chabot    /**
6847d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * Checks whether an expected argument array matches an actual argument array.
6947d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * This convenience implementation uses
7047d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * <code>argumentMatches(Object, Object)</code> to check whether arguments
7147d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * pairs match. If all the arguments match, true is returned, otherwise
7247d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * false. In two cases, <code>argumentMatches(Object, Object)</code> is
7347d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * not called: If both argument arrays are null, they match; if one and only
7447d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * one is null, they do not match.
7547d431f63a66505a645f282416659a9758a91f1cBrett Chabot     *
7647d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * @param expected
7747d431f63a66505a645f282416659a9758a91f1cBrett Chabot     *            the expected arguments.
7847d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * @param actual
7947d431f63a66505a645f282416659a9758a91f1cBrett Chabot     *            the actual arguments.
8047d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * @return true if the arguments match, false otherwise.
8147d431f63a66505a645f282416659a9758a91f1cBrett Chabot     */
8247d431f63a66505a645f282416659a9758a91f1cBrett Chabot    public boolean matches(Object[] expected, Object[] actual) {
8347d431f63a66505a645f282416659a9758a91f1cBrett Chabot        if (expected == actual) {
8447d431f63a66505a645f282416659a9758a91f1cBrett Chabot            return true;
8547d431f63a66505a645f282416659a9758a91f1cBrett Chabot        }
8647d431f63a66505a645f282416659a9758a91f1cBrett Chabot        if (expected == null || actual == null) {
8747d431f63a66505a645f282416659a9758a91f1cBrett Chabot            return false;
8847d431f63a66505a645f282416659a9758a91f1cBrett Chabot        }
8947d431f63a66505a645f282416659a9758a91f1cBrett Chabot        if (expected.length != actual.length) {
9047d431f63a66505a645f282416659a9758a91f1cBrett Chabot            return false;
9147d431f63a66505a645f282416659a9758a91f1cBrett Chabot        }
9247d431f63a66505a645f282416659a9758a91f1cBrett Chabot        for (int i = 0; i < expected.length; i++) {
9347d431f63a66505a645f282416659a9758a91f1cBrett Chabot            Object expectedObject = expected[i];
9447d431f63a66505a645f282416659a9758a91f1cBrett Chabot            Object actualObject = actual[i];
9547d431f63a66505a645f282416659a9758a91f1cBrett Chabot
9647d431f63a66505a645f282416659a9758a91f1cBrett Chabot            if (expectedObject == null && actualObject == null) {
9747d431f63a66505a645f282416659a9758a91f1cBrett Chabot                continue;
9847d431f63a66505a645f282416659a9758a91f1cBrett Chabot            }
9947d431f63a66505a645f282416659a9758a91f1cBrett Chabot
10047d431f63a66505a645f282416659a9758a91f1cBrett Chabot            if (expectedObject == null && actualObject != null) {
10147d431f63a66505a645f282416659a9758a91f1cBrett Chabot                return false;
10247d431f63a66505a645f282416659a9758a91f1cBrett Chabot            }
10347d431f63a66505a645f282416659a9758a91f1cBrett Chabot
10447d431f63a66505a645f282416659a9758a91f1cBrett Chabot            if (expectedObject != null && actualObject == null) {
10547d431f63a66505a645f282416659a9758a91f1cBrett Chabot                return false;
10647d431f63a66505a645f282416659a9758a91f1cBrett Chabot            }
10747d431f63a66505a645f282416659a9758a91f1cBrett Chabot
10847d431f63a66505a645f282416659a9758a91f1cBrett Chabot            if (!argumentMatches(expectedObject, actualObject)) {
10947d431f63a66505a645f282416659a9758a91f1cBrett Chabot                return false;
11047d431f63a66505a645f282416659a9758a91f1cBrett Chabot            }
11147d431f63a66505a645f282416659a9758a91f1cBrett Chabot        }
11247d431f63a66505a645f282416659a9758a91f1cBrett Chabot        return true;
11347d431f63a66505a645f282416659a9758a91f1cBrett Chabot    }
11447d431f63a66505a645f282416659a9758a91f1cBrett Chabot
11547d431f63a66505a645f282416659a9758a91f1cBrett Chabot    /**
11647d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * Returns a string representation of the matcher. This convenience
11747d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * implementation calls {@link AbstractMatcher#argumentToString(Object)}
11847d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * for every argument in the given array and returns the string representations
11947d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * of the arguments separated by commas.
12047d431f63a66505a645f282416659a9758a91f1cBrett Chabot     *
12147d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * @param arguments
12247d431f63a66505a645f282416659a9758a91f1cBrett Chabot     *            the arguments to be used in the string representation.
12347d431f63a66505a645f282416659a9758a91f1cBrett Chabot     * @return a string representation of the matcher.
12447d431f63a66505a645f282416659a9758a91f1cBrett Chabot     */
12547d431f63a66505a645f282416659a9758a91f1cBrett Chabot    public String toString(Object[] arguments) {
12647d431f63a66505a645f282416659a9758a91f1cBrett Chabot        if (arguments == null)
12747d431f63a66505a645f282416659a9758a91f1cBrett Chabot            arguments = new Object[0];
12847d431f63a66505a645f282416659a9758a91f1cBrett Chabot
12947d431f63a66505a645f282416659a9758a91f1cBrett Chabot        StringBuilder result = new StringBuilder();
13047d431f63a66505a645f282416659a9758a91f1cBrett Chabot
13147d431f63a66505a645f282416659a9758a91f1cBrett Chabot        for (int i = 0; i < arguments.length; i++) {
13247d431f63a66505a645f282416659a9758a91f1cBrett Chabot            if (i > 0) {
13347d431f63a66505a645f282416659a9758a91f1cBrett Chabot                result.append(", ");
13447d431f63a66505a645f282416659a9758a91f1cBrett Chabot            }
13547d431f63a66505a645f282416659a9758a91f1cBrett Chabot            result.append(argumentToString(arguments[i]));
13647d431f63a66505a645f282416659a9758a91f1cBrett Chabot        }
13747d431f63a66505a645f282416659a9758a91f1cBrett Chabot        return result.toString();
13847d431f63a66505a645f282416659a9758a91f1cBrett Chabot    }
13947d431f63a66505a645f282416659a9758a91f1cBrett Chabot}
140