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

import jp.co.cybec.cb3.accessor.fileaccess.xml.XMLElement;
import jp.co.cybec.cb3.accessor.fileaccess.xml.XMLFileReaderImpl;
import jp.co.cybec.cb3.accessor.fileaccess.xml.XMLPath;
import jp.co.cybec.cb3.exception.AccessorAlreadyOpenedException;
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.DataFileNotFoundException;
import jp.co.cybec.cb3.exception.DataFileParseException;
import junit.framework.Assert;

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

/**
 * {@link XMLFileReaderImpl} のテストケース。
 * @author Daisuke Suga
 */
public class XMLFileReaderImplTest {

	XMLFileReaderImpl target = null;

	/** 読み込み用 正常ファイル */
	private static final String CONFIG_READER1 = "jp/co/cybec/cb3/accessor/fileaccess/xml/reader1Config";

	/** 読み込み用 データファイルが存在しない */
	private static final String CONFIG_READER_FILE_NOT_FOUND = "jp/co/cybec/cb3/accessor/fileaccess/xml/readerFileNotFoundConfig";

	/** 読み込み用 データファイルの記述が正しくない */
	private static final String CONFIG_READER_PARSE_ERROR = "jp/co/cybec/cb3/accessor/fileaccess/xml/readerParseErrorConfig";

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

	@Before
	public void setUp() {
		target = new XMLFileReaderImpl();
	}

	@After
	public void tearDown() {
		target.release();
	}

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

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

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

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

	/**
	 * {@link XMLFileReaderImpl#open()} のためのテスト・メソッド。<br>
	 * データファイルが存在しないときに例外が発生することを確認する。
	 */
	@Test(expected = DataFileNotFoundException.class)
	public void testOpenDataFileNotFoundException() {
		target.initialize(CONFIG_READER_FILE_NOT_FOUND);
		target.open();
	}

	/**
	 * {@link XMLFileReaderImpl#open()} のためのテスト・メソッド。<br>
	 * データファイルの読み込みに失敗したときに例外が発生することを確認する。
	 */
	@Ignore("DataFileIOExceptionを発生させられない")
	@Test(expected = DataFileIOException.class)
	public void testOpenDataFileIOException() {
	}

	/**
	 * {@link XMLFileReaderImpl#open()} のためのテスト・メソッド。<br>
	 * データファイルの解析に失敗したときに例外が発生することを確認する。
	 */
	@Test(expected = DataFileParseException.class)
	public void testOpenDataFileParseException() {
		target.initialize(CONFIG_READER_PARSE_ERROR);
		target.open();
	}

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

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

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

	/**
	 * {@link XMLFileReaderImpl#close()} のためのテスト・メソッド。<br>
	 * データファイルがオープンされていなくても例外が発生しないことを確認する。
	 */
	@Test
	public void testCloseNotOpen() {
		target.initialize(CONFIG_READER1);
		target.close();
	}

	/**
	 * {@link XMLFileReaderImpl#close()} のためのテスト・メソッド。<br>
	 * データファイルのクローズに失敗したときに例外が発生することを確認する。
	 */
	@Ignore("DataFileIOExceptionを発生させられない")
	@Test(expected = DataFileIOException.class)
	public void testCloseDataFileIOException() {
	}

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

	/**
	 * {@link XMLFileReaderImpl#close()} のためのテスト・メソッド。<br>
	 * データファイルがオープンされていなくても例外が発生しないことを確認する。
	 */
	@Test
	public void testReleaseNotOpen() {
		target.initialize(CONFIG_READER1);
		target.release();
	}

	/**
	 * {@link XMLFileReaderImpl#selectPath(String)} のためのテスト・メソッド。<br>
	 * 正しい値を検索できることを確認する。
	 */
	@Test
	public void testSelectPath() {
		target.initialize(CONFIG_READER1);
		target.open();

		XMLPath path = target.selectPath("*/dept/code");
		Assert.assertNotNull(path);

		XMLElement element = path.next();
		Assert.assertNotNull(element);

		Assert.assertEquals("10", element.getString());
	}

	/**
	 * {@link XMLFileReaderImpl#selectPath(String)} のためのテスト・メソッド。<br>
	 * データファイルがオープンされていないときに例外が発生することを確認する。
	 */
	@Test(expected = AccessorNotOpenException.class)
	public void testSelectPathAccessorNotOpenException() {
		target.initialize(CONFIG_READER1);
		target.selectPath("*/dept/code");
	}

}
