/*******************************************************************************
 * Copyright (c) 2007 Matt Carter and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Matt Carter - initial API and implementation
 ******************************************************************************/

package org.eclipse.core.tests.internal.databinding.conversion;

import org.eclipse.core.internal.databinding.conversion.StringToCharacterConverter;

import junit.framework.TestCase;

/**
 * @since 1.1
 */
public class StringToCharacterConverterTest extends TestCase {

	private StringToCharacterConverter converter;
	private StringToCharacterConverter primitiveConverter;

	@Override
	protected void setUp() throws Exception {
		super.setUp();
		converter = StringToCharacterConverter.toCharacter(false);
		primitiveConverter = StringToCharacterConverter.toCharacter(true);
	}

	public void testConvertsToCharacter() throws Exception {
		Character value = Character.valueOf('X');
		Character result = (Character) converter.convert(Character
				.toString(value.charValue()));

		assertEquals(value, result);
	}

	public void testConvertsToCharacterPrimitive() throws Exception {
		Character value = Character.valueOf('Y');
		Character result = (Character) primitiveConverter.convert(String
				.valueOf(value.charValue()));
		assertEquals(value, result);
	}

	public void testFromTypeIsString() throws Exception {
		assertEquals(String.class, converter.getFromType());
	}

	public void testToTypeIsCharacter() throws Exception {
		assertEquals(Character.class, converter.getToType());
	}

	public void testToTypeIsCharacterPrimitive() throws Exception {
		assertEquals(Character.TYPE, primitiveConverter.getToType());
	}

	public void testReturnsNullBoxedTypeForEmptyString() throws Exception {
		assertNull(converter.convert(""));
	}

	public void testNullCharacterIsOK() throws Exception {
		assertNull(converter.convert(null));
	}

	public void testNullCharacterIsNotOKForPrimitive() throws Exception {
		try {
			primitiveConverter.convert(null);
			fail("exception should have been thrown");
		} catch (IllegalArgumentException e) {
		}
	}

	public void testThrowsIllegalArgumentExceptionIfAskedToConvertNonString()
			throws Exception {
		try {
			converter.convert(Integer.valueOf(1));
			fail("exception should have been thrown");
		} catch (IllegalArgumentException e) {
		}
	}
}