GenericConversionServiceTests.java 26.2 KB
Newer Older
K
Keith Donald 已提交
1
/*
2
 * Copyright 2002-2009 the original author or authors.
K
Keith Donald 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
16

17
package org.springframework.core.convert.support;
K
Keith Donald 已提交
18

K
polish  
Keith Donald 已提交
19 20 21
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.fail;
K
Keith Donald 已提交
22 23
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
K
polish  
Keith Donald 已提交
24

K
Keith Donald 已提交
25 26
import java.util.AbstractList;
import java.util.ArrayList;
K
Keith Donald 已提交
27
import java.util.Arrays;
K
Keith Donald 已提交
28
import java.util.Collection;
K
Keith Donald 已提交
29
import java.util.Collections;
K
polish  
Keith Donald 已提交
30
import java.util.HashMap;
K
Keith Donald 已提交
31
import java.util.LinkedHashMap;
32
import java.util.LinkedHashSet;
K
Keith Donald 已提交
33 34
import java.util.LinkedList;
import java.util.List;
K
polish  
Keith Donald 已提交
35
import java.util.Map;
36
import java.util.Set;
K
Keith Donald 已提交
37

K
Keith Donald 已提交
38
import org.junit.Test;
K
polish  
Keith Donald 已提交
39
import org.springframework.core.convert.ConversionFailedException;
40
import org.springframework.core.convert.ConverterNotFoundException;
K
Keith Donald 已提交
41
import org.springframework.core.convert.TypeDescriptor;
K
Keith Donald 已提交
42 43
import org.springframework.core.convert.converter.Converter;

44 45 46 47
/**
 * @author Keith Donald
 */
public class GenericConversionServiceTests {
K
Keith Donald 已提交
48

K
Keith Donald 已提交
49
	private GenericConversionService conversionService = new GenericConversionService();
K
Keith Donald 已提交
50

K
polish  
Keith Donald 已提交
51 52
	@Test
	public void executeConversion() {
K
Keith Donald 已提交
53 54
		conversionService.addConverterFactory(new StringToNumberConverterFactory());
		assertEquals(new Integer(3), conversionService.convert("3", Integer.class));
K
Keith Donald 已提交
55
	}
K
polish  
Keith Donald 已提交
56 57 58

	@Test
	public void executeConversionNullSource() {
K
Keith Donald 已提交
59
		assertEquals(null, conversionService.convert(null, Integer.class));
K
polish  
Keith Donald 已提交
60
	}
K
Keith Donald 已提交
61

K
Keith Donald 已提交
62 63
	@Test
	public void executeCompatibleSource() {
K
Keith Donald 已提交
64
		assertEquals(Boolean.FALSE, conversionService.convert(false, boolean.class));
K
Keith Donald 已提交
65 66
	}

K
polish  
Keith Donald 已提交
67
	@Test
K
polish  
Keith Donald 已提交
68
	public void converterNotFound() {
K
Keith Donald 已提交
69
		try {
K
Keith Donald 已提交
70
			conversionService.convert("3", Integer.class);
K
Keith Donald 已提交
71
			fail("Should have thrown an exception");
72
		} catch (ConverterNotFoundException e) {
K
Keith Donald 已提交
73 74 75
		}
	}

K
polish  
Keith Donald 已提交
76 77
	@Test
	public void addConverterNoSourceTargetClassInfoAvailable() {
K
polish  
Keith Donald 已提交
78
		try {
K
Keith Donald 已提交
79
			conversionService.addConverter(new Converter() {
80
				public Object convert(Object source) {
K
polish  
Keith Donald 已提交
81 82 83 84 85 86 87 88 89
					return source;
				}
			});
			fail("Should have failed");
		} catch (IllegalArgumentException e) {

		}
	}

K
polish  
Keith Donald 已提交
90 91
	@Test
	public void convertNull() {
K
Keith Donald 已提交
92
		assertNull(conversionService.convert(null, Integer.class));
K
Keith Donald 已提交
93
	}
K
Keith Donald 已提交
94

95
	public void convertNullTargetClass() {
96
		assertNull(conversionService.convert("3", (Class<?>) null));
97
	}
K
Keith Donald 已提交
98

99
	@Test
100
	public void convertNullTypeDescriptor() {
101
		assertNull(conversionService.convert("3", TypeDescriptor.valueOf(String.class), TypeDescriptor.NULL));
102 103
	}

K
polish  
Keith Donald 已提交
104 105
	@Test
	public void convertWrongTypeArgument() {
K
Keith Donald 已提交
106
		conversionService.addConverterFactory(new StringToNumberConverterFactory());
K
Keith Donald 已提交
107
		try {
K
Keith Donald 已提交
108
			conversionService.convert("BOGUS", Integer.class);
K
Keith Donald 已提交
109
			fail("Should have failed");
K
polish  
Keith Donald 已提交
110
		} catch (ConversionFailedException e) {
K
Keith Donald 已提交
111 112 113 114

		}
	}

K
polish  
Keith Donald 已提交
115 116
	@Test
	public void convertSuperSourceType() {
K
Keith Donald 已提交
117
		conversionService.addConverter(new Converter<CharSequence, Integer>() {
118
			public Integer convert(CharSequence source) {
K
Keith Donald 已提交
119 120 121
				return Integer.valueOf(source.toString());
			}
		});
K
Keith Donald 已提交
122
		Integer result = conversionService.convert("3", Integer.class);
K
Keith Donald 已提交
123 124 125
		assertEquals(new Integer(3), result);
	}

K
polish  
Keith Donald 已提交
126 127
	@Test
	public void convertObjectToPrimitive() {
K
Keith Donald 已提交
128 129 130 131 132 133 134 135 136 137 138 139 140 141
		assertFalse(conversionService.canConvert(String.class, boolean.class));
		conversionService.addConverter(new StringToBooleanConverter());
		assertTrue(conversionService.canConvert(String.class, boolean.class));
		Boolean b = conversionService.convert("true", boolean.class);
		assertEquals(Boolean.TRUE, b);
		assertTrue(conversionService.canConvert(TypeDescriptor.valueOf(String.class), TypeDescriptor
				.valueOf(boolean.class)));
		b = (Boolean) conversionService.convert("true", TypeDescriptor.valueOf(String.class), TypeDescriptor
				.valueOf(boolean.class));
		assertEquals(Boolean.TRUE, b);
	}

	@Test
	public void convertObjectToPrimitiveViaConverterFactory() {
K
Keith Donald 已提交
142 143
		conversionService.addConverterFactory(new StringToNumberConverterFactory());
		Integer three = conversionService.convert("3", int.class);
K
Keith Donald 已提交
144 145 146
		assertEquals(3, three.intValue());
	}

K
polish  
Keith Donald 已提交
147 148
	@Test
	public void convertArrayToArray() {
149 150
		conversionService.addGenericConverter(Object[].class, Object[].class, new ArrayToArrayConverter(
				conversionService));
K
Keith Donald 已提交
151 152
		conversionService.addConverterFactory(new StringToNumberConverterFactory());
		Integer[] result = conversionService.convert(new String[] { "1", "2", "3" }, Integer[].class);
K
Keith Donald 已提交
153 154 155 156 157
		assertEquals(new Integer(1), result[0]);
		assertEquals(new Integer(2), result[1]);
		assertEquals(new Integer(3), result[2]);
	}

K
polish  
Keith Donald 已提交
158 159
	@Test
	public void convertArrayToPrimitiveArray() {
K
polish  
Keith Donald 已提交
160 161
		conversionService.addGenericConverter(Object[].class, Object[].class, new ArrayToArrayConverter(
				conversionService));
K
Keith Donald 已提交
162 163
		conversionService.addConverterFactory(new StringToNumberConverterFactory());
		int[] result = conversionService.convert(new String[] { "1", "2", "3" }, int[].class);
K
Keith Donald 已提交
164 165 166 167
		assertEquals(1, result[0]);
		assertEquals(2, result[1]);
		assertEquals(3, result[2]);
	}
K
Keith Donald 已提交
168

K
Keith Donald 已提交
169 170
	@Test
	public void convertArrayToArrayAssignable() {
K
Keith Donald 已提交
171
		int[] result = conversionService.convert(new int[] { 1, 2, 3 }, int[].class);
K
Keith Donald 已提交
172 173 174 175
		assertEquals(1, result[0]);
		assertEquals(2, result[1]);
		assertEquals(3, result[2]);
	}
K
Keith Donald 已提交
176

K
polish  
Keith Donald 已提交
177 178
	@Test
	public void convertArrayToListInterface() {
K
polish  
Keith Donald 已提交
179 180
		conversionService.addGenericConverter(Object[].class, Collection.class, new ArrayToCollectionConverter(
				conversionService));
K
Keith Donald 已提交
181
		List<?> result = conversionService.convert(new String[] { "1", "2", "3" }, List.class);
K
Keith Donald 已提交
182 183 184 185 186
		assertEquals("1", result.get(0));
		assertEquals("2", result.get(1));
		assertEquals("3", result.get(2));
	}

K
polish  
Keith Donald 已提交
187
	public List<Integer> genericList = new ArrayList<Integer>();
K
polish  
Keith Donald 已提交
188 189 190

	@Test
	public void convertArrayToListGenericTypeConversion() throws Exception {
K
polish  
Keith Donald 已提交
191 192
		conversionService.addGenericConverter(Object[].class, Collection.class, new ArrayToCollectionConverter(
				conversionService));
K
Keith Donald 已提交
193 194
		conversionService.addConverterFactory(new StringToNumberConverterFactory());
		List<Integer> result = (List<Integer>) conversionService.convert(new String[] { "1", "2", "3" }, TypeDescriptor
K
Keith Donald 已提交
195
				.valueOf(String[].class), new TypeDescriptor(getClass().getDeclaredField("genericList")));
K
Keith Donald 已提交
196 197 198 199
		assertEquals(new Integer("1"), result.get(0));
		assertEquals(new Integer("2"), result.get(1));
		assertEquals(new Integer("3"), result.get(2));
	}
K
polish  
Keith Donald 已提交
200 201 202

	@Test
	public void convertArrayToListImpl() {
K
polish  
Keith Donald 已提交
203 204
		conversionService.addGenericConverter(Object[].class, Collection.class, new ArrayToCollectionConverter(
				conversionService));
K
Keith Donald 已提交
205
		LinkedList<?> result = conversionService.convert(new String[] { "1", "2", "3" }, LinkedList.class);
K
Keith Donald 已提交
206 207 208 209 210
		assertEquals("1", result.get(0));
		assertEquals("2", result.get(1));
		assertEquals("3", result.get(2));
	}

K
Keith Donald 已提交
211
	@Test(expected = ConversionFailedException.class)
K
polish  
Keith Donald 已提交
212
	public void convertArrayToAbstractList() {
K
polish  
Keith Donald 已提交
213 214
		conversionService.addGenericConverter(Object[].class, Collection.class, new ArrayToCollectionConverter(
				conversionService));
K
Keith Donald 已提交
215
		conversionService.convert(new String[] { "1", "2", "3" }, AbstractList.class);
K
Keith Donald 已提交
216 217
	}

K
polish  
Keith Donald 已提交
218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
	@Test
	public void convertArrayToMap() {
		conversionService.addGenericConverter(Object[].class, Map.class, new ArrayToMapConverter(conversionService));
		Map result = conversionService.convert(new String[] { "foo=bar", "bar=baz", "baz=boop" }, Map.class);
		assertEquals("bar", result.get("foo"));
		assertEquals("baz", result.get("bar"));
		assertEquals("boop", result.get("baz"));
	}

	@Test
	public void convertArrayToMapWithElementConversion() throws Exception {
		conversionService.addGenericConverter(Object[].class, Map.class, new ArrayToMapConverter(conversionService));
		conversionService.addConverterFactory(new StringToNumberConverterFactory());
		conversionService.addConverterFactory(new StringToEnumConverterFactory());
		Map result = (Map) conversionService.convert(new String[] { "1=BAR", "2=BAZ" }, TypeDescriptor
				.valueOf(String[].class), new TypeDescriptor(getClass().getField("genericMap")));
		assertEquals(FooEnum.BAR, result.get(1));
		assertEquals(FooEnum.BAZ, result.get(2));
	}

K
polish  
Keith Donald 已提交
238
	@Test
K
Keith Donald 已提交
239
	public void convertArrayToString() {
K
polish  
Keith Donald 已提交
240 241
		conversionService.addGenericConverter(Object[].class, Object.class, new ArrayToObjectConverter(
				conversionService));
K
Keith Donald 已提交
242 243 244 245 246 247
		String result = conversionService.convert(new String[] { "1", "2", "3" }, String.class);
		assertEquals("1,2,3", result);
	}

	@Test
	public void convertArrayToStringWithElementConversion() {
K
polish  
Keith Donald 已提交
248 249
		conversionService.addGenericConverter(Object[].class, Object.class, new ArrayToObjectConverter(
				conversionService));
K
Keith Donald 已提交
250 251 252 253 254 255 256
		conversionService.addConverter(new ObjectToStringConverter());
		String result = conversionService.convert(new Integer[] { 1, 2, 3 }, String.class);
		assertEquals("1,2,3", result);
	}

	@Test
	public void convertEmptyArrayToString() {
K
polish  
Keith Donald 已提交
257 258
		conversionService.addGenericConverter(Object[].class, Object.class, new ArrayToObjectConverter(
				conversionService));
K
Keith Donald 已提交
259 260 261
		String result = conversionService.convert(new String[0], String.class);
		assertEquals("", result);
	}
K
Keith Donald 已提交
262

K
Keith Donald 已提交
263 264
	@Test
	public void convertArrayToObject() {
K
polish  
Keith Donald 已提交
265 266
		conversionService.addGenericConverter(Object[].class, Object.class, new ArrayToObjectConverter(
				conversionService));
K
Keith Donald 已提交
267 268 269 270 271 272 273
		Object[] array = new Object[] { 3L };
		Object result = conversionService.convert(array, Object.class);
		assertEquals(3L, result);
	}

	@Test
	public void convertArrayToObjectWithElementConversion() {
K
polish  
Keith Donald 已提交
274 275
		conversionService.addGenericConverter(Object[].class, Object.class, new ArrayToObjectConverter(
				conversionService));
K
Keith Donald 已提交
276 277 278 279 280 281 282 283
		conversionService.addConverterFactory(new StringToNumberConverterFactory());
		String[] array = new String[] { "3" };
		Integer result = conversionService.convert(array, Integer.class);
		assertEquals(new Integer(3), result);
	}

	@Test
	public void convertCollectionToArray() {
K
polish  
Keith Donald 已提交
284 285
		conversionService.addGenericConverter(Collection.class, Object[].class, new CollectionToArrayConverter(
				conversionService));
K
polish  
Keith Donald 已提交
286
		List<String> list = new ArrayList<String>();
K
Keith Donald 已提交
287 288 289
		list.add("1");
		list.add("2");
		list.add("3");
K
Keith Donald 已提交
290
		String[] result = conversionService.convert(list, String[].class);
K
Keith Donald 已提交
291 292 293 294 295
		assertEquals("1", result[0]);
		assertEquals("2", result[1]);
		assertEquals("3", result[2]);
	}

K
polish  
Keith Donald 已提交
296
	@Test
K
Keith Donald 已提交
297
	public void convertCollectionToArrayWithElementConversion() {
K
polish  
Keith Donald 已提交
298 299
		conversionService.addGenericConverter(Collection.class, Object[].class, new CollectionToArrayConverter(
				conversionService));
K
Keith Donald 已提交
300
		conversionService.addConverterFactory(new StringToNumberConverterFactory());
K
polish  
Keith Donald 已提交
301
		List<String> list = new ArrayList<String>();
K
Keith Donald 已提交
302 303 304
		list.add("1");
		list.add("2");
		list.add("3");
K
Keith Donald 已提交
305
		Integer[] result = conversionService.convert(list, Integer[].class);
K
Keith Donald 已提交
306 307 308 309 310
		assertEquals(new Integer(1), result[0]);
		assertEquals(new Integer(2), result[1]);
		assertEquals(new Integer(3), result[2]);
	}

311 312
	@Test
	public void convertCollectionToCollection() throws Exception {
K
polish  
Keith Donald 已提交
313 314
		conversionService.addGenericConverter(Collection.class, Collection.class, new CollectionToCollectionConverter(
				conversionService));
K
Keith Donald 已提交
315
		conversionService.addConverterFactory(new StringToNumberConverterFactory());
316 317 318 319
		Set<String> foo = new LinkedHashSet<String>();
		foo.add("1");
		foo.add("2");
		foo.add("3");
320
		List<Integer> bar = (List<Integer>) conversionService.convert(foo, TypeDescriptor.valueOf(LinkedHashSet.class),
K
Keith Donald 已提交
321
				new TypeDescriptor(getClass().getField("genericList")));
322 323 324 325
		assertEquals(new Integer(1), bar.get(0));
		assertEquals(new Integer(2), bar.get(1));
		assertEquals(new Integer(3), bar.get(2));
	}
K
Keith Donald 已提交
326

327 328
	@Test
	public void convertCollectionToCollectionNull() throws Exception {
K
polish  
Keith Donald 已提交
329 330
		conversionService.addGenericConverter(Collection.class, Collection.class, new CollectionToCollectionConverter(
				conversionService));
K
Keith Donald 已提交
331 332
		List<Integer> bar = (List<Integer>) conversionService.convert(null,
				TypeDescriptor.valueOf(LinkedHashSet.class), new TypeDescriptor(getClass().getField("genericList")));
333 334 335 336 337
		assertNull(bar);
	}

	@Test
	public void convertCollectionToCollectionNotGeneric() throws Exception {
K
polish  
Keith Donald 已提交
338 339
		conversionService.addGenericConverter(Collection.class, Collection.class, new CollectionToCollectionConverter(
				conversionService));
340 341 342 343 344 345 346 347 348 349 350
		conversionService.addConverterFactory(new StringToNumberConverterFactory());
		Set<String> foo = new LinkedHashSet<String>();
		foo.add("1");
		foo.add("2");
		foo.add("3");
		List bar = (List) conversionService.convert(foo, TypeDescriptor.valueOf(LinkedHashSet.class), TypeDescriptor
				.valueOf(List.class));
		assertEquals("1", bar.get(0));
		assertEquals("2", bar.get(1));
		assertEquals("3", bar.get(2));
	}
K
Keith Donald 已提交
351

K
Keith Donald 已提交
352 353
	@Test
	public void convertCollectionToCollectionSpecialCaseSourceImpl() throws Exception {
K
polish  
Keith Donald 已提交
354 355
		conversionService.addGenericConverter(Collection.class, Collection.class, new CollectionToCollectionConverter(
				conversionService));
K
Keith Donald 已提交
356 357 358 359 360 361 362 363 364 365 366 367 368 369
		conversionService.addConverterFactory(new StringToNumberConverterFactory());
		Map map = new LinkedHashMap();
		map.put("1", "1");
		map.put("2", "2");
		map.put("3", "3");
		Collection values = map.values();
		List<Integer> bar = (List<Integer>) conversionService.convert(values,
				TypeDescriptor.valueOf(values.getClass()), new TypeDescriptor(getClass().getField("genericList")));
		assertEquals(3, bar.size());
		assertEquals(new Integer(1), bar.get(0));
		assertEquals(new Integer(2), bar.get(1));
		assertEquals(new Integer(3), bar.get(2));
	}

K
polish  
Keith Donald 已提交
370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398
	@Test
	public void convertCollectionToMap() {
		conversionService.addGenericConverter(Collection.class, Map.class, new CollectionToMapConverter(
				conversionService));
		List<String> list = new ArrayList<String>();
		list.add("foo=bar");
		list.add("bar=baz");
		list.add("baz=boop");
		Map result = conversionService.convert(list, Map.class);
		assertEquals("bar", result.get("foo"));
		assertEquals("baz", result.get("bar"));
		assertEquals("boop", result.get("baz"));
	}

	@Test
	public void convertCollectionToMapWithElementConversion() throws Exception {
		conversionService.addGenericConverter(Collection.class, Map.class, new CollectionToMapConverter(
				conversionService));
		conversionService.addConverterFactory(new StringToNumberConverterFactory());
		conversionService.addConverterFactory(new StringToEnumConverterFactory());
		List<String> list = new ArrayList<String>();
		list.add("1=BAR");
		list.add("2=BAZ");
		Map result = (Map) conversionService.convert(list, TypeDescriptor.valueOf(List.class), new TypeDescriptor(
				getClass().getField("genericMap")));
		assertEquals(FooEnum.BAR, result.get(1));
		assertEquals(FooEnum.BAZ, result.get(2));
	}

K
Keith Donald 已提交
399 400
	@Test
	public void convertCollectionToString() {
K
polish  
Keith Donald 已提交
401 402
		conversionService.addGenericConverter(Collection.class, Object.class, new CollectionToObjectConverter(
				conversionService));
K
Keith Donald 已提交
403 404 405 406 407 408 409
		List<String> list = Arrays.asList(new String[] { "foo", "bar" });
		String result = conversionService.convert(list, String.class);
		assertEquals("foo,bar", result);
	}

	@Test
	public void convertCollectionToStringWithElementConversion() throws Exception {
K
polish  
Keith Donald 已提交
410 411
		conversionService.addGenericConverter(Collection.class, Object.class, new CollectionToObjectConverter(
				conversionService));
K
Keith Donald 已提交
412 413
		conversionService.addConverter(new ObjectToStringConverter());
		List<Integer> list = Arrays.asList(new Integer[] { 3, 5 });
K
Keith Donald 已提交
414 415
		String result = (String) conversionService.convert(list,
				new TypeDescriptor(getClass().getField("genericList")), TypeDescriptor.valueOf(String.class));
K
Keith Donald 已提交
416 417 418 419 420
		assertEquals("3,5", result);
	}

	@Test
	public void convertCollectionToObject() {
K
polish  
Keith Donald 已提交
421 422
		conversionService.addGenericConverter(Collection.class, Object.class, new CollectionToObjectConverter(
				conversionService));
K
Keith Donald 已提交
423 424 425 426 427 428 429
		List<Long> list = Collections.singletonList(3L);
		Long result = conversionService.convert(list, Long.class);
		assertEquals(new Long(3), result);
	}

	@Test
	public void convertCollectionToObjectWithElementConversion() {
K
polish  
Keith Donald 已提交
430 431
		conversionService.addGenericConverter(Collection.class, Object.class, new CollectionToObjectConverter(
				conversionService));
K
Keith Donald 已提交
432 433 434 435 436 437
		conversionService.addConverterFactory(new StringToNumberConverterFactory());
		List<String> list = Collections.singletonList("3");
		Integer result = conversionService.convert(list, Integer.class);
		assertEquals(new Integer(3), result);
	}

K
polish  
Keith Donald 已提交
438 439 440 441
	public Map<Integer, FooEnum> genericMap = new HashMap<Integer, FooEnum>();

	@Test
	public void convertMapToMap() throws Exception {
K
polish  
Keith Donald 已提交
442 443 444
		conversionService.addGenericConverter(Map.class, Map.class, new MapToMapConverter(conversionService));
		conversionService.addConverterFactory(new StringToNumberConverterFactory());
		conversionService.addConverterFactory(new StringToEnumConverterFactory());
K
polish  
Keith Donald 已提交
445 446 447
		Map<String, String> foo = new HashMap<String, String>();
		foo.put("1", "BAR");
		foo.put("2", "BAZ");
K
Keith Donald 已提交
448 449
		Map<String, FooEnum> map = (Map<String, FooEnum>) conversionService.convert(foo, TypeDescriptor
				.valueOf(Map.class), new TypeDescriptor(getClass().getField("genericMap")));
K
Keith Donald 已提交
450 451
		assertEquals(FooEnum.BAR, map.get(1));
		assertEquals(FooEnum.BAZ, map.get(2));
K
polish  
Keith Donald 已提交
452 453
	}

K
Keith Donald 已提交
454 455
	@Test
	public void convertMapToStringArray() throws Exception {
K
polish  
Keith Donald 已提交
456
		conversionService.addGenericConverter(Map.class, Object[].class, new MapToArrayConverter(conversionService));
K
Keith Donald 已提交
457 458 459 460 461 462 463 464 465 466
		Map<String, String> foo = new LinkedHashMap<String, String>();
		foo.put("1", "BAR");
		foo.put("2", "BAZ");
		String[] result = conversionService.convert(foo, String[].class);
		assertEquals("1=BAR", result[0]);
		assertEquals("2=BAZ", result[1]);
	}

	@Test
	public void convertMapToStringArrayWithElementConversion() throws Exception {
K
polish  
Keith Donald 已提交
467 468
		conversionService.addGenericConverter(Map.class, Object[].class, new MapToArrayConverter(conversionService));
		conversionService.addConverter(new ObjectToStringConverter());
K
Keith Donald 已提交
469 470 471 472 473 474 475 476 477
		Map<Integer, FooEnum> foo = new LinkedHashMap<Integer, FooEnum>();
		foo.put(1, FooEnum.BAR);
		foo.put(2, FooEnum.BAZ);
		String[] result = (String[]) conversionService.convert(foo, new TypeDescriptor(getClass()
				.getField("genericMap")), TypeDescriptor.valueOf(String[].class));
		assertEquals("1=BAR", result[0]);
		assertEquals("2=BAZ", result[1]);
	}

K
polish  
Keith Donald 已提交
478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523
	@Test
	public void convertMapToString() {
		conversionService.addGenericConverter(Map.class, Object.class, new MapToObjectConverter(conversionService));
		Map<String, String> foo = new LinkedHashMap<String, String>();
		foo.put("1", "BAR");
		foo.put("2", "BAZ");
		String result = conversionService.convert(foo, String.class);
		assertEquals("1=BAR 2=BAZ", result);
	}

	@Test
	public void convertMapToStringWithConversion() throws Exception {
		conversionService.addGenericConverter(Map.class, Object.class, new MapToObjectConverter(conversionService));
		Map<Integer, FooEnum> foo = new LinkedHashMap<Integer, FooEnum>();
		foo.put(1, FooEnum.BAR);
		foo.put(2, FooEnum.BAZ);
		conversionService.addConverter(new ObjectToStringConverter());
		String result = (String) conversionService.convert(foo, new TypeDescriptor(getClass().getField("genericMap")),
				TypeDescriptor.valueOf(String.class));
		assertEquals("1=BAR 2=BAZ", result);
	}

	@Test
	public void convertMapToObject() {
		conversionService.addGenericConverter(Map.class, Object.class, new MapToObjectConverter(conversionService));
		Map<Long, Long> foo = new LinkedHashMap<Long, Long>();
		foo.put(1L, 1L);
		foo.put(2L, 2L);
		Long result = conversionService.convert(foo, Long.class);
		assertEquals(new Long(1), result);
	}

	public Map<Long, Long> genericMap2 = new HashMap<Long, Long>();

	@Test
	public void convertMapToObjectWithConversion() throws Exception {
		conversionService.addGenericConverter(Map.class, Object.class, new MapToObjectConverter(conversionService));
		conversionService.addConverterFactory(new NumberToNumberConverterFactory());
		Map<Long, Long> foo = new LinkedHashMap<Long, Long>();
		foo.put(1L, 1L);
		foo.put(2L, 2L);
		Integer result = (Integer) conversionService.convert(foo,
				new TypeDescriptor(getClass().getField("genericMap2")), TypeDescriptor.valueOf(Integer.class));
		assertEquals(new Integer(1), result);
	}

K
Keith Donald 已提交
524
	@Test
K
Keith Donald 已提交
525
	public void convertStringToArray() {
K
polish  
Keith Donald 已提交
526 527
		conversionService.addGenericConverter(Object.class, Object[].class, new ObjectToArrayConverter(
				conversionService));
K
Keith Donald 已提交
528 529 530 531 532
		String[] result = conversionService.convert("1,2,3", String[].class);
		assertEquals(3, result.length);
		assertEquals("1", result[0]);
		assertEquals("2", result[1]);
		assertEquals("3", result[2]);
K
Keith Donald 已提交
533 534 535
	}

	@Test
K
Keith Donald 已提交
536
	public void convertStringToArrayWithElementConversion() {
K
polish  
Keith Donald 已提交
537 538
		conversionService.addGenericConverter(Object.class, Object[].class, new ObjectToArrayConverter(
				conversionService));
K
Keith Donald 已提交
539 540 541 542 543 544
		conversionService.addConverterFactory(new StringToNumberConverterFactory());
		Integer[] result = conversionService.convert("1,2,3", Integer[].class);
		assertEquals(3, result.length);
		assertEquals(new Integer(1), result[0]);
		assertEquals(new Integer(2), result[1]);
		assertEquals(new Integer(3), result[2]);
K
Keith Donald 已提交
545 546 547
	}

	@Test
K
Keith Donald 已提交
548
	public void convertEmptyStringToArray() {
K
polish  
Keith Donald 已提交
549 550
		conversionService.addGenericConverter(Object.class, Object[].class, new ObjectToArrayConverter(
				conversionService));
K
Keith Donald 已提交
551 552
		String[] result = conversionService.convert("", String[].class);
		assertEquals(0, result.length);
K
Keith Donald 已提交
553 554
	}

K
polish  
Keith Donald 已提交
555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573
	@Test
	public void convertObjectToArray() {
		conversionService.addGenericConverter(Object.class, Object[].class, new ObjectToArrayConverter(
				conversionService));
		Object[] result = conversionService.convert(3L, Object[].class);
		assertEquals(1, result.length);
		assertEquals(3L, result[0]);
	}

	@Test
	public void convertObjectToArrayWithElementConversion() {
		conversionService.addGenericConverter(Object.class, Object[].class, new ObjectToArrayConverter(
				conversionService));
		conversionService.addConverterFactory(new NumberToNumberConverterFactory());
		Integer[] result = conversionService.convert(3L, Integer[].class);
		assertEquals(1, result.length);
		assertEquals(new Integer(3), result[0]);
	}

K
Keith Donald 已提交
574
	@Test
K
Keith Donald 已提交
575
	public void convertStringToCollection() {
K
polish  
Keith Donald 已提交
576 577
		conversionService.addGenericConverter(Object.class, Collection.class, new ObjectToCollectionConverter(
				conversionService));
K
Keith Donald 已提交
578 579 580 581 582
		List result = conversionService.convert("1,2,3", List.class);
		assertEquals(3, result.size());
		assertEquals("1", result.get(0));
		assertEquals("2", result.get(1));
		assertEquals("3", result.get(2));
K
Keith Donald 已提交
583 584
	}

K
Keith Donald 已提交
585
	@Test
K
Keith Donald 已提交
586
	public void convertStringToCollectionWithElementConversion() throws Exception {
K
polish  
Keith Donald 已提交
587 588
		conversionService.addGenericConverter(Object.class, Collection.class, new ObjectToCollectionConverter(
				conversionService));
K
Keith Donald 已提交
589
		conversionService.addConverterFactory(new StringToNumberConverterFactory());
K
Keith Donald 已提交
590 591
		List result = (List) conversionService.convert("1,2,3", TypeDescriptor.valueOf(String.class),
				new TypeDescriptor(getClass().getField("genericList")));
K
Keith Donald 已提交
592 593 594 595
		assertEquals(3, result.size());
		assertEquals(new Integer(1), result.get(0));
		assertEquals(new Integer(2), result.get(1));
		assertEquals(new Integer(3), result.get(2));
K
Keith Donald 已提交
596 597 598
	}

	@Test
K
Keith Donald 已提交
599
	public void convertEmptyStringToCollection() {
K
polish  
Keith Donald 已提交
600 601 602 603
		conversionService.addGenericConverter(Object.class, Collection.class, new ObjectToCollectionConverter(
				conversionService));
		Collection result = conversionService.convert("", Collection.class);
		assertEquals(0, result.size());
K
Keith Donald 已提交
604
	}
K
Keith Donald 已提交
605

K
Keith Donald 已提交
606
	@Test
K
Keith Donald 已提交
607
	public void convertObjectToCollection() {
K
polish  
Keith Donald 已提交
608 609
		conversionService.addGenericConverter(Object.class, Collection.class, new ObjectToCollectionConverter(
				conversionService));
K
Keith Donald 已提交
610 611 612
		List<String> result = (List<String>) conversionService.convert(3L, List.class);
		assertEquals(1, result.size());
		assertEquals(3L, result.get(0));
K
Keith Donald 已提交
613
	}
K
Keith Donald 已提交
614

K
Keith Donald 已提交
615
	@Test
K
Keith Donald 已提交
616
	public void convertObjectToCollectionWithElementConversion() throws Exception {
K
polish  
Keith Donald 已提交
617 618
		conversionService.addGenericConverter(Object.class, Collection.class, new ObjectToCollectionConverter(
				conversionService));
K
Keith Donald 已提交
619 620 621 622 623
		conversionService.addConverterFactory(new NumberToNumberConverterFactory());
		List<Integer> result = (List<Integer>) conversionService.convert(3L, TypeDescriptor.valueOf(Long.class),
				new TypeDescriptor(getClass().getField("genericList")));
		assertEquals(1, result.size());
		assertEquals(new Integer(3), result.get(0));
K
Keith Donald 已提交
624
	}
K
Keith Donald 已提交
625

K
Keith Donald 已提交
626 627
	@Test
	public void convertStringToMap() {
K
polish  
Keith Donald 已提交
628
		conversionService.addGenericConverter(Object.class, Map.class, new ObjectToMapConverter(conversionService));
K
Keith Donald 已提交
629 630 631 632 633 634 635 636
		Map result = conversionService.convert("foo=bar bar=baz baz=boop", Map.class);
		assertEquals("bar", result.get("foo"));
		assertEquals("baz", result.get("bar"));
		assertEquals("boop", result.get("baz"));
	}

	@Test
	public void convertStringToMapWithElementConversion() throws Exception {
K
polish  
Keith Donald 已提交
637
		conversionService.addGenericConverter(Object.class, Map.class, new ObjectToMapConverter(conversionService));
K
Keith Donald 已提交
638 639 640 641
		conversionService.addConverterFactory(new StringToNumberConverterFactory());
		conversionService.addConverterFactory(new StringToEnumConverterFactory());
		Map result = (Map) conversionService.convert("1=BAR 2=BAZ", TypeDescriptor.valueOf(String.class),
				new TypeDescriptor(getClass().getField("genericMap")));
K
Keith Donald 已提交
642 643 644 645
		assertEquals(FooEnum.BAR, result.get(1));
		assertEquals(FooEnum.BAZ, result.get(2));
	}

646
	@Test
K
polish  
Keith Donald 已提交
647 648 649 650 651
	public void convertObjectToMap() {
		conversionService.addGenericConverter(Object.class, Map.class, new ObjectToMapConverter(conversionService));
		Map result = conversionService.convert("foo=bar bar=baz", Map.class);
		assertEquals("bar", result.get("foo"));
		assertEquals("baz", result.get("bar"));
652 653 654
	}

	@Test
K
polish  
Keith Donald 已提交
655 656
	public void convertObjectToMapWithConversion() throws Exception {
		conversionService.addGenericConverter(Object.class, Map.class, new ObjectToMapConverter(conversionService));
657
		conversionService.addConverterFactory(new NumberToNumberConverterFactory());
K
polish  
Keith Donald 已提交
658 659 660
		Map result = (Map) conversionService.convert(1L, TypeDescriptor.valueOf(Integer.class), new TypeDescriptor(
				getClass().getField("genericMap2")));
		assertEquals(new Long(1), result.get(1L));
661 662
	}

K
Keith Donald 已提交
663 664
	@Test
	public void genericConverterDelegatingBackToConversionServiceConverterNotFound() {
K
polish  
Keith Donald 已提交
665 666
		conversionService.addGenericConverter(Object.class, Object[].class, new ObjectToArrayConverter(
				conversionService));
K
Keith Donald 已提交
667
		try {
K
Keith Donald 已提交
668
			conversionService.convert("1", Integer[].class);
K
Keith Donald 已提交
669 670 671 672
		} catch (ConversionFailedException e) {
			assertTrue(e.getCause() instanceof ConverterNotFoundException);
		}
	}
K
Keith Donald 已提交
673

K
Keith Donald 已提交
674 675 676
	@Test
	public void parent() {
		GenericConversionService parent = new GenericConversionService();
K
Keith Donald 已提交
677 678
		conversionService.setParent(parent);
		assertFalse(conversionService.canConvert(String.class, Integer.class));
K
Keith Donald 已提交
679
		try {
K
Keith Donald 已提交
680
			conversionService.convert("3", Integer.class);
K
Keith Donald 已提交
681
		} catch (ConverterNotFoundException e) {
K
Keith Donald 已提交
682

K
Keith Donald 已提交
683 684 685
		}
	}

K
Keith Donald 已提交
686
	public static enum FooEnum {
K
polish  
Keith Donald 已提交
687
		BAR, BAZ
K
Keith Donald 已提交
688 689
	}

J
Juergen Hoeller 已提交
690
}