package org.teachingextensions.approvals.lite; import java.awt.Component; import java.awt.image.BufferedImage; import java.util.Arrays; import org.teachingextensions.approvals.lite.ReporterFactory.FileTypes; import org.teachingextensions.approvals.lite.namer.ApprovalNamer; import org.teachingextensions.approvals.lite.namer.JUnitStackTraceNamer; import org.teachingextensions.approvals.lite.util.ArrayUtils; import org.teachingextensions.approvals.lite.util.ObjectUtils; import org.teachingextensions.approvals.lite.util.StringUtils; import org.teachingextensions.approvals.lite.util.lambda.Function1; import org.teachingextensions.approvals.lite.writers.ApprovalTextWriter; import org.teachingextensions.approvals.lite.writers.ComponentApprovalWriter; import org.teachingextensions.approvals.lite.writers.ImageApprovalWriter; /** * Approvals allows you to unit test complex objects <br><br> * * -- Create a Golden Master file (approved) <br> * -- Verify against your result file (received) <br> * -- Download BeyondCompare to view the two files <br> */ public class Approvals { /** * Verifies the output file (received) against a Golden Master file (approved)<br/> * If there is no GoldenMaster, then the test will fail * <div><b>Example:</b> {@code Approvals.verify(response)}</div> * * @param response * The string to be verified */ public static void verify(String response) throws Exception { verify(new ApprovalTextWriter(response, "txt"), FileTypes.Text); } public static <T> void verifyAll(String header, T[] values) { Approvals.verifyAll(header, Arrays.asList(values)); } public static <T> void verifyAll(String header, Iterable<T> values) { Approvals.verifyAll(header, values, new Function1<T, String>() { @Override public String call(T i) { return i + ""; } }); } public static <T> void verifyAll(String header, T[] values, Function1<T, String> f1) { verifyAll(header, Arrays.asList(values), f1); } public static <T> void verifyAll(String header, Iterable<T> array, Function1<T, String> f1) { String text = formatHeader(header) + ArrayUtils.toString(array, f1); verify(new ApprovalTextWriter(text, "txt"), FileTypes.Text); } private static String formatHeader(String header) { return StringUtils.isEmpty(header) ? "" : header + "\r\n\r\n\r\n"; } public static void verifyHtml(String response) throws Exception { verify(new ApprovalTextWriter(response, "html"), FileTypes.Html); } /** * Verifies the output file (received) against a Golden Master file (approved) <br/> * If there is no GoldenMaster, then the test will fail * <div><b>Example:</b> {@code Approvals.verify(component)}</div> * * @param component * The component to be verified */ public static void verify(Component component) { Approvals.verify(new ComponentApprovalWriter(component), FileTypes.Image); } public static void verify(BufferedImage bufferedImage) { verify(new ImageApprovalWriter(bufferedImage), FileTypes.Image); } public static void verify(ApprovalWriter writer, ApprovalNamer namer, ApprovalFailureReporter reporter) { verify(new FileApprover(writer, namer), reporter); } public static void verify(ApprovalWriter writer, String fileType) { verify(writer, createApprovalNamer(), ReporterFactory.get(fileType)); } public static void verify(FileApprover approver, ApprovalFailureReporter reporter) { try { if (!approver.approve()) { boolean passed = false; if (reporter instanceof ApprovalFailureOverrider) { passed = approver.askToChangeReceivedToApproved((ApprovalFailureOverrider) reporter); } if (!passed) { approver.reportFailure(reporter); approver.fail(); } else { approver.cleanUpAfterSuccess(reporter); } } else { approver.cleanUpAfterSuccess(reporter); } } catch (Exception e) { throw ObjectUtils.throwAsError(e); } } public static ApprovalNamer createApprovalNamer() { return new JUnitStackTraceNamer(); } /** * Verifies the output file (received) against a Golden Master file (approved)<br/> * If there is no GoldenMaster, then the test will fail * <div><b>Example:</b> {@code Approvals.verify(object)}</div> * * @param response * The object to be verified <br/> * NOTE: the object will be returned as a String */ public static void verify(Object o) throws Exception { Approvals.verify(o + ""); } }