package org.testory.plumbing; import static java.lang.String.join; import static org.testory.plumbing.PlumbingException.check; import static org.testory.plumbing.Stubbing.stubbing; import static org.testory.plumbing.history.FilteredHistory.filter; import org.testory.common.Chain; import org.testory.common.Formatter; import org.testory.common.Nullable; import org.testory.plumbing.history.FilteredHistory; import org.testory.plumbing.history.History; import org.testory.proxy.Handler; import org.testory.proxy.Invocation; import org.testory.proxy.InvocationMatcher; public class QuietFormatter extends Formatter { private int isFormatting = 0; private QuietFormatter() {} public static QuietFormatter quietFormatter() { return new QuietFormatter(); } public String format(@Nullable Object object) { isFormatting++; try { if (object instanceof Invocation) { return format((Invocation) object); } else { return super.format(object); } } finally { isFormatting--; } } private String format(Invocation invocation) { return String.format("%s.%s(%s)", format(invocation.instance), invocation.method.getName(), join(", ", formatSequence(invocation.arguments))); } public History quiet(final History history) { check(history != null); final Stubbing stubbingToString = stubbingToString(history); return new History() { public Chain<Object> get() { return isFormatting == 0 ? history.get() : history.get().add(stubbingToString); } public History add(Object event) { if (isFormatting == 0) { history.add(event); } return this; } }; } private static Stubbing stubbingToString(History history) { final FilteredHistory<Mocking> mockingHistory = filter(Mocking.class, history); return stubbing(new InvocationMatcher() { public boolean matches(Invocation invocation) { return invocation.method.getName().equals("toString") && invocation.method.getParameterTypes().length == 0; } }, new Handler() { public Object handle(Invocation invocation) { for (Mocking mocking : mockingHistory.get()) { if (mocking.mock == invocation.instance) { return mocking.name; } } return "unknownMock"; } }); } }