/*
 * FlatFileRecordWriterImplTest.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.FlatFileRecordWriterImpl;
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 FlatFileRecordWriterImpl} のテストケース。
 * @author Juanjuan Wang
 */
public class FlatFileRecordWriterImplTest {

	/** 書込み用 正常データファイル */
	private static final String CVS_FILE_NORMAL= "src/test/testdata/delimited/testWriter01.csv";

	private FlatFileRecordWriterImpl target = null;

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

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

	/**
	 * {@link FlatFileRecordWriterImpl#open()} のためのテスト・メソッド。
	 * 追加モードでファイルをオープンする時に例外が発生しないことを確認する。
	 */
	@Test
	public void testOpenAppendTrue() {
		target.setFilepath(CVS_FILE_NORMAL);
		target.setAppend("true");
		target.setEncode("Shift_JIS");

	 	target.open();
	}

	/**
	 * {@link FlatFileRecordWriterImpl#open()} のためのテスト・メソッド。
	 * 上書きモードでファイルをオープンする時に例外が発生しないことを確認する。
	 */
	@Test
	public void testOpenAppendFalse() {
		target.setFilepath(CVS_FILE_NORMAL);
		target.setAppend("false");
		target.setEncode("Shift_JIS");

	 	target.open();
	}

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

		target.open();
	}

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

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

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

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

		target.open();
	}

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

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


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

	 	target.close();
	}

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

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

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

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

	/**
	 * {@link FlatFileRecordWriterImpl#getBufferedWriter()} のためのテスト・メソッド。
	 * バッファーライターが取得できることを確認する。
	 */
	@Test
	public void testGetBufferedWriter() {
		target.setFilepath(CVS_FILE_NORMAL);
		target.setAppend("false");
		target.setEncode("Shift_JIS");
		target.open();
		Assert.assertNotNull(target.getBufferedWriter());
	}

	/**
	 * {@link FlatFileRecordWriterImpl#getAppend()} のためのテスト・メソッド。
	 * 正しくファイルオープンモードが取得できることを確認する。
	 */
	@Test
	public void testGetAppend() {
		target.setAppend("true");
		Assert.assertEquals(true, target.getAppend());
	}

	/**
	 * {@link FlatFileRecordWriterImpl#setAppend(String)} のためのテスト・メソッド。
	 * 正しくファイルオープンモードが設定できることを確認する。
	 */
	@Test
	public void testSetAppend() {
		target.setAppend("false");
		Assert.assertEquals(false, target.getAppend());
	}

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

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

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

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