package kr.kangwoo.util.date;

import static org.junit.Assert.*;

import java.text.ParseException;
import java.util.Date;

import junit.framework.Assert;
import kr.kangwoo.util.DateUtils;
import kr.kangwoo.util.date.LunaDate;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class LunaDateTest {

	@Before
	public void setUp() throws Exception {
	}

	@After
	public void tearDown() throws Exception {
	}

	@Test
	public void testLunaDateIntIntIntBoolean() {
		LunaDate lDate = new LunaDate(1978, 7, 19, false);
		Assert.assertEquals(lDate.getYear(), 1978);
		Assert.assertEquals(lDate.getMonth(), 7);
		Assert.assertEquals(lDate.getDay(), 19);
		Assert.assertFalse(lDate.isLeaf());
	}

	@Test
	public void testLunaDateStringStringBoolean() {
		try {
			LunaDate lDate = new LunaDate("1978-07-19", "yyyy-MM-dd", false);
			Assert.assertEquals(lDate.getYear(), 1978);
			Assert.assertEquals(lDate.getMonth(), 7);
			Assert.assertEquals(lDate.getDay(), 19);
			Assert.assertFalse(lDate.isLeaf());
		} catch (ParseException e) {
			Assert.fail(e.getMessage());
		}
	}

	@Test
	public void testLunaDateStringBoolean() {
		try {
			LunaDate lDate = new LunaDate("1978-07-19", false);
			Assert.assertEquals(lDate.getYear(), 1978);
			Assert.assertEquals(lDate.getMonth(), 7);
			Assert.assertEquals(lDate.getDay(), 19);
			Assert.assertFalse(lDate.isLeaf());
			
		} catch (ParseException e) {
			Assert.fail(e.getMessage());
		}
	}

	@Test
	public void testToLunaDateIntIntInt() {
		LunaDate lDate = new LunaDate(1978, 6, 15, false);
		LunaDate lDate2 = LunaDate.toLunaDate(1978, 7, 19);

		Assert.assertEquals(lDate.getYear(), lDate2.getYear());
		Assert.assertEquals(lDate.getMonth(), lDate2.getMonth());
		Assert.assertEquals(lDate.getDay(), lDate2.getDay());
		Assert.assertEquals(lDate.isLeaf(), lDate2.isLeaf());
	}

	@Test
	public void testToLunaDate() {
		// Nothing
	}

	@Test
	public void testToSolarDate() {
		try {
			LunaDate lDate = new LunaDate("1978-06-15", false);
			Date sDate = DateUtils.toDate("1978-07-19");
			DateUtils.isSameDay(lDate.toSolarDate(), sDate);
		} catch (Exception e) {
			Assert.fail(e.getMessage());
		}
	}


	@Test
	public void testAddDays() {
		LunaDate lDate = new LunaDate(1978, 6, 15, false);
		lDate.addDays(100);
		Assert.assertEquals(lDate.getYear(), 1978);
		Assert.assertEquals(lDate.getMonth(), 9);
		Assert.assertEquals(lDate.getDay(), 26);
		Assert.assertFalse(lDate.isLeaf());
	}

	@Test
	public void testAfterDays() {
		LunaDate lDate = new LunaDate(1978, 6, 15, false);
		lDate.addDays(100);
		Assert.assertEquals(lDate.getYear(), 1978);
		Assert.assertEquals(lDate.getMonth(), 9);
		Assert.assertEquals(lDate.getDay(), 26);
		Assert.assertFalse(lDate.isLeaf());
	}

	@Test
	public void testBeforeDays() {
		LunaDate lDate = new LunaDate(1978, 9, 26, false);
		lDate.beforeDays(100);
		Assert.assertEquals(lDate.getYear(), 1978);
		Assert.assertEquals(lDate.getMonth(), 6);
		Assert.assertEquals(lDate.getDay(), 15);
		Assert.assertFalse(lDate.isLeaf());
	}

	@Test
	public void testCompare() {
		LunaDate lDate1 = new LunaDate(1978, 6, 15, false);
		LunaDate lDate2 = new LunaDate(1978, 9, 26, false);
		
		Assert.assertEquals(lDate1.compare(lDate2), -1);
		Assert.assertEquals(lDate1.compare(lDate1), 0);
		Assert.assertEquals(lDate2.compare(lDate1), 1);
	}

	@Test
	public void testGetPeriodDays() {
		LunaDate lDate1 = new LunaDate(1978, 6, 15, false);
		LunaDate lDate2 = new LunaDate(1978, 9, 26, false);
		Assert.assertEquals(lDate1.getPeriodDays(lDate2), 100);
		
	}
	

	@Test
	public void testEqualsObject() {
		LunaDate lDate1 = new LunaDate(1978, 6, 15, false);
		LunaDate lDate2 = new LunaDate(1978, 6, 15, false);
		
		Assert.assertEquals(lDate1.getYear(), lDate2.getYear());
		Assert.assertEquals(lDate1.getMonth(), lDate2.getMonth());
		Assert.assertEquals(lDate1.getDay(), lDate2.getDay());
		Assert.assertEquals(lDate1.isLeaf(), lDate2.isLeaf());
		Assert.assertEquals(lDate1.getGan(), lDate2.getGan());
		Assert.assertEquals(lDate1.getJee(), lDate2.getJee());
		Assert.assertEquals(lDate1.getDdi(), lDate2.getDdi());
	}
	
	@Test
	public void testClone() {
		LunaDate lDate1 = new LunaDate(1978, 6, 15, false);
		LunaDate lDate2 = (LunaDate)lDate1.clone();
		
		Assert.assertEquals(lDate1.getYear(), lDate2.getYear());
		Assert.assertEquals(lDate1.getMonth(), lDate2.getMonth());
		Assert.assertEquals(lDate1.getDay(), lDate2.getDay());
		Assert.assertEquals(lDate1.isLeaf(), lDate2.isLeaf());
		Assert.assertEquals(lDate1.getGan(), lDate2.getGan());
		Assert.assertEquals(lDate1.getJee(), lDate2.getJee());
		Assert.assertEquals(lDate1.getDdi(), lDate2.getDdi());
	}

	@Test
	public void testToLunaDateDate() {
		LunaDate lDate = new LunaDate(1978, 6, 15, false);
		LunaDate lDate2 = LunaDate.toLunaDate(DateUtils.toDate("1978-07-19"));

		Assert.assertEquals(lDate.getYear(), lDate2.getYear());
		Assert.assertEquals(lDate.getMonth(), lDate2.getMonth());
		Assert.assertEquals(lDate.getDay(), lDate2.getDay());
		Assert.assertEquals(lDate.isLeaf(), lDate2.isLeaf());
		
		Assert.assertEquals(LunaDate.toLunaDate(DateUtils.toDate(1800,  1,  1)), new LunaDate(1799, 12, 07, false));
		Assert.assertEquals(LunaDate.toLunaDate(DateUtils.toDate(1800, 12, 31)), new LunaDate(1800, 11, 16, false));
		Assert.assertEquals(LunaDate.toLunaDate(DateUtils.toDate(1801,  1,  1)), new LunaDate(1800, 11, 17, false));
		Assert.assertEquals(LunaDate.toLunaDate(DateUtils.toDate(1802,  1,  1)), new LunaDate(1801, 11, 27, false));
		Assert.assertEquals(LunaDate.toLunaDate(DateUtils.toDate(1850, 12, 31)), new LunaDate(1850, 11, 28, false));
		Assert.assertEquals(LunaDate.toLunaDate(DateUtils.toDate(2050, 12, 31)), new LunaDate(2050, 11, 18, false));
		Assert.assertEquals(LunaDate.toLunaDate(DateUtils.toDate(2009,  3,  1)), new LunaDate(2009,  2,  5, false));
		Assert.assertEquals(LunaDate.toLunaDate(DateUtils.toDate(2006,  8, 12)), new LunaDate(2006,  7, 19, false));
		Assert.assertEquals(LunaDate.toLunaDate(DateUtils.toDate(2006,  9, 11)), new LunaDate(2006,  7, 19, true));
		Assert.assertEquals(LunaDate.toLunaDate(DateUtils.toDate(2005,  1,  1)), new LunaDate(2004, 11, 21, false));
		Assert.assertEquals(LunaDate.toLunaDate(DateUtils.toDate(1975,  4, 11)), new LunaDate(1975,  2, 30, false));
	}
}

