You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by di...@apache.org on 2003/01/19 07:03:12 UTC

cvs commit: jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/tags/junit AssertEqualsTag.java RunTag.java AssertThrowsTag.java JellyTestSuite.java JUnitTagLibrary.java package.html AssertTagSupport.java AssertTag.java SuiteTag.java FailTag.java CaseTag.java JellyAssertionFailedError.java

dion        2003/01/18 22:03:12

  Added:       jelly/src/test/org/apache/commons/jelly/tags/junit
                        AssertEqualsTag.java RunTag.java
                        AssertThrowsTag.java JellyTestSuite.java
                        JUnitTagLibrary.java package.html
                        AssertTagSupport.java AssertTag.java SuiteTag.java
                        FailTag.java CaseTag.java
                        JellyAssertionFailedError.java
  Log:
  Copy current junit tags into test source tree for use in core testing
  
  Revision  Changes    Path
  1.1                  jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/tags/junit/AssertEqualsTag.java
  
  Index: AssertEqualsTag.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/tags/junit/AssertEqualsTag.java,v 1.1 2003/01/19 06:03:12 dion Exp $
   * $Revision: 1.1 $
   * $Date: 2003/01/19 06:03:12 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   * 
   * $Id: AssertEqualsTag.java,v 1.1 2003/01/19 06:03:12 dion Exp $
   */
  package org.apache.commons.jelly.tags.junit;
  
  import org.apache.commons.jelly.XMLOutput;
  import org.apache.commons.jelly.expression.Expression;
  
  /** 
   * Compares an actual object against an expected object and if they are different
   * then the test will fail.
   *
   * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
   * @version $Revision: 1.1 $
   */
  public class AssertEqualsTag extends AssertTagSupport {
  
      private Expression actual;
      private Expression expected;
      
  
      // Tag interface
      //------------------------------------------------------------------------- 
      public void doTag(XMLOutput output) throws Exception {
          String message = getBodyText();
  
          Object expectedValue = expected.evaluate(context);                    
          Object actualValue = actual.evaluate(context);                    
          
          if (expectedValue == null && actualValue == null) {
              return;
          }
          if (actualValue != null && expectedValue.equals(actualValue)) {            
              return;
          }
  
          String expressions = "\nExpected expression: " 
              + expected.getExpressionText() 
              + "\nActual expression: " 
              + actual.getExpressionText();
          
          failNotEquals(message, expectedValue, actualValue, expressions);
      }
      
      // Properties
      //-------------------------------------------------------------------------                
      
      /** 
       * Sets the actual value which will be compared against the 
       * expected value.
       */
      public void setActual(Expression actual) {
          this.actual = actual;
      }
      
      /**
       * Sets the expected value to be tested against
       */
      public void setExpected(Expression expected) {
          this.expected = expected;
      }
  }
  
  
  
  1.1                  jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/tags/junit/RunTag.java
  
  Index: RunTag.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/tags/junit/RunTag.java,v 1.1 2003/01/19 06:03:12 dion Exp $
   * $Revision: 1.1 $
   * $Date: 2003/01/19 06:03:12 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   * 
   * $Id: RunTag.java,v 1.1 2003/01/19 06:03:12 dion Exp $
   */
  package org.apache.commons.jelly.tags.junit;
  
  import java.io.PrintWriter;
  import java.io.StringWriter;
  
  import junit.framework.AssertionFailedError;
  import junit.framework.Test;
  import junit.framework.TestListener;
  import junit.framework.TestResult;
  
  import org.apache.commons.jelly.MissingAttributeException;
  import org.apache.commons.jelly.TagSupport;
  import org.apache.commons.jelly.XMLOutput;
  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;
  import org.xml.sax.SAXException;
  import org.xml.sax.helpers.AttributesImpl;
  
  /** 
   * This tag will run the given Test which could be an individual TestCase or a TestSuite.
   * The TestResult can be specified to capture the output, otherwise the results are output
   * as XML so that they can be formatted in some custom manner.
   *
   * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
   * @version $Revision: 1.1 $
   */
  public class RunTag extends TagSupport {
  
      /** The Log to which logging calls will be made. */
      private static final Log log = LogFactory.getLog(RunTag.class);
      
      private Test test;
      private TestResult result;
      private TestListener listener;
      
      // Tag interface
      //------------------------------------------------------------------------- 
      public void doTag(XMLOutput output) throws Exception {
          Test test = getTest();
          if ( test == null ) {
              test = (Test) context.getVariable("org.apache.commons.jelly.junit.suite");        
          }
          if ( test == null ) {
              throw new MissingAttributeException( "test" );
          }
          TestResult result = getResult();
          if ( result == null ) {
              result = createResult(output);                    
          }
          TestListener listener = getListener();
          if ( listener == null ) {
              listener = createTestListener(output);
          }
          result.addListener(listener);
          test.run(result);
      }
      
      // Properties
      //-------------------------------------------------------------------------                
  
      /**
       * Returns the TestResult used to capture the output of the test.
       * @return TestResult
       */
      public TestResult getResult() {
          return result;
      }
  
      /**
       * Returns the Test to be ran.
       * @return Test
       */
      public Test getTest() {
          return test;
      }
  
      /**
       * Sets the JUnit TestResult used to capture the results of the tst
       * @param result The TestResult to use
       */
      public void setResult(TestResult result) {
          this.result = result;
      }
  
      /**
       * Sets the JUnit Test to run which could be an individual test or a TestSuite
       * @param test The test to run
       */
      public void setTest(Test test) {
          this.test = test;
      }
  
      /**
       * Returns the listener.
       * @return TestListener
       */
      public TestListener getListener() {
          return listener;
      }
  
      /**
       * Sets the TestListener.to be used to format the output of running the unit test cases
       * @param listener The listener to set
       */
      public void setListener(TestListener listener) {
          this.listener = listener;
      }
  
  
  
      // Implementation methods
      //-------------------------------------------------------------------------                
  
      /**
       * Factory method to create a new TestResult to capture the output of
       * the test cases
       */
      protected TestResult createResult(XMLOutput output) {
          return new TestResult();
      }
      
      /**
       * Factory method to create a new TestListener to capture the output of
       * the test cases
       */    
      protected TestListener createTestListener(final XMLOutput output) {
          return new TestListener() {
              public void addError(Test test, Throwable t) {
                  try {
                      output.startElement("error");
      
                      output.startElement("message");
                      output.write(t.getMessage());
                      output.endElement("message");
      
                      output.startElement("stack");
                      output.write( stackTraceToString(t) );
                      output.endElement("stack");
      
                      output.endElement("error");
                  }
                  catch (SAXException e) {
                      handleSAXException(e);
                  }
              }
              
              public void addFailure(Test test, AssertionFailedError t) {
                  try {
                      output.startElement("failure");
      
                      output.startElement("message");
                      output.write(t.getMessage());
                      output.endElement("message");
      
                      output.startElement("stack");
                      output.write( stackTraceToString(t) );
                      output.endElement("stack");
      
                      output.endElement("failure");
                  }
                  catch (SAXException e) {
                      handleSAXException(e);
                  }
              }
              
              public void endTest(Test test) {
                  try {
                      output.endElement("test");
                  }
                  catch (SAXException e) {
                      handleSAXException(e);
                  }
              }
              
              public void startTest(Test test) {
                  try {
                      String name = test.toString();
                      AttributesImpl attributes = new AttributesImpl();
                      attributes.addAttribute("", "name", "name", "CDATA", name);
                      
                      output.startElement("test", attributes);
                  }
                  catch (SAXException e) {
                      handleSAXException(e);
                  }
              }
          };
      }
  
      /**
       * @return the stack trace as a String
       */
      protected String stackTraceToString(Throwable t) {
          StringWriter writer = new StringWriter();
          t.printStackTrace(new PrintWriter(writer));
          return writer.toString();
      }
      
      /**
       * Handles SAX Exceptions
       */
      protected void handleSAXException(SAXException e) {
          log.error( "Caught: " + e, e );
      }
  }
  
  
  
  1.1                  jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/tags/junit/AssertThrowsTag.java
  
  Index: AssertThrowsTag.java
  ===================================================================
  /*
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.commons.jelly.tags.junit;
  
  import org.apache.commons.jelly.JellyException;
  import org.apache.commons.jelly.XMLOutput;
  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;
  
  /**
   * Runs its body and asserts that an exception is thrown by it.  If no
   * exception is thrown the tag fails.  By default all exceptions are caught.
   * If however <code>expected</code> was specified the body must throw
   * an exception of the given class, otherwise the assertion fails.  The
   * exception thrown by the body can also be of any subtype of the specified
   * exception class.  The optional <code>var</code> attribute can be specified if
   * the caught exception is to be exported to a variable.
   */
  public class AssertThrowsTag extends AssertTagSupport {
  
  	/** The Log to which logging calls will be made. */
  	private static final Log log = LogFactory.getLog(AssertThrowsTag.class);
  
  	/**
  	 * The variable name to export the caught exception to.
  	 */
  	private String var;
  
  	/**
  	 * The class name (fully qualified) of the exception expected to be thrown
  	 * by the body.  Also a superclass of the expected exception can be given.
  	 */
  	private String expected;
  
      /**
       * Sets the ClassLoader to be used when loading an exception class
     */
      private ClassLoader classLoader;
      
  	// Tag interface
  	//-------------------------------------------------------------------------
  	public void doTag(XMLOutput output) throws Exception {
  		Class throwableClass = getThrowableClass();
  
  		try {
  			invokeBody(output);
  		} 
          catch (Throwable t) {
              if (t instanceof JellyException) {
                  // unwrap Jelly exceptions which wrap other exceptions
                  JellyException je = (JellyException) t;
                  if (je.getCause() != null) {
                      t = je.getCause();
                  }
              }
  			if (var != null) {
  				context.setVariable(var, t);
  			}
  			if (throwableClass != null && !throwableClass.isAssignableFrom(t.getClass())) {
  				fail("Unexpected exception: " + t);
  			} 
              else {
  				return;
  			}
  		}
  		fail("No exception was thrown.");
  	}
  
  	// Properties
  	//-------------------------------------------------------------------------
  	/**
  	 * Sets the class name of exception expected to be thrown by the body.  The
  	 * class name must be fully qualified and can either be the expected
  	 * exception class itself or any supertype of it, but must be a subtype of
  	 * <code>java.lang.Throwable</code>.
  	 */
  	public void setExpected(String expected) {
  		this.expected = expected;
  	}
  
  	/**
  	 * Sets the variable name to define for this expression.
  	 */
  	public void setVar(String var) {
  		this.var = var;
  	}
  
      /**
       * Sets the class loader to be used to load the exception type
     */
      public void setClassLoader(ClassLoader classLoader) {
          this.classLoader = classLoader;
      }
      
      public ClassLoader getClassLoader() {
          if (classLoader == null) {
              return getClass().getClassLoader();
          }
          return classLoader;
      }
      
  	// Implementation methods
  	//-------------------------------------------------------------------------
  
  	/**
  	 * Returns the <code>Class</code> corresponding to the class
  	 * specified by <code>expected</code>. If
  	 * <code>expected</code> was either not specified then <code>java. lang.
  	 * Throwable</code> is returned.
       * Otherwise if the class couldn't be
       * found or doesn't denote an exception class then an exception is thrown. 
  	 * 
  	 * @return Class The class of the exception to expect
  	 */
  	protected Class getThrowableClass() throws ClassNotFoundException {
  		if (expected == null) {
  			return Throwable.class;
  		}
  
  		Class throwableClass = null;
  		try {
  			throwableClass = getClassLoader().loadClass(expected);
          }
          catch (ClassNotFoundException e) {
              try {
                  throwableClass = Thread.currentThread().getContextClassLoader().loadClass(expected);
              }
              catch (ClassNotFoundException e2) {
                  log.warn( "Could not find exception class: " + expected );
                  throw e;
              }
          }
              
  		if (!Throwable.class.isAssignableFrom(throwableClass)) {
  			log.warn( "The class: " + expected + " is not an Exception class.");
  			return null;
  		}
  		return throwableClass;
  	}
  }
  
  
  
  1.1                  jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/tags/junit/JellyTestSuite.java
  
  Index: JellyTestSuite.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/tags/junit/JellyTestSuite.java,v 1.1 2003/01/19 06:03:12 dion Exp $
   * $Revision: 1.1 $
   * $Date: 2003/01/19 06:03:12 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   * 
   * $Id: JellyTestSuite.java,v 1.1 2003/01/19 06:03:12 dion Exp $
   */
  package org.apache.commons.jelly.tags.junit;
  
  import java.net.URL;
  
  import junit.framework.TestSuite;
  
  import org.apache.commons.jelly.JellyContext;
  import org.apache.commons.jelly.XMLOutput;
  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;
  
  /** 
   * An abstract base class for creating a TestSuite via a Jelly script.
   *
   * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
   * @version $Revision: 1.1 $
   */
  public abstract class JellyTestSuite {
  
      /** The Log to which logging calls will be made. */
      private static final Log log = LogFactory.getLog(JellyTestSuite.class);
  
  
      /**
       * Helper method to create a test suite from a file name on the class path
       * in the package of the given class. 
       * For example a test could call 
       * <code>
       * createTestSuite( Foo.class, "suite.jelly" );
       * </code>
       * which would loaad the 'suite.jelly script from the same package as the Foo 
       * class on the classpath.
       * 
       * @param testClass is the test class used to load the script via the classpath
       * @param script is the name of the script, which is typically just a name, no directory.
       * @return a newly created TestSuite
       */
      public static TestSuite createTestSuite(Class testClass, String script) throws Exception {
          URL url = testClass.getResource(script);
          if ( url == null ) {
              throw new Exception( 
                  "Could not find Jelly script: " + script 
                  + " in package of class: " + testClass.getName() 
              );
          }
          return createTestSuite( url );
      }
          
      /**
       * Helper method to create a test suite from the given Jelly script
       * 
       * @param script is the URL to the script which should create a TestSuite
       * @return a newly created TestSuite
       */
      public static TestSuite createTestSuite(URL script) throws Exception {
          JellyContext context = new JellyContext(script);
          XMLOutput output = XMLOutput.createXMLOutput(System.out);
          context = context.runScript(script, output);
          TestSuite answer = (TestSuite) context.getVariable("org.apache.commons.jelly.junit.suite");
          if ( answer == null ) {
              log.warn( "Could not find a TestSuite created by Jelly for the script:" + script );
              // return an empty test suite
              return new TestSuite();
          }
          return answer;
      }
  }
  
  
  
  1.1                  jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/tags/junit/JUnitTagLibrary.java
  
  Index: JUnitTagLibrary.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/tags/junit/JUnitTagLibrary.java,v 1.1 2003/01/19 06:03:12 dion Exp $
   * $Revision: 1.1 $
   * $Date: 2003/01/19 06:03:12 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   * 
   * $Id: JUnitTagLibrary.java,v 1.1 2003/01/19 06:03:12 dion Exp $
   */
  package org.apache.commons.jelly.tags.junit;
  
  import org.apache.commons.jelly.TagLibrary;
  
  import org.apache.commons.jelly.JellyException;
  import org.apache.commons.jelly.TagLibrary;
  import org.apache.commons.jelly.expression.Expression;
  import org.apache.commons.jelly.expression.ExpressionFactory;
  import org.apache.commons.jelly.impl.TagScript;
  import org.apache.commons.jelly.expression.xpath.XPathExpression;
  
  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;
  
  import org.jaxen.JaxenException;
  
  /** Describes the Taglib. This class could be generated by XDoclet
    *
    * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
    * @version $Revision: 1.1 $
    */
  public class JUnitTagLibrary extends TagLibrary {
  
      /** The Log to which logging calls will be made. */
      private Log log = LogFactory.getLog(JUnitTagLibrary.class);
      
      public JUnitTagLibrary() {
          registerTag("assert", AssertTag.class);
          registerTag("assertEquals", AssertEqualsTag.class);
      	registerTag("assertThrows", AssertThrowsTag.class);
          registerTag("fail", FailTag.class);
          registerTag("run", RunTag.class );
          registerTag("case", CaseTag.class );
          registerTag("suite", SuiteTag.class );
      }
  
      public Expression createExpression(
          ExpressionFactory factory,
          TagScript tagScript,
          String attributeName,
          String attributeValue) throws Exception {
  
          // #### may need to include some namespace URI information in the XPath instance?
          
          if (attributeName.equals("xpath")) {            
              if ( log.isDebugEnabled() ) {
                  log.debug( "Parsing XPath expression: " + attributeValue );
              }
              
              try {
                  // XPath xpath = new Dom4jXPath(attributeValue);
                  Expression xpathExpr = super.createExpression( factory,
                                                                 tagScript,
                                                                 attributeName,
                                                                 attributeValue );
  
                  return new XPathExpression(attributeValue, xpathExpr, tagScript);
              }
              catch (JaxenException e) {
                  throw new JellyException( "Could not parse XPath expression: \"" + attributeValue + "\" reason: " + e, e );            
              }            
          }
          
          // will use the default expression instead
          return super.createExpression(factory, tagScript, attributeName, attributeValue);
      }
  }
  
  
  
  1.1                  jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/tags/junit/package.html
  
  Index: package.html
  ===================================================================
  <html>
  <head>
  </head>
  <body>
  
    <p>A collection of <a href="http://www.junit.org">JUnit</a> tags for 
    	performing unit tests written in Jelly script.
    </p>
    
    <p>
      The &lt;suite&gt; tag allows a test suite to be created and then test cases can either 
      be individually ran or the whole suite ran.
    </p>
    <p>
      The &lt;case&gt; tag allows a single test case to be created as part of a suite.
    </p>
    <p>
      The &lt;run&gt; tag can be used to run a given Test, TestCase or TestSuite
    </p>
    
    <p>There is an example of these tags in action 
  	<a href="http://cvs.apache.org/viewcvs.cgi/jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/junit/suite.jelly?rev=HEAD&content-type=text/vnd.viewcvs-markup">here</a>
    </p>
  </body>
  </html>
  
  
  
  1.1                  jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/tags/junit/AssertTagSupport.java
  
  Index: AssertTagSupport.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/tags/junit/AssertTagSupport.java,v 1.1 2003/01/19 06:03:12 dion Exp $
   * $Revision: 1.1 $
   * $Date: 2003/01/19 06:03:12 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   * 
   * $Id: AssertTagSupport.java,v 1.1 2003/01/19 06:03:12 dion Exp $
   */
  package org.apache.commons.jelly.tags.junit;
  
  import org.apache.commons.jelly.xpath.XPathTagSupport;
  
  /** 
   * The abstract base class of any assertion tag which is
   * useful for implementation inheritence.
   * 
   * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
   * @version $Revision: 1.1 $
   */
  public abstract class AssertTagSupport extends XPathTagSupport {
  
      public AssertTagSupport() {
      }
  
      // Implementation methods
      //-------------------------------------------------------------------------                
      
      /**
       * Produces a failure assertion with the given message 
       */
      protected void fail(String message) throws JellyAssertionFailedError {
          throw new JellyAssertionFailedError(message);
      }
      
      /**
       * Produces a failure assertion with the given message and added detail.
       */
      protected void fail(String message, String detail) throws JellyAssertionFailedError {
          if (message == null || message.length() == 0) {
              fail(detail);
          }
          else {
              fail(message + ". Assertion failed while " + detail);
          }
      }
      
      /**
       * Produces a failure if the actual value was not equal to the expected value
       */
      protected void failNotEquals(String message, Object expected, Object actual, String expressions) throws JellyAssertionFailedError {
          String formatted= "";
          if (message != null) {
              formatted = message +" ";
          }
          fail(formatted + "expected:[" + expected + "] but was:[" + actual + "]" + expressions);
      }
      
  }
  
  
  
  1.1                  jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/tags/junit/AssertTag.java
  
  Index: AssertTag.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/tags/junit/AssertTag.java,v 1.1 2003/01/19 06:03:12 dion Exp $
   * $Revision: 1.1 $
   * $Date: 2003/01/19 06:03:12 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   * 
   * $Id: AssertTag.java,v 1.1 2003/01/19 06:03:12 dion Exp $
   */
  package org.apache.commons.jelly.tags.junit;
  
  import org.apache.commons.jelly.XMLOutput;
  import org.apache.commons.jelly.MissingAttributeException;
  import org.apache.commons.jelly.expression.Expression;
  
  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;
  
  
  import org.jaxen.XPath;
  
  /** 
   * Performs an assertion that a given boolean expression, or XPath expression is
   * true. If the expression returns false then this test fails.
   *
   * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
   * @version $Revision: 1.1 $
   */
  public class AssertTag extends AssertTagSupport {
  
      /** The Log to which logging calls will be made. */
      private static final Log log = LogFactory.getLog(AssertTag.class);
      
      /** The expression to evaluate. */
      private Expression test;
      
      /** The XPath expression to evaluate */
      private XPath xpath;
  
      public AssertTag() {
      }
  
      // Tag interface
      //------------------------------------------------------------------------- 
      public void doTag(XMLOutput output) throws Exception {
          if (test == null && xpath == null) {
              throw new MissingAttributeException( "test" );
          }
          if (test != null) {
              if (! test.evaluateAsBoolean(context)) {
                  fail( getBodyText(), "evaluating test: "+ test.getExpressionText() );
              }
          }
          else {
              Object xpathContext = getXPathContext();
              if (! xpath.booleanValueOf(xpathContext)) {
                  fail( getBodyText(), "evaluating xpath: "+ xpath );
              }
          }
  
      }
      
      // Properties
      //-------------------------------------------------------------------------                
  
      /** 
       * Sets the boolean expression to evaluate. If this expression returns true
       * then the test succeeds otherwise if it returns false then the text will
       * fail with the content of the tag being the error message.
       */
      public void setTest(Expression test) {
          this.test = test;
      }
  
      /** 
       * Sets the boolean XPath expression to evaluate. If this expression returns true
       * then the test succeeds otherwise if it returns false then the text will
       * fail with the content of the tag being the error message.
       */
      public void setXpath(XPath xpath) {
          this.xpath = xpath;
      }
  }
  
  
  
  1.1                  jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/tags/junit/SuiteTag.java
  
  Index: SuiteTag.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/tags/junit/SuiteTag.java,v 1.1 2003/01/19 06:03:12 dion Exp $
   * $Revision: 1.1 $
   * $Date: 2003/01/19 06:03:12 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   * 
   * $Id: SuiteTag.java,v 1.1 2003/01/19 06:03:12 dion Exp $
   */
  package org.apache.commons.jelly.tags.junit;
  
  import junit.framework.Test;
  import junit.framework.TestSuite;
  
  import org.apache.commons.jelly.TagSupport;
  import org.apache.commons.jelly.XMLOutput;
  
  /** 
   * Represents a collection of TestCases.. This tag is analagous to
   * JUnit's TestSuite class.
   *
   * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
   * @version $Revision: 1.1 $
   */
  public class SuiteTag extends TagSupport {
  
      /** the test suite this tag created */
      private TestSuite suite;
      
      /** the name of the variable of the test suite */
      private String var;
      
      /** the name of the test suite to create */
      private String name;
  
      public SuiteTag() {
      }
      
      /**
       * Adds a new Test to this suite
       */
      public void addTest(Test test) {
          getSuite().addTest(test);
      }    
      
      // Tag interface
      //------------------------------------------------------------------------- 
      public void doTag(XMLOutput output) throws Exception {
          suite = createSuite();
          
          TestSuite parent = (TestSuite) context.getVariable("org.apache.commons.jelly.junit.suite");        
          if ( parent == null ) {
              context.setVariable("org.apache.commons.jelly.junit.suite", suite );
          }
          else {
              parent.addTest( suite );
          }
  
          invokeBody(output);
          
          if ( var != null ) {
              context.setVariable(var, suite);
          }            
      }
      
      // Properties
      //-------------------------------------------------------------------------                
      public TestSuite getSuite() {
          return suite;
      }
      
      /**
       * Sets the name of the test suite whichi is exported
       */
      public void setVar(String var) {
          this.var = var;
      }
      
      /**
       * @return the name of this test suite
       */
      public String getName() {
          return name;
      }
      
      /** 
       * Sets the name of this test suite
       */
      public void setName(String name) {
          this.name = name;
      }
      
      // Implementation methods
      //-------------------------------------------------------------------------                
      
      /**
       * Factory method to create a new TestSuite
       */
      protected TestSuite createSuite() {
          if ( name == null ) {
              return new TestSuite();
          }
          else {
              return new TestSuite(name);
          }
      }
  }
  
  
  
  1.1                  jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/tags/junit/FailTag.java
  
  Index: FailTag.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/tags/junit/FailTag.java,v 1.1 2003/01/19 06:03:12 dion Exp $
   * $Revision: 1.1 $
   * $Date: 2003/01/19 06:03:12 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   * 
   * $Id: FailTag.java,v 1.1 2003/01/19 06:03:12 dion Exp $
   */
  package org.apache.commons.jelly.tags.junit;
  
  import org.apache.commons.jelly.XMLOutput;
  
  /** 
   * This tag causes a failure message. The message can either
   * be specified in the tags body or via the message attribute.
   *
   * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
   * @version $Revision: 1.1 $
   */
  public class FailTag extends AssertTagSupport {
  
      private String message;
  
      public FailTag() {
      }
  
      // Tag interface
      //------------------------------------------------------------------------- 
      public void doTag(XMLOutput output) throws Exception {
          String message = getMessage();
          if ( message == null ) {
              message = getBodyText();
          }
          fail( message );
      }
      
      // Properties
      //-------------------------------------------------------------------------                
  
      /**
       * @return the failure message
       */
      public String getMessage() {
          return message;
      }
      
      
      /** 
       * Sets the failure message. If this attribute is not specified then the
       * body of this tag will be used instead.
       */
      public void setMessage(String message) {
          this.message = message;
      }
  }
  
  
  
  1.1                  jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/tags/junit/CaseTag.java
  
  Index: CaseTag.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/tags/junit/CaseTag.java,v 1.1 2003/01/19 06:03:12 dion Exp $
   * $Revision: 1.1 $
   * $Date: 2003/01/19 06:03:12 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   * 
   * $Id: CaseTag.java,v 1.1 2003/01/19 06:03:12 dion Exp $
   */
  package org.apache.commons.jelly.tags.junit;
  
  import junit.framework.TestCase;
  import junit.framework.TestSuite;
  
  import org.apache.commons.jelly.JellyContext;
  import org.apache.commons.jelly.JellyException;
  import org.apache.commons.jelly.TagSupport;
  import org.apache.commons.jelly.XMLOutput;
  
  /** 
   * Represents a single test case in a test suite; this tag is analagous to
   * JUnit's TestCase class.
   *
   * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
   * @version $Revision: 1.1 $
   */
  public class CaseTag extends TagSupport {
  
      private String name;
      
      
      // Tag interface
      //------------------------------------------------------------------------- 
      public void doTag(final XMLOutput output) throws Exception {
          String name = getName();
          if ( name == null ) {
              name = toString();
          }
          
          // #### we need to redirect the output to a TestListener
          // or something?
          TestCase testCase = new TestCase(name) {
              protected void runTest() throws Throwable {
                  // create a new child context so that each test case
                  // will have its own variable scopes
                  JellyContext newContext = new JellyContext( context );
                  
                  // disable inheritence of variables and tag libraries
                  newContext.setExportLibraries(false);
                  newContext.setExport(false);
                  
                  // invoke the test case
                  getBody().run(newContext, output);
              }
          };
          
          // lets find the test suite
          TestSuite suite = getSuite();
          if ( suite == null ) {
              throw new JellyException( "Could not find a TestSuite to add this test to. This tag should be inside a <test:suite> tag" );
          }
          suite.addTest(testCase);
      }
      
      // Properties
      //-------------------------------------------------------------------------                
  
      /**
       * @return the name of this test case
       */
      public String getName() {
          return name;
      }
      
      /** 
       * Sets the name of this test case
       */
      public void setName(String name) {
          this.name = name;
      }
      
      // Implementation methods
      //-------------------------------------------------------------------------                
  
      /**
       * Strategy method to find the corrent TestSuite to add a new Test case to
       */
      protected TestSuite getSuite() {
          SuiteTag tag = (SuiteTag) findAncestorWithClass( SuiteTag.class );
          if ( tag != null ) {
              return tag.getSuite();
          }
          return (TestSuite) context.getVariable( "org.apache.commons.jelly.junit.suite" );
      }
  
  }
  
  
  
  1.1                  jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/tags/junit/JellyAssertionFailedError.java
  
  Index: JellyAssertionFailedError.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/tags/junit/JellyAssertionFailedError.java,v 1.1 2003/01/19 06:03:12 dion Exp $
   * $Revision: 1.1 $
   * $Date: 2003/01/19 06:03:12 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   * 
   * $Id: JellyAssertionFailedError.java,v 1.1 2003/01/19 06:03:12 dion Exp $
   */
  
  package org.apache.commons.jelly.tags.junit;
  
  import java.io.PrintStream;
  import java.io.PrintWriter;
  
  import junit.framework.AssertionFailedError;
  
  import org.apache.commons.jelly.LocationAware;
  
  /** 
   * <p><code>JellyAssertionFailedError</code> is 
   * a JUnit AssertionFailedError which is LocationAware so that it can include
   * details of where in the JellyUnit test case that the failure occurred.</p>
   *
   * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
   * @version $Revision: 1.1 $
   */
  
  public class JellyAssertionFailedError extends AssertionFailedError implements LocationAware {
      
      /** the underlying cause of the exception */
      private Throwable cause;
  
      /** the Jelly file which caused the problem */
      private String fileName;
  
      /** the tag name which caused the problem */
      private String elementName;
  
      /** the line number in the script of the error */
      private int lineNumber = -1;
      
      /** the column number in the script of the error */
      private int columnNumber = -1;
      
      public JellyAssertionFailedError() {
      }
  
      public JellyAssertionFailedError(String message) {
          super(message);
      }
  
      public JellyAssertionFailedError(String message, Throwable cause) {
          super(message);
          this.cause = cause;
      }
      
      public JellyAssertionFailedError(Throwable cause) {
          super(cause.getLocalizedMessage());
          this.cause = cause;
      }
      
      public Throwable getCause() {
          return cause;
      }
  
      
      /** 
       * @return the line number of the tag 
       */
      public int getLineNumber() {
          return lineNumber;
      }
      
      /** 
       * Sets the line number of the tag 
       */
      public void setLineNumber(int lineNumber) {
          this.lineNumber = lineNumber;
      }
  
      /** 
       * @return the column number of the tag 
       */
      public int getColumnNumber() {
          return columnNumber;
      }
      
      /** 
       * Sets the column number of the tag 
       */
      public void setColumnNumber(int columnNumber) {
          this.columnNumber = columnNumber;
      }
  
      /** 
       * @return the Jelly file which caused the problem 
       */
      public String getFileName() {
          return fileName;
      }
  
      /** 
       * Sets the Jelly file which caused the problem 
       */
      public void setFileName(String fileName) {
          this.fileName = fileName;
      }
      
  
      /** 
       * @return the element name which caused the problem
       */
      public String getElementName() {
          return elementName;
      }
  
      /** 
       * Sets the element name which caused the problem
       */
      public void setElementName(String elementName) {
          this.elementName = elementName;
      }
      
      
      public String getMessage() {
          return super.getMessage() + " File: " + fileName + " At tag <" + elementName + ">: line: " 
              + lineNumber + " column: " + columnNumber;
      }
  
      public String getReason() {
          return super.getMessage();
      }
  
      // #### overload the printStackTrace methods...
      public void printStackTrace(PrintWriter s) { 
          synchronized (s) {
              super.printStackTrace(s);
              if  (cause != null) {
                  s.println("Root cause");
                  cause.printStackTrace(s);
              }
          }
      }
          
      public void printStackTrace(PrintStream s) {
          synchronized (s) {
              super.printStackTrace(s);
              if  (cause != null) {
                  s.println("Root cause");
                  cause.printStackTrace(s);
              }
          }
      }
  
  	public void printStackTrace() {
  		super.printStackTrace();
  		if (cause != null) {
  			System.out.println("Root cause");
  			cause.printStackTrace();
  		}
  	}
  }
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>