/*
* Copyright 2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.powermock.reflect.internal;
/**
*
*/
class ParameterTypesMatcher {
private boolean isVarArgs;
private Class<?>[] expectedParameterTypes;
private Class<?>[] actualParameterTypes;
public ParameterTypesMatcher(boolean isVarArgs, Class<?>[] expectedParameterTypes, Class<?>... actualParameterTypes) {
this.isVarArgs = isVarArgs;
this.expectedParameterTypes = expectedParameterTypes;
this.actualParameterTypes = actualParameterTypes;
}
private boolean isRemainParamsVarArgs(int index, Class<?> actualParameterType) {
return isVarArgs && index == expectedParameterTypes.length - 1
&& actualParameterType.getComponentType().isAssignableFrom(expectedParameterTypes[index]);
}
private boolean isParameterTypesNotMatch(Class<?> actualParameterType, Class<?> expectedParameterType) {
if (actualParameterType == null){
return false;
}
if (expectedParameterType == null){
return false;
}
return !actualParameterType.isAssignableFrom(expectedParameterType);
}
public boolean match() {
assertParametersTypesNotNull();
if (isParametersLengthMatch()) {
return false;
} else {
return isParametersMatch();
}
}
private boolean isParametersLengthMatch() {return expectedParameterTypes.length != actualParameterTypes.length;}
private void assertParametersTypesNotNull() {
if (expectedParameterTypes == null || actualParameterTypes == null) {
throw new IllegalArgumentException("parameter types cannot be null");
}
}
private Boolean isParametersMatch() {
for (int index = 0; index < expectedParameterTypes.length; index++) {
final Class<?> actualParameterType = actualParameterTypes[index];
if (isRemainParamsVarArgs(index, actualParameterType)) {
return true;
} else {
final Class<?> expectedParameterType = expectedParameterTypes[index];
if (isParameterTypesNotMatch(actualParameterType, expectedParameterType)) {
return false;
}
}
}
return true;
}
}