package ru.yandex.qatools.allure.aspects;
import ru.yandex.qatools.allure.config.AllureConfig;
import java.lang.reflect.Array;
import java.text.MessageFormat;
import java.util.Arrays;
/**
* Some utils that help process steps and attachments names and titles.
*
* @author Dmitry Baev charlie@yandex-team.ru
* Date: 24.10.13
*/
public final class AllureAspectUtils {
/**
* Don't instance this class
*/
private AllureAspectUtils() {
}
/**
* Generate method in the following format: {methodName}[{param1}, {param2}, ...]. Cut a generated
* name is it over {@link ru.yandex.qatools.allure.config.AllureConfig#maxTitleLength}
*/
public static String getName(String methodName, Object[] parameters) {
int maxLength = AllureConfig.newInstance().getMaxTitleLength();
if (methodName.length() > maxLength) {
return cutBegin(methodName, maxLength);
} else {
return methodName + getParametersAsString(parameters, maxLength - methodName.length());
}
}
/**
* Convert array of given parameters to sting.
*/
public static String getParametersAsString(Object[] parameters, int maxLength) {
if (parameters == null || parameters.length == 0) {
return "";
}
StringBuilder builder = new StringBuilder();
builder.append("[");
for (int i = 0; i < parameters.length; i++) {
builder.append(arrayToString(parameters[i]));
if (i < parameters.length - 1) {
builder.append(", ");
}
}
return cutEnd(builder.toString(), maxLength) + "]";
}
/**
* Generate title using name pattern. First step all "{method}" substrings will be replaced
* with given method name. Then replace all "{i}" substrings with i-th parameter.
*/
public static String getTitle(String namePattern, String methodName, Object instance, Object[] parameters) {
String finalPattern = namePattern
.replaceAll("\\{method\\}", methodName)
.replaceAll("\\{this\\}", String.valueOf(instance));
int paramsCount = parameters == null ? 0 : parameters.length;
Object[] results = new Object[paramsCount];
for (int i = 0; i < paramsCount; i++) {
results[i] = arrayToString(parameters[i]);
}
return cutEnd(MessageFormat.format(finalPattern, results), AllureConfig.newInstance().getMaxTitleLength());
}
/**
* {@link Arrays#toString(Object[])} with {@link Arrays#toString(Object[])} for array elements
*/
public static Object arrayToString(Object obj) {
if (obj != null && obj.getClass().isArray()) {
int len = Array.getLength(obj);
String[] strings = new String[len];
for (int i = 0; i < len; i++) {
strings[i] = String.valueOf(Array.get(obj, i));
}
return Arrays.toString(strings);
} else {
return obj;
}
}
/**
* Cut all characters from maxLength and replace it with "..."
*/
public static String cutEnd(String data, int maxLength) {
if (data.length() > maxLength) {
return data.substring(0, maxLength) + "...";
} else {
return data;
}
}
/**
* Cut first (length-maxLength) characters and replace it with "..."
*/
public static String cutBegin(String data, int maxLength) {
if (data.length() > maxLength) {
return "..." + data.substring(data.length() - maxLength, data.length());
} else {
return data;
}
}
}