package kr.kangwoo.util;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class NumberUtilsTests {

	@Before
	public void setUp() throws Exception {
	}

	@After
	public void tearDown() throws Exception {
	}

	@Test
	public void testToShort() {
		Assert.assertEquals(NumberUtils.toShort(null, (short)0), 0);
		Assert.assertEquals(NumberUtils.toShort("NaN", (short)0), 0);
		Assert.assertEquals(NumberUtils.toShort("1234", (short)0), 1234);
	}

	@Test
	public void testToShortObjectString() {
		Assert.assertNull(NumberUtils.toShortObject(null));
		Assert.assertNull(NumberUtils.toShortObject("NaN"));
		Assert.assertEquals(NumberUtils.toShortObject("1234"), 1234);
	}

	@Test
	public void testToShortObjectStringString() {
		Assert.assertNull(NumberUtils.toShortObject(null, null));
		Assert.assertNull(NumberUtils.toShortObject("NaN", null));
		Assert.assertEquals(NumberUtils.toShortObject("1,234", "#,###"), 1234);
		Assert.assertNull(NumberUtils.toShortObject("1234", "#,###"));
		Assert.assertEquals(NumberUtils.toShortObject("1234", null), 1234);
	}

	@Test
	public void testToInteger() {
		Assert.assertEquals(NumberUtils.toInteger(null, 0), 0);
		Assert.assertEquals(NumberUtils.toInteger("NaN", 0), 0);
		Assert.assertEquals(NumberUtils.toInteger("1234", 0), 1234);
	}

	@Test
	public void testToIntegerObjectString() {
		Assert.assertNull(NumberUtils.toIntegerObject(null));
		Assert.assertNull(NumberUtils.toIntegerObject("NaN"));
		Assert.assertEquals(NumberUtils.toIntegerObject("1234"), 1234);
	}

	@Test
	public void testToIntegerObjectStringString() {
		Assert.assertNull(NumberUtils.toIntegerObject(null, null));
		Assert.assertNull(NumberUtils.toIntegerObject("NaN", null));
		Assert.assertEquals(NumberUtils.toIntegerObject("1,234", "#,###"), 1234);
		Assert.assertNull(NumberUtils.toIntegerObject("1234", "#,###"));
		Assert.assertEquals(NumberUtils.toIntegerObject("1234", null), 1234);
	}

	@Test
	public void testToLong() {
		Assert.assertEquals(NumberUtils.toLong(null, 0), 0);
		Assert.assertEquals(NumberUtils.toLong("NaN", 0), 0);
		Assert.assertEquals(NumberUtils.toLong("1234", 0), 1234);
	}

	@Test
	public void testToLongObjectString() {
		Assert.assertNull(NumberUtils.toLongObject(null));
		Assert.assertNull(NumberUtils.toLongObject("NaN"));
		Assert.assertEquals(NumberUtils.toLongObject("1234"), 1234);
	}

	@Test
	public void testToLongObjectStringString() {
		Assert.assertNull(NumberUtils.toLongObject(null, null));
		Assert.assertNull(NumberUtils.toLongObject("NaN", null));
		Assert.assertEquals(NumberUtils.toLongObject("1,234", "#,###"), 1234);
		Assert.assertNull(NumberUtils.toLongObject("1234", "#,###"));
		Assert.assertEquals(NumberUtils.toLongObject("1234", null), 1234);
	}

	@Test
	public void testToFloat() {
		Assert.assertEquals(NumberUtils.toFloat(null, 0), 0.0);
		Assert.assertEquals(NumberUtils.toFloat("NaN", 0), 0.0);
		Assert.assertEquals(NumberUtils.toFloat("1234.5", 0), 1234.5);
	}

	@Test
	public void testToFloatObjectString() {
		Assert.assertNull(NumberUtils.toFloatObject(null));
		Assert.assertNull(NumberUtils.toFloatObject("AAA"));
		Assert.assertEquals(NumberUtils.toFloatObject("NaN"), Float.NaN);
		Assert.assertEquals(NumberUtils.toFloatObject("1234.5"), 1234.5);
	}
	 
	@Test
	public void testToFloatObjectStringString() {
		Assert.assertNull(NumberUtils.toFloatObject(null, null));
		Assert.assertNull(NumberUtils.toFloatObject("AAA", null));
		Assert.assertEquals(NumberUtils.toFloatObject("NaN", null), Float.NaN);
		Assert.assertEquals(NumberUtils.toFloatObject("1,234", "#,###"), 1234.0);
		Assert.assertEquals(NumberUtils.toFloatObject("1,234.5", "#,###.#"), 1234.5);
		Assert.assertNull(NumberUtils.toFloatObject("1234.5", "#,###"));
		Assert.assertEquals(NumberUtils.toFloatObject("1234.5", null), 1234.5);
	}

	@Test
	public void testToDouble() {
		Assert.assertEquals(NumberUtils.toDouble(null, 0), 0.0);
		Assert.assertEquals(NumberUtils.toDouble("NaN", 0), 0.0);
		Assert.assertEquals(NumberUtils.toDouble("1234.5", 0), 1234.5);
	}

	@Test
	public void testToDoubleObjectString() {
		Assert.assertNull(NumberUtils.toDoubleObject(null));
		Assert.assertNull(NumberUtils.toDoubleObject("AAA"));
		Assert.assertEquals(NumberUtils.toDoubleObject("NaN"), Double.NaN);
		Assert.assertEquals(NumberUtils.toDoubleObject("1234.5"), 1234.5);
	}

	@Test
	public void testToDoubleObjectStringString() {
		Assert.assertNull(NumberUtils.toDoubleObject(null, null));
		Assert.assertNull(NumberUtils.toDoubleObject("AAA", null));
		Assert.assertEquals(NumberUtils.toDoubleObject("NaN", null), Double.NaN);
		Assert.assertEquals(NumberUtils.toDoubleObject("1,234", "#,###"), 1234.0);
		Assert.assertEquals(NumberUtils.toDoubleObject("1,234.5", "#,###.#"), 1234.5);
		Assert.assertNull(NumberUtils.toDoubleObject("1234.5", "#,###"));
		Assert.assertEquals(NumberUtils.toDoubleObject("1234.5", null), 1234.5);
	}

	@Test
	public void testToHexString() {
		Assert.assertEquals(NumberUtils.toHexString(0xFFFFFFFF), "ffffffff");
		Assert.assertEquals(NumberUtils.toHexString(0x00000000), "00000000");
		Assert.assertEquals(NumberUtils.toHexString(0xFFFF), "0000ffff");
	}

	@Test
	public void testUnsignedInt() {
		Assert.assertEquals(NumberUtils.unsignedInt(0xFFFFFFF0), 0xFFFFFFF0L);
		Assert.assertEquals(NumberUtils.unsignedInt(0xFFFFFFFF), 0xFFFFFFFFL);
	}

	@Test
	public void testExtractW0() {
		Assert.assertEquals(NumberUtils.extractW0(0xFFFFFFFF00000000L), 0xFFFFFFFF);
		Assert.assertEquals(NumberUtils.extractW0(0x00000001FFFFFFFFL), 0x00000001);
		Assert.assertEquals(NumberUtils.extractW0(0x00000000FFFFFFFFL), 0x00000000);
	}

	@Test
	public void testExtractW1() {
		Assert.assertEquals(NumberUtils.extractW1(0x00000000FFFFFFFFL), 0xFFFFFFFF);
		Assert.assertEquals(NumberUtils.extractW1(0xFFFFFFFF00000000L), 0x00000000);
		Assert.assertEquals(NumberUtils.extractW1(0xFFFFFFFF00000001L), 0x00000001);
	}

	@Test
	public void testRotateLeftIntInt() {
		Assert.assertEquals(NumberUtils.rotateLeft(0xF2AB34CD, 4), 0x2AB34CDF);
		Assert.assertEquals(NumberUtils.rotateLeft(0xF2AB34CD, 8), 0xAB34CDF2);
		Assert.assertEquals(NumberUtils.rotateLeft(0xF2AB34CD, 16), 0x34CDF2AB);
		Assert.assertEquals(NumberUtils.rotateLeft(0x02AB34CD, 4), 0x2AB34CD0);
	}

	@Test
	public void testRotateRightIntInt() {
		Assert.assertEquals(NumberUtils.rotateRight(0xF2AB34CD, 4), 0xDF2AB34C);
		Assert.assertEquals(NumberUtils.rotateRight(0xF2AB34CD, 8), 0xCDF2AB34);
		Assert.assertEquals(NumberUtils.rotateRight(0xF2AB34CD, 16), 0x34CDF2AB);
		Assert.assertEquals(NumberUtils.rotateRight(0x02AB34CD, 4), 0xD02AB34C);
	}

	@Test
	public void testRotateLeftLongInt() {
		Assert.assertEquals(NumberUtils.rotateLeft(0xF2AB34CD00000000L, 4), 0x2AB34CD00000000FL);
		Assert.assertEquals(NumberUtils.rotateLeft(0xF2AB34CD00000000L, 8), 0xAB34CD00000000F2L);
		Assert.assertEquals(NumberUtils.rotateLeft(0xF2AB34CD00000000L, 16), 0x34CD00000000F2ABL);
		Assert.assertEquals(NumberUtils.rotateLeft(0x02AB34CD00000000L, 4), 0x2AB34CD000000000L);
	}

	@Test
	public void testRotateRightLongInt() {
		Assert.assertEquals(NumberUtils.rotateRight(0xF2AB34CD00000000L, 4), 0x0F2AB34CD0000000L);
		Assert.assertEquals(NumberUtils.rotateRight(0xF2AB34CD00000000L, 8), 0x00F2AB34CD000000L);
		Assert.assertEquals(NumberUtils.rotateRight(0xF2AB34CD00000000L, 16), 0x0000F2AB34CD0000L);
		Assert.assertEquals(NumberUtils.rotateRight(0x02AB34CD00000000L, 4), 0x002AB34CD0000000L);
	}

	@Test
	public void testHashCodeLong() {
	}

	@Test
	public void testHashCodeFloat() {
	}

	@Test
	public void testHashCodeDouble() {
	}

}

