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

import jp.co.cybec.cb3.accessor.fileaccess.flat.FlatFileRecordReaderImpl;
import jp.co.cybec.cb3.exception.AccessorAlreadyOpenedException;
import jp.co.cybec.cb3.exception.DataFileIOException;
import jp.co.cybec.cb3.exception.DataFileNotFoundException;

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

/**
 * {@link FlatFileRecordReaderImpl} のテストケース。
 * @author Juanjuan Wang
 */
public class FlatFileRecordReaderImplTest {
	/** 読み込み用 正常データファイル */
	private static final String CVS_FILE_NORMAL= "src/test/testdata/delimited/test.csv";

	// クラスをインスタンスする
	FlatFileRecordReaderImpl target = null;

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

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

	/**
	 * {@link FlatFileRecordReaderImpl#open()} のためのテスト・メソッド。
	 * 例外が発生しないことを確認する。
	 */
	@Test
	public void testOpen() {
		target.setFilepath(CVS_FILE_NORMAL);
		target.setEncode("Shift_JIS");
		target.open();
	}

	/**
	 * {@link FlatFileRecordReaderImpl#open()} のためのテスト・メソッド。
	 * データファイルが存在しない時に例外が発生することを確認する。
	 */
	@Test(expected = DataFileNotFoundException.class)
	public void testOpenDataFileNotFoundException() {
		target.setFilepath("fileNotFound.txt");
		target.setEncode("Shift_JIS");
		target.open();
	}

	/**
	 * {@link FlatFileRecordReaderImpl#open()} のためのテスト・メソッド。
	 * ２回オープンしたときに例外が発生することを確認する。
	 */
	@Test(expected = AccessorAlreadyOpenedException.class)
	public void testOpenAccessorAlreadyOpenedException() {
		target.setFilepath(CVS_FILE_NORMAL);
		target.setEncode("Shift_JIS");
		target.open();
		target.open();
	}

	/**
	 * {@link FlatFileRecordReaderImpl#open()} のためのテスト・メソッド。
	 * データファイルがnullの時に例外が発生することを確認する。
	 */
	@Test(expected = DataFileNotFoundException.class)
	public void testOpenNullFilepath() {
		target.setFilepath(null);
		target.open();
	}

	/**
	 * {@link FlatFileRecordReaderImpl#open()} のためのテスト・メソッド。
	 * データファイルの読み込みに失敗した時に例外が発生することを確認する。
	 */
	@Test(expected = DataFileIOException.class)
	public void testOpenDataFileIOException() {
		target.setFilepath(CVS_FILE_NORMAL);
		target.setEncode("EUC");
		target.open();
	}

	/**
	 * {@link FlatFileRecordReaderImpl#close()} のためのテスト・メソッド。
	 * 例外が発生しないことを確認する。
	 */
	@Test
	public void testClose() {
	 	target.setFilepath(CVS_FILE_NORMAL);
		target.setEncode("Shift_JIS");

	 	target.open();
	 	target.close();
	 	target.open();
	}


	/**
	 * {@link FlatFileRecordReaderImpl#close()} のためのテスト・メソッド。
	 * ファイルがオープンされていなくても、例外が発生しないことを確認する。
	 */
	@Test
	public void testCloseNoOpen() {
	 	target.setFilepath(CVS_FILE_NORMAL);
		target.setEncode("Shift_JIS");

	 	target.close();
	}

	/**
	 * {@link FlatFileRecordReaderImpl#release()} のためのテスト・メソッド。
	 * 例外が発生しないことを確認する。
	 */
	@Test
	public void testRelease() {
	 	target.setFilepath(CVS_FILE_NORMAL);
		target.setEncode("Shift_JIS");

	 	target.open();
	 	target.release();
	 	target.open();
	}

	/**
	 * {@link FlatFileRecordReaderImpl#isOpen()} のためのテスト・メソッド。
	 * ファイルオープン時正しくファイルのオープン状態を保持するフラグが設定できることを確認すること。
	 */
	@Test
	public void testIsOpenOpen() {
		target.setFilepath(CVS_FILE_NORMAL);
		target.setEncode("Shift_JIS");
		target.open();
		Assert.assertEquals(true, target.isOpen());
	}

	/**
	 * {@link FlatFileRecordReaderImpl#isOpen()} のためのテスト・メソッド。
	 * ファイルクローズ時正しくファイルのオープン状態を保持するフラグが設定できることを確認すること。
	 */
	@Test
	public void testIsOpenClose() {
		target.setFilepath(CVS_FILE_NORMAL);
		target.setEncode("Shift_JIS");
		target.open();
		target.close();
		Assert.assertEquals(false, target.isOpen());
		target.open();
	}

	/**
	 * {@link FlatFileRecordReaderImpl#getBufferedReader()} のためのテスト・メソッド。
	 * バッファーリーダーが取得できることを確認する。
	 */
	@Test
	public void testGetBufferedReader() {
		target.setFilepath(CVS_FILE_NORMAL);
		target.setEncode("Shift_JIS");
		target.open();
		Assert.assertNotNull(target.getBufferedReader());
	}

	/**
	 * {@link FlatFileRecordReaderImpl#getFilepath()} のためのテスト・メソッド。
	 * 正しくファイルパスが取得できることを確認すること。
	 */
	@Test
	public void testGetFilepath() {
		target.setFilepath("d:/test.csv");
		Assert.assertEquals("d:/test.csv", target.getFilepath());
	}

	/**
	 * {@link FlatFileRecordReaderImpl#setFilepath(String)} のためのテスト・メソッド。
	 * 正しくファイルパスが設定できることを確認すること。
	 */
	@Test
	public void testSetFilepath() {
		target.setFilepath("d:/test.csv");
		Assert.assertEquals("d:/test.csv", target.getFilepath());
	}

	/**
	 * {@link FlatFileRecordReaderImpl#getEncode()} のためのテスト・メソッド。
	 * 正しくエンコードが取得できることを確認すること。
	 */
	@Test
	public void testGetEncode() {
		target.setEncode("Shift_JIS");
		Assert.assertEquals("Shift_JIS", target.getEncode());
	}

	/**
	 * {@link FlatFileRecordReaderImpl#setEncode(String)} のためのテスト・メソッド。
	 * 正しくエンコードが設定できることを確認すること。
	 */
	@Test
	public void testSetEncode() {
		target.setEncode("Shift_JIS");
		Assert.assertEquals("Shift_JIS", target.getEncode());
	}
}
