001package org.junit.experimental.theories.internal;
002
003import java.util.Arrays;
004import java.util.Collection;
005import java.util.Iterator;
006
007public class ParameterizedAssertionError extends AssertionError {
008    private static final long serialVersionUID = 1L;
009
010    public ParameterizedAssertionError(Throwable targetException,
011            String methodName, Object... params) {
012        super(String.format("%s(%s)", methodName, join(", ", params)));
013        this.initCause(targetException);
014    }
015
016    @Override
017    public boolean equals(Object obj) {
018        return obj instanceof ParameterizedAssertionError && toString().equals(obj.toString());
019    }
020
021    @Override
022    public int hashCode() {
023        return toString().hashCode();
024    }
025
026    public static String join(String delimiter, Object... params) {
027        return join(delimiter, Arrays.asList(params));
028    }
029
030    public static String join(String delimiter, Collection<Object> values) {
031        StringBuilder sb = new StringBuilder();
032        Iterator<Object> iter = values.iterator();
033        while (iter.hasNext()) {
034            Object next = iter.next();
035            sb.append(stringValueOf(next));
036            if (iter.hasNext()) {
037                sb.append(delimiter);
038            }
039        }
040        return sb.toString();
041    }
042
043    private static String stringValueOf(Object next) {
044        try {
045            return String.valueOf(next);
046        } catch (Throwable e) {
047            return "[toString failed]";
048        }
049    }
050}