1 /* 2 * Copyright (c) 2007 Mockito contributors 3 * This program is made available under the terms of the MIT License. 4 */ 5 package org.mockito.internal.invocation; 6 7 import org.mockito.ArgumentMatcher; 8 import org.mockito.internal.matchers.ArrayEquals; 9 import org.mockito.internal.matchers.Equals; 10 11 import java.util.ArrayList; 12 import java.util.Arrays; 13 import java.util.List; 14 15 /** 16 * by Szczepan Faber, created at: 3/31/12 17 */ 18 public class ArgumentsProcessor { 19 // drops hidden synthetic parameters (last continuation parameter from Kotlin suspending functions) 20 // and expands varargs expandArgs(MockitoMethod method, Object[] args)21 public static Object[] expandArgs(MockitoMethod method, Object[] args) { 22 int nParams = method.getParameterTypes().length; 23 if (args != null && args.length > nParams) 24 args = Arrays.copyOf(args, nParams); // drop extra args (currently -- Kotlin continuation synthetic arg) 25 return expandVarArgs(method.isVarArgs(), args); 26 } 27 28 // expands array varArgs that are given by runtime (1, [a, b]) into true 29 // varArgs (1, a, b); expandVarArgs(final boolean isVarArgs, final Object[] args)30 private static Object[] expandVarArgs(final boolean isVarArgs, final Object[] args) { 31 if (!isVarArgs || isNullOrEmpty(args) || args[args.length - 1] != null && !args[args.length - 1].getClass().isArray()) { 32 return args == null ? new Object[0] : args; 33 } 34 35 final int nonVarArgsCount = args.length - 1; 36 Object[] varArgs; 37 if (args[nonVarArgsCount] == null) { 38 // in case someone deliberately passed null varArg array 39 varArgs = new Object[] { null }; 40 } else { 41 varArgs = ArrayEquals.createObjectArray(args[nonVarArgsCount]); 42 } 43 final int varArgsCount = varArgs.length; 44 Object[] newArgs = new Object[nonVarArgsCount + varArgsCount]; 45 System.arraycopy(args, 0, newArgs, 0, nonVarArgsCount); 46 System.arraycopy(varArgs, 0, newArgs, nonVarArgsCount, varArgsCount); 47 return newArgs; 48 } 49 isNullOrEmpty(T[] array)50 private static <T> boolean isNullOrEmpty(T[] array) { 51 return array == null || array.length == 0; 52 } 53 argumentsToMatchers(Object[] arguments)54 public static List<ArgumentMatcher> argumentsToMatchers(Object[] arguments) { 55 List<ArgumentMatcher> matchers = new ArrayList<ArgumentMatcher>(arguments.length); 56 for (Object arg : arguments) { 57 if (arg != null && arg.getClass().isArray()) { 58 matchers.add(new ArrayEquals(arg)); 59 } else { 60 matchers.add(new Equals(arg)); 61 } 62 } 63 return matchers; 64 } 65 66 67 } 68