/*
 * DateUtilTest.java
 * Copyright (C) 2008 Cyber Beans Corporation. All rights reserved.
 */
package jp.co.cybec.cb3.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import jp.co.cybec.cb3.util.DateUtil;
import junit.framework.Assert;

import org.junit.Test;

/**
 * DateUtilのテストケース。
 * @author Jianming Guo
 */
public class DateUtilTest {

	/**
	 * {@link DateUtil#parseDate(String)} のためのテスト・メソッド。<br>
	 * 文字列を日付型に正しくパースすることを確認する。
	 */
	@Test
	public void testParseDate() throws ParseException{
		SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd HHmmss");
		Date expected = df.parse("20080721 152135");

		Date result = DateUtil.parseDate("2008/07/21 15:21:35");
		Assert.assertEquals(expected, result);
	}

	/**
	 * {@link DateUtil#parseDate(String)} のためのテスト・メソッド。<br>
	 * 日付文字列のフォーマットがデフォールトのと異なる場合、例外が発生することを確認する。
	 */
	@Test(expected = ParseException.class)
	public void testParseDateParseException1() throws ParseException {
		DateUtil.parseDate("2008-07-21 15:21:35");
	}

	/**
	 * {@link DateUtil#parseDate(String)} のためのテスト・メソッド。<br>
	 * 文字列が日付じゃない場合、例外が発生することを確認する。
	 */
	@Test(expected = ParseException.class)
	public void testParseDateParseException2() throws ParseException {
		DateUtil.parseDate("200ba021");
	}

	/**
	 * {@link DateUtil#parseDate(String, String)} のためのテスト・メソッド。<br>
	 * 文字列を日付型に正しくパースすることを確認する。
	 *    ※ 年月日時分秒
	 */
	@Test
	public void testParseDate2() throws ParseException{
		Date expected;
		Date result;

		SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd HHmmss");
		expected = df.parse("20080721 152135");

		// フォーマット： "yyyyMMdd HHmmss"
		result = DateUtil.parseDate("20080721 152135", "yyyyMMdd HHmmss");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy/MM/dd HH:mm:ss"
		result = DateUtil.parseDate("2008/07/21 15:21:35", "yyyy/MM/dd HH:mm:ss");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy-MM-dd HH:mm:ss"
		result = DateUtil.parseDate("2008-07-21 15:21:35", "yyyy-MM-dd HH:mm:ss");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy.MM.dd HH:mm:ss"
		result = DateUtil.parseDate("2008.07.21 15:21:35", "yyyy.MM.dd HH:mm:ss");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy年MM月dd日 HH時mm分ss秒"
		result = DateUtil.parseDate("2008年07月21日 15時21分35秒", "yyyy年MM月dd日 HH時mm分ss秒");
		Assert.assertEquals(expected, result);
	}

	/**
	 * {@link DateUtil#parseDate(String, String)} のためのテスト・メソッド。<br>
	 * 文字列を日付型に正しくパースすることを確認する。
	 *    ※ 年月日時分
	 */
	@Test
	public void testParseDate3() throws ParseException{
		Date expected;
		Date result;

		SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd HHmm");
		expected = df.parse("20080721 1521");

		// フォーマット： "yyyyMMdd HHmm"
		result = DateUtil.parseDate("20080721 1521", "yyyyMMdd HHmm");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy/MM/dd HH:mm"
		result = DateUtil.parseDate("2008/07/21 15:21", "yyyy/MM/dd HH:mm");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy-MM-dd HH:mm"
		result = DateUtil.parseDate("2008-07-21 15:21", "yyyy-MM-dd HH:mm");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy.MM.dd HH:mm"
		result = DateUtil.parseDate("2008.07.21 15:21", "yyyy.MM.dd HH:mm");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy年MM月dd日 HH時mm分"
		result = DateUtil.parseDate("2008年07月21日 15時21分", "yyyy年MM月dd日 HH時mm分");
		Assert.assertEquals(expected, result);

	}

	/**
	 * {@link DateUtil#parseDate(String, String)} のためのテスト・メソッド。<br>
	 * 文字列を日付型に正しくパースすることを確認する。
	 *    ※ 年月日時
	 */
	@Test
	public void testParseDate4() throws ParseException{
		Date expected;
		Date result;

		SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd HH");
		expected = df.parse("20080721 15");

		// フォーマット： "yyyyMMdd HH"
		result = DateUtil.parseDate("20080721 15", "yyyyMMdd HH");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy/MM/dd HH"
		result = DateUtil.parseDate("2008/07/21 15", "yyyy/MM/dd HH");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy-MM-dd HH"
		result = DateUtil.parseDate("2008-07-21 15", "yyyy-MM-dd HH");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy.MM.dd HH"
		result = DateUtil.parseDate("2008.07.21 15", "yyyy.MM.dd HH");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy年MM月dd日 HH時"
		result = DateUtil.parseDate("2008年07月21日 15時", "yyyy年MM月dd日 HH時");
		Assert.assertEquals(expected, result);
	}

	/**
	 * {@link DateUtil#parseDate(String, String)} のためのテスト・メソッド。<br>
	 * 文字列を日付型に正しくパースすることを確認する。
	 *    ※ 年月日
	 */
	@Test
	public void testParseDate5() throws ParseException{
		Date expected;
		Date result;

		SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
		expected = df.parse("20080721");

		// フォーマット： "yyyyMMdd"
		result = DateUtil.parseDate("20080721", "yyyyMMdd");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy/MM/dd"
		result = DateUtil.parseDate("2008/07/21", "yyyy/MM/dd");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy-MM-dd"
		result = DateUtil.parseDate("2008-07-21", "yyyy-MM-dd");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy.MM.dd"
		result = DateUtil.parseDate("2008.07.21", "yyyy.MM.dd");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy年MM月dd日"
		result = DateUtil.parseDate("2008年07月21日", "yyyy年MM月dd日");
		Assert.assertEquals(expected, result);
	}

	/**
	 * {@link DateUtil#parseDate(String, String)} のためのテスト・メソッド。<br>
	 * 文字列を日付型に正しくパースすることを確認する。
	 *    ※ 年月
	 */
	@Test
	public void testParseDate6() throws ParseException {
		Date expected;
		Date result;

		SimpleDateFormat df = new SimpleDateFormat("yyyyMM");
		expected = df.parse("200807");

		// フォーマット： "yyyyMM"
		result = DateUtil.parseDate("200807", "yyyyMM");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy/MM"
		result = DateUtil.parseDate("2008/07", "yyyy/MM");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy-MM"
		result = DateUtil.parseDate("2008-07", "yyyy-MM");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy.MM"
		result = DateUtil.parseDate("2008.07", "yyyy.MM");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy年MM月"
		result = DateUtil.parseDate("2008年07月", "yyyy年MM月");
		Assert.assertEquals(expected, result);
	}

	/**
	 * {@link DateUtil#parseDate(String, String)} のためのテスト・メソッド。<br>
	 * 文字列のフォーマットが指定のフォーマットと異なる場合、例外が発生することを確認する。
	 */
	@Test(expected = ParseException.class)
	public void testParseDateParseException3() throws ParseException{
		DateUtil.parseDate("2008/07/21 15:21:35", "yyyyMMdd HHmmss");
	}

	/**
	 * {@link DateUtil#parseDate(String, String, boolean)} のためのテスト・メソッド。<br>
	 * 文字列を日付型に正しくパースすることを確認する。
	 */
	@Test
	public void testParseDate10() throws ParseException {
		Date expected;
		Date result;

		SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd HHmmss");
		expected = df.parse("20080721 152135");

		// フォーマット： "yyyyMMdd HHmmss"
		result = DateUtil.parseDate("20080721 152135", "yyyyMMdd HHmmss", true);
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy/MM/dd HH:mm:ss"
		result = DateUtil.parseDate("2008/07/21 15:21:35", "yyyy/MM/dd HH:mm:ss", false);
		Assert.assertEquals(expected, result);
	}

	/**
	 * {@link DateUtil#formatDate(Date)} のためのテスト・メソッド。<br>
	 * 日付を正しくフォーマットすることを確認する。
	 */
	@Test
	public void testFormatDate1() throws ParseException{
		String expected;
		String result;

		SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd HHmmss");
		Date date = df.parse("20080721 152135");
		expected = "2008/07/21 15:21:35";

		result = DateUtil.formatDate(date);
		Assert.assertEquals(expected, result);

		df = new SimpleDateFormat("yyyyMMdd");
		date = df.parse("20080721");

		expected = "2008/07/21 00:00:00";
		result = DateUtil.formatDate(date);
		Assert.assertEquals(expected, result);
	}

	/**
	 * {@link DateUtil#formatDate(Date, String)} のためのテスト・メソッド。<br>
	 * 日付を正しくフォーマットすることを確認する。
	 *   ※ 年月日時分秒
	 */
	@Test
	public void testFormatDate2() throws ParseException {
		String expected;
		String result;

		SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd HHmmss");
		Date date = df.parse("20080721 152135");
		// フォーマット： "yyyyMMdd HHmmss"
		expected = "20080721 152135";
		result = DateUtil.formatDate(null, "yyyyMMdd HHmmss");
		Assert.assertNull(result);


		// フォーマット： null
		expected = "2008/07/21 15:21:35";
		result = DateUtil.formatDate(date, null);
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyyMMdd HHmmss"
		expected = "20080721 152135";
		result = DateUtil.formatDate(date, "yyyyMMdd HHmmss");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy/MM/dd HH:mm:ss"
		expected = "2008/07/21 15:21:35";
		result = DateUtil.formatDate(date, "yyyy/MM/dd HH:mm:ss");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy-MM-dd HH:mm:ss"
		expected = "2008-07-21 15:21:35";
		result = DateUtil.formatDate(date, "yyyy-MM-dd HH:mm:ss");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy.MM.dd HH:mm:ss"
		expected = "2008.07.21 15:21:35";
		result = DateUtil.formatDate(date, "yyyy.MM.dd HH:mm:ss");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy年MM月dd日 HH時mm分ss秒"
		expected = "2008年07月21日 15時21分35秒";
		result = DateUtil.formatDate(date, "yyyy年MM月dd日 HH時mm分ss秒");
		Assert.assertEquals(expected, result);

	}

	/**
	 * {@link DateUtil#formatDate(Date, String)} のためのテスト・メソッド。<br>
	 * 日付を正しくフォーマットすることを確認する。
	 *   ※ 年月日時分
	 */
	@Test
	public void testFormatDate3() throws ParseException{
		String expected;
		String result;

		SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd HHmmss");
		Date date = df.parse("20080721 152135");

		// フォーマット： "yyyyMMdd HHmm"
		expected = "20080721 1521";
		result = DateUtil.formatDate(date, "yyyyMMdd HHmm");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy/MM/dd HH:mm"
		expected = "2008/07/21 15:21";
		result = DateUtil.formatDate(date, "yyyy/MM/dd HH:mm");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy-MM-dd HH:mm"
		expected = "2008-07-21 15:21";
		result = DateUtil.formatDate(date, "yyyy-MM-dd HH:mm");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy.MM.dd HH:mm"
		expected = "2008.07.21 15:21";
		result = DateUtil.formatDate(date, "yyyy.MM.dd HH:mm");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy年MM月dd日 HH時mm分"
		expected = "2008年07月21日 15時21分";
		result = DateUtil.formatDate(date, "yyyy年MM月dd日 HH時mm分");
		Assert.assertEquals(expected, result);

	}

	/**
	 * {@link DateUtil#formatDate(Date, String)} のためのテスト・メソッド。<br>
	 * 日付を正しくフォーマットすることを確認する。
	 *   ※ 年月日
	 */
	@Test
	public void testFormatDate4() throws ParseException{
		String expected;
		String result;

		SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd HHmmss");
		Date date = df.parse("20080721 152135");

		// フォーマット： "yyyyMMdd"
		expected = "20080721";
		result = DateUtil.formatDate(date, "yyyyMMdd");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy/MM/dd"
		expected = "2008/07/21";
		result = DateUtil.formatDate(date, "yyyy/MM/dd");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy-MM-ddm"
		expected = "2008-07-21";
		result = DateUtil.formatDate(date, "yyyy-MM-dd");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy.MM.dd"
		expected = "2008.07.21";
		result = DateUtil.formatDate(date, "yyyy.MM.dd");
		Assert.assertEquals(expected, result);

		// フォーマット： "yyyy年MM月dd日"
		expected = "2008年07月21日";
		result = DateUtil.formatDate(date, "yyyy年MM月dd日");
		Assert.assertEquals(expected, result);

	}

	/**
	 * {@link DateUtil#parseDate(String, String, boolean)} のためのテスト・メソッド。<br>
	 * フォーマット文字が無効な場合、例外が発生することを確認する。
	 */
	@Test(expected = IllegalArgumentException.class)
	public void testFormatDateIllegalArgumentException() {
		// フォーマット： "yyyyMMdd HHmmss"
		DateUtil.formatDate(new Date(System.currentTimeMillis()), "YYYYああああ");
	}
}
