1   /*
2    * Copyright (C) The DNA Group. All rights reserved.
3    *
4    * This software is published under the terms of the DNA
5    * Software License version 1.1, a copy of which has been included
6    * with this distribution in the LICENSE.txt file.
7    */
8   package org.codehaus.dna.impl;
9   
10  import java.lang.reflect.Proxy;
11  import junit.framework.TestCase;
12  
13  import org.codehaus.dna.impl.DefaultConfiguration;
14  import org.codehaus.dna.impl.SAXConfigurationSerializer;
15  import org.xml.sax.ContentHandler;
16  import org.xml.sax.helpers.AttributesImpl;
17  
18  public class SAXConfigurationSerializerTestCase
19      extends TestCase
20  {
21      public void testSerializeZeroLengthAttributes()
22          throws Exception
23      {
24          final DefaultConfiguration configuration = new DefaultConfiguration( "element", "", "" );
25          final SAXConfigurationSerializer serializer = new SAXConfigurationSerializer();
26          final AttributesImpl attributes = serializer.serializeAttributes( configuration );
27          assertEquals( "attributes.getLength()", 0, attributes.getLength() );
28      }
29  
30      public void testSerializeAttributes()
31          throws Exception
32      {
33          final DefaultConfiguration configuration = new DefaultConfiguration( "element", "", "" );
34          final String name = "key";
35          final String value = "value";
36          configuration.setAttribute( name, value );
37          final SAXConfigurationSerializer serializer = new SAXConfigurationSerializer();
38          final AttributesImpl attributes = serializer.serializeAttributes( configuration );
39          assertEquals( "attributes.getLength()", 1, attributes.getLength() );
40          assertEquals( "attributes.getLocalName(0)", name, attributes.getLocalName( 0 ) );
41          assertEquals( "attributes.getQName(0)", name, attributes.getQName( 0 ) );
42          assertEquals( "attributes.getURI(0)", "", attributes.getURI( 0 ) );
43          assertEquals( "attributes.getType(0)", "CDATA", attributes.getType( 0 ) );
44          assertEquals( "attributes.getType(0)", value, attributes.getValue( 0 ) );
45      }
46  
47      public void testSerializeElementWithNoContentOrChildren()
48          throws Exception
49      {
50          final String name = "element";
51          final DefaultConfiguration configuration = new DefaultConfiguration( name, "", "" );
52          final SAXConfigurationSerializer serializer = new MockSAXConfigurationSerializer();
53  
54          final MockInvocationRecorder recorder = new MockInvocationRecorder();
55          recorder.addInvocation( SAXMethods.START_ELEMENT,
56                                  new Object[]{"", name, name,
57                                               MockSAXConfigurationSerializer.ATTRIBUTES},
58                                  null );
59          recorder.addInvocation( SAXMethods.END_ELEMENT,
60                                  new Object[]{"", name, name},
61                                  null );
62  
63          final ContentHandler handler = (ContentHandler)
64              Proxy.newProxyInstance( getClass().getClassLoader(),
65                                      new Class[]{ContentHandler.class},
66                                      recorder );
67  
68          serializer.serializeElement( configuration, handler );
69      }
70  
71      public void testSerializeElementWithValue()
72          throws Exception
73      {
74          final String name = "element";
75          final String value = "value";
76          final DefaultConfiguration configuration = new DefaultConfiguration( name, "", "" );
77          configuration.setValue( value );
78          final SAXConfigurationSerializer serializer = new MockSAXConfigurationSerializer();
79  
80          final MockInvocationRecorder recorder = new MockInvocationRecorder();
81          recorder.addInvocation( SAXMethods.START_ELEMENT,
82                                  new Object[]{"", name, name,
83                                               MockSAXConfigurationSerializer.ATTRIBUTES},
84                                  null );
85          recorder.addInvocation( SAXMethods.CHARACTERS,
86                                  new Object[]{value.toCharArray(), new Integer( 0 ), new Integer( 0 )},
87                                  null );
88          recorder.addInvocation( SAXMethods.END_ELEMENT,
89                                  new Object[]{"", name, name},
90                                  null );
91  
92          final ContentHandler handler = (ContentHandler)
93              Proxy.newProxyInstance( getClass().getClassLoader(),
94                                      new Class[]{ContentHandler.class},
95                                      recorder );
96  
97          serializer.serializeElement( configuration, handler );
98      }
99  
100     public void testSerializeElementWithChild()
101         throws Exception
102     {
103         final String name = "element";
104         final String childName = "child";
105         final DefaultConfiguration configuration = new DefaultConfiguration( name, "", "" );
106         final DefaultConfiguration child = new DefaultConfiguration( childName, "", "" );
107         configuration.addChild( child );
108         final SAXConfigurationSerializer serializer = new MockSAXConfigurationSerializer();
109 
110         final MockInvocationRecorder recorder = new MockInvocationRecorder();
111         recorder.addInvocation( SAXMethods.START_ELEMENT,
112                                 new Object[]{"", name, name,
113                                              MockSAXConfigurationSerializer.ATTRIBUTES},
114                                 null );
115         recorder.addInvocation( SAXMethods.START_ELEMENT,
116                                 new Object[]{"", childName, childName,
117                                              MockSAXConfigurationSerializer.ATTRIBUTES},
118                                 null );
119         recorder.addInvocation( SAXMethods.END_ELEMENT,
120                                 new Object[]{"", childName, childName},
121                                 null );
122         recorder.addInvocation( SAXMethods.END_ELEMENT,
123                                 new Object[]{"", name, name},
124                                 null );
125 
126         final ContentHandler handler = (ContentHandler)
127             Proxy.newProxyInstance( getClass().getClassLoader(),
128                                     new Class[]{ContentHandler.class},
129                                     recorder );
130 
131         serializer.serializeElement( configuration, handler );
132     }
133 
134     public void testSerializeElementWithChildAndContent()
135         throws Exception
136     {
137         final String name = "element";
138         final String childName = "child";
139         final String value = "text";
140         final DefaultConfiguration configuration = new DefaultConfiguration( name, "", "" );
141         final DefaultConfiguration child = new DefaultConfiguration( childName, "", "" );
142         configuration.addChild( child );
143         child.setValue( value );
144         final SAXConfigurationSerializer serializer = new MockSAXConfigurationSerializer();
145 
146         final MockInvocationRecorder recorder = new MockInvocationRecorder();
147         recorder.addInvocation( SAXMethods.START_ELEMENT,
148                                 new Object[]{"", name, name,
149                                              MockSAXConfigurationSerializer.ATTRIBUTES},
150                                 null );
151         recorder.addInvocation( SAXMethods.START_ELEMENT,
152                                 new Object[]{"", childName, childName,
153                                              MockSAXConfigurationSerializer.ATTRIBUTES},
154                                 null );
155         recorder.addInvocation( SAXMethods.CHARACTERS,
156                                 new Object[]{value.toCharArray(), new Integer( 0 ), new Integer( 0 )},
157                                 null );
158         recorder.addInvocation( SAXMethods.END_ELEMENT,
159                                 new Object[]{"", childName, childName},
160                                 null );
161         recorder.addInvocation( SAXMethods.END_ELEMENT,
162                                 new Object[]{"", name, name},
163                                 null );
164 
165         final ContentHandler handler = (ContentHandler)
166             Proxy.newProxyInstance( getClass().getClassLoader(),
167                                     new Class[]{ContentHandler.class},
168                                     recorder );
169 
170         serializer.serializeElement( configuration, handler );
171     }
172 
173     public void testSerializeElementAsPartOfDocument()
174         throws Exception
175     {
176         final String name = "element";
177         final DefaultConfiguration configuration = new DefaultConfiguration( name, "", "" );
178         final SAXConfigurationSerializer serializer = new MockSAXConfigurationSerializer();
179 
180         final MockInvocationRecorder recorder = new MockInvocationRecorder();
181         recorder.addInvocation( SAXMethods.START_DOCUMENT,
182                                 new Object[ 0 ],
183                                 null );
184         recorder.addInvocation( SAXMethods.START_ELEMENT,
185                                 new Object[]{"", name, name,
186                                              MockSAXConfigurationSerializer.ATTRIBUTES},
187                                 null );
188         recorder.addInvocation( SAXMethods.END_ELEMENT,
189                                 new Object[]{"", name, name},
190                                 null );
191         recorder.addInvocation( SAXMethods.END_DOCUMENT,
192                                 new Object[ 0 ],
193                                 null );
194 
195         final ContentHandler handler = (ContentHandler)
196             Proxy.newProxyInstance( getClass().getClassLoader(),
197                                     new Class[]{ContentHandler.class},
198                                     recorder );
199 
200         serializer.serialize( configuration, handler );
201     }
202 }