001    // Copyright 2004, 2005 The Apache Software Foundation
002    //
003    // Licensed under the Apache License, Version 2.0 (the "License");
004    // you may not use this file except in compliance with the License.
005    // You may obtain a copy of the License at
006    //
007    //     http://www.apache.org/licenses/LICENSE-2.0
008    //
009    // Unless required by applicable law or agreed to in writing, software
010    // distributed under the License is distributed on an "AS IS" BASIS,
011    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012    // See the License for the specific language governing permissions and
013    // limitations under the License.
014    
015    package org.apache.hivemind.test;
016    
017    import org.easymock.AbstractMatcher;
018    
019    /**
020     * @author Howard M. Lewis Ship
021     * @since 1.1
022     */
023    public class AggregateArgumentsMatcher extends AbstractMatcher
024    {
025        private ArgumentMatcher[] _matchers;
026    
027        private ArgumentMatcher _defaultMatcher = new EqualsMatcher();
028    
029        /**
030         * Aggregates the individual matchers. Each matcher is matched against the argument in the same
031         * position. Null matchers, or arguments outside the array range, are handled by a default
032         * instance (of {@link EqualsMatcher}). This makes it easy to provide special argument matchers
033         * for particular arguments.
034         */
035        public AggregateArgumentsMatcher(ArgumentMatcher[] matchers)
036        {
037            _matchers = matchers;
038        }
039    
040        /**
041         * Convienice for just a single matcher.
042         */
043        public AggregateArgumentsMatcher(ArgumentMatcher matcher)
044        {
045            this(new ArgumentMatcher[]
046            { matcher });
047        }
048    
049        public boolean matches(Object[] expected, Object[] actual)
050        {
051            for (int i = 0; i < expected.length; i++)
052            {
053                if (!matches(i, expected[i], actual[i]))
054                    return false;
055            }
056    
057            return true;
058        }
059    
060        private boolean matches(int argumentIndex, Object expected, Object actual)
061        {
062            if (expected == actual)
063                return true;
064    
065            // If one is null, but both aren't null (previous check) then a non-match.
066    
067            if (expected == null || actual == null)
068                return false;
069    
070            ArgumentMatcher am = getArgumentMatcher(argumentIndex);
071    
072            return am.compareArguments(expected, actual);
073        }
074    
075        private ArgumentMatcher getArgumentMatcher(int argumentIndex)
076        {
077            if (argumentIndex >= _matchers.length)
078                return _defaultMatcher;
079    
080            ArgumentMatcher result = _matchers[argumentIndex];
081    
082            if (result == null)
083                result = _defaultMatcher;
084    
085            return result;
086        }
087    }