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


import jp.co.cybec.cb3.accessor.fileaccess.RecordFieldConstants;
import jp.co.cybec.cb3.accessor.fileaccess.RecordFieldReaderFormat;
import jp.co.cybec.cb3.exception.DataFormatException;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

/**
 * {@link RecordFieldReaderFormat} のテストケース。
 * @author Juanjuan Wang
 */
public class RecordFieldReaderFormatTest {

	RecordFieldReaderFormat target = null;

	@Before
	public void setUp() throws Exception {
		target = new RecordFieldReaderFormat("c:\testConfig.xml", "fieldName");
	}

	@After
	public void tearDown() throws Exception {
	}

	/**
	 * {@link RecordFieldReaderFormat#format(String, String, String)} のためのテスト・メソッド。<br>
	 * 正しくフォーマットすることを確認する。
	 *   データ型：数字、パターン："#,###.00"
	 */
	@Test
	public void testFormat01() {
		String result = target.format("#,###.00", RecordFieldConstants.TYPE_NUMBER, "123,456.20");
		Assert.assertEquals("123456.2", result);
	}

	/**
	 * {@link RecordFieldReaderFormat#format(String, String, String)} のためのテスト・メソッド。<br>
	 * 正しくフォーマットすることを確認する。
	 *   データ型：日付、パターン："yyyyMMdd"
	 */
	@Test
	public void testFormat02() {
		String result = target.format("yyyyMMdd", RecordFieldConstants.TYPE_DATE, "20081023");
		Assert.assertEquals("2008/10/23 00:00:00", result);
	}

	/**
	 * {@link RecordFieldReaderFormat#format(String, String, String)} のためのテスト・メソッド。<br>
	 * 正しくフォーマットすることを確認する。
	 *   データ型：日付、パターン："yyyy-MM-dd"
	 */
	@Test
	public void testFormat03() {
		String result = target.format("yyyy-MM-dd", RecordFieldConstants.TYPE_DATE, "2008-10-23");
		Assert.assertEquals("2008/10/23 00:00:00", result);
	}

	/**
	 * {@link RecordFieldReaderFormat#format(String, String, String)} のためのテスト・メソッド。<br>
	 * 正しくフォーマットすることを確認する。
	 *   データ型：日付、パターン："MM-dd-yy"
	 */
	@Test
	public void testFormat04() {
		String result = target.format("MM-dd-yy", RecordFieldConstants.TYPE_DATE, "10-23-08");
		Assert.assertEquals("2008/10/23 00:00:00", result);
	}

	/**
	 * {@link RecordFieldReaderFormat#format(String, String, String)} のためのテスト・メソッド。<br>
	 * データが未指定の場合、フォーマットしないことを確認する。
	 *   データ型：数字、パターン："###"、データ：null
	 */
	@Test
	public void testFormat05() {
		// データ：null
		String result = target.format("###", RecordFieldConstants.TYPE_NUMBER, null);
		Assert.assertEquals(null, result);

		// データ："";
		result = target.format("###", RecordFieldConstants.TYPE_NUMBER, "");
		Assert.assertEquals("", result);
	}

	/**
	 * {@link RecordFieldReaderFormat#format(String, String, String)} のためのテスト・メソッド。<br>
	 * パターンが未指定の場合、フォーマットしないことを確認する。
	 */
	@Test
	public void testFormat06() {
		// パターン：null;
		String result = target.format(null, RecordFieldConstants.TYPE_NUMBER, "123.1000");
		Assert.assertEquals("123.1000", result);

		// パターン：""
		result = target.format("", RecordFieldConstants.TYPE_NUMBER, "123.1000");
		Assert.assertEquals("123.1000", result);
	}

	/**
	 * {@link RecordFieldReaderFormat#format(String, String, String)} のためのテスト・メソッド。<br>
	 * タイプが未指定の場合、例外が発生することを確認する。
	 */
	@Test(expected = DataFormatException.class)
	public void testFormatDataFormatException01() {
		target.format("###", null, "123");
	}

	/**
	 * {@link RecordFieldReaderFormat#format(String, String, String)} のためのテスト・メソッド。<br>
	 * 文字列データが数字じゃない場合、例外が発生することを確認する。
	 */
	@Test(expected = DataFormatException.class)
	public void testFormatDataFormatException02() {
		target.format("###", RecordFieldConstants.TYPE_NUMBER, "#123");
	}

	/**
	 * {@link RecordFieldReaderFormat#format(String, String, String)} のためのテスト・メソッド。<br>
	 * タイプがnullの場合、例外が発生することを確認する。
	 */
	@Test(expected = DataFormatException.class)
	public void testFormatDataFormatException03() {
		target.format("###", null, "123");
	}

	/**
	 * {@link RecordFieldReaderFormat#format(String, String, String)} のためのテスト・メソッド。<br>
	 * タイプが「number」と「date」以外の場合、例外が発生することを確認する。
	 */
	@Test(expected = DataFormatException.class)
	public void testFormatDataFormatException04() {
		target.format("###", "center", "123");
	}

	/**
	 * {@link RecordFieldReaderFormat#trim(String, String, String)} のためのテスト・メソッド。<br>
	 * データがnullの場合、nullを返すことを確認する。
	 */
	@Test
	public void testTrim01() {
		String result = target.trim(RecordFieldConstants.ALGIN_LEFT, "0", null);
		Assert.assertNull(result);
	}

	/**
	 * {@link RecordFieldReaderFormat#trim(String, String, String)} のためのテスト・メソッド。<br>
	 * アラインメントが未指定の場合、トリムしないことを確認する。
	 */
	@Test
	public void testTrim02() {
		// アラインメント：null
		String result = target.trim(null, "0", "012300");
		Assert.assertEquals("012300", result);

		// アラインメント：""
		result = target.trim("", "0", "012300");
		Assert.assertEquals("012300", result);
	}

	/**
	 * {@link RecordFieldReaderFormat#trim(String, String, String)} のためのテスト・メソッド。<br>
	 * 正しくトリムすることを確認する。
	 *   パディング文字：" "、アラインメント："left"、データ：" 日記    "
	 */
	@Test
	public void testTrim03() {
		String result = target.trim(RecordFieldConstants.ALGIN_LEFT, " ", " 日記    ");
		Assert.assertEquals(" 日記", result);
	}

	/**
	 * {@link RecordFieldReaderFormat#trim(String, String, String)} のためのテスト・メソッド。<br>
	 * 正しくトリムすることを確認する。
	 *   パディング文字："0"、アラインメント："right"、データ："0001020"
	 */
	@Test
	public void testTrim04() {
		String result = target.trim(RecordFieldConstants.ALGIN_RIGHT, "0", "0001020");
		Assert.assertEquals("1020", result);
	}

	/**
	 * {@link RecordFieldReaderFormat#trim(String, String, String)} のためのテスト・メソッド。<br>
	 * 正しくトリムすることを確認する。
	 *   パディング文字："0"、アラインメント："right"、データ："0123 "
	 */
	@Test
	public void testTrim05() {
		String result = target.trim(RecordFieldConstants.ALGIN_LEFT, "0", "01203000");
		Assert.assertEquals("01203", result);
	}

	/**
	 * {@link RecordFieldReaderFormat#trim(String, String, String)} のためのテスト・メソッド。<br>
	 * パディング文字が未指定の場合、トリムしないことを確認する。
	 */
	@Test
	public void testTrim06() {
		// パディング文字： null
		String result = target.trim(RecordFieldConstants.ALGIN_LEFT, null, "0123 ");
		Assert.assertEquals("0123 ", result);

		// パディング文字：""
		result = target.trim(RecordFieldConstants.ALGIN_LEFT, "", "0123 ");
		Assert.assertEquals("0123 ", result);
	}

	/**
	 * {@link RecordFieldReaderFormat#trim(String, String, String)} のためのテスト・メソッド。<br>
	 * アラインメントが「left」と「right」以外の場合、例外が発生することを確認する。
	 */
	@Test(expected = DataFormatException.class)
	public void testTrimDataFormatException01() {
		target.trim("middle", "0", "0012300");
	}

	/**
	 * {@link RecordFieldReaderFormat#trim(String, String, String)} のためのテスト・メソッド。<br>
	 * パディング文字のバイト数が1バイト以上の場合、例が発生することを確認する。
	 */
	@Test(expected = DataFormatException.class)
	public void testTrimDataFormatException02() {
		target.trim(RecordFieldConstants.ALGIN_LEFT, "00", "00001230000");
	}

}
