/* * Copyright (c) 2006-2013 Rogério Liesenfeld * This file is subject to the terms of the MIT license (see LICENSE.txt). */ package mockit.internal.expectations.invocation; import java.util.*; import mockit.external.asm4.*; import mockit.internal.*; import mockit.internal.expectations.argumentMatching.*; import mockit.internal.state.*; import mockit.internal.util.*; public final class InvocationArguments { final String classDesc; final String methodNameAndDesc; final String genericSignature; final String[] exceptions; private final ArgumentValuesAndMatchers valuesAndMatchers; private RealMethod realMethod; InvocationArguments( int access, String classDesc, String methodNameAndDesc, String genericSignature, String exceptions, Object[] args) { this.classDesc = classDesc; this.methodNameAndDesc = methodNameAndDesc; this.genericSignature = genericSignature; this.exceptions = exceptions == null ? null : exceptions.split(" "); valuesAndMatchers = (access & Opcodes.ACC_VARARGS) == 0 ? new ArgumentValuesAndMatchersWithoutVarargs(this, args) : new ArgumentValuesAndMatchersWithVarargs(this, args); } String getClassName() { return classDesc.replace('/', '.'); } boolean isForConstructor() { return methodNameAndDesc.charAt(0) == '<'; } public Object[] getValues() { return valuesAndMatchers.values; } void setValues(Object[] values) { valuesAndMatchers.values = values; } public void setValuesWithNoMatchers(Object[] argsToVerify) { valuesAndMatchers.setValuesWithNoMatchers(argsToVerify); } public List<ArgumentMatcher> getMatchers() { return valuesAndMatchers.matchers; } public void setMatchers(List<ArgumentMatcher> matchers) { valuesAndMatchers.matchers = matchers; } public Object[] prepareForVerification(Object[] argsToVerify, List<ArgumentMatcher> matchers) { return valuesAndMatchers.prepareForVerification(argsToVerify, matchers); } public boolean isMatch(Object[] replayArgs, Map<Object, Object> instanceMap) { TestRun.enterNoMockingZone(); try { return valuesAndMatchers.isMatch(replayArgs, instanceMap); } finally { TestRun.exitNoMockingZone(); } } public Error assertMatch(Object[] replayArgs, Map<Object, Object> instanceMap, CharSequence errorMessagePrefix) { return valuesAndMatchers.assertMatch(replayArgs, instanceMap, errorMessagePrefix); } Error argumentMismatchMessage(int paramIndex, Object expected, Object actual, CharSequence errorMessagePrefix) { ArgumentMismatch message = new ArgumentMismatch(); if (errorMessagePrefix != null) { message.append(errorMessagePrefix); message.append('\n'); } message.append("Parameter "); String parameterName = ParameterNames.getName(classDesc, methodNameAndDesc, paramIndex); if (parameterName == null) { message.append(paramIndex); } else { message.appendFormatted(parameterName); } message.append(" of ").append(new MethodFormatter(classDesc, methodNameAndDesc).toString()); message.append(" expected ").appendFormatted(expected); if (!message.isFinished()) { message.append(", got ").appendFormatted(actual); } return new UnexpectedInvocation(message.toString()); } @Override public String toString() { MethodFormatter methodFormatter = new MethodFormatter(classDesc, methodNameAndDesc); return valuesAndMatchers.toString(methodFormatter); } public boolean hasEquivalentMatchers(InvocationArguments other) { return valuesAndMatchers.hasEquivalentMatchers(other.valuesAndMatchers); } RealMethod getRealMethod() { if (realMethod == null) { realMethod = new RealMethod(getClassName(), methodNameAndDesc); } return realMethod; } }