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

import jp.co.cybec.cb3.accessor.fileaccess.flat.FlatFileRecord;
import jp.co.cybec.cb3.accessor.fileaccess.flat.delimited.DelimitedLineRecordReader;
import jp.co.cybec.cb3.exception.AccessorNotOpenException;
import jp.co.cybec.cb3.exception.ConfigFileNotFoundException;
import jp.co.cybec.cb3.exception.DataFileIOException;
import jp.co.cybec.cb3.exception.DataFormatException;
import junit.framework.Assert;

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

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

	/** separator：","、quotechar："&quot;"、skipLines："1"、encode："Shift_JIS"の場合、読み込み用 正常ファイル */
	private static final String CONFIG_READER1 = "jp/co/cybec/cb3/accessor/fileaccess/flat/delimited/reader/readerConfig1.xml";

	/** separator：""、quotechar：""、skipLines：""、encode：""の場合、読み込み用 正常ファイル */
	private static final String CONFIG_READER2 = "jp/co/cybec/cb3/accessor/fileaccess/flat/delimited/reader/readerConfig2.xml";

	/** 可変長のリーダーのミニマムセットの場合、読み込み用 正常ファイル */
	private static final String CONFIG_READER3 = "jp/co/cybec/cb3/accessor/fileaccess/flat/delimited/reader/readerConfig3.xml";

	/** separator：""、quotechar："&quot;"、skipLines：""、encode："unicode"の場合、読み込み用 正常ファイル */
	private static final String CONFIG_READER4 = "jp/co/cybec/cb3/accessor/fileaccess/flat/delimited/reader/readerConfig9.xml";

	/** パターンクラスの場合、読み込み用 正常ファイル */
	private static final String CONFIG_READER5 = "jp/co/cybec/cb3/accessor/fileaccess/flat/delimited/reader/readerConfig5.xml";

	/** 設定ファイルのフィールド数とデータファイルのフィールド数が合っていません。 */
	private static final String CONFIG_READER7 = "jp/co/cybec/cb3/accessor/fileaccess/flat/delimited/reader/readerConfig7.xml";

	/** データファイルのフィールド数が零です。 */
	private static final String CONFIG_READER8 = "jp/co/cybec/cb3/accessor/fileaccess/flat/delimited/reader/readerConfig8.xml";

	/** ユーザー定義クラスが存在しない */
	private static final String CONFIG_READER9 = "jp/co/cybec/cb3/accessor/fileaccess/flat/delimited/reader/readerConfig6.xml";

	/** データファイルのエンコードがEUCです */
	private static final String CONFIG_READER10 = "jp/co/cybec/cb3/accessor/fileaccess/flat/delimited/reader/readerConfig4.xml";

	/** パターンクラスの場合、文字列をフォーマットする時に、例外が発生する */
	private static final String CONFIG_READER11 = "jp/co/cybec/cb3/accessor/fileaccess/flat/delimited/reader/readerConfig10.xml";

	/** 正常データファイル */
	private static final String FILE_NORMAL= "src/test/testdata/delimited/test.csv";

	private DelimitedLineRecordReader delimitedReader = null;
	private FlatFileRecord record = null;

	/**
	 * @throws Exception
	 */
	@Before
	public void setUp() throws Exception {
		delimitedReader = new DelimitedLineRecordReader();
	}

	/**
	 * @throws Exception
	 */
	@After
	public void tearDown() throws Exception {
		delimitedReader.release();
	}

	/**
	 * {@link DelimitedLineRecordReader#initialize(String)} のためのテスト・メソッド。<br>
	 * 例外が発生しないことを確認する。
	 */
	@Test
	public void testInitialize() {
		delimitedReader.initialize(CONFIG_READER1);
	}

	/**
	 * {@link DelimitedLineRecordReader#initialize(String)} のためのテスト・メソッド。<br>
	 * 引数に存在しないキー（設定ファイル）を指定したときに例外が発生することを確認する。
	 */
	@Test(expected = ConfigFileNotFoundException.class)
	public void testInitializeConfigFileNotFoundException() {
		delimitedReader.initialize("aaa");
	}

	/**
	 * {@link DelimitedLineRecordReader#open(String)} のためのテスト・メソッド。
	 * 例外が発生しないことを確認する。
	 */
	@Test
	public void testOpenString() {
		delimitedReader.initialize(CONFIG_READER1);
		delimitedReader.open(FILE_NORMAL);
	}

	/**
	 * {@link DelimitedLineRecordReader#nextRecord()} のためのテスト・メソッド。
	 * 正しくレコードが取得できることを確認する。
	 * separator：","
	 * quotechar："&quot;"
	 * skipLines："1"
	 * encode   ："Shift_JIS"
	 */
	@Test
	public void testNextRecord01() {
		// 設定ファイルを読み込む
		delimitedReader.initialize(CONFIG_READER1);
		delimitedReader.open();
		// データを取得する
		record = delimitedReader.nextRecord();

		// 結果をチェックする
		Assert.assertEquals("1", record.getString("intField"));
		Assert.assertEquals("teststring\\\"あいう", record.getString("strField1"));
		Assert.assertEquals("teststring2", record.getString("strField2"));
		Assert.assertEquals("1456785", record.getString("longField"));
		Assert.assertEquals("123", record.getString("shortField"));
		Assert.assertEquals("1123.46", record.getString("floatField"));
		Assert.assertEquals("123456.012", record.getString("bigField1"));
		Assert.assertEquals("1234565648.012", record.getString("bigField2"));
		Assert.assertEquals("2008/01/02 08:10:12", record.getString("dateField1"));
		Assert.assertEquals("2006/12/23 00:00:00", record.getString("dateField2"));
		Assert.assertEquals("翻訳　先\"週の先週｛１２３｝", record.getString("strField3"));
		Assert.assertEquals("", record.getString("strField4"));
		Assert.assertEquals(",", record.getString("strField5"));
		Assert.assertEquals("12_子供のミカン", record.getString("strField6"));
		Assert.assertEquals("東京の　学生\r\n", record.getString("strField7"));
		Assert.assertEquals("本田のwww.bb@hotmail.com.cn", record.getString("strField8"));
		Assert.assertEquals("10%", record.getString("strField9"));
		Assert.assertEquals("スイカ&蜜柑。", record.getString("strField10"));
		Assert.assertEquals("2001/10/05 00:00:00", record.getString("dateField3"));
		Assert.assertEquals("2001/09/29 08:44:00", record.getString("dateField4"));
		Assert.assertEquals("2001/09/10 00:00:00", record.getString("dateField5"));

		record = null;
		record = delimitedReader.nextRecord();

		// 結果をチェックする
		Assert.assertEquals("2", record.getString("intField"));
		Assert.assertEquals("teststring\\\"あいう2", record.getString("strField1"));
		Assert.assertEquals("teststring2", record.getString("strField2"));
		Assert.assertEquals("1456785", record.getString("longField"));
		Assert.assertEquals("123", record.getString("shortField"));
		Assert.assertEquals("1123.4", record.getString("floatField"));
		Assert.assertEquals("123456.012", record.getString("bigField1"));
		Assert.assertEquals("1234565648.012", record.getString("bigField2"));
		Assert.assertEquals("2008/01/02 08:10:12", record.getString("dateField1"));
		Assert.assertEquals("2006/12/23 00:00:00", record.getString("dateField2"));
		Assert.assertEquals("翻訳2　先\"週の先週｛１２３｝", record.getString("strField3"));
		Assert.assertEquals("", record.getString("strField4"));
		Assert.assertEquals(",", record.getString("strField5"));
		Assert.assertEquals("12_子供のミカン", record.getString("strField6"));
		Assert.assertEquals("東京2の　学\r\n生", record.getString("strField7"));
		Assert.assertEquals("本田2のwww.bb@hotmail.com.cn", record.getString("strField8"));
		Assert.assertEquals("10%", record.getString("strField9"));
		Assert.assertEquals("スイカ&蜜柑。", record.getString("strField10"));
		Assert.assertEquals("2001/10/05 00:00:00", record.getString("dateField3"));
		Assert.assertEquals("2001/09/29 08:44:00", record.getString("dateField4"));
		Assert.assertEquals("2001/09/10 00:00:00", record.getString("dateField5"));
	}

	/**
	 * {@link DelimitedLineRecordReader#nextRecord()} のためのテスト・メソッド。
	 * 正しくレコードが取得できることを確認する。
	 * separator： なし
	 * quotechar： なし
	 * skipLines： なし
	 * encode   ： なし
	 */
	@Test
	public void testNextRecord02() {
		// 設定ファイルを読み込む
		delimitedReader.initialize(CONFIG_READER2);
		delimitedReader.open();
		// データを取得する
		record = delimitedReader.nextRecord();
		// 結果をチェックする
		Assert.assertEquals("1", record.getString("intField"));
		Assert.assertEquals("teststring1\\\"あいう", record.getString("strField1"));
		Assert.assertEquals("teststring2", record.getString("strField2"));
		Assert.assertEquals("1456785", record.getString("longField"));
		Assert.assertEquals("123", record.getString("shortField"));
		Assert.assertEquals("1123.461", record.getString("floatField"));
		Assert.assertEquals("123456.012", record.getString("bigField1"));
		Assert.assertEquals("1234565648.012", record.getString("bigField2"));
		Assert.assertEquals("2008/01/02 08:10:12", record.getString("dateField1"));
		Assert.assertEquals("2006/12/23 00:00:00", record.getString("dateField2"));
		Assert.assertEquals("翻訳1　先\"週の先週｛１２３｝", record.getString("strField3"));
		Assert.assertEquals(" ", record.getString("strField4"));
		Assert.assertEquals(" ", record.getString("strField5"));
		Assert.assertEquals(" ", record.getString("strField6"));
		Assert.assertEquals("12_子供のミカン", record.getString("strField7"));
		Assert.assertEquals("東京1の　学生", record.getString("strField8"));
		Assert.assertEquals("本田1のwww.bb@hotmail.com.cn", record.getString("strField9"));
		Assert.assertEquals("10%", record.getString("strField10"));
		Assert.assertEquals("スイカ&蜜柑。", record.getString("strField11"));
		Assert.assertEquals("2001/10/05 00:00:00", record.getString("dateField3"));
		Assert.assertEquals("2001/09/29 08:44:00", record.getString("dateField4"));
		Assert.assertEquals("2001/09/10 00:00:00", record.getString("dateField5"));
		record = null;
		record = delimitedReader.nextRecord();
		// 結果をチェックする
		Assert.assertEquals("2", record.getString("intField"));
		Assert.assertEquals("teststring2\\\"あいう", record.getString("strField1"));
		Assert.assertEquals("teststring2", record.getString("strField2"));
		Assert.assertEquals("1456785", record.getString("longField"));
		Assert.assertEquals("123", record.getString("shortField"));
		Assert.assertEquals("1123.461", record.getString("floatField"));
		Assert.assertEquals("123456.012", record.getString("bigField1"));
		Assert.assertEquals("1234565648.012", record.getString("bigField2"));
		Assert.assertEquals("2008/01/02 08:10:12", record.getString("dateField1"));
		Assert.assertEquals("2006/12/23 00:00:00", record.getString("dateField2"));
		Assert.assertEquals("翻訳2　先\"週の先週｛１２３｝", record.getString("strField3"));
		Assert.assertEquals(" ", record.getString("strField4"));
		Assert.assertEquals(" ", record.getString("strField5"));
		Assert.assertEquals(" ", record.getString("strField6"));
		Assert.assertEquals("12_子供のミカン", record.getString("strField7"));
		Assert.assertEquals("東京2の　学生", record.getString("strField8"));
		Assert.assertEquals("本田2のwww.bb@hotmail.com.cn", record.getString("strField9"));
		Assert.assertEquals("10%", record.getString("strField10"));
		Assert.assertEquals("スイカ&蜜柑。", record.getString("strField11"));
		Assert.assertEquals("2001/10/05 00:00:00", record.getString("dateField3"));
		Assert.assertEquals("2001/09/29 08:44:00", record.getString("dateField4"));
		Assert.assertEquals("2001/09/10 00:00:00", record.getString("dateField5"));
		record = null;
		record = delimitedReader.nextRecord();
		// 結果をチェックする
		Assert.assertEquals("3", record.getString("intField"));
		Assert.assertEquals("teststring3\\\"あいう", record.getString("strField1"));
		Assert.assertEquals("teststring2", record.getString("strField2"));
		Assert.assertEquals("1456785", record.getString("longField"));
		Assert.assertEquals("123", record.getString("shortField"));
		Assert.assertEquals("1123.461", record.getString("floatField"));
		Assert.assertEquals("123456.012", record.getString("bigField1"));
		Assert.assertEquals("1234565648.012", record.getString("bigField2"));
		Assert.assertEquals("2008/01/02 08:10:12", record.getString("dateField1"));
		Assert.assertEquals("2006/12/23 00:00:00", record.getString("dateField2"));
		Assert.assertEquals("翻訳3　先\"週の先週｛１２３｝", record.getString("strField3"));
		Assert.assertEquals(" ", record.getString("strField4"));
		Assert.assertEquals(" ", record.getString("strField5"));
		Assert.assertEquals(" ", record.getString("strField6"));
		Assert.assertEquals("12_子供のミカン", record.getString("strField7"));
		Assert.assertEquals("東京3の　学生", record.getString("strField8"));
		Assert.assertEquals("本田3のwww.bb@hotmail.com.cn", record.getString("strField9"));
		Assert.assertEquals("10%", record.getString("strField10"));
		Assert.assertEquals("スイカ&蜜柑。", record.getString("strField11"));
		Assert.assertEquals("2001/10/05 00:00:00", record.getString("dateField3"));
		Assert.assertEquals("2001/09/29 08:44:00", record.getString("dateField4"));
		Assert.assertEquals("2001/09/10 00:00:00", record.getString("dateField5"));
	}
	/**
	 * {@link DelimitedLineRecordReader#nextRecord()} のためのテスト・メソッド。
	 * 可変長のリーダーのミニマムセットの場合、正しくレコードが取得できることを確認する。
	 *
	 */
	@Test
	public void testNextRecord03() {
		// 設定ファイルを読み込む
		delimitedReader.initialize(CONFIG_READER3);
		delimitedReader.open();
		// データを取得する
		record = delimitedReader.nextRecord();

		// 結果をチェックする
		Assert.assertEquals("1", record.getString("intField"));
		Assert.assertEquals("teststring1\\\"あいう", record.getString("strField1"));
		Assert.assertEquals("teststring2", record.getString("strField2"));
		Assert.assertEquals("1456785", record.getString("longField"));
		Assert.assertEquals("123", record.getString("shortField"));
		Assert.assertEquals("1123.461", record.getString("floatField"));
		Assert.assertEquals("123456.012", record.getString("bigField1"));
		Assert.assertEquals("1234565648.012", record.getString("bigField2"));
		Assert.assertEquals("2008/01/02 08:10:12", record.getString("dateField1"));
		Assert.assertEquals("2006/12/23 00:00:00", record.getString("dateField2"));
		Assert.assertEquals("翻訳1　先\"週の先週｛１２３｝", record.getString("strField3"));
		Assert.assertEquals(" ", record.getString("strField4"));
		Assert.assertEquals(" ", record.getString("strField5"));
		Assert.assertEquals(" ", record.getString("strField6"));
		Assert.assertEquals("12_子供のミカン", record.getString("strField7"));
		Assert.assertEquals("東京1の　学生", record.getString("strField8"));
		Assert.assertEquals("本田1のwww.bb@hotmail.com.cn", record.getString("strField9"));
		Assert.assertEquals("10%", record.getString("strField10"));
		Assert.assertEquals("スイカ&蜜柑。", record.getString("strField11"));
		Assert.assertEquals("2001/10/05 00:00:00", record.getString("dateField3"));
		Assert.assertEquals("2001/09/29 08:44:00", record.getString("dateField4"));
		Assert.assertEquals("2001/09/10 00:00:00", record.getString("dateField5"));

		record = null;
		// データを取得する
		record = delimitedReader.nextRecord();

		// 結果をチェックする
		Assert.assertEquals("2", record.getString("intField"));
		Assert.assertEquals("teststring2\\\"あいう", record.getString("strField1"));
		Assert.assertEquals("teststring2", record.getString("strField2"));
		Assert.assertEquals("1456785", record.getString("longField"));
		Assert.assertEquals("123", record.getString("shortField"));
		Assert.assertEquals("1123.461", record.getString("floatField"));
		Assert.assertEquals("123456.012", record.getString("bigField1"));
		Assert.assertEquals("1234565648.012", record.getString("bigField2"));
		Assert.assertEquals("2008/01/02 08:10:12", record.getString("dateField1"));
		Assert.assertEquals("2006/12/23 00:00:00", record.getString("dateField2"));
		Assert.assertEquals("翻訳2　先\"週の先週｛１２３｝", record.getString("strField3"));
		Assert.assertEquals(" ", record.getString("strField4"));
		Assert.assertEquals(" ", record.getString("strField5"));
		Assert.assertEquals(" ", record.getString("strField6"));
		Assert.assertEquals("12_子供のミカン", record.getString("strField7"));
		Assert.assertEquals("東京2の　学生", record.getString("strField8"));
		Assert.assertEquals("本田2のwww.bb@hotmail.com.cn", record.getString("strField9"));
		Assert.assertEquals("10%", record.getString("strField10"));
		Assert.assertEquals("スイカ&蜜柑。", record.getString("strField11"));
		Assert.assertEquals("2001/10/05 00:00:00", record.getString("dateField3"));
		Assert.assertEquals("2001/09/29 08:44:00", record.getString("dateField4"));
		Assert.assertEquals("2001/09/10 00:00:00", record.getString("dateField5"));

		record = null;
		// データを取得する
		record = delimitedReader.nextRecord();

		// 結果をチェックする
		Assert.assertEquals("3", record.getString("intField"));
		Assert.assertEquals("teststring3\\\"あいう", record.getString("strField1"));
		Assert.assertEquals("teststring2", record.getString("strField2"));
		Assert.assertEquals("1456785", record.getString("longField"));
		Assert.assertEquals("123", record.getString("shortField"));
		Assert.assertEquals("1123.461", record.getString("floatField"));
		Assert.assertEquals("123456.012", record.getString("bigField1"));
		Assert.assertEquals("1234565648.012", record.getString("bigField2"));
		Assert.assertEquals("2008/01/02 08:10:12", record.getString("dateField1"));
		Assert.assertEquals("2006/12/23 00:00:00", record.getString("dateField2"));
		Assert.assertEquals("翻訳3　先\"週の先週｛１２３｝", record.getString("strField3"));
		Assert.assertEquals(" ", record.getString("strField4"));
		Assert.assertEquals(" ", record.getString("strField5"));
		Assert.assertEquals(" ", record.getString("strField6"));
		Assert.assertEquals("12_子供のミカン", record.getString("strField7"));
		Assert.assertEquals("東京3の　学生", record.getString("strField8"));
		Assert.assertEquals("本田3のwww.bb@hotmail.com.cn", record.getString("strField9"));
		Assert.assertEquals("10%", record.getString("strField10"));
		Assert.assertEquals("スイカ&蜜柑。", record.getString("strField11"));
		Assert.assertEquals("2001/10/05 00:00:00", record.getString("dateField3"));
		Assert.assertEquals("2001/09/29 08:44:00", record.getString("dateField4"));
		Assert.assertEquals("2001/09/10 00:00:00", record.getString("dateField5"));
	}

	/**
	 * {@link DelimitedLineRecordReader#nextRecord()} のためのテスト・メソッド。
	 * 正しくレコードが取得できることを確認する。
	 * separator：なし
	 * quotechar："&quot;"
	 * skipLines：なし
	 * encode   ：unicode
	 */
	@Test
	public void testNextRecord04() {
		// 設定ファイルを読み込む
		delimitedReader.initialize(CONFIG_READER4);
		delimitedReader.open();
		// データを取得する
		record = delimitedReader.nextRecord();

		// 結果をチェックする
		Assert.assertEquals("1", record.getString("intField"));
		Assert.assertEquals("teststring\\\"あいう", record.getString("strField1"));
		Assert.assertEquals("teststring2", record.getString("strField2"));
		Assert.assertEquals("1456785", record.getString("longField"));
		Assert.assertEquals("123", record.getString("shortField"));
		Assert.assertEquals("1123.461", record.getString("floatField"));
		Assert.assertEquals("123456.012", record.getString("bigField1"));
		Assert.assertEquals("1234565648.012", record.getString("bigField2"));
		Assert.assertEquals("2008/01/02 08:10:12", record.getString("dateField1"));
		Assert.assertEquals("2006/12/23 00:00:00", record.getString("dateField2"));
		Assert.assertEquals("翻訳　先\"週の先週｛１２３｝", record.getString("strField3"));
		Assert.assertEquals("", record.getString("strField4"));
		Assert.assertEquals(",", record.getString("strField5"));
		Assert.assertEquals("12_子供\r\nのミカン", record.getString("strField6"));
		Assert.assertEquals("東京の　学生\r\n", record.getString("strField7"));
		Assert.assertEquals("本田のwww.bb@hotmail.com.cn", record.getString("strField8"));
		Assert.assertEquals("10%", record.getString("strField9"));
		Assert.assertEquals("スイカ&蜜柑。", record.getString("strField10"));
		Assert.assertEquals("2001/10/05 00:00:00", record.getString("dateField3"));
		Assert.assertEquals("2001/09/29 08:44:00", record.getString("dateField4"));
		Assert.assertEquals("2001/09/10 00:00:00", record.getString("dateField5"));

		record = null;
		// データを取得する
		record = delimitedReader.nextRecord();

		// 結果をチェックする
		Assert.assertEquals("2", record.getString("intField"));
		Assert.assertEquals("teststring\\\"あいう", record.getString("strField1"));
		Assert.assertEquals("teststring2", record.getString("strField2"));
		Assert.assertEquals("1456785", record.getString("longField"));
		Assert.assertEquals("123", record.getString("shortField"));
		Assert.assertEquals("1123.461", record.getString("floatField"));
		Assert.assertEquals("123456.012", record.getString("bigField1"));
		Assert.assertEquals("1234565648.012", record.getString("bigField2"));
		Assert.assertEquals("2008/01/02 08:10:12", record.getString("dateField1"));
		Assert.assertEquals("2006/12/23 00:00:00", record.getString("dateField2"));
		Assert.assertEquals("翻訳　先\"週の先週｛１２３｝", record.getString("strField3"));
		Assert.assertEquals("", record.getString("strField4"));
		Assert.assertEquals(",", record.getString("strField5"));
		Assert.assertEquals("12_子供のミカン", record.getString("strField6"));
		Assert.assertEquals("東京の　学生", record.getString("strField7"));
		Assert.assertEquals("本田のwww.bb@hotmail.com.cn", record.getString("strField8"));
		Assert.assertEquals("10%", record.getString("strField9"));
		Assert.assertEquals("スイカ&蜜柑。", record.getString("strField10"));
		Assert.assertEquals("2001/10/05 00:00:00", record.getString("dateField3"));
		Assert.assertEquals("2001/09/29 08:44:00", record.getString("dateField4"));
		Assert.assertEquals("2001/09/10 00:00:00", record.getString("dateField5"));

		record = null;
		// データを取得する
		record = delimitedReader.nextRecord();

		// 結果をチェックする
		Assert.assertEquals("3", record.getString("intField"));
		Assert.assertEquals("teststring\\\"あいう", record.getString("strField1"));
		Assert.assertEquals("teststring2", record.getString("strField2"));
		Assert.assertEquals("1456785", record.getString("longField"));
		Assert.assertEquals("123", record.getString("shortField"));
		Assert.assertEquals("1123.461", record.getString("floatField"));
		Assert.assertEquals("123456.012", record.getString("bigField1"));
		Assert.assertEquals("1234565648.012", record.getString("bigField2"));
		Assert.assertEquals("2008/01/02 08:10:12", record.getString("dateField1"));
		Assert.assertEquals("2006/12/23 00:00:00", record.getString("dateField2"));
		Assert.assertEquals("翻訳　先\"週の先週｛１２３｝", record.getString("strField3"));
		Assert.assertEquals("   　", record.getString("strField4"));
		Assert.assertEquals(",", record.getString("strField5"));
		Assert.assertEquals("12_子供のミカン", record.getString("strField6"));
		Assert.assertEquals("東京の　学生", record.getString("strField7"));
		Assert.assertEquals("本田のwww.bb@hotmail.com.cn", record.getString("strField8"));
		Assert.assertEquals("10%", record.getString("strField9"));
		Assert.assertEquals("スイカ&蜜柑。", record.getString("strField10"));
		Assert.assertEquals("2001/10/05 00:00:00", record.getString("dateField3"));
		Assert.assertEquals("2001/09/29 08:44:00", record.getString("dateField4"));
		Assert.assertEquals("2001/09/10 00:00:00", record.getString("dateField5"));

	}

	/**
	 * {@link DelimitedLineRecordReader#nextRecord()} のためのテスト・メソッド。
	 * パターンクラスの場合、正しくレコードが取得できることを確認する。
	 * separator： ","
	 * quotechar： "&quot;"
	 * skipLines： "1"
	 * encode   ： "UTF-8"
	 */
	@Test
	public void testNextRecord05() {
		// 設定ファイルを読み込む
		delimitedReader.initialize(CONFIG_READER5);
	 	delimitedReader.open();
		// データを取得する
		record = delimitedReader.nextRecord();
		// 結果をチェックする
		Assert.assertEquals("001", record.getString("intField"));
		Assert.assertEquals("teststringあいう", record.getString("strField1"));
		Assert.assertEquals("teststring2", record.getString("strField2"));
		Assert.assertEquals("1456785", record.getString("longField"));
		Assert.assertEquals("123", record.getString("shortField"));
		Assert.assertEquals("1123.461", record.getString("floatField"));
		Assert.assertEquals("123456.012", record.getString("bigField1"));
		Assert.assertEquals("1234565648.012", record.getString("bigField2"));
		Assert.assertEquals("2008/01/02 08:10:12", record.getString("dateField1"));
		Assert.assertEquals("2006/12/23 00:00:00", record.getString("dateField2"));
		Assert.assertEquals("翻訳　先週の先週｛１２３｝", record.getString("strField3"));
		Assert.assertEquals("　", record.getString("strField4"));
		Assert.assertEquals(",", record.getString("strField5"));
		Assert.assertEquals("12_子供のミカン", record.getString("strField6"));
		Assert.assertEquals("東京の　学生\r\n", record.getString("strField7"));
		Assert.assertEquals("本田のwww.bb@hotmail.com.cn", record.getString("strField8"));
		Assert.assertEquals("10%", record.getString("strField9"));
		Assert.assertEquals("スイカ&蜜柑。", record.getString("strField10"));
		Assert.assertEquals("2001/10/05 00:00:00", record.getString("dateField3"));
		Assert.assertEquals("2001/09/29 08:44:00", record.getString("dateField4"));
		Assert.assertEquals("2001/09/10 00:00:00", record.getString("dateField5"));
	}

	/**
	 * {@link DelimitedLineRecordReader#nextRecord()} のためのテスト・メソッド。
	 * データファイルがオープンされていなくても例外が発生しないことを確認する。
	 */
	@Test(expected = AccessorNotOpenException.class)
	public void testNextRecord06() {
		// 設定ファイルを読み込む
		delimitedReader.initialize(CONFIG_READER1);
		delimitedReader.nextRecord();
	}

	/**
	 * {@link DelimitedLineRecordReader#nextRecord()} のためのテスト・メソッド。
	 * 設定ファイルのフィールド数とデータファイルのフィールド数が合っていません。例外が発生することを確認する。
	 */
	@Test(expected = DataFormatException.class)
	public void testNextRecord07() {
		// 設定ファイルを読み込む
		delimitedReader.initialize(CONFIG_READER7);
	 	delimitedReader.open();
	 	delimitedReader.nextRecord();
	}

	/**
	 * {@link DelimitedLineRecordReader#nextRecord()} のためのテスト・メソッド。
	 * データファイルのフィールドの長さが零の場合、例外が発生しないことを確認する。
	 */
	@Test
	public void testNextRecord08() {
		// 設定ファイルを読み込む
		delimitedReader.initialize(CONFIG_READER8);
	 	delimitedReader.open();
	 	delimitedReader.nextRecord();
	 	delimitedReader.nextRecord();
	}

	/**
	 * {@link DelimitedLineRecordReader#nextRecord()} のためのテスト・メソッド。
	 * パターンクラスの場合、ユーザー定義クラスが存在しないで、例外が発生することを確認する。
	 */
	@Test(expected = DataFormatException.class)
	public void testNextRecord09() {
		// 設定ファイルを読み込む
		delimitedReader.initialize(CONFIG_READER9);
		delimitedReader.open();
		// データを取得する
		record = delimitedReader.nextRecord();
	}

	/**
	 * {@link DelimitedLineRecordReader#nextRecord()} のためのテスト・メソッド。
	 * データファイルのエンコードがEUCの場合、例外が発生することを確認する。
	 */
	@Test(expected = DataFileIOException.class)
	public void testNextRecord10() {
		// 設定ファイルを読み込む
		delimitedReader.initialize(CONFIG_READER10);
	 	delimitedReader.open();
	}

	/**
	 * {@link DelimitedLineRecordReader#nextRecord()} のためのテスト・メソッド。
	 * パターンクラスの場合、文字列をフォーマットする時に、例外が発生することを確認する。
	 */
	@Test(expected = DataFormatException.class)
	public void testNextRecord11() {
		// 設定ファイルを読み込む
		delimitedReader.initialize(CONFIG_READER11);
	 	delimitedReader.open();
		// データを取得する
		record = delimitedReader.nextRecord();
	}

}
