1 package org.apache.commons.digester3;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import static org.apache.commons.digester3.binder.DigesterLoader.newLoader;
23 import static org.junit.Assert.assertEquals;
24 import static org.junit.Assert.assertFalse;
25 import static org.junit.Assert.assertTrue;
26
27 import org.apache.commons.digester3.annotations.FromAnnotationsRuleModule;
28 import org.apache.commons.digester3.binder.AbstractRulesModule;
29 import org.apache.commons.digester3.binder.RulesModule;
30 import org.apache.commons.digester3.xmlrules.FromXmlRulesModule;
31 import org.junit.Test;
32 import org.xml.sax.SAXParseException;
33
34
35
36
37 public final class Digester153TestCase
38 {
39
40 @Test
41 public void basicConstructor()
42 throws Exception
43 {
44 ObjectCreateRule createRule = new ObjectCreateRule( TestBean.class );
45 createRule.setConstructorArgumentTypes( boolean.class, double.class );
46
47 Digester digester = new Digester();
48 digester.addRule( "toplevel/bean", createRule );
49 digester.addCallParam( "toplevel/bean", 0, "boolean" );
50 digester.addCallParam( "toplevel/bean", 1, "double" );
51
52 TestBean bean = digester.parse( getClass().getResourceAsStream( "BasicConstructor.xml" ) );
53
54 assertTrue( bean.getBooleanProperty() );
55 assertEquals( 9.99D, bean.getDoubleProperty(), 0 );
56
57
58 bean = digester.parse( getClass().getResourceAsStream( "BasicConstructor.xml" ) );
59
60 assertTrue( bean.getBooleanProperty() );
61 assertEquals( 9.99D, bean.getDoubleProperty(), 0 );
62 }
63
64 @Test
65 public void constructorWithAttributeAndElement()
66 throws Exception
67 {
68 ObjectCreateRule createRule = new ObjectCreateRule( TestBean.class );
69 createRule.setConstructorArgumentTypes( boolean.class, double.class );
70
71 Digester digester = new Digester();
72 digester.addRule( "toplevel/bean", createRule );
73 digester.addCallParam( "toplevel/bean", 0, "boolean" );
74 digester.addCallParam( "toplevel/bean/double", 1 );
75 digester.addBeanPropertySetter("toplevel/bean/float", "floatProperty");
76
77 TestBean bean = digester.parse( getClass().getResourceAsStream( "ConstructorWithAttributeAndElement.xml" ) );
78
79 assertTrue( bean.getBooleanProperty() );
80 assertEquals( 9.99D, bean.getDoubleProperty(), 0 );
81 assertEquals( Float.valueOf( 5.5f ), Float.valueOf( bean.getFloatProperty() ) );
82
83
84 bean = digester.parse( getClass().getResourceAsStream( "ConstructorWithAttributeAndElement.xml" ) );
85
86 assertTrue( bean.getBooleanProperty() );
87 assertEquals( 9.99D, bean.getDoubleProperty(), 0 );
88 assertEquals( Float.valueOf( 5.5f ), Float.valueOf( bean.getFloatProperty() ) );
89 }
90
91 @Test
92 public void basicConstructorViaBinder()
93 throws Exception
94 {
95 succesfullConstructor( new AbstractRulesModule()
96 {
97
98 @Override
99 protected void configure()
100 {
101 forPattern( "toplevel/bean" )
102 .createObject().ofType( TestBean.class ).usingConstructor( boolean.class, double.class )
103 .then()
104 .callParam().fromAttribute( "boolean" ).ofIndex( 0 )
105 .then()
106 .callParam().fromAttribute( "double" ).ofIndex( 1 );
107 }
108
109 } );
110 }
111
112 @Test
113 public void basicConstructorViaAnnotations()
114 throws Exception
115 {
116 succesfullConstructor( new FromAnnotationsRuleModule()
117 {
118
119 @Override
120 protected void configureRules()
121 {
122 bindRulesFrom( TestBean.class );
123 }
124
125 } );
126 }
127
128 @Test
129 public void basicConstructorViaXML()
130 throws Exception
131 {
132 succesfullConstructor( new FromXmlRulesModule()
133 {
134
135 @Override
136 protected void loadRules()
137 {
138 loadXMLRules( getClass().getResourceAsStream( "xmlrules/constructor-testrules.xml" ) );
139 }
140
141 } );
142 }
143
144 private void succesfullConstructor( RulesModule rulesModule )
145 throws Exception
146 {
147 TestBean bean = newLoader( rulesModule )
148 .newDigester()
149 .parse( getClass().getResourceAsStream( "BasicConstructor.xml" ) );
150
151 assertTrue( bean.getBooleanProperty() );
152 assertEquals( 9.99D, bean.getDoubleProperty(), 0 );
153 }
154
155 @Test
156 public void basicConstructorWithValuesNotFound()
157 throws Exception
158 {
159 ObjectCreateRule createRule = new ObjectCreateRule( TestBean.class );
160 createRule.setConstructorArgumentTypes( boolean.class, double.class );
161
162 Digester digester = new Digester();
163 digester.addRule( "toplevel/bean", createRule );
164 digester.addCallParam( "toplevel/bean", 0, "notFound1" );
165 digester.addCallParam( "toplevel/bean", 1, "notFound2" );
166
167 TestBean bean = digester.parse( getClass().getResourceAsStream( "BasicConstructor.xml" ) );
168
169 assertFalse( bean.getBooleanProperty() );
170 assertEquals( 0D, bean.getDoubleProperty(), 0 );
171 }
172
173 @Test( expected = SAXParseException.class )
174 public void basicConstructorWithWrongParameters()
175 throws Exception
176 {
177 ObjectCreateRule createRule = new ObjectCreateRule( TestBean.class );
178 createRule.setConstructorArgumentTypes( boolean.class );
179
180 Digester digester = new Digester();
181 digester.addRule( "toplevel/bean", createRule );
182
183 digester.parse( getClass().getResourceAsStream( "BasicConstructor.xml" ) );
184 }
185
186 @Test
187 public void constructorWithClassDefinedInAttribute()
188 throws Exception
189 {
190 ObjectCreateRule createRule = new ObjectCreateRule( null, "type" );
191 createRule.setConstructorArgumentTypes( boolean.class, double.class );
192
193 Digester digester = new Digester();
194 digester.addRule( "toplevel/bean", createRule );
195 digester.addCallParam( "toplevel/bean", 0, "boolean" );
196 digester.addCallParam( "toplevel/bean", 1, "double" );
197
198 TestBean bean = digester.parse( getClass().getResourceAsStream( "AttributeDefinedConstructor.xml" ) );
199
200 assertTrue( bean.getBooleanProperty() );
201 assertEquals( 9.99D, bean.getDoubleProperty(), 0 );
202 }
203
204 }