1package org.testng.asserts;
2
3import java.util.Map;
4
5import org.testng.collections.Maps;
6
7/**
8 * When an assertion fails, don't throw an exception but record the failure.
9 * Calling {@code assertAll()} will cause an exception to be thrown if at
10 * least one assertion failed.
11 */
12public class SoftAssert extends Assertion {
13  // LinkedHashMap to preserve the order
14  private final Map<AssertionError, IAssert<?>> m_errors = Maps.newLinkedHashMap();
15
16  @Override
17  protected void doAssert(IAssert<?> a) {
18    onBeforeAssert(a);
19    try {
20      a.doAssert();
21      onAssertSuccess(a);
22    } catch (AssertionError ex) {
23      onAssertFailure(a, ex);
24      m_errors.put(ex, a);
25    } finally {
26      onAfterAssert(a);
27    }
28  }
29
30  public void assertAll() {
31    if (!m_errors.isEmpty()) {
32      StringBuilder sb = new StringBuilder("The following asserts failed:");
33      boolean first = true;
34      for (Map.Entry<AssertionError, IAssert<?>> ae : m_errors.entrySet()) {
35        if (first) {
36          first = false;
37        } else {
38          sb.append(",");
39        }
40        sb.append("\n\t");
41        sb.append(ae.getKey().getMessage());
42      }
43      throw new AssertionError(sb.toString());
44    }
45  }
46}
47