    1   /*
    2    * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
    3    *
    4    * This software is open source.
    5    * See the bottom of this file for the licence.
    6    */
    7
    8   package org.dom4j.dtd;
    9
    10  import junit.textui.TestRunner;
    11
    12  import org.dom4j.AbstractTestCase;
    13
    14  /***
    15   * Tests the {@link AttributeDecl}functionality. Tests each of the property
    16   * access methods and the serialization mechanisms. Correct parsing is tested by
    17   * {@link DocTypeTest}.
    18   *
    19   * <p>
    20   * There are several key variations that need to be tested both here and in
    21   * {@link DocTypeTest}, which is responsible for testing correct parsing of the
    22   * {@link DocumentType}. Those variations include the different
    23   * <code>valueDefault</code> and <code>value</code> variations so that we
    24   * can test for correct acceptance and correct rejection of attribute
    25   * declarations.
    26   * </p>
    27   *
    28   * <p>
    29   * </p>
    30   *
    31   * @author Bryan Thompson
    32   * @author Maarten Coene
    33   * @version $Revision: 1.3 $
    34   *
    35   * @todo The dom4j documentation needs to describe what representation SHOULD be
    36   *       generated by {@link AttributeDecl#toString()}.
    37   * @todo The dom4j AttributeDecl should expose some methods that make it easier
    38   *       for people to use the DTD grammar, e.g., isFixed(), isRequired(),
    39   *       isImplied().
    40   */
    41  public class AttributeDeclTest extends AbstractTestCase {
    42      public static void main(String[] args) {
    43          TestRunner.run(AttributeDeclTest.class);
    44      }
    45
    46      // Test case(s)
    47      // -------------------------------------------------------------------------
    48
    49      /***
    50       * Test
    51       *
    52       * <pre>
    53       *
    54       *  &lt;!ATTLIST foo bar ID #IMPLIED&gt;
    55       *
    56       * </pre>.
    57       */
    58      public void testIdImpliedNone() {
    59          MyTestAttributeDecl decl = new MyTestAttributeDecl("foo", // elementName
    60                  "bar", // attributeName
    61                  "ID", // type
    62                  "#IMPLIED", // valueDefault
    63                  null, // value
    64                  "<!ATTLIST foo bar ID #IMPLIED>");
    65          assertSameAttributeDecl(decl, new AttributeDecl("foo", "bar", "ID",
    66                  "#IMPLIED", null));
    67      }
    68
    69      /***
    70       * Test
    71       *
    72       * <pre>
    73       *
    74       *  &lt;!ATTLIST foo bar CDATA #FIXED \&quot;goo\&quot;&gt;
    75       *
    76       * </pre>.
    77       */
    78      public void testCDataFixedValue() {
    79          MyTestAttributeDecl decl = new MyTestAttributeDecl("foo", // elementName
    80                  "bar", // attributeName
    81                  "CDATA", // type
    82                  "#FIXED", // valueDefault
    83                  "goo", // value
    84                  "<!ATTLIST foo bar CDATA #FIXED \"goo\">");
    85          assertSameAttributeDecl(decl, new AttributeDecl("foo", "bar", "CDATA",
    86                  "#FIXED", "goo"));
    87      }
    88
    89      /***
    90       * Test
    91       *
    92       * <pre>
    93       *
    94       *  &lt;!ATTLIST foo bar CDATA &quot;goo&quot;&gt;
    95       *
    96       * </pre>.
    97       */
    98      public void testCDataNoneValue() {
    99          MyTestAttributeDecl decl = new MyTestAttributeDecl("foo", // elementName
    100                 "bar", // attributeName
    101                 "CDATA", // type
    102                 null, // valueDefault
    103                 "goo", // value
    104                 "<!ATTLIST foo bar CDATA \"goo\">");
    105         assertSameAttributeDecl(decl, new AttributeDecl("foo", "bar", "CDATA",
    106                 null, "goo"));
    107     }
    108
    109     // Implementation methods
    110     // -------------------------------------------------------------------------
    111     protected void assertSameAttributeDecl(MyTestAttributeDecl expected,
    112             AttributeDecl actual) {
    113         assertEquals("elementName is correct", expected.getElementName(),
    114                 actual.getElementName());
    115
    116         assertEquals("attributeName is correct", expected.getAttributeName(),
    117                 actual.getAttributeName());
    118
    119         assertEquals("type is correct", expected.getType(), actual.getType());
    120
    121         assertEquals("valueDefault is correct", expected.getValueDefault(),
    122                 actual.getValueDefault());
    123
    124         assertEquals("toString() is correct", expected.getText(), actual
    125                 .toString());
    126     }
    127
    128     /***
    129      * Helper is useful since we are trying to exhaustively test the ATTLIST
    130      * variations and their correct serialization.
    131      */
    132     protected static class MyTestAttributeDecl {
    133         private String elName;
    134
    135         private String attName;
    136
    137         private String declType;
    138
    139         private String defaultValue;
    140
    141         private String declValue;
    142
    143         private String txt;
    144
    145         /***
    146          * DOCUMENT ME!
    147          *
    148          * @param elementName
    149          *            The name of the element whose attribute is being
    150          *            described.
    151          * @param attributeName
    152          *            The name of the attribute.
    153          * @param type
    154          *            The type of the declared attribute, e.g., CDATA, ID,
    155          *            IDREF, IDREFS, ENTITY, ENTITIES, NMTOKEN, NKTOKENS
    156          * @param valueDefault
    157          *            The type of default that applies for this attribute
    158          *            declaration, e.g., #REQUIRED, #IMPLIED, #FIXED (in which
    159          *            case the <i>value </i> MUST be non- <code>null</code>
    160          *            and specifies the fixed value for the attribute, or
    161          *            <code>null</code> if no valueDefault was specified in
    162          *            the attribute declaration (in which case the <i>value </i>
    163          *            MUST be non- <code>null</code> and specifies the default
    164          *            value for the attribute).
    165          * @param value
    166          *            The value of the attribute assigned in the attribute
    167          *            declaration -or- <code>null</code> if no value was
    168          *            provided in the attribute declaration. The value MUST be
    169          *            <code>null</code> unless the <i>valueDefault </i> is
    170          *            either "#FIXED" or <code>null</code>.
    171          * @param text
    172          *            The text representation of the attribute declaration,
    173          *            e.g., <code>&lt;!ATTLIST foo id ID #IMPLIED&gt;</code>.
    174          *
    175          * @todo The constructor and properties in {@link AttributeDecl}should
    176          *       have some similar javadoc so that people more easily understand
    177          *       the interaction and difference between the <i>valueDefault </i>
    178          *       and <i>value </i> properties. The constructor SHOULD be clear
    179          *       about whether and when the <code>valueDefault</code> and
    180          *       <code>value</code> properties MUST be <code>null</code>.
    181          */
    182         public MyTestAttributeDecl(String elementName, String attributeName,
    183                 String type, String valueDefault, String value, String text) {
    184             elName = elementName;
    185
    186             attName = attributeName;
    187
    188             declType = type;
    189
    190             defaultValue = valueDefault;
    191
    192             declValue = value;
    193
    194             txt = text;
    195         }
    196
    197         public String getElementName() {
    198             return elName;
    199         }
    200
    201         public String getAttributeName() {
    202             return attName;
    203         }
    204
    205         public String getType() {
    206             return declType;
    207         }
    208
    209         public String getValueDefault() {
    210             return defaultValue;
    211         }
    212
    213         public String getValue() {
    214             return declValue;
    215         }
    216
    217         public String getText() {
    218             return txt;
    219         }
    220     } // Class TestAttributeDecl
    221 }
    222
    223 /*
    224  * Redistribution and use of this software and associated documentation
    225  * ("Software"), with or without modification, are permitted provided that the
    226  * following conditions are met:
    227  *
    228  * 1. Redistributions of source code must retain copyright statements and
    229  * notices. Redistributions must also contain a copy of this document.
    230  *
    231  * 2. Redistributions in binary form must reproduce the above copyright notice,
    232  * this list of conditions and the following disclaimer in the documentation
    233  * and/or other materials provided with the distribution.
    234  *
    235  * 3. The name "DOM4J" must not be used to endorse or promote products derived
    236  * from this Software without prior written permission of MetaStuff, Ltd. For
    237  * written permission, please contact dom4j-info@metastuff.com.
    238  *
    239  * 4. Products derived from this Software may not be called "DOM4J" nor may
    240  * "DOM4J" appear in their names without prior written permission of MetaStuff,
    241  * Ltd. DOM4J is a registered trademark of MetaStuff, Ltd.
    242  *
    243  * 5. Due credit should be given to the DOM4J Project - http://www.dom4j.org
    244  *
    245  * THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND
    246  * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    247  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    248  * ARE DISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE
    249  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    250  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    251  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    252  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    253  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    254  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    255  * POSSIBILITY OF SUCH DAMAGE.
    256  *
    257  * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
    258  */