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