You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by js...@apache.org on 2002/12/04 17:09:12 UTC

cvs commit: jakarta-commons-sandbox/jelly/src/java/org/apache/commons/jelly/tags/junit AssertThrowsTag.java JUnitTagLibrary.java AssertThrownTag.java

jstrachan    2002/12/04 08:09:12

  Modified:    jelly/src/test/org/apache/commons/jelly/junit suite.jelly
               jelly/src/java/org/apache/commons/jelly/tags/junit
                        JUnitTagLibrary.java
  Added:       jelly/src/java/org/apache/commons/jelly/tags/junit
                        AssertThrowsTag.java
  Removed:     jelly/src/java/org/apache/commons/jelly/tags/junit
                        AssertThrownTag.java
  Log:
  Applied patch suggested by Dominique Devienne and agreed by Knut Wannheden, to use assertThrows instead of assertThrown as the tag name for JellyUnit testing for exceptions
  
  Revision  Changes    Path
  1.9       +15 -15    jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/junit/suite.jelly
  
  Index: suite.jelly
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/junit/suite.jelly,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- suite.jelly	28 Nov 2002 13:16:08 -0000	1.8
  +++ suite.jelly	4 Dec 2002 16:09:12 -0000	1.9
  @@ -52,44 +52,44 @@
     </test:case>
   
   
  -  <test:case name="assertThrownTests">
  +  <test:case name="assertThrowsTests">
   
       <!-- test using var attribute -->
  -    <test:assertThrown var="ex">
  +    <test:assertThrows var="ex">
         <test:fail message="This exeption should be exported"/>
  -    </test:assertThrown>
  +    </test:assertThrows>
       <test:assert test="${ex != null}">No exception exported</test:assert>
   
       <!-- test using superclass of expected throwable -->
  -    <test:assertThrown expected="java.lang.Exception">
  +    <test:assertThrows expected="java.lang.Exception">
         <test:fail message="This should always fail"/>
  -    </test:assertThrown>
  +    </test:assertThrows>
   
       <!-- test using non exception class -->
  -    <test:assertThrown expected="java.lang.Class">
  +    <test:assertThrows expected="java.lang.Class">
         <test:fail message="This should always fail"/>
  -    </test:assertThrown>
  +    </test:assertThrows>
   
       <!-- test using undefined class -->
  -    <test:assertThrown expected="java.lang.ClassNotFoundException">
  -			<test:assertThrown expected="foo.bar.Baz">
  +    <test:assertThrows expected="java.lang.ClassNotFoundException">
  +			<test:assertThrows expected="foo.bar.Baz">
   				<test:fail message="This should always fail"/>
  -			</test:assertThrown>
  -		</test:assertThrown>
  +			</test:assertThrows>
  +		</test:assertThrows>
   
       <!-- test using other exception class -->
       <j:catch var="ex">
  -      <test:assertThrown expected="java.io.IOException">
  +      <test:assertThrows expected="java.io.IOException">
           <test:fail message="This should always fail"/>
  -      </test:assertThrown>
  +      </test:assertThrows>
       </j:catch>
       
   		<test:assert test="${ex != null}">We should have created an exception</test:assert>
   
       <!-- test with no exception from body -->
       <j:catch var="ex">
  -      <test:assertThrown>
  -      </test:assertThrown>
  +      <test:assertThrows>
  +      </test:assertThrows>
       </j:catch>
       
   		<test:assert test="${ex != null}">We should have created an exception</test:assert>
  
  
  
  1.8       +1 -1      jakarta-commons-sandbox/jelly/src/java/org/apache/commons/jelly/tags/junit/JUnitTagLibrary.java
  
  Index: JUnitTagLibrary.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/jelly/src/java/org/apache/commons/jelly/tags/junit/JUnitTagLibrary.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- JUnitTagLibrary.java	28 Nov 2002 13:16:08 -0000	1.7
  +++ JUnitTagLibrary.java	4 Dec 2002 16:09:12 -0000	1.8
  @@ -90,7 +90,7 @@
       public JUnitTagLibrary() {
           registerTag("assert", AssertTag.class);
           registerTag("assertEquals", AssertEqualsTag.class);
  -    	registerTag("assertThrown", AssertThrownTag.class);
  +    	registerTag("assertThrows", AssertThrowsTag.class);
           registerTag("fail", FailTag.class);
           registerTag("run", RunTag.class );
           registerTag("case", CaseTag.class );
  
  
  
  1.1                  jakarta-commons-sandbox/jelly/src/java/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;
  	}
  }
  
  
  

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