package org.jboss.resteasy.test.util;

import org.jboss.resteasy.util.TypeConverter;
import org.junit.Assert;
import org.junit.Test;

import java.util.Date;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;


/**
 * @tpSubChapter Util tests
 * @tpChapter Unit tests
 * @tpTestCaseDetails Test for {@link org.jboss.resteasy.util.TypeConverter#getType(Class, String)}.
 * @tpSince RESTEasy 3.0.16
 */
public class TypeConverterTest {

    private static final String CONVERSION_ERROR = "Wrong type of converted value";

    /**
     * @tpTestDetails Boolean conversion.
     * @tpSince RESTEasy 3.0.16
     */
    @Test
    public void testBooleanTypes() {
        assertTrue(CONVERSION_ERROR, TypeConverter.getType(Boolean.class, "T"));
        assertTrue(CONVERSION_ERROR, TypeConverter.getType(Boolean.class, "t"));
        assertTrue(CONVERSION_ERROR, TypeConverter.getType(Boolean.class, "Y"));
        assertTrue(CONVERSION_ERROR, TypeConverter.getType(Boolean.class, "y"));
        assertTrue(CONVERSION_ERROR, TypeConverter.getType(Boolean.class, "Yes"));
        assertTrue(CONVERSION_ERROR, TypeConverter.getType(Boolean.class, "YES"));
        assertTrue(CONVERSION_ERROR, TypeConverter.getType(Boolean.class, "TRUE"));
        assertTrue(CONVERSION_ERROR, TypeConverter.getType(Boolean.class, "true"));

        assertFalse(CONVERSION_ERROR, TypeConverter.getType(Boolean.class, "F"));
        assertFalse(CONVERSION_ERROR, TypeConverter.getType(Boolean.class, "f"));
        assertFalse(CONVERSION_ERROR, TypeConverter.getType(Boolean.class, "N"));
        assertFalse(CONVERSION_ERROR, TypeConverter.getType(Boolean.class, "n"));
        assertFalse(CONVERSION_ERROR, TypeConverter.getType(Boolean.class, "No"));
        assertFalse(CONVERSION_ERROR, TypeConverter.getType(Boolean.class, "No"));
        assertFalse(CONVERSION_ERROR, TypeConverter.getType(Boolean.class, "FALSE"));
        assertFalse(CONVERSION_ERROR, TypeConverter.getType(Boolean.class, "False"));
    }

    /**
     * @tpTestDetails Integer and int conversion.
     * @tpSince RESTEasy 3.0.16
     */
    @Test
    public void testIntegerTypes() {
        assertEquals(CONVERSION_ERROR, 11, (int) TypeConverter.getType(int.class, "11"));
        assertEquals(CONVERSION_ERROR, 11, (int) TypeConverter.getType(Integer.class, "11"));
    }

    /**
     * @tpTestDetails Double conversion.
     * @tpSince RESTEasy 3.0.16
     */
    @Test
    public void testDoubleTypes() {
        assertEquals(CONVERSION_ERROR, 20.15d, TypeConverter.getType(double.class, "20.15"), 0);
        assertEquals(CONVERSION_ERROR, 20.15d, TypeConverter.getType(Double.class, "20.15"), 0);
    }

    /**
     * @tpTestDetails Float conversion.
     * @tpSince RESTEasy 3.0.16
     */
    @Test
    public void testFloatTypes() {
        assertEquals(CONVERSION_ERROR, 23.44f, TypeConverter.getType(float.class, "23.44"), 0);
        assertEquals(CONVERSION_ERROR, 23.44f, TypeConverter.getType(Float.class, "23.44"), 0);
    }

    /**
     * @tpTestDetails Long conversion.
     * @tpSince RESTEasy 3.0.16
     */
    @Test
    public void testLongTypes() {
        assertEquals(CONVERSION_ERROR, 23L, (long) TypeConverter.getType(long.class, "23"));
        assertEquals(CONVERSION_ERROR, 23L, (long) TypeConverter.getType(Long.class, "23"));
    }

   /**
    * @tpTestDetails character conversion.
    */
   @Test
    public void testCharacterTypes() {
        assertEquals(CONVERSION_ERROR, 'A', TypeConverter.getType(Character.class, "A").charValue());
        assertEquals(CONVERSION_ERROR, 'A', (char)TypeConverter.getType(char.class, "A"));
    }

    /**
     * @tpTestDetails Date conversion.
     * @tpSince RESTEasy 3.0.16
     */
    @Test
    public void testDate() {
        try {
            TypeConverter.getType(Date.class, "07/04/2008");
            Assert.fail("Exception was excepted.");
        } catch (IllegalArgumentException e) {
            // ok
        }
    }

}
