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

import java.math.BigDecimal;
import java.sql.ResultSet;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Map;

import jp.co.cybec.cb3.accessor.dbaccess.DBAccessorImpl;
import jp.co.cybec.cb3.accessor.dbaccess.DBQueryParameterMap;
import jp.co.cybec.cb3.accessor.dbaccess.DBRecord;
import jp.co.cybec.cb3.accessor.dbaccess.DBRecordReader;
import jp.co.cybec.cb3.accessor.dbaccess.JdbcRecord;
import jp.co.cybec.cb3.mock.accessor.MockResultSet;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.dao.DataAccessException;

/**
 *
 * JdbcRecordクラスのテストケース
 * @author Lijuan Sun
 */
public class JdbcRecordTest{

	// 変数を初期化する
	ApplicationContext context = null;
	DBAccessorImpl dbaccessTmp;
	DBQueryParameterMap parameter = null;
	ResultSet rs = null;
	DBRecordReader reader = null;
	DBRecord record = null;

	// 設定ファイルパース
	private static String[] CONTEXT_XML_PATH = new String[] {
			"jp/co/cybec/cb3/accessor/dbaccess/TestDBAccessConfig.xml",
			"datasourceContext.xml",
	};

	@Before
	public void setup(){

		// クラスをインスタンスする
		context = new ClassPathXmlApplicationContext(CONTEXT_XML_PATH);
		dbaccessTmp = (DBAccessorImpl) context.getBean("dbAccessorImpl");
		// 設定ファイルを読み込む
		dbaccessTmp.initialize("jp/co/cybec/cb3/accessor/dbaccess/dbaccessConfig.xml");
		// テーブルをクリアする
		dbaccessTmp.delete("delRecordTest");
		// データをインサートする
		dbaccessTmp.insert("insertRecordTest");
		// レコードを取得する
		reader = dbaccessTmp.select("selRecordTest");
	}

	@After
	public void teardown(){
		// リリスする
		dbaccessTmp.release();
	}

	/**
	 * {@link jp.co.cybec.cb3.accessor.dbaccess.JdbcRecord} のためのテスト・メソッド。
	 * 1レコード分Map情報テスト
	 */
	@Test
	public void testToMap() {

		Map<String,Object> tmp = null;

		while ((record = reader.nextRecord()) != null) {
			tmp = record.toMap();
		}
		// 結果チェック
		Assert.assertEquals(10, tmp.size());
	}

	/**
	 * {@link jp.co.cybec.cb3.accessor.dbaccess.JdbcRecord} のためのテスト・メソッド。
	 * エラー発生場合
	 */
	@Test
	public void testToMap2() {

		try{
			// MockResultSetをインスタンスする
			MockResultSet mrs = new MockResultSet();
			record = new JdbcRecord(mrs, "SELECT * FROM DUMMY", null, 1);
			record.toMap();
			// 例外が発生しない場合、テスト失敗
			Assert.fail();
		} catch (Exception e){
			// 結果チェック
			if (!(e instanceof DataAccessException)){
				Assert.fail("getDateテスト失敗");
			}
		}
	}

	/**
	 * {@link jp.co.cybec.cb3.accessor.dbaccess.JdbcRecord} のためのテスト・メソッド。
	 * 1レコード分Map情報テスト
	 */
	@Test
	public void testToMap3() {

		Map<String,Object> tmp = null;

		while ((record = reader.nextRecord()) != null) {
			tmp = record.toMap();
			tmp = record.toMap();
		}
		// 結果チェック
		Assert.assertEquals(10, tmp.size());
	}

	/**
	 * {@link jp.co.cybec.cb3.accessor.dbaccess.JdbcRecord} のためのテスト・メソッド。
	 * 1レコード分Map情報テスト
	 */
	@Test
	public void testToMapStringValue() {

		Map<String,String> tmp = null;

		while ((record = reader.nextRecord()) != null) {
			tmp = record.toMapStringValue();
		}
		// 結果チェック
		Assert.assertEquals(10, tmp.size());
	}

	/**
	 * {@link jp.co.cybec.cb3.accessor.dbaccess.JdbcRecord} のためのテスト・メソッド。
	 * 1レコード分Map情報テスト
	 */
	@Test
	public void testToMapStringValue2() {

		Map<String,String> tmp = null;

		while ((record = reader.nextRecord()) != null) {
			tmp = record.toMapStringValue();
			tmp = record.toMapStringValue();
		}
		// 結果チェック
		Assert.assertEquals(10, tmp.size());
	}

	/**
	 * {@link jp.co.cybec.cb3.accessor.dbaccess.JdbcRecord} のためのテスト・メソッド。
	 * 正常取得場合
	 */
	@Test
	public void testGetAll(){

		while ((record = reader.nextRecord()) != null) {
			// 結果チェック
			Assert.assertEquals(new Integer(1234567890),record.getInteger("INTEGER_COLUMN"));
			Assert.assertEquals(new String("String"), record.getObject("STRING_COLUMN"));
			Assert.assertEquals(new Short("-32768"), record.getShort("SHORT_COLUMN"));
			Assert.assertEquals(new Float("2.40282"), record.getFloat("FLOAT_COLUMN"));
			Assert.assertEquals(new BigDecimal("123456789012345"), record.getBigDecimal("BIGDECIMAL_COLUMN"));
			try {
				Assert.assertEquals(DateFormat.getDateInstance().parse("2008/03/28"), record.getDate("DATE_COLUMN"));
			} catch (ParseException e) {
				e.printStackTrace();
				Assert.fail("getDateテスト失敗");
			}
			Assert.assertEquals("2008-03-28 14:16:26.0", record.getTimestamp("TIMESTAMP_COLUMN").toString());
			Assert.assertEquals("String", record.getString("STRING_COLUMN"));
		}
	}

	/**
	 * {@link jp.co.cybec.cb3.accessor.dbaccess.JdbcRecord} のためのテスト・メソッド。
	 * 正常取得場合
	 */
	@Test
	public void testGetLong() {
		while ((record = reader.nextRecord()) != null) {
			// 結果チェック
			Assert.assertEquals(new Long("9223372036854775807"), record.getLong("LONG_COLUMN"));
		}
	}

	/**
	 * {@link jp.co.cybec.cb3.accessor.dbaccess.JdbcRecord} のためのテスト・メソッド。
	 * エラー発生場合
	 */
	@Test
	public void testGetObject(){

		try{
			while ((record = reader.nextRecord()) != null) {
				record.getObject("COLUMN");
			}
			// 例外が発生しない場合、テスト失敗
			Assert.fail();
		} catch (Exception e){
			// 結果チェック
			if (!(e instanceof DataAccessException)){
				Assert.fail("getDateテスト失敗");
			}
		}
	}

	/**
	 * {@link jp.co.cybec.cb3.accessor.dbaccess.JdbcRecord} のためのテスト・メソッド。
	 * エラー発生場合
	 */
	@Test
	public void testGetLong2(){

		try{
			while ((record = reader.nextRecord()) != null) {
				record.getLong("COLUMN");
			}
			// 例外が発生しない場合、テスト失敗
			Assert.fail();
		} catch (Exception e){
			// 結果チェック
			if (!(e instanceof DataAccessException)){
				Assert.fail("getDateテスト失敗");
			}
		}
	}

	/**
	 * {@link jp.co.cybec.cb3.accessor.dbaccess.JdbcRecord} のためのテスト・メソッド。
	 * エラー発生場合
	 */
	@Test
	public void testGetInteger(){

		try{
			while ((record = reader.nextRecord()) != null) {
				record.getInteger("COLUMN");
			}
		} catch (Exception e){
			if (!(e instanceof DataAccessException)){
				Assert.fail("getDateテスト失敗");
			}
		}
	}

	/**
	 * {@link jp.co.cybec.cb3.accessor.dbaccess.JdbcRecord} のためのテスト・メソッド。
	 * エラー発生場合
	 */
	@Test
	public void testGetShort(){

		try{
			while ((record = reader.nextRecord()) != null) {
				record.getShort("COLUMN");
			}
		} catch (Exception e){
			// 結果チェック
			if (!(e instanceof DataAccessException)){
				Assert.fail("getDateテスト失敗");
			}
		}
	}

	/**
	 * {@link jp.co.cybec.cb3.accessor.dbaccess.JdbcRecord} のためのテスト・メソッド。
	 * エラー発生場合
	 */
	@Test
	public void testGetFloat(){

		try{
			while ((record = reader.nextRecord()) != null) {
				record.getFloat("COLUMN");
			}
			// 例外が発生しない場合、テスト失敗
			Assert.fail();
		} catch (Exception e){
			if (!(e instanceof DataAccessException)){
				Assert.fail("getDateテスト失敗");
			}
		}
	}

	/**
	 * {@link jp.co.cybec.cb3.accessor.dbaccess.JdbcRecord} のためのテスト・メソッド。
	 * エラー発生場合
	 */
	@Test
	public void testGetDate(){

		try{
			while ((record = reader.nextRecord()) != null) {
				record.getDate("COLUMN");
			}
			// 例外が発生しない場合、テスト失敗
			Assert.fail();
		} catch (Exception e){
			// 結果チェック
			if (!(e instanceof DataAccessException)){
				Assert.fail("getDateテスト失敗");
			}
		}
	}

	/**
	 * {@link jp.co.cybec.cb3.accessor.dbaccess.JdbcRecord} のためのテスト・メソッド。
	 * エラー発生場合
	 */
	@Test
	public void testGetBigDecimal(){

		try{
			while ((record = reader.nextRecord()) != null) {
				record.getBigDecimal("COLUMN");
			}
			// 例外が発生しない場合、テスト失敗
			Assert.fail();
		} catch (Exception e){
			// 結果チェック
			if (!(e instanceof DataAccessException)){
				Assert.fail("getDateテスト失敗");
			}
		}
	}

	/**
	 * {@link jp.co.cybec.cb3.accessor.dbaccess.JdbcRecord} のためのテスト・メソッド。
	 * エラー発生場合
	 */
	@Test
	public void testTimestamp(){

		try{
			while ((record = reader.nextRecord()) != null) {
				record.getTimestamp("COLUMN");
			}
			// 例外が発生しない場合、テスト失敗
			Assert.fail();
		} catch (Exception e){
			// 結果チェック
			if (!(e instanceof DataAccessException)){
				Assert.fail("getDateテスト失敗");
			}
		}
	}

	/**
	 * {@link jp.co.cybec.cb3.accessor.dbaccess.JdbcRecord} のためのテスト・メソッド。
	 * エラー発生場合
	 */
	@Test
	public void testGetString(){

		try{
			while ((record = reader.nextRecord()) != null) {
				record.getString("COLUMN");
			}
			// 例外が発生しない場合、テスト失敗
			Assert.fail();
		} catch (Exception e){
			// 結果チェック
			if (!(e instanceof DataAccessException)){
				Assert.fail("getDateテスト失敗");
			}
		}
	}

	/**
	 * {@link jp.co.cybec.cb3.accessor.dbaccess.JdbcRecord} のためのテスト・メソッド。
	 * 1レコード分Map情報テスト
	 */
	@Test
	public void test() {
		while ((record = reader.nextRecord()) != null) {
			System.out.println(record.toMapStringValue());
		}
	}
}
