1package org.testng.internal;
2
3import org.testng.IAttributes;
4import org.testng.IClass;
5import org.testng.ITest;
6import org.testng.ITestContext;
7import org.testng.ITestNGMethod;
8import org.testng.ITestResult;
9import org.testng.Reporter;
10import org.testng.collections.Objects;
11
12import java.util.List;
13import java.util.Set;
14
15
16/**
17 * This class represents the result of a test.
18 *
19 * @author Cedric Beust, May 2, 2004
20 */
21public class TestResult implements ITestResult {
22
23  private static final long serialVersionUID = 6273017418233324556L;
24  private IClass m_testClass = null;
25  private ITestNGMethod m_method = null;
26  private int m_status = -1;
27  private Throwable m_throwable = null;
28  private long m_startMillis = 0;
29  private long m_endMillis = 0;
30  private String m_name = null;
31  private String m_host;
32  transient private Object[] m_parameters = {};
33  transient private Object m_instance;
34  private String m_instanceName;
35  private ITestContext m_context;
36
37  public TestResult() {
38
39  }
40
41  public TestResult(IClass testClass,
42      Object instance,
43      ITestNGMethod method,
44      Throwable throwable,
45      long start,
46      long end,
47      ITestContext context)
48  {
49    init(testClass, instance, method, throwable, start, end, context);
50  }
51
52  /**
53   *
54   * @param testClass
55   * @param instance
56   * @param method
57   * @param throwable
58   * @param start
59   * @param end
60   */
61  public void init (IClass testClass,
62      Object instance,
63      ITestNGMethod method,
64      Throwable throwable,
65      long start,
66      long end,
67      ITestContext context)
68  {
69    m_testClass = testClass;
70    m_throwable = throwable;
71    m_instanceName = m_testClass.getName();
72    if (null == m_throwable) {
73      m_status = ITestResult.SUCCESS;
74    }
75    m_startMillis = start;
76    m_endMillis = end;
77    m_method = method;
78    m_context = context;
79
80    m_instance = instance;
81
82    // Calculate the name: either the method name, ITest#getTestName or
83    // toString() if it's been overridden.
84    if (m_instance == null) {
85      m_name = m_method.getMethodName();
86    } else {
87      if (m_instance instanceof ITest) {
88        m_name = ((ITest) m_instance).getTestName();
89      }
90      else if (testClass.getTestName() != null) {
91        m_name = testClass.getTestName();
92      }
93      else {
94        String string = m_instance.toString();
95        // Only display toString() if it's been overridden by the user
96        m_name = getMethod().getMethodName();
97        try {
98          if (!Object.class.getMethod("toString")
99              .equals(m_instance.getClass().getMethod("toString"))) {
100            m_instanceName = string.startsWith("class ")
101                ? string.substring("class ".length())
102                : string;
103            m_name = m_name + " on " + m_instanceName;
104          }
105        }
106        catch(NoSuchMethodException ignore) {
107          // ignore
108        }
109      }
110    }
111  }
112
113  private static void ppp(String s) {
114    System.out.println("[TestResult] " + s);
115  }
116
117  @Override
118  public void setEndMillis(long millis) {
119    m_endMillis = millis;
120  }
121
122  /**
123   * If this result's related instance implements ITest or use @Test(testName=...), returns its test name,
124   * otherwise returns null.
125   */
126  @Override
127  public String getTestName() {
128    if (m_instance instanceof ITest) {
129      return ((ITest) m_instance).getTestName();
130    }
131    if (m_testClass.getTestName() != null) {
132      return m_testClass.getTestName();
133    }
134    return null;
135  }
136
137  @Override
138  public String getName() {
139    return m_name;
140  }
141
142  /**
143   * @return Returns the method.
144   */
145  @Override
146  public ITestNGMethod getMethod() {
147    return m_method;
148  }
149
150  /**
151   * @param method The method to set.
152   */
153  public void setMethod(ITestNGMethod method) {
154    m_method = method;
155  }
156
157  /**
158   * @return Returns the status.
159   */
160  @Override
161  public int getStatus() {
162    return m_status;
163  }
164
165  /**
166   * @param status The status to set.
167   */
168  @Override
169  public void setStatus(int status) {
170    m_status = status;
171  }
172
173  @Override
174  public boolean isSuccess() {
175    return ITestResult.SUCCESS == m_status;
176  }
177
178  /**
179   * @return Returns the testClass.
180   */
181  @Override
182  public IClass getTestClass() {
183    return m_testClass;
184  }
185
186  /**
187   * @param testClass The testClass to set.
188   */
189  public void setTestClass(IClass testClass) {
190    m_testClass = testClass;
191  }
192
193  /**
194   * @return Returns the throwable.
195   */
196  @Override
197  public Throwable getThrowable() {
198    return m_throwable;
199  }
200
201  /**
202   * @param throwable The throwable to set.
203   */
204  @Override
205  public void setThrowable(Throwable throwable) {
206    m_throwable = throwable;
207  }
208
209  /**
210   * @return Returns the endMillis.
211   */
212  @Override
213  public long getEndMillis() {
214    return m_endMillis;
215  }
216
217  /**
218   * @return Returns the startMillis.
219   */
220  @Override
221  public long getStartMillis() {
222    return m_startMillis;
223  }
224
225//  public List<String> getOutput() {
226//    return m_output;
227//  }
228
229  @Override
230  public String toString() {
231    List<String> output = Reporter.getOutput(this);
232    String result = Objects.toStringHelper(getClass())
233        .omitNulls()
234        .omitEmptyStrings()
235        .add("name", getName())
236        .add("status", toString(m_status))
237        .add("method", m_method)
238        .add("output", output != null && output.size() > 0 ? output.get(0) : null)
239        .toString();
240
241    return result;
242  }
243
244  private String toString(int status) {
245    switch(status) {
246      case SUCCESS: return "SUCCESS";
247      case FAILURE: return "FAILURE";
248      case SKIP: return "SKIP";
249      case SUCCESS_PERCENTAGE_FAILURE: return "SUCCESS WITHIN PERCENTAGE";
250      case STARTED: return "STARTED";
251      default: throw new RuntimeException();
252    }
253  }
254
255  @Override
256  public String getHost() {
257    return m_host;
258  }
259
260  public void setHost(String host) {
261    m_host = host;
262  }
263
264  @Override
265  public Object[] getParameters() {
266    return m_parameters;
267  }
268
269  @Override
270  public void setParameters(Object[] parameters) {
271    m_parameters = parameters;
272  }
273
274  @Override
275  public Object getInstance() {
276    return m_instance;
277  }
278
279  private IAttributes m_attributes = new Attributes();
280
281  @Override
282  public Object getAttribute(String name) {
283    return m_attributes.getAttribute(name);
284  }
285
286  @Override
287  public void setAttribute(String name, Object value) {
288    m_attributes.setAttribute(name, value);
289  }
290
291  @Override
292  public Set<String> getAttributeNames() {
293    return m_attributes.getAttributeNames();
294  }
295
296  @Override
297  public Object removeAttribute(String name) {
298    return m_attributes.removeAttribute(name);
299  }
300
301  @Override
302  public ITestContext getTestContext() {
303	  return m_context;
304  }
305
306  public void setContext(ITestContext context) {
307	  m_context = context;
308  }
309
310  @Override
311  public int compareTo(ITestResult comparison) {
312	  if( getStartMillis() > comparison.getStartMillis() ) {
313		  return 1;
314	  } else if( getStartMillis() < comparison.getStartMillis()) {
315		  return -1;
316	  } else {
317		  return 0;
318	  }
319  }
320
321  @Override
322  public String getInstanceName() {
323    return m_instanceName;
324  }
325}
326
327