View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.juneau.config;
18  
19  import static org.apache.juneau.TestUtils.*;
20  import static org.junit.jupiter.api.Assertions.*;
21  
22  import java.util.*;
23  
24  import org.apache.juneau.*;
25  import org.apache.juneau.json.*;
26  import org.apache.juneau.testutils.pojos.*;
27  import org.junit.jupiter.api.*;
28  
29  class ConfigInterfaceTest extends TestBase {
30  
31  	Config cf;
32  	ConfigInterface proxy;
33  
34  	public ConfigInterfaceTest() {
35  		cf = Config.create().serializer(Json5Serializer.DEFAULT.copy().addBeanTypes().addRootType().build()).build();
36  		proxy = cf.getSection("A").asInterface(ConfigInterface.class).orElse(null);
37  	}
38  
39  
40  	//====================================================================================================
41  	// getSectionAsInterface(String,Class)
42  	//====================================================================================================
43  
44  	@Test void a01_string() {
45  		proxy.setString("foo");
46  		assertEquals("foo", proxy.getString());
47  		assertEquals("foo", cf.get("A/string").get());
48  	}
49  
50  	@Test void a02_int() {
51  		proxy.setInt(1);
52  		assertEquals(1, proxy.getInt());
53  		assertEquals("1", cf.get("A/int").get());
54  	}
55  
56  	@Test void a03_integer() {
57  		proxy.setInteger(2);
58  		assertEquals(2, proxy.getInteger().intValue());
59  		assertEquals("2", cf.get("A/integer").get());
60  		assertInstanceOf(Integer.class, proxy.getInteger());
61  	}
62  
63  	@Test void a04_boolean() {
64  		proxy.setBoolean(true);
65  		assertEquals(true, proxy.isBoolean());
66  		assertEquals("true", cf.get("A/boolean").get());
67  	}
68  
69  	@Test void a05_booleanObject() {
70  		proxy.setBooleanObject(true);
71  		assertEquals(true, proxy.getBooleanObject());
72  		assertEquals("true", cf.get("A/booleanObject").get());
73  		assertInstanceOf(Boolean.class, proxy.getBooleanObject());
74  	}
75  
76  	@Test void a06_float() {
77  		proxy.setFloat(1f);
78  		assertEquals(1f, proxy.getFloat(), 0.1f);
79  		assertEquals("1.0", cf.get("A/float").get());
80  	}
81  
82  	@Test void a07_floatObject() {
83  		proxy.setFloatObject(1f);
84  		assertEquals(1f, proxy.getFloatObject().floatValue(), 0.1f);
85  		assertEquals("1.0", cf.get("A/floatObject").get());
86  		assertInstanceOf(Float.class, proxy.getFloatObject());
87  	}
88  
89  	@Test void a08_int3dArray() {
90  		proxy.setInt3dArray(new int[][][]{{{1,2},null},null});
91  		assertEquals("[[[1,2],null],null]", cf.get("A/int3dArray").get());
92  		assertJson("[[[1,2],null],null]", proxy.getInt3dArray());
93  		assertInstanceOf(int[][][].class, proxy.getInt3dArray());
94  	}
95  
96  	@Test void a09_integer3dArray() {
97  		proxy.setInteger3dArray(new Integer[][][]{{{1,null},null},null});
98  		assertJson("[[[1,null],null],null]", proxy.getInteger3dArray());
99  		assertEquals("[[[1,null],null],null]", cf.get("A/integer3dArray").get());
100 		assertInstanceOf(Integer.class, proxy.getInteger3dArray()[0][0][0]);
101 	}
102 
103 	@Test void a10_string3dArray() {
104 		proxy.setString3dArray(new String[][][]{{{"foo",null},null},null});
105 		assertJson("[[['foo',null],null],null]", proxy.getString3dArray());
106 		assertEquals("[[['foo',null],null],null]", cf.get("A/string3dArray").get());
107 	}
108 
109 	@Test void a11_integerList() {
110 		proxy.setIntegerList(alist(1,null));
111 		assertJson("[1,null]", proxy.getIntegerList());
112 		assertEquals("[1,null]", cf.get("A/integerList").get());
113 		assertInstanceOf(Integer.class, proxy.getIntegerList().get(0));
114 	}
115 
116 	@Test void a12_integer3dList() {
117 		proxy.setInteger3dList(alist(alist(alist(1,null),null),null));
118 		assertJson("[[[1,null],null],null]", proxy.getInteger3dList());
119 		assertEquals("[[[1,null],null],null]", cf.get("A/integer3dList").get());
120 		assertInstanceOf(Integer.class, proxy.getInteger3dList().get(0).get(0).get(0));
121 	}
122 
123 	@Test void a13_integer1d3dList() {
124 		proxy.setInteger1d3dList(alist(new Integer[][][]{{{1,null},null},null},null));
125 		assertJson("[[[[1,null],null],null],null]", proxy.getInteger1d3dList());
126 		assertEquals("[[[[1,null],null],null],null]", cf.get("A/integer1d3dList").get());
127 		assertInstanceOf(Integer.class, proxy.getInteger1d3dList().get(0)[0][0][0]);
128 	}
129 
130 	@Test void a14_int1d3dList() {
131 		proxy.setInt1d3dList(alist(new int[][][]{{{1,2},null},null},null));
132 		assertJson("[[[[1,2],null],null],null]", proxy.getInt1d3dList());
133 		assertEquals("[[[[1,2],null],null],null]", cf.get("A/int1d3dList").get());
134 		assertInstanceOf(int[][][].class, proxy.getInt1d3dList().get(0));
135 	}
136 
137 	@Test void a15_stringList() {
138 		proxy.setStringList(Arrays.asList("foo","bar",null));
139 		assertJson("['foo','bar',null]", proxy.getStringList());
140 		assertEquals("['foo','bar',null]", cf.get("A/stringList").get());
141 	}
142 
143 	// Beans
144 
145 	@Test void a16_bean() {
146 		proxy.setBean(ABean.get());
147 		assertJson("{a:1,b:'foo'}", proxy.getBean());
148 		assertEquals("{a:1,b:'foo'}", cf.get("A/bean").get());
149 		assertInstanceOf(ABean.class, proxy.getBean());
150 	}
151 
152 	@Test void a17_bean3dArray() {
153 		proxy.setBean3dArray(new ABean[][][]{{{ABean.get(),null},null},null});
154 		assertJson("[[[{a:1,b:'foo'},null],null],null]", proxy.getBean3dArray());
155 		assertEquals("[[[{a:1,b:'foo'},null],null],null]", cf.get("A/bean3dArray").get());
156 		assertInstanceOf(ABean.class, proxy.getBean3dArray()[0][0][0]);
157 	}
158 
159 	@Test void a18_beanList() {
160 		proxy.setBeanList(Arrays.asList(ABean.get()));
161 		assertJson("[{a:1,b:'foo'}]", proxy.getBeanList());
162 		assertEquals("[{a:1,b:'foo'}]", cf.get("A/beanList").get());
163 		assertInstanceOf(ABean.class, proxy.getBeanList().get(0));
164 	}
165 
166 	@Test void a19_bean1d3dList() {
167 		proxy.setBean1d3dList(alist(new ABean[][][]{{{ABean.get(),null},null},null},null));
168 		assertJson("[[[[{a:1,b:'foo'},null],null],null],null]", proxy.getBean1d3dList());
169 		assertEquals("[[[[{a:1,b:'foo'},null],null],null],null]", cf.get("A/bean1d3dList").get());
170 		assertInstanceOf(ABean.class, proxy.getBean1d3dList().get(0)[0][0][0]);
171 	}
172 
173 	@Test void a20_beanMap() {
174 		proxy.setBeanMap(map("foo",ABean.get()));
175 		assertJson("{foo:{a:1,b:'foo'}}", proxy.getBeanMap());
176 		assertEquals("{foo:{a:1,b:'foo'}}", cf.get("A/beanMap").get());
177 		assertInstanceOf(ABean.class, proxy.getBeanMap().get("foo"));
178 	}
179 
180 	@Test void a21_beanListMap() {
181 		proxy.setBeanListMap(map("foo",Arrays.asList(ABean.get())));
182 		assertJson("{foo:[{a:1,b:'foo'}]}", proxy.getBeanListMap());
183 		assertEquals("{foo:[{a:1,b:'foo'}]}", cf.get("A/beanListMap").get());
184 		assertInstanceOf(ABean.class, proxy.getBeanListMap().get("foo").get(0));
185 	}
186 
187 	@Test void a22_bean1d3dListMap() {
188 		proxy.setBean1d3dListMap(map("foo",alist(new ABean[][][]{{{ABean.get(),null},null},null},null)));
189 		assertJson("{foo:[[[[{a:1,b:'foo'},null],null],null],null]}", proxy.getBean1d3dListMap());
190 		assertEquals("{foo:[[[[{a:1,b:'foo'},null],null],null],null]}", cf.get("A/bean1d3dListMap").get());
191 		assertInstanceOf(ABean.class, proxy.getBean1d3dListMap().get("foo").get(0)[0][0][0]);
192 	}
193 
194 	@Test void a23_beanListMapIntegerKeys() {
195 		proxy.setBeanListMapIntegerKeys(map(1,Arrays.asList(ABean.get())));
196 		assertJson("{'1':[{a:1,b:'foo'}]}", proxy.getBeanListMapIntegerKeys());
197 		assertEquals("{'1':[{a:1,b:'foo'}]}", cf.get("A/beanListMapIntegerKeys").get());
198 		assertInstanceOf(ABean.class, proxy.getBeanListMapIntegerKeys().get(1).get(0));
199 	}
200 
201 	// Typed beans
202 
203 	@Test void a24_typedBean() {
204 		proxy.setTypedBean(TypedBeanImpl.get());
205 		assertJson("{a:1,b:'foo'}", proxy.getTypedBean());
206 		assertEquals("{_type:'TypedBeanImpl',a:1,b:'foo'}", cf.get("A/typedBean").get());
207 		assertInstanceOf(TypedBeanImpl.class, proxy.getTypedBean());
208 	}
209 
210 	@Test void a25_typedBean3dArray() {
211 		proxy.setTypedBean3dArray(new TypedBean[][][]{{{TypedBeanImpl.get(),null},null},null});
212 		assertJson("[[[{a:1,b:'foo'},null],null],null]", proxy.getTypedBean3dArray());
213 		assertEquals("[[[{_type:'TypedBeanImpl',a:1,b:'foo'},null],null],null]", cf.get("A/typedBean3dArray").get());
214 		assertInstanceOf(TypedBeanImpl.class, proxy.getTypedBean3dArray()[0][0][0]);
215 	}
216 
217 	@Test void a26_typedBeanList() {
218 		proxy.setTypedBeanList(Arrays.asList((TypedBean)TypedBeanImpl.get()));
219 		assertJson("[{a:1,b:'foo'}]", proxy.getTypedBeanList());
220 		assertEquals("[{_type:'TypedBeanImpl',a:1,b:'foo'}]", cf.get("A/typedBeanList").get());
221 		assertInstanceOf(TypedBeanImpl.class, proxy.getTypedBeanList().get(0));
222 	}
223 
224 	@Test void a27_typedBean1d3dList() {
225 		proxy.setTypedBean1d3dList(alist(new TypedBean[][][]{{{TypedBeanImpl.get(),null},null},null},null));
226 		assertJson("[[[[{a:1,b:'foo'},null],null],null],null]", proxy.getTypedBean1d3dList());
227 		assertEquals("[[[[{_type:'TypedBeanImpl',a:1,b:'foo'},null],null],null],null]", cf.get("A/typedBean1d3dList").get());
228 		assertInstanceOf(TypedBeanImpl.class, proxy.getTypedBean1d3dList().get(0)[0][0][0]);
229 	}
230 
231 	@Test void a28_typedBeanMap() {
232 		proxy.setTypedBeanMap(map("foo",TypedBeanImpl.get()));
233 		assertJson("{foo:{a:1,b:'foo'}}", proxy.getTypedBeanMap());
234 		assertEquals("{foo:{_type:'TypedBeanImpl',a:1,b:'foo'}}", cf.get("A/typedBeanMap").get());
235 		assertInstanceOf(TypedBeanImpl.class, proxy.getTypedBeanMap().get("foo"));
236 	}
237 
238 	@Test void a29_typedBeanListMap() {
239 		proxy.setTypedBeanListMap(map("foo",Arrays.asList((TypedBean)TypedBeanImpl.get())));
240 		assertJson("{foo:[{a:1,b:'foo'}]}", proxy.getTypedBeanListMap());
241 		assertEquals("{foo:[{_type:'TypedBeanImpl',a:1,b:'foo'}]}", cf.get("A/typedBeanListMap").get());
242 		assertInstanceOf(TypedBeanImpl.class, proxy.getTypedBeanListMap().get("foo").get(0));
243 	}
244 
245 	@Test void a30_typedBean1d3dListMap() {
246 		proxy.setTypedBean1d3dListMap(map("foo",alist(new TypedBean[][][]{{{TypedBeanImpl.get(),null},null},null},null)));
247 		assertJson("{foo:[[[[{a:1,b:'foo'},null],null],null],null]}", proxy.getTypedBean1d3dListMap());
248 		assertEquals("{foo:[[[[{_type:'TypedBeanImpl',a:1,b:'foo'},null],null],null],null]}", cf.get("A/typedBean1d3dListMap").get());
249 		assertInstanceOf(TypedBeanImpl.class, proxy.getTypedBean1d3dListMap().get("foo").get(0)[0][0][0]);
250 	}
251 
252 	@Test void a31_typedBeanListMapIntegerKeys() {
253 		proxy.setTypedBeanListMapIntegerKeys(map(1,Arrays.asList((TypedBean)TypedBeanImpl.get())));
254 		assertJson("{'1':[{a:1,b:'foo'}]}", proxy.getTypedBeanListMapIntegerKeys());
255 		assertEquals("{'1':[{_type:'TypedBeanImpl',a:1,b:'foo'}]}", cf.get("A/typedBeanListMapIntegerKeys").get());
256 		assertInstanceOf(TypedBeanImpl.class, proxy.getTypedBeanListMapIntegerKeys().get(1).get(0));
257 	}
258 
259 	// Swapped POJOs
260 
261 	@Test void a32_swappedObject() {
262 		proxy.setSwappedObject(new SwappedObject());
263 		assertJson("'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/'", proxy.getSwappedObject());
264 		assertEquals("swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/", cf.get("A/swappedObject").get());
265 		assertInstanceOf(SwappedObject.class, proxy.getSwappedObject());
266 	}
267 
268 	@Test void a33_swappedObject3dArray() {
269 		proxy.setSwappedObject3dArray(new SwappedObject[][][]{{{new SwappedObject(),null},null},null});
270 		assertJson("[[['swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/',null],null],null]", proxy.getSwappedObject3dArray());
271 		assertEquals("[[['swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/',null],null],null]", cf.get("A/swappedObject3dArray").get());
272 		assertInstanceOf(SwappedObject.class, proxy.getSwappedObject3dArray()[0][0][0]);
273 	}
274 
275 	@Test void a34_swappedObjectMap() {
276 		proxy.setSwappedObjectMap(map(new SwappedObject(), new SwappedObject()));
277 		assertJson("{'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/':'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/'}", proxy.getSwappedObjectMap());
278 		assertEquals("{'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/':'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/'}", cf.get("A/swappedObjectMap").get());
279 		assertInstanceOf(SwappedObject.class, proxy.getSwappedObjectMap().keySet().iterator().next());
280 		assertInstanceOf(SwappedObject.class, proxy.getSwappedObjectMap().values().iterator().next());
281 	}
282 
283 	@Test void a35_swappedObject3dMap() {
284 		proxy.setSwappedObject3dMap(map(new SwappedObject(), new SwappedObject[][][]{{{new SwappedObject(),null},null},null}));
285 		assertJson("{'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/':[[['swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/',null],null],null]}", proxy.getSwappedObject3dMap());
286 		assertEquals("{'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/':[[['swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/',null],null],null]}", cf.get("A/swappedObject3dMap").get());
287 		assertInstanceOf(SwappedObject.class, proxy.getSwappedObject3dMap().keySet().iterator().next());
288 		assertInstanceOf(SwappedObject.class, proxy.getSwappedObject3dMap().values().iterator().next()[0][0][0]);
289 	}
290 
291 	// Implicit swapped POJOs
292 
293 	@Test void a36_implicitSwappedObject() {
294 		proxy.setImplicitSwappedObject(new ImplicitSwappedObject());
295 		assertJson("'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/'", proxy.getImplicitSwappedObject());
296 		assertEquals("swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/", cf.get("A/implicitSwappedObject").get());
297 		assertInstanceOf(ImplicitSwappedObject.class, proxy.getImplicitSwappedObject());
298 	}
299 
300 	@Test void a37_implicitSwappedObject3dArray() {
301 		proxy.setImplicitSwappedObject3dArray(new ImplicitSwappedObject[][][]{{{new ImplicitSwappedObject(),null},null},null});
302 		assertJson("[[['swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/',null],null],null]", proxy.getImplicitSwappedObject3dArray());
303 		assertEquals("[[['swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/',null],null],null]", cf.get("A/implicitSwappedObject3dArray").get());
304 		assertInstanceOf(ImplicitSwappedObject.class, proxy.getImplicitSwappedObject3dArray()[0][0][0]);
305 	}
306 
307 	@Test void a38_implicitSwappedObjectMap() {
308 		proxy.setImplicitSwappedObjectMap(map(new ImplicitSwappedObject(), new ImplicitSwappedObject()));
309 		assertJson("{'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/':'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/'}", proxy.getImplicitSwappedObjectMap());
310 		assertEquals("{'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/':'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/'}", cf.get("A/implicitSwappedObjectMap").get());
311 		assertInstanceOf(ImplicitSwappedObject.class, proxy.getImplicitSwappedObjectMap().keySet().iterator().next());
312 		assertInstanceOf(ImplicitSwappedObject.class, proxy.getImplicitSwappedObjectMap().values().iterator().next());
313 	}
314 
315 	@Test void a39_implicitSwappedObject3dMap() {
316 		proxy.setImplicitSwappedObject3dMap(map(new ImplicitSwappedObject(), new ImplicitSwappedObject[][][]{{{new ImplicitSwappedObject(),null},null},null}));
317 		assertJson("{'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/':[[['swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/',null],null],null]}", proxy.getImplicitSwappedObject3dMap());
318 		assertEquals("{'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/':[[['swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/',null],null],null]}", cf.get("A/implicitSwappedObject3dMap").get());
319 		assertInstanceOf(ImplicitSwappedObject.class, proxy.getImplicitSwappedObject3dMap().keySet().iterator().next());
320 		assertInstanceOf(ImplicitSwappedObject.class, proxy.getImplicitSwappedObject3dMap().values().iterator().next()[0][0][0]);
321 	}
322 
323 	// Enums
324 
325 	@Test void a40_enum() {
326 		proxy.setEnum(TestEnum.TWO);
327 		assertJson("'TWO'", proxy.getEnum());
328 		assertEquals("TWO", cf.get("A/enum").get());
329 		assertInstanceOf(TestEnum.class, proxy.getEnum());
330 	}
331 
332 	@Test void a41_enum3d() {
333 		proxy.setEnum3d(new TestEnum[][][]{{{TestEnum.TWO,null},null},null});
334 		assertJson("[[['TWO',null],null],null]", proxy.getEnum3d());
335 		assertEquals("[[['TWO',null],null],null]", cf.get("A/enum3d").get());
336 		assertInstanceOf(TestEnum.class, proxy.getEnum3d()[0][0][0]);
337 	}
338 
339 	@Test void a42_enumList() {
340 		proxy.setEnumList(alist(TestEnum.TWO,null));
341 		assertJson("['TWO',null]", proxy.getEnumList());
342 		assertEquals("['TWO',null]", cf.get("A/enumList").get());
343 		assertInstanceOf(TestEnum.class, proxy.getEnumList().get(0));
344 	}
345 
346 	@Test void a43_enum3dList() {
347 		proxy.setEnum3dList(alist(alist(alist(TestEnum.TWO,null),null),null));
348 		assertJson("[[['TWO',null],null],null]", proxy.getEnum3dList());
349 		assertEquals("[[['TWO',null],null],null]", cf.get("A/enum3dList").get());
350 		assertInstanceOf(TestEnum.class, proxy.getEnum3dList().get(0).get(0).get(0));
351 	}
352 
353 	@Test void a44_enum1d3dList() {
354 		proxy.setEnum1d3dList(alist(new TestEnum[][][]{{{TestEnum.TWO,null},null},null},null));
355 		assertJson("[[[['TWO',null],null],null],null]", proxy.getEnum1d3dList());
356 		assertEquals("[[[['TWO',null],null],null],null]", cf.get("A/enum1d3dList").get());
357 		assertInstanceOf(TestEnum.class, proxy.getEnum1d3dList().get(0)[0][0][0]);
358 	}
359 
360 	@Test void a45_enumMap() {
361 		proxy.setEnumMap(map(TestEnum.ONE,TestEnum.TWO));
362 		assertJson("{ONE:'TWO'}", proxy.getEnumMap());
363 		assertEquals("{ONE:'TWO'}", cf.get("A/enumMap").get());
364 		assertInstanceOf(TestEnum.class, proxy.getEnumMap().keySet().iterator().next());
365 		assertInstanceOf(TestEnum.class, proxy.getEnumMap().values().iterator().next());
366 	}
367 
368 	@Test void a46_enum3dArrayMap() {
369 		proxy.setEnum3dArrayMap(map(TestEnum.ONE,new TestEnum[][][]{{{TestEnum.TWO,null},null},null}));
370 		assertJson("{ONE:[[['TWO',null],null],null]}", proxy.getEnum3dArrayMap());
371 		assertEquals("{ONE:[[['TWO',null],null],null]}", cf.get("A/enum3dArrayMap").get());
372 		assertInstanceOf(TestEnum.class, proxy.getEnum3dArrayMap().keySet().iterator().next());
373 		assertInstanceOf(TestEnum.class, proxy.getEnum3dArrayMap().values().iterator().next()[0][0][0]);
374 	}
375 
376 	@Test void a47_enum1d3dListMap() {
377 		proxy.setEnum1d3dListMap(map(TestEnum.ONE,alist(new TestEnum[][][]{{{TestEnum.TWO,null},null},null},null)));
378 		assertJson("{ONE:[[[['TWO',null],null],null],null]}", proxy.getEnum1d3dListMap());
379 		assertEquals("{ONE:[[[['TWO',null],null],null],null]}", cf.get("A/enum1d3dListMap").get());
380 		assertInstanceOf(TestEnum.class, proxy.getEnum1d3dListMap().keySet().iterator().next());
381 		assertInstanceOf(TestEnum.class, proxy.getEnum1d3dListMap().values().iterator().next().get(0)[0][0][0]);
382 	}
383 
384 	public interface ConfigInterface {
385 
386 		// Various primitives
387 
388 		String getString();
389 		void setString(String x);
390 
391 		int getInt();
392 		void setInt(int x);
393 
394 		Integer getInteger();
395 		void setInteger(Integer x);
396 
397 		boolean isBoolean();
398 		void setBoolean(boolean x);
399 
400 		Boolean getBooleanObject();
401 		void setBooleanObject(Boolean x);
402 
403 		float getFloat();
404 		void setFloat(float x);
405 
406 		Float getFloatObject();
407 		void setFloatObject(Float x);
408 
409 		int[][][] getInt3dArray();
410 		void setInt3dArray(int[][][] x);
411 
412 		Integer[][][] getInteger3dArray();
413 		void setInteger3dArray(Integer[][][] x);
414 
415 		String[][][] getString3dArray();
416 		void setString3dArray(String[][][] x);
417 
418 		List<Integer> getIntegerList();
419 		void setIntegerList(List<Integer> x);
420 
421 		List<List<List<Integer>>> getInteger3dList();
422 		void setInteger3dList(List<List<List<Integer>>> x);
423 
424 		List<Integer[][][]> getInteger1d3dList();
425 		void setInteger1d3dList(List<Integer[][][]> x);
426 
427 		List<int[][][]> getInt1d3dList();
428 		void setInt1d3dList(List<int[][][]> x);
429 
430 		List<String> getStringList();
431 		void setStringList(List<String> x);
432 
433 		// Beans
434 
435 		ABean getBean();
436 		void setBean(ABean x);
437 
438 		ABean[][][] getBean3dArray();
439 		void setBean3dArray(ABean[][][] x);
440 
441 		List<ABean> getBeanList();
442 		void setBeanList(List<ABean> x);
443 
444 		List<ABean[][][]> getBean1d3dList();
445 		void setBean1d3dList(List<ABean[][][]> x);
446 
447 		Map<String,ABean> getBeanMap();
448 		void setBeanMap(Map<String,ABean> x);
449 
450 		Map<String,List<ABean>> getBeanListMap();
451 		void setBeanListMap(Map<String,List<ABean>> x);
452 
453 		Map<String,List<ABean[][][]>> getBean1d3dListMap();
454 		void setBean1d3dListMap(Map<String,List<ABean[][][]>> x);
455 
456 		Map<Integer,List<ABean>> getBeanListMapIntegerKeys();
457 		void setBeanListMapIntegerKeys(Map<Integer,List<ABean>> x);
458 
459 		// Typed beans
460 
461 		TypedBean getTypedBean();
462 		void setTypedBean(TypedBean x);
463 
464 		TypedBean[][][] getTypedBean3dArray();
465 		void setTypedBean3dArray(TypedBean[][][] x);
466 
467 		List<TypedBean> getTypedBeanList();
468 		void setTypedBeanList(List<TypedBean> x);
469 
470 		List<TypedBean[][][]> getTypedBean1d3dList();
471 		void setTypedBean1d3dList(List<TypedBean[][][]> x);
472 
473 		Map<String,TypedBean> getTypedBeanMap();
474 		void setTypedBeanMap(Map<String,TypedBean> x);
475 
476 		Map<String,List<TypedBean>> getTypedBeanListMap();
477 		void setTypedBeanListMap(Map<String,List<TypedBean>> x);
478 
479 		Map<String,List<TypedBean[][][]>> getTypedBean1d3dListMap();
480 		void setTypedBean1d3dListMap(Map<String,List<TypedBean[][][]>> x);
481 
482 		Map<Integer,List<TypedBean>> getTypedBeanListMapIntegerKeys();
483 		void setTypedBeanListMapIntegerKeys(Map<Integer,List<TypedBean>> x);
484 
485 		// Swapped POJOs
486 
487 		SwappedObject getSwappedObject();
488 		void setSwappedObject(SwappedObject x);
489 
490 		SwappedObject[][][] getSwappedObject3dArray();
491 		void setSwappedObject3dArray(SwappedObject[][][] x);
492 
493 		Map<SwappedObject,SwappedObject> getSwappedObjectMap();
494 		void setSwappedObjectMap(Map<SwappedObject,SwappedObject> x);
495 
496 		Map<SwappedObject,SwappedObject[][][]> getSwappedObject3dMap();
497 		void setSwappedObject3dMap(Map<SwappedObject,SwappedObject[][][]> x);
498 
499 		// Implicit swapped POJOs
500 
501 		ImplicitSwappedObject getImplicitSwappedObject();
502 		void setImplicitSwappedObject(ImplicitSwappedObject x);
503 
504 		ImplicitSwappedObject[][][] getImplicitSwappedObject3dArray();
505 		void setImplicitSwappedObject3dArray(ImplicitSwappedObject[][][] x);
506 
507 		Map<ImplicitSwappedObject,ImplicitSwappedObject> getImplicitSwappedObjectMap();
508 		void setImplicitSwappedObjectMap(Map<ImplicitSwappedObject,ImplicitSwappedObject> x);
509 
510 		Map<ImplicitSwappedObject,ImplicitSwappedObject[][][]> getImplicitSwappedObject3dMap();
511 		void setImplicitSwappedObject3dMap(Map<ImplicitSwappedObject,ImplicitSwappedObject[][][]> x);
512 
513 		// Enums
514 
515 		TestEnum getEnum();
516 		void setEnum(TestEnum x);
517 
518 		TestEnum[][][] getEnum3d();
519 		void setEnum3d(TestEnum[][][] x);
520 
521 		List<TestEnum> getEnumList();
522 		void setEnumList(List<TestEnum> x);
523 
524 		List<List<List<TestEnum>>> getEnum3dList();
525 		void setEnum3dList(List<List<List<TestEnum>>> x);
526 
527 		List<TestEnum[][][]> getEnum1d3dList();
528 		void setEnum1d3dList(List<TestEnum[][][]> x);
529 
530 		Map<TestEnum,TestEnum> getEnumMap();
531 		void setEnumMap(Map<TestEnum,TestEnum> x);
532 
533 		Map<TestEnum,TestEnum[][][]> getEnum3dArrayMap();
534 		void setEnum3dArrayMap(Map<TestEnum,TestEnum[][][]> x);
535 
536 		Map<TestEnum,List<TestEnum[][][]>> getEnum1d3dListMap();
537 		void setEnum1d3dListMap(Map<TestEnum,List<TestEnum[][][]>> x);
538 	}
539 }