    1   /*
    2    * Copyright 2002,2004 The Apache Software Foundation.
    3    *
    4    * Licensed under the Apache License, Version 2.0 (the "License");
    5    * you may not use this file except in compliance with the License.
    6    * You may obtain a copy of the License at
    7    *
    8    *      http://www.apache.org/licenses/LICENSE-2.0
    9    *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  package org.apache.commons.jelly.tags.junit;
    17
    18  import junit.framework.TestCase;
    19  import junit.framework.TestSuite;
    20
    21  import org.apache.commons.jelly.JellyContext;
    22  import org.apache.commons.jelly.JellyTagException;
    23  import org.apache.commons.jelly.TagSupport;
    24  import org.apache.commons.jelly.XMLOutput;
    25
    26  /***
    27   * Represents a single test case in a test suite; this tag is analagous to
    28   * JUnit's TestCase class.
    29   *
    30   * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
    31   * @version $Revision: 155420 $
    32   */
    33  public class CaseTag extends TagSupport {
    34
    35      private String name;
    36
    37
    38      // Tag interface
    39      //-------------------------------------------------------------------------
    40      public void doTag(final XMLOutput output) throws JellyTagException {
    41          String name = getName();
    42          if ( name == null ) {
    43              name = toString();
    44          }
    45
    46          // #### we need to redirect the output to a TestListener
    47          // or something?
    48          TestCase testCase = new TestCase(name) {
    49              protected void runTest() throws Throwable {
    50                  // create a new child context so that each test case
    51                  // will have its own variable scopes
    52                  JellyContext newContext = new JellyContext( context );
    53
    54                  // disable inheritence of variables and tag libraries
    55                  newContext.setExportLibraries(false);
    56                  newContext.setExport(false);
    57
    58                  // invoke the test case
    59                  getBody().run(newContext, output);
    60              }
    61          };
    62
    63          // lets find the test suite
    64          TestSuite suite = getSuite();
    65          if ( suite == null ) {
    66              throw new JellyTagException( "Could not find a TestSuite to add this test to. This tag should be inside a <test:suite> tag" );
    67          }
    68          suite.addTest(testCase);
    69      }
    70
    71      // Properties
    72      //-------------------------------------------------------------------------
    73
    74      /***
    75       * @return the name of this test case
    76       */
    77      public String getName() {
    78          return name;
    79      }
    80
    81      /***
    82       * Sets the name of this test case
    83       */
    84      public void setName(String name) {
    85          this.name = name;
    86      }
    87
    88      // Implementation methods
    89      //-------------------------------------------------------------------------
    90
    91      /***
    92       * Strategy method to find the corrent TestSuite to add a new Test case to
    93       */
    94      protected TestSuite getSuite() {
    95          SuiteTag tag = (SuiteTag) findAncestorWithClass( SuiteTag.class );
    96          if ( tag != null ) {
    97              return tag.getSuite();
    98          }
    99          return (TestSuite) context.getVariable( "org.apache.commons.jelly.junit.suite" );
    100     }
    101
    102 }