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;
9   
10  import junit.textui.TestRunner;
11  
12  import java.util.Iterator;
13  import java.util.List;
14  
15  /***
16   * A test harness to test the content API in DOM4J
17   * 
18   * @author <a href="mailto:james.strachan@metastuff.com">James Strachan </a>
19   * @version $Revision: 1.3 $
20   */
21  public class ContentTest extends AbstractTestCase {
22      protected DocumentFactory factory = new DocumentFactory();
23  
24      public static void main(String[] args) {
25          TestRunner.run(ContentTest.class);
26      }
27  
28      // Test case(s)
29      // -------------------------------------------------------------------------
30      public void testRoot() throws Exception {
31          Element root = document.getRootElement();
32          assertTrue("Has root element", root != null);
33  
34          List authors = root.elements("author");
35          assertTrue("Root has children", (authors != null)
36                  && (authors.size() == 2));
37  
38          Element author1 = (Element) authors.get(0);
39          Element author2 = (Element) authors.get(1);
40  
41          assertTrue("Author1 is James", author1.attributeValue("name").equals(
42                  "James"));
43          assertTrue("Author2 is Bob", author2.attributeValue("name").equals(
44                  "Bob"));
45  
46          testGetAttributes(author1);
47          testGetAttributes(author2);
48      }
49  
50      public void testContent() throws Exception {
51          Element root = document.getRootElement();
52          assertTrue("Has root element", root != null);
53  
54          List content = root.content();
55          assertTrue("Root has content", (content != null)
56                  && (content.size() >= 2));
57  
58          boolean iterated = false;
59  
60          for (Iterator iter = content.iterator(); iter.hasNext();) {
61              Object object = iter.next();
62              assertTrue("Content object is a node", object instanceof Node);
63              iterated = true;
64          }
65  
66          assertTrue("Iteration completed", iterated);
67      }
68  
69      public void testGetNode() throws Exception {
70          Element root = document.getRootElement();
71          assertTrue("Has root element", root != null);
72  
73          int count = root.nodeCount();
74          assertTrue("Root has correct node count", count == 2);
75  
76          boolean iterated = false;
77  
78          for (int i = 0; i < count; i++) {
79              Node node = root.node(i);
80              assertTrue("Valid node returned from node()", node != null);
81              iterated = true;
82          }
83  
84          assertTrue("Iteration completed", iterated);
85      }
86  
87      public void testGetXPathNode() throws Exception {
88          Element root = document.getRootElement();
89          assertTrue("Has root element", root != null);
90  
91          int count = root.nodeCount();
92          assertTrue("Root has correct node count", count == 2);
93  
94          boolean iterated = false;
95  
96          for (int i = 0; i < count; i++) {
97              Node node = root.getXPathResult(i);
98              assertTrue("Valid node returned from node()", node != null);
99              assertTrue("Node supports the parent relationship", node
100                     .supportsParent());
101             iterated = true;
102         }
103 
104         assertTrue("Iteration completed", iterated);
105     }
106 
107     public void testOrderOfPI() throws Exception {
108         Document document = factory.createDocument();
109         document.addProcessingInstruction("xml-stylesheet",
110                 "type=\"text/xsl\" href=\"...\"");
111         document.addElement("root");
112 
113         List list = document.content();
114 
115         assertNotNull(list);
116         assertEquals(2, list.size());
117 
118         Object pi = list.get(0);
119         Object root = list.get(1);
120 
121         assertTrue("First element is not a PI",
122                 pi instanceof ProcessingInstruction);
123         assertTrue("Second element is an element", root instanceof Element);
124 
125         String xml = "<?xml version=\"1.0\" ?>\n"
126                 + "<?xml-stylesheet type=\"text/xsl\" href=\"foo\" ?>\n"
127                 + "<root/>";
128         document = DocumentHelper.parseText(xml);
129 
130         list = document.content();
131 
132         assertNotNull(list);
133         assertEquals(2, list.size());
134         pi = list.get(0);
135         root = list.get(1);
136 
137         assertTrue("First element is not a PI",
138                 pi instanceof ProcessingInstruction);
139         assertTrue("Second element is an element", root instanceof Element);
140     }
141 
142     public void testAddingInTheMiddle() throws Exception {
143         Document doc = factory.createDocument();
144         Element root = doc.addElement("html");
145         Element header = root.addElement("header");
146         Element footer = root.addElement("footer");
147 
148         // now lets add <foo> in between header & footer
149         List list = root.content();
150         Element foo = factory.createElement("foo");
151         list.add(1, foo);
152 
153         // assertions
154         assertTrue(list.size() == 3);
155         assertTrue(list.get(0) == header);
156         assertTrue(list.get(1) == foo);
157         assertTrue(list.get(2) == footer);
158     }
159 
160     public void testAddAtIndex() throws Exception {
161         Document doc = factory.createDocument();
162         Element root = doc.addElement("html");
163         Element header = root.addElement("header");
164         Element body = root.addElement("body");
165 
166         Element foo = factory.createElement("foo");
167         Element bar = factory.createElement("bar");
168 
169         List content = header.content();
170         content.add(0, foo);
171         content.add(0, bar);
172 
173         assertEquals("foo", header.node(1).getName());
174         assertEquals("bar", header.node(0).getName());
175 
176         foo = factory.createElement("foo");
177         bar = factory.createElement("bar");
178 
179         content = body.content();
180         content.add(0, foo);
181         content.add(1, bar);
182 
183         assertEquals("foo", body.node(0).getName());
184         assertEquals("bar", body.node(1).getName());
185     }
186 
187     public void testAddAtIndex2() throws Exception {
188         Document doc = factory.createDocument();
189         Element parent = doc.addElement("parent");
190         Element child = parent.addElement("child");
191         Element anotherChild = factory.createElement("child2");
192 
193         List elements = parent.elements();
194         int index = elements.indexOf(child);
195 
196         assertEquals(0, index);
197 
198         elements.add(1, anotherChild);
199         elements = parent.elements();
200         assertEquals(child, elements.get(0));
201         assertEquals(anotherChild, elements.get(1));
202     }
203 
204     // Implementation methods
205     // -------------------------------------------------------------------------
206     protected void testGetAttributes(Element author) throws Exception {
207         String definedName = "name";
208         String undefinedName = "undefined-attribute-name";
209         String defaultValue = "** Default Value **";
210 
211         String value = author.attributeValue(definedName, defaultValue);
212         assertTrue("Defined value doesn't return specified default value",
213                 value != defaultValue);
214 
215         value = author.attributeValue(undefinedName, defaultValue);
216         assertTrue("Undefined value returns specified default value",
217                 value == defaultValue);
218     }
219 }
220 
221 /*
222  * Redistribution and use of this software and associated documentation
223  * ("Software"), with or without modification, are permitted provided that the
224  * following conditions are met:
225  * 
226  * 1. Redistributions of source code must retain copyright statements and
227  * notices. Redistributions must also contain a copy of this document.
228  * 
229  * 2. Redistributions in binary form must reproduce the above copyright notice,
230  * this list of conditions and the following disclaimer in the documentation
231  * and/or other materials provided with the distribution.
232  * 
233  * 3. The name "DOM4J" must not be used to endorse or promote products derived
234  * from this Software without prior written permission of MetaStuff, Ltd. For
235  * written permission, please contact dom4j-info@metastuff.com.
236  * 
237  * 4. Products derived from this Software may not be called "DOM4J" nor may
238  * "DOM4J" appear in their names without prior written permission of MetaStuff,
239  * Ltd. DOM4J is a registered trademark of MetaStuff, Ltd.
240  * 
241  * 5. Due credit should be given to the DOM4J Project - http://www.dom4j.org
242  * 
243  * THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND
244  * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
245  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
246  * ARE DISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE
247  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
248  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
249  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
250  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
251  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
252  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
253  * POSSIBILITY OF SUCH DAMAGE.
254  * 
255  * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
256  */