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 }