package org.testng.eclipse.ui;
import java.util.Map;
import java.util.regex.Pattern;
import org.testng.ITestResult;
import org.testng.eclipse.util.CustomSuite;
/**
* Carries along information about a test result.
*
* @author <a href='mailto:the[dot]mindstorm[at]gmail[dot]com'>Alex Popescu</a>
*/
public class RunInfo {
public static final int SUITE_TYPE = 1;
public static final int TEST_TYPE = 2;
public static final int RESULT_TYPE = 3;
private static final Pattern NEWLINES= Pattern.compile("\n");
private static final Pattern CARRAGERETURN= Pattern.compile("\r");
private String m_id;
private String m_idWithDesc;
private int m_type;
private String m_suiteName = CustomSuite.DEFAULT_SUITE_TAG_NAME;
private String m_testName = CustomSuite.DEFAULT_TEST_TAG_NAME;
private String m_className;
private String m_methodName;
private String[] m_parameters;
private String[] m_parameterTypes;
private String m_stackTrace;
protected int m_methodCount;
protected int m_passed;
protected int m_failed;
protected int m_skipped;
protected int m_successPercentageFailed;
private int m_status;
private String m_testDescription;
private String m_jvmArgs;
private Map<String, String> m_environment;
private long m_time;
private int m_invocationCount;
private int m_currentInvocationCount;
private String m_instanceName;
public RunInfo(String suiteName) {
m_id = suiteName;
m_suiteName = suiteName;
m_type = SUITE_TYPE;
}
public RunInfo(String suiteName, String testName) {
m_id = suiteName + "." + testName;
m_suiteName = suiteName;
m_testName = testName;
m_type = TEST_TYPE;
}
// public RunInfo(TestResultMessage trm) {
// this(trm.getSuiteName(), trm.getName(), trm.getTestClass(), trm.getMethod(),
// trm.getTestDescription(), trm.getParameters(), trm.getParameterTypes(),
// trm.getEndMillis() - trm.getStartMillis(), trm.getStackTrace(),
// trm.getResult());
// }
public RunInfo(String suiteName,
String testName,
String className,
String methodName,
String testDesc,
String instanceName,
String[] params,
String[] paramTypes,
long time,
String stackTrace,
int status,
int invocationCount,
int currentInvocationCount) {
m_id = suiteName + "." + testName + "." + className + "."
+ methodName + toString(params, paramTypes);
if (testDesc != null) m_idWithDesc = m_id + "." + testDesc;
else m_idWithDesc = m_id;
m_suiteName = suiteName;
m_testName = testName;
m_className = className;
m_methodName = methodName;
m_testDescription= testDesc != null ? (testDesc.equals(methodName) ? null : testDesc) : null;
m_instanceName = instanceName;
m_parameters= params;
m_parameterTypes= paramTypes;
m_time = time >= 0 ? time : 0;
m_stackTrace = stackTrace;
m_type = RESULT_TYPE;
m_status = status;
m_invocationCount = invocationCount;
m_currentInvocationCount = currentInvocationCount;
}
public long getTime() {
return m_time;
}
/**
* @param params
* @param paramTypes
* @return
*/
private String toString(String[] params, String[] paramTypes) {
if(null == params || params.length == 0) return "()";
StringBuffer buf= new StringBuffer("(");
for(int i= 0; i < params.length; i++) {
if(i > 0) buf.append(",");
if("java.lang.String".equals(paramTypes[i]) && !("null".equals(params[i]) || "\"\"".equals(params[i]))) {
String p= escapeNewLines2(params[i]);
buf.append("\"").append(p).append("\"");
}
else {
buf.append(params[i]);
}
}
return buf.append(")").toString();
}
/*String escapeNewLines(String s) {
if(s.indexOf('\n') != -1 || s.indexOf('\r') != -1) {
return s.replace("\n", "\\n").replace("\r", "\\r");
}
return s;
}*/
String escapeNewLines2(String s) {
String result= NEWLINES.matcher(s).replaceAll("\\\\n");
return CARRAGERETURN.matcher(result).replaceAll("\\\\r");
}
String escapeNewLines3(String s) {
String result= Pattern.compile("\n").matcher(s).replaceAll("\\\\n");
return Pattern.compile("\r").matcher(result).replaceAll("\\\\r");
}
/**
* Override hashCode.
*
* @return the Objects hashcode.
*/
@Override
public int hashCode() {
return m_id.hashCode();
}
/**
* Returns <code>true</code> if this <code>RunInfo</code> is the same as the o argument.
*
* @return <code>true</code> if this <code>RunInfo</code> is the same as the o argument.
*/
@Override
public boolean equals(Object o) {
if(this == o) {
return true;
}
if(null == o || !(o instanceof RunInfo)) {
return false;
}
return m_id.equals(((RunInfo) o).m_id);
}
@Override
public String toString() {
StringBuffer buffer = new StringBuffer();
buffer.append("RunInfo[");
buffer.append("status:" + getStatusName());
buffer.append(" type:" + typeToString(m_type));
buffer.append(" id:");
buffer.append(m_id);
// if (m_suiteName != null) {
// buffer.append(" suiteName:");
// buffer.append(m_suiteName);
// }
// if (m_testName != null) {
// buffer.append(" testName:");
// buffer.append(m_testName);
// }
// if (m_className != null) {
// buffer.append(" className:");
// buffer.append(m_className);
// }
// if (m_methodName != null) {
// buffer.append(" methodName:");
// buffer.append(m_methodName);
// }
// if (m_methodCount != 0) {
// buffer.append(" methodCount:");
// buffer.append(m_methodCount);
// }
if (m_passed != 0) {
buffer.append(" passed:");
buffer.append(m_passed);
}
if (m_failed > 0) {
buffer.append(" failed:");
buffer.append(m_failed);
}
if (m_skipped > 0) {
buffer.append(" skipped:");
buffer.append(m_skipped);
}
// buffer.append(" successPercentageFailed:");
// buffer.append(m_successPercentageFailed);
buffer.append("]");
return buffer.toString();
}
private String typeToString(int type) {
if (type == SUITE_TYPE) return "Suite";
else if (type == TEST_TYPE) return "Test";
else if (type == RESULT_TYPE) return "Result";
else return "<unknown>";
}
/**
* FIXME: rename to getMethodFQN()
* @return
*/
public String getMethodDisplay() {
StringBuffer buf= new StringBuffer(m_className);
buf.append(m_methodName).append(getParametersDisplay())
.append(getInvocationCountDisplay())
;
return buf.toString();
}
public String getTestDescription() {
if (null == m_testDescription || "".equals(m_testDescription.trim())) return "";
else return m_testDescription;
// return m_testDescription.substring(m_testDescription.indexOf('('));
}
/**
* @return
*/
public String getParametersDisplay() {
if(null == m_parameters || m_parameters.length == 0) return "";
return toString(m_parameters, m_parameterTypes);
}
/**
* @return
*/
public String getClassName() {
return m_className;
}
/**
* @return
*/
public String getMethodName() {
return m_methodName;
}
/**
* @return
*/
public String[] getParameterTypes() {
return m_parameterTypes;
}
public String getId() {
return m_id;
}
public String getSuiteName() {
return m_suiteName;
}
public String getTestName() {
return m_testName;
}
public String getTestFQN() {
return m_suiteName + "." + m_testName;
}
public int getType() {
return m_type;
}
public int getStatus() {
return m_status;
}
public String getStatusName() {
return m_status == ITestResult.FAILURE ? "failure"
: (m_status == ITestResult.SUCCESS ? "success"
: (m_status == ITestResult.SKIP ? "skipped" : "unknown"));
}
public String getStackTrace() {
return m_stackTrace;
}
public String getJvmArgs() {
return m_jvmArgs;
}
public void setJvmArgs(String m_jvmArgs) {
this.m_jvmArgs = m_jvmArgs;
}
public Map<String, String> getEnvironmentVariables() {
return m_environment;
}
public void setEnvironmentVariables(Map<String, String> environment) {
this.m_environment = environment;
}
/**
* The string that will be displayed in the tree view of AbstractHierarchyTab.
*/
public String getTreeLabel() {
return getMethodName()
+ getParametersDisplay()
+ "(" + ((float) getTime() / (float) 1000) + " s) "
;
}
public String getTestId() {
return m_suiteName + "." + m_testName;
}
public String getMethodId() {
return getTestId() + "." + getMethodDisplay();
}
public String getClassId() {
return getTestId() + "." + m_className;
}
public int getInvocationCount() {
return m_invocationCount;
}
public int getCurrentInvocationCount() {
return m_currentInvocationCount;
}
public String getInvocationCountDisplay() {
int ic = getInvocationCount();
if (ic > 1) {
return " " + getCurrentInvocationCount() + "/" + ic;
} else {
return "";
}
}
public String getInstanceName() {
return m_instanceName;
}
/*public static void main(String[] args) {
String test1= "something\nwrong";
String test2= "something\rwrong";
String test3= "something\ndefinitely\rwrong";
String test4= "something\\n not\\r wrong";
String test5= "something not wrong\n";
String test6= "something not wrong\n\r";
String test7= "something not wrong\r\n";
RunInfo info= new RunInfo("doesntmatter");
System.out.println("1: " + info.escapeNewLines(test1));
System.out.println("2: " + info.escapeNewLines(test2));
System.out.println("3: " + info.escapeNewLines(test3));
System.out.println("4: " + info.escapeNewLines(test4));
System.out.println("5: " + info.escapeNewLines(test5));
System.out.println("6: " + info.escapeNewLines(test6));
System.out.println("7: " + info.escapeNewLines(test7));
System.out.println("1: " + info.escapeNewLines2(test1));
System.out.println("2: " + info.escapeNewLines2(test2));
System.out.println("3: " + info.escapeNewLines2(test3));
System.out.println("4: " + info.escapeNewLines2(test4));
System.out.println("5: " + info.escapeNewLines2(test5));
System.out.println("6: " + info.escapeNewLines2(test6));
System.out.println("7: " + info.escapeNewLines2(test7));
}*/
}