Java程序  |  165行  |  5.37 KB

package junitparams.internal;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;

/**
 * Some String utils to handle parameterised tests' results.
 *
 * @author Pawel Lipinski
 */
public class Utils {
    public static final String REGEX_ALL_NEWLINES = "(\\r\\n|\\n|\\r)";

    public static String stringify(Object paramSet, int paramIdx) {
        String result = "[" + paramIdx + "] ";

        return result + stringify(paramSet);
    }

    public static String stringify(Object paramSet) {
        String result;
        if (paramSet == null)
            result = "null";
        else if (paramSet instanceof String)
            result = paramSet.toString();
        else
            result = asCsvString(safelyCastParamsToArray(paramSet));

        return trimSpecialChars(result);
    }

    public static String getParameterStringByIndexOrEmpty(Object paramSet, int parameterIndex) {
        Object[] params = safelyCastParamsToArray(paramSet);
        if (paramSet instanceof String) {
            params = splitAtCommaOrPipe((String) paramSet);
        }
        if (parameterIndex >= 0 && parameterIndex < params.length) {
            return addParamToResult("", params[parameterIndex]);
        }

        return "";
    }

    public static String[] splitAtCommaOrPipe(String input) {
        ArrayList<String> result = new ArrayList<String>();

        char character = '\0';
        char previousCharacter;

        StringBuilder value = new StringBuilder();
        for (int i = 0; i < input.length(); i++) {
            previousCharacter = character;
            character = input.charAt(i);

            if (character == ',' || character == '|') {
                if (previousCharacter == '\\') {
                    value.setCharAt(value.length() - 1, character);
                    continue;
                }
                result.add(value.toString().trim());
                value = new StringBuilder();
                continue;
            }

            value.append(character);
        }
        result.add(value.toString().trim());

        return result.toArray(new String[]{});
    }

    private static String trimSpecialChars(String result) {
        return result.replace('(', '[').replace(')', ']').replaceAll(REGEX_ALL_NEWLINES, " ");
    }

    static Object[] safelyCastParamsToArray(Object paramSet) {
        final Object[] params;
        if (paramSet instanceof Object[]) {
            params = (Object[]) paramSet;
        } else {
            params = new Object[]{paramSet};
        }
        return params;
    }

    private static String asCsvString(Object[] params) {
        if (params == null)
            return "null";

        if (params.length == 0)
            return "";

        String result = "";

        for (int i = 0; i < params.length - 1; i++) {
            Object param = params[i];
            result = addParamToResult(result, param) + ", ";
        }
        result = addParamToResult(result, params[params.length - 1]);

        return result;
    }

    private static String addParamToResult(String result, Object param) {
        if (param == null)
            result += "null";
        else if (param.getClass().isArray())
            result += convertAnyArrayToString(param);
        else if (hasOverridenToStringMethod(param))
            result += param.toString();
        else
            result += param.getClass().getSimpleName();

        return result;
    }

    private static boolean hasOverridenToStringMethod(Object param) {
        Method[] methods = param.getClass().getMethods();
        for (Method method : methods) {
            if (method.getName().equals("toString") && overridesMethod(method)) {
                return true;
            }
        }
        return false;
    }

    private static boolean overridesMethod(Method method) {
        return !method.getDeclaringClass().equals(Object.class);
    }

    static String uniqueMethodId(int index, Object paramSet, String methodName) {
        return stringify(paramSet, index) + " (" + methodName + ")";
    }

    private static String convertAnyArrayToString(Object arrayAsObject) {
        if (arrayAsObject.getClass().getComponentType().isPrimitive()) {
            return convertFromArrayOfPrimitives(arrayAsObject);
        } else {
            return Arrays.toString((Object[]) arrayAsObject);
        }
    }

    private static final String convertFromArrayOfPrimitives(Object arrayOfPrimitives) {
        String componentType = arrayOfPrimitives.getClass().getComponentType().getName();
        if ("byte".equals(componentType)) {
            return Arrays.toString((byte[]) arrayOfPrimitives);
        } else if ("short".equals(componentType)) {
            return Arrays.toString((short[]) arrayOfPrimitives);
        } else if ("int".equals(componentType)) {
            return Arrays.toString((int[]) arrayOfPrimitives);
        } else if ("long".equals(componentType)) {
            return Arrays.toString((long[]) arrayOfPrimitives);
        } else if ("float".equals(componentType)) {
            return Arrays.toString((float[]) arrayOfPrimitives);
        } else if ("double".equals(componentType)) {
            return Arrays.toString((double[]) arrayOfPrimitives);
        } else if ("boolean".equals(componentType)) {
            return Arrays.toString((boolean[]) arrayOfPrimitives);
        } else {
            return Arrays.toString((char[]) arrayOfPrimitives);
        }
    }
}