/*
 * RecordFieldWriterFormatTest.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.RecordFieldWriterFormat;
import jp.co.cybec.cb3.exception.DataFormatException;

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

/**
 * {@link RecordFieldWriterFormat} のテストケース。
 * @author Juanjuan Wang
 */
public class RecordFieldWriterFormatTest {
	RecordFieldWriterFormat target = null;

	@Before
	public void setUp() throws Exception {
		target = new RecordFieldWriterFormat("delimitedLineRecordWriteConfig1.xml", "name");
	}

	@After
	public void tearDown() throws Exception {
	}

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

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

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

	/**
	 * {@link RecordFieldWriterFormat#format(String, String, String)} のためのテスト・メソッド。
	 * 正しくフォーマットすることを確認する。
	 *   データ型：数字、パターン："#.000"、タイプ：".25"
	 */
	@Test
	public void testFormat03() {
		String result = target.format("#.000", RecordFieldConstants.TYPE_NUMBER, ".102");
		Assert.assertEquals(".102", result);
	}

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

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

	/**
	 * {@link RecordFieldWriterFormat#format(String, String, String)} のためのテスト・メソッド。
	 * 正しくフォーマットすることを確認する。
	 *   データ型：日付、パターン："MM-dd-yy HH:mm:ss"、データ："2008/01/02 13:20:33"
	 */
	@Test
	public void testFormat06() {
		String result = target.format("MM-dd-yy HH:mm:ss", RecordFieldConstants.TYPE_DATE, "2008/01/02 13:20:33");
		Assert.assertEquals("01-02-08 13:20:33", result);
	}

	/**
	 * {@link RecordFieldWriterFormat#format(String, String, String)} のためのテスト・メソッド。
	 * データ文字列がnullLの場合、NULLを返すことを確認する。
	 *   データ型：日付、パターン："yyyyMMdd"、データ：null
	 */
	@Test
	public void testFormat07() {
		String result = target.format("yyyyMMdd", RecordFieldConstants.TYPE_DATE, null);
		Assert.assertNull(result);
	}

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

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

	/**
	 * {@link RecordFieldWriterFormat#format(String, String, String)} のためのテスト・メソッド。
	 * データ文字列のフォーマットがパターンと異なる場合、例外が発生することを確認する。
	 *   データ型：日付、パターン："yyyyMMdd"、データ："2008/01/02"
	 */
	@Test(expected = DataFormatException.class)
	public void testFormatDataFormatException03() {
		target.format("yyyyMMdd", RecordFieldConstants.TYPE_DATE, "2008/01/02");
	}

	/**
	 * {@link RecordFieldWriterFormat#padding(String, String, String, String)} のためのテスト・メソッド。
	 * 正しくパディングすることを確認する。
	 *  データの長："7"、アラインメント指定子："left"、パディング：" "
	 */
	@Test
	public void testPadding01() {
		String result = target.padding("7", RecordFieldConstants.ALGIN_LEFT, " ", "ab12");
		Assert.assertEquals("ab12   ", result);
	}

	/**
	 * {@link RecordFieldWriterFormat#padding(String, String, String, String)} のためのテスト・メソッド。
	 * 正しくパディングすることを確認する。
	 *   データの長："7"、アラインメント指定子："right"、パディング：" "
	 */
	@Test
	public void testPadding02() {
		String result = target.padding("7", RecordFieldConstants.ALGIN_RIGHT, " ", "ab12");
		Assert.assertEquals("   ab12", result);
	}


	/**
	 * {@link RecordFieldWriterFormat#padding(String, String, String, String)} のためのテスト・メソッド。
	 * データ文字列がnullと空白の場合、正しくパディングすることを確認する。
	 */
	@Test
	public void testPadding03() {
		// データ文字列：null
		String result = target.padding("5", RecordFieldConstants.ALGIN_LEFT, " ", null);
		Assert.assertEquals("     ", result);

		// データ文字列： ""
		result = target.padding("5", RecordFieldConstants.ALGIN_LEFT, " ", "");
		Assert.assertEquals("     ", result);
	}

	/**
	 * {@link RecordFieldWriterFormat#padding(String, String, String, String)} のためのテスト・メソッド。
	 * バイト数が未指定の場合、パディングしないことを確認する。
	 */
	@Test
	public void testPadding04() {
		// バイト数：null
		String result = target.padding(null, RecordFieldConstants.ALGIN_LEFT, " ", "testデータ");
		Assert.assertEquals("testデータ", result);

		// バイト数：""
		result = target.padding("", RecordFieldConstants.ALGIN_LEFT, " ", "testデータ");
		Assert.assertEquals("testデータ", result);
	}

	/**
	 * {@link RecordFieldWriterFormat#padding(String, String, String, String)} のためのテスト・メソッド。
	 * パディング文字が未指定の場合、パディングしないことを確認する。
	 */
	@Test
	public void testPadding05() {
		// パディング文字：null
		String result = target.padding("20", RecordFieldConstants.ALGIN_LEFT, null, "testデータ");
		Assert.assertEquals("testデータ", result);

		// パディング文字：""
		result = target.padding("20", RecordFieldConstants.ALGIN_LEFT, "", "testデータ");
		Assert.assertEquals("testデータ", result);
	}

	/**
	 * {@link RecordFieldWriterFormat#padding(String, String, String, String)} のためのテスト・メソッド。
	 * アラインメントが未指定の場合、パディングしないことを確認する。
	 */
	@Test
	public void testPadding06() {
		// アラインメント：null
		String result = target.padding("20", null, " ", "testデータ");
		Assert.assertEquals("testデータ", result);

		// アラインメント：""
		result = target.padding("20", "", " ", "testデータ");
		Assert.assertEquals("testデータ", result);
	}

	/**
	 * {@link RecordFieldWriterFormat#padding(String, String, String, String)} のためのテスト・メソッド。
	 * 正しくパディングすることを確認する。
	 *  データの長："10"、アラインメント指定子："left"、パディング：" "
	 */
	@Test
	public void testPadding07() {
		String result = target.padding("10", RecordFieldConstants.ALGIN_LEFT, " ", "abあい12");
		Assert.assertEquals("abあい12  ", result);
	}

	/**
	 * {@link RecordFieldWriterFormat#padding(String, String, String, String)} のためのテスト・メソッド。
	 * 正しくパディングすることを確認する。
	 *  データの長："10"、アラインメント指定子："right"、パディング：" "
	 */
	@Test
	public void testPadding08() {
		String result = target.padding("10", RecordFieldConstants.ALGIN_RIGHT, " ", "愛他12");
		Assert.assertEquals("    愛他12", result);
	}

	/**
	 * {@link RecordFieldWriterFormat#padding(String, String, String, String)} のためのテスト・メソッド。
	 * データ文字列のバイト数が指定バイト数より大きい場合、例外が発生することを確認する。
	 */
	@Test(expected = DataFormatException.class)
	public void testPaddingDataFormatException01() {
		target.padding("5", RecordFieldConstants.ALGIN_RIGHT, " ", "データab");
	}

	/**
	 * {@link RecordFieldWriterFormat#padding(String, String, String, String)} のためのテスト・メソッド。
	 * バイト数が数字じゃない場合、例外が発生することを確認する。
	 */
	@Test(expected = DataFormatException.class)
	public void testPaddingDataFormatException02() {
		target.padding("asda", RecordFieldConstants.ALGIN_RIGHT, " ", "データTest");
	}

	/**
	 * {@link RecordFieldWriterFormat#padding(String, String, String, String)} のためのテスト・メソッド。
	 * パディング文字のバイト数が1バイト以上の場合、例外が発生することを確認する。
	 */
	@Test(expected = DataFormatException.class)
	public void testPaddingDataFormatException03() {
		target.padding("16", RecordFieldConstants.ALGIN_RIGHT, "  ", "errtest");
	}

	/**
	 * {@link RecordFieldWriterFormat#padding(String, String, String, String)} のためのテスト・メソッド。
	 * アラインメント指定子が「left」と「right」以外の場合、例外が発生することを確認する。
	 */
	@Test(expected = DataFormatException.class)
	public void testPaddingDataFormatException04() {
		target.padding("9", "center", "*", "test");
	}
}
