1e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/* 2e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Copyright (c) 2007 Mockito contributors 3e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * This program is made available under the terms of the MIT License. 4e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */ 5e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpackage org.mockito.internal.invocation; 6e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 7e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.hamcrest.Matcher; 8e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.matchers.ArrayEquals; 9e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.matchers.Equals; 10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.util.collections.ArrayUtils; 11e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 12e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.util.ArrayList; 13e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.util.List; 14e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 15e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/** 16e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * by Szczepan Faber, created at: 3/31/12 17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */ 18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpublic class ArgumentsProcessor { 19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson // expands array varArgs that are given by runtime (1, [a, b]) into true 20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson // varArgs (1, a, b); 21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson public static Object[] expandVarArgs(final boolean isVarArgs, final Object[] args) { 22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson if (!isVarArgs || new ArrayUtils().isEmpty(args) || args[args.length - 1] != null && !args[args.length - 1].getClass().isArray()) { 23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson return args == null ? new Object[0] : args; 24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 25e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 26e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson final int nonVarArgsCount = args.length - 1; 27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson Object[] varArgs; 28e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson if (args[nonVarArgsCount] == null) { 29e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson // in case someone deliberately passed null varArg array 30e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson varArgs = new Object[] { null }; 31e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } else { 32e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson varArgs = ArrayEquals.createObjectArray(args[nonVarArgsCount]); 33e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 34e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson final int varArgsCount = varArgs.length; 35e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson Object[] newArgs = new Object[nonVarArgsCount + varArgsCount]; 36e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson System.arraycopy(args, 0, newArgs, 0, nonVarArgsCount); 37e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson System.arraycopy(varArgs, 0, newArgs, nonVarArgsCount, varArgsCount); 38e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson return newArgs; 39e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 40e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 41e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson public static List<Matcher> argumentsToMatchers(Object[] arguments) { 42e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson List<Matcher> matchers = new ArrayList<Matcher>(arguments.length); 43e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson for (Object arg : arguments) { 44e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson if (arg != null && arg.getClass().isArray()) { 45e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson matchers.add(new ArrayEquals(arg)); 46e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } else { 47e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson matchers.add(new Equals(arg)); 48e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 49e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 50e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson return matchers; 51e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 52e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson} 53