Sponsored Link •
|
Advertisement
|
This page shows the complete listing of class com.artima.examples.reporter.xml.ex1.XMLReporter
, which is
described in the article, "Create an XML Reporter for your Unit Tests":
http://www.artima.com/suiterunner/xmlreporter.html
/* * Copyright (C) 2001-2003 Artima Software, Inc. All rights reserved. * Licensed under the Open Software License version 1.0. * * A copy of the Open Software License version 1.0 is available at: * http://www.artima.com/suiterunner/osl10.html * * This software consists of voluntary contributions made by many * individuals on behalf of Artima Software, Inc. For more * information on Artima Software, Inc., please see: * http://www.artima.com/ */ package com.artima.examples.reporter.xml.ex1; import org.suiterunner.Reporter; import org.suiterunner.Runner; import org.suiterunner.Report; import java.io.*; import java.text.MessageFormat; import java.util.*; /** * A <code>Reporter</code> that formats test results as * XML and prints to the standard output stream. * * <p>An <code>XMLReporter</code> is constructed with a default * configuration that reports everything. In other words, * an <code>XMLReporter</code> in its default configuration will * behave as if a <code>Set</code> containing the following configuration * characters was passed to <code>setConfiguration</code>: * * <UL> * <LI><code>Reporter.PRESENT_RUN_STARTING</code> * <LI><code>Reporter.PRESENT_TEST_STARTING</code> * <LI><code>Reporter.PRESENT_TEST_SUCCEEDED</code> * <LI><code>Reporter.PRESENT_TEST_FAILED</code> * <LI><code>Reporter.PRESENT_SUITE_STARTING</code> * <LI><code>Reporter.PRESENT_SUITE_COMPLETED</code> * <LI><code>Reporter.PRESENT_SUITE_ABORTED</code> * <LI><code>Reporter.PRESENT_INFO_PROVIDED</code> * <LI><code>Reporter.PRESENT_RUN_STOPPED</code> * <LI><code>Reporter.PRESENT_RUN_ABORTED</code> * <LI><code>Reporter.PRESENT_RUN_COMPLETED</code> * </UL> * * This default configuration can be changed by invoking <code>setConfiguration</code> * on the <code>XMLReporter</code>, passing in a different set of configuration * characters. * * The XML Schema of the XML documents produced by this reporter is: * * <PRE> * <?xml version="1.0"?> * <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> * <xsd:element name="name" type="xsd:string"/> * <xsd:element name="message" type="xsd:string"/> * <xsd:element name="date" type="xsd:string"/> * <xsd:element name="source" type="xsd:string"/> * <xsd:element name="thread" type="xsd:string"/> * <xsd:element name="throwable" type="xsd:string"/> * </xsd:schema> * </PRE> * * @author Bill Venners */ public class XMLReporter implements Reporter { // A PrintWriter that wraps the standard output private PrintWriter pw; // A Set that holds this Reporter's current configuration private Set configuration; // A Set that contains all valid configuration characters, which // are defined in interface Reporter. private Set validConfigChars; /** * Construct an <code>XMLReporter</code>, which writes test results * in XML to the standard output stream. The <code>XMLReporter</code> is * created with a default configuration that includes all valid configuration * characters. */ public XMLReporter() { pw = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(System.out))); // Build a set that contains all valid configuration characters Set validSet = new HashSet(); validSet.add(Reporter.PRESENT_INFO_PROVIDED); validSet.add(Reporter.PRESENT_RUN_ABORTED); validSet.add(Reporter.PRESENT_RUN_COMPLETED); validSet.add(Reporter.PRESENT_RUN_STARTING); validSet.add(Reporter.PRESENT_RUN_STOPPED); validSet.add(Reporter.PRESENT_SUITE_ABORTED); validSet.add(Reporter.PRESENT_SUITE_COMPLETED); validSet.add(Reporter.PRESENT_SUITE_STARTING); validSet.add(Reporter.PRESENT_TEST_FAILED); validSet.add(Reporter.PRESENT_TEST_STARTING); validSet.add(Reporter.PRESENT_TEST_SUCCEEDED); validConfigChars = Collections.unmodifiableSet(validSet); // Initialize configuration to validConfigChars, because the default // configuration for this Reporter is defined to be everything. (See // the JavaDoc comment for the entire class.) configuration = new HashSet(validConfigChars); } /** * Prints information indicating that a run with an expected <code>testCount</code> * number of tests is starting, if * the current configuration includes <code>Reporter.PRESENT_RUN_STARTING</code>. * If <code>Reporter.PRESENT_RUN_STARTING</code> is not included in the the * current configuration, this method prints nothing. * * @param testCount the number of tests expected during this run. * * @exception IllegalArgumentException if <code>testCount</code> is less than zero. */ public void runStarting(int testCount) { if (testCount < 0) { throw new IllegalArgumentException(); } if (configuration.contains(Reporter.PRESENT_RUN_STARTING)) { pw.println("<?xml version=\"1.0\"?>"); pw.println("<run>"); } } /** * Prints information extracted from the specified <code>Report</code> * about a test about to be run, if * the current configuration includes <code>Reporter.PRESENT_TEST_STARTING</code>. * If <code>Reporter.PRESENT_TEST_STARTING</code> is not included in the the * current configuration, this method prints nothing. * * @param report a <code>Report</code> that encapsulates the test starting event to report. * * @exception NullPointerException if <code>report</code> reference is <code>null</code> */ public synchronized void testStarting(Report report) { if (report == null) { throw new NullPointerException("Parameter report is null."); } if (configuration.contains(Reporter.PRESENT_TEST_STARTING)) { String stringToReport = "<testStarting>\n"; stringToReport += printReport(report); stringToReport += "</testStarting>"; pw.println(stringToReport); } } /** * Prints information extracted from the specified <code>Report</code> * about a test that succeeded, if * the current configuration includes <code>Reporter.PRESENT_TEST_SUCCEEDED</code>. * If <code>Reporter.PRESENT_TEST_SUCCEEDED</code> is not included in the the * current configuration, this method prints nothing. * * @param report a <code>Report</code> that encapsulates the test succeeded event to report. * * @exception NullPointerException if <code>report</code> reference is <code>null</code> */ public synchronized void testSucceeded(Report report) { if (report == null) { throw new NullPointerException("Parameter report is null."); } if (configuration.contains(Reporter.PRESENT_TEST_SUCCEEDED)) { String stringToReport = "<testSucceeded>\n"; stringToReport += printReport(report); stringToReport += "</testSucceeded>"; pw.println(stringToReport); } } /** * Prints information extracted from the specified <code>Report</code> * about a test that failed, if * the current configuration includes <code>Reporter.PRESENT_TEST_FAILED</code>. * If <code>Reporter.PRESENT_TEST_FAILED</code> is not included in the the * current configuration, this method prints nothing. * * @param report a <code>Report</code> that encapsulates the test failed event to report. * * @exception NullPointerException if <code>report</code> reference is <code>null</code> */ public synchronized void testFailed(Report report) { if (report == null) { throw new NullPointerException("Parameter report is null."); } if (configuration.contains(Reporter.PRESENT_TEST_FAILED)) { String stringToReport = "<testFailed>\n"; stringToReport += printReport(report); stringToReport += "</testFailed>"; pw.println(stringToReport); } } /** * Prints information extracted from the specified <code>Report</code>, if * the current configuration includes <code>Reporter.PRESENT_INFO_PROVIDED</code>. * If <code>Reporter.PRESENT_INFO_PROVIDED</code> is not included in the the * current configuration, this method prints nothing. * * @param report a <code>Report</code> that encapsulates the event to report. * * @exception NullPointerException if <code>report</code> reference is <code>null</code> */ public synchronized void infoProvided(Report report) { if (report == null) { throw new NullPointerException("Parameter report is null."); } if (configuration.contains(Reporter.PRESENT_INFO_PROVIDED)) { String stringToReport = "<infoProvided>\n"; stringToReport += printReport(report); stringToReport += "</infoProvided>"; pw.println(stringToReport); } } /** * Prints information indicating a suite of tests is about to start executing, if * the current configuration includes <code>Reporter.PRESENT_SUITE_STARTING</code>. * If <code>Reporter.PRESENT_SUITE_STARTING</code> is not included in the the * current configuration, this method prints nothing. * * @param report a <code>Report</code> that encapsulates the suite starting event to report. * * @exception NullPointerException if <code>report</code> reference is <code>null</code> */ public void suiteStarting(Report report) { if (report == null) { throw new NullPointerException("Parameter report is null."); } if (configuration.contains(Reporter.PRESENT_SUITE_STARTING)) { String stringToReport = "<suiteStarting>\n"; stringToReport += printReport(report); stringToReport += "</suiteStarting>"; pw.println(stringToReport); } } /** * Prints information indicating a suite of tests has completed executing, if * the current configuration includes <code>Reporter.PRESENT_SUITE_COMPLETED</code>. * If <code>Reporter.PRESENT_SUITE_COMPLETED</code> is not included in the the * current configuration, this method prints nothing. * * @param report a <code>Report</code> that encapsulates the suite completed event to report. * @exception NullPointerException if <code>report</code> reference is <code>null</code> */ public synchronized void suiteCompleted(Report report) { if (report == null) { throw new NullPointerException("Parameter report is null."); } if (configuration.contains(Reporter.PRESENT_SUITE_COMPLETED)) { String stringToReport = "<suiteCompleted>\n"; stringToReport += printReport(report); stringToReport += "</suiteCompleted>"; pw.println(stringToReport); } } /** * Prints information indicating the execution of a suite of tests has aborted prior to completion, if * the current configuration includes <code>Reporter.PRESENT_SUITE_ABORTED</code>. * If <code>Reporter.PRESENT_SUITE_ABORTED</code> is not included in the the * current configuration, this method prints nothing. * * @param report a <code>Report</code> that encapsulates the suite aborted event to report. * @exception NullPointerException if <code>report</code> reference is <code>null</code> */ public synchronized void suiteAborted(Report report) { if (report == null) { throw new NullPointerException("Parameter report is null."); } if (configuration.contains(Reporter.PRESENT_SUITE_ABORTED)) { String stringToReport = "<suiteAborted>\n"; stringToReport += printReport(report); stringToReport += "</suiteAborted>"; pw.println(stringToReport); } } /** * Prints information indicating a runner has stopped running a suite of tests prior to completion, if * the current configuration includes <code>Reporter.PRESENT_RUN_STOPPED</code>. * If <code>Reporter.PRESENT_RUN_STOPPED</code> is not included in the the * current configuration, this method prints nothing. */ public synchronized void runStopped() { if (configuration.contains(Reporter.PRESENT_RUN_STOPPED)) { String stringToReport = "<runStopped/>\n"; stringToReport += "</run>"; pw.println(stringToReport); pw.flush(); } } /** * Prints information indicating a run has aborted prior to completion, if * the current configuration includes <code>Reporter.PRESENT_RUN_ABORTED</code>. * If <code>Reporter.PRESENT_RUN_ABORTED</code> is not included in the the * current configuration, this method prints nothing. * * @param report a <code>Report</code> that encapsulates the suite aborted event to report. * @exception NullPointerException if <code>report</code> reference is <code>null</code> */ public synchronized void runAborted(Report report) { if (report == null) { throw new NullPointerException("Parameter report is null."); } if (configuration.contains(Reporter.PRESENT_RUN_ABORTED)) { String stringToReport = "<runAborted>\n"; stringToReport += printReport(report); stringToReport += "<runAborted/>\n"; stringToReport += "</run>"; pw.println(stringToReport); pw.flush(); } } /** * Configures this <code>XMLReporter</code>. If the specified <code>configuration</code> * set is zero size, the <code>XMLReporter</code> will be configured to its * default configuration. (The default configuration is described in the main * comment for class <code>XMLReporter</code>.) * * @param configuration set of <code>Config</code> objects that indicate the new * configuration for this <code>XMLReporter</code> * * @exception NullPointerException if <code>configuration</code> reference is <code>null</code> * @exception IllegalArgumentException if <code>configuration</code> set contains any objects * whose class isn't <code>org.suiterunner.Config</code> */ public synchronized void setConfiguration(Set configs) { if (configs == null) { throw new NullPointerException("Parameter configs is null."); } for (Iterator it = configs.iterator(); it.hasNext();) { Object o = it.next(); if (!(o instanceof Character)) { throw new IllegalArgumentException("Passed object is not a Character."); } if (!validConfigChars.contains(o)) { throw new IllegalArgumentException("Passed object is not a valid configuration Character."); } } if (configs.size() == 0) { // If passsed Set is empty, reset this Reporter to its default // configuration, which is to report everything. this.configuration = new HashSet(validConfigChars); } else { this.configuration = new HashSet(configs); } } /** * Prints information indicating a run has completed, if * the current configuration includes <code>Reporter.PRESENT_RUN_COMPLETED</code>. * If <code>Reporter.PRESENT_RUN_COMPLETED</code> is not included in the the * current configuration, this method prints nothing. */ public synchronized void runCompleted() { if (configuration.contains(Reporter.PRESENT_RUN_COMPLETED)) { pw.println("</run>"); pw.flush(); } } /** * Does nothing, because this object holds no finite non-memory resources. */ public void dispose() { } /* * Replace &, <, >, ", and ', in passed raw String with their * XML entity representation. */ private String insertEntities(String raw) { if (raw == null) { throw new NullPointerException("Parameter raw is null."); } StringBuffer buf = new StringBuffer(); for (int i = 0; i < raw.length(); ++i) { char c = raw.charAt(i); if (c == '&') { buf.append("&"); } else if (c == '<') { buf.append("<"); } else if (c == '>') { buf.append(">"); } else if (c == '"') { buf.append("""); } else if (c == '\'') { buf.append("'"); } else { buf.append(c); } } return buf.toString(); } /* * Print a Report to the standard output. */ private String printReport(Report report) { if (report == null) { throw new NullPointerException("Parameter report is null."); } String name = insertEntities(report.getName()); String message = insertEntities(report.getMessage()); String dateString = insertEntities(report.getDate().toString()); String sourceName = insertEntities(report.getSource().toString()); String threadName = insertEntities((report.getThread()).getName()); Throwable throwable = report.getThrowable(); String reportString = " <name>" + name + "</name>\n"; reportString += " <message>" + message + "</message>\n"; reportString += " <date>" + dateString + "</date>\n"; reportString += " <source>" + sourceName + "</source>\n"; reportString += " <thread>" + threadName + "</thread>\n"; if (throwable != null) { CharArrayWriter caw = new CharArrayWriter(); PrintWriter capw = new PrintWriter(caw); throwable.printStackTrace(capw); capw.close(); String stackTrace = caw.toString(); reportString += " <throwable>\n"; reportString += " " + insertEntities(stackTrace); reportString += " </throwable>\n"; } return reportString; } }
Sponsored Links
|