Package com.asakusafw.testtools.excel

Source Code of com.asakusafw.testtools.excel.ExcelUtilsTest

/**
* Copyright 2011-2014 Asakusa Framework Team.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.asakusafw.testtools.excel;


import static org.junit.Assert.*;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.List;

import org.apache.hadoop.io.Writable;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.asakusafw.modelgen.source.MySqlDataType;
import com.asakusafw.runtime.value.ByteOption;
import com.asakusafw.runtime.value.DateOption;
import com.asakusafw.runtime.value.DateTime;
import com.asakusafw.runtime.value.DateTimeOption;
import com.asakusafw.runtime.value.DateUtil;
import com.asakusafw.runtime.value.DecimalOption;
import com.asakusafw.runtime.value.IntOption;
import com.asakusafw.runtime.value.LongOption;
import com.asakusafw.runtime.value.ShortOption;
import com.asakusafw.runtime.value.StringOption;
import com.asakusafw.testtools.ColumnInfo;
import com.asakusafw.testtools.ColumnMatchingCondition;
import com.asakusafw.testtools.Constants;
import com.asakusafw.testtools.NullValueCondition;

public class ExcelUtilsTest {

    @Before
    public void setUp() throws Exception {
    }

    @After
    public void tearDown() throws Exception {
    }


    /**
     * コンストラクタの処理が成功すること
     * @throws IOException
     */
    @Test
    public void testConstractor01() throws IOException {
        String filename = "src/test/data/Excel/ExcelUtils/FOO.xls";
       new ExcelUtils(filename);
    }

    /**
     * コンストラクタのテスト
     * 不正なファイル名が指定された場合
     * @throws IOException
     */
    @Test(expected = java.io.FileNotFoundException.class)
    public void testConstractor02() throws IOException {
        String filename = "src/test/data/Excel/ExcelUtils/NOT_EXIST_FILE";
        new ExcelUtils(filename);
    }

    /**
     * コンストラクタのテスト
     * 入力データのシートがない場合
     * @throws IOException
     */
    @Test
    public void testConstractor03() throws IOException {
        String filename = "src/test/data/Excel/ExcelUtils/NO_INPUT_DATA.xls";
        try {
            new ExcelUtils(filename);
        } catch (IOException e) {
            String actual = e.getLocalizedMessage();
            String expected = "Excelファイル: src/test/data/Excel/ExcelUtils/NO_INPUT_DATA.xlsに入力データのシートが存在しません";
            assertEquals(expected, actual);
        }
    }

    /**
     * コンストラクタのテスト
     * 出力データのシートがない場合
     * @throws IOException
     */
    @Test
    public void testConstractor04() throws IOException {
        String filename = "src/test/data/Excel/ExcelUtils/NO_OUTPUT_DATA.xls";
        try {
            new ExcelUtils(filename);
        } catch (IOException e) {
            String actual = e.getLocalizedMessage();
            String expected = "Excelファイル: src/test/data/Excel/ExcelUtils/NO_OUTPUT_DATA.xlsに出力データのシートが存在しません";
            assertEquals(expected, actual);
        }
    }

    /**
     * コンストラクタのテスト
     * テスト条件のシートがない場合
     * @throws IOException
     */
    @Test
    public void testConstractor05() throws IOException {
        String filename = "src/test/data/Excel/ExcelUtils/NO_TEST_CONDITON.xls";
        try {
            new ExcelUtils(filename);
        } catch (IOException e) {
            String actual = e.getLocalizedMessage();
            String expected = "Excelファイル: src/test/data/Excel/ExcelUtils/NO_TEST_CONDITON.xlsにテスト条件データのシートが存在しません";
            assertEquals(expected, actual);
        }

    }


    /**
     * コンストラクタのテスト
     * テーブル名が未設定
     * @throws IOException
     */
    @Test
    public void testConstractor06() throws IOException {
        String filename = "src/test/data/Excel/ExcelUtils/BROKEN_TABLENAME1.xls";
        try {
            new ExcelUtils(filename);
        } catch (IOException e) {
            String actual = e.getLocalizedMessage();
            String expected = "Excelファイル: src/test/data/Excel/ExcelUtils/BROKEN_TABLENAME1.xlsにテーブル名が定義されていません";
            assertEquals(expected, actual);
        }
    }

    /**
     * コンストラクタのテスト
     * テーブル名のセルが存在しない
     * @throws IOException
     */
    @Test
    public void testConstractor07() throws IOException {
        String filename = "src/test/data/Excel/ExcelUtils/BROKEN_TABLENAME2.xls";
        try {
            new ExcelUtils(filename);
        } catch (InvalidExcelBookException e) {
            String actual = e.getLocalizedMessage();
            String expected = "Excelファイルが異常です(空セル), file = src/test/data/Excel/ExcelUtils/BROKEN_TABLENAME2.xls, sheet = テスト条件, row = 1, col = 3";
            assertEquals(expected, actual);
        }
    }



    /**
     * getColumnInfos()のテスト
     * テーブル名の行が存在しない
     * @throws IOException
     */
    @Test
    public void testConstractor08() throws IOException {
        String filename = "src/test/data/Excel/ExcelUtils/EMPTY_SEETS.xls";
        try {
            new ExcelUtils(filename);
        } catch (InvalidExcelBookException e) {
            String actual = e.getLocalizedMessage();
            String expected = "Excelファイルが異常です(空行), file = src/test/data/Excel/ExcelUtils/EMPTY_SEETS.xls, sheet = テスト条件, row = 0";
            assertEquals(expected, actual);
        }

    }

    /**
     * getColumnInfos()のテスト
     * Decimalカラムの桁数が未設定
     * @throws IOException
     */
    @Test
    public void testgetColumnInfos01() throws IOException {
        String filename = "src/test/data/Excel/ExcelUtils/NO_WIDTH1.xls";
        try {
            new ExcelUtils(filename);
        } catch (InvalidExcelBookException e) {
            String actual = e.getLocalizedMessage();
            String expected = "Excelファイルが異常です。テスト条件のシートの定義が不正です。 file = src/test/data/Excel/ExcelUtils/NO_WIDTH1.xls, 行 = 32, 項目 = 桁数";
            assertEquals(expected, actual);
        }
    }

    /**
     * getColumnInfos()のテスト
     * Decimalカラムの精度が未設定
     * @throws IOException
     */
    @Test
    public void testgetColumnInfos02() throws IOException {
        String filename = "src/test/data/Excel/ExcelUtils/NO_WIDTH2.xls";
        try {
            new ExcelUtils(filename);
        } catch (InvalidExcelBookException e) {
            String actual = e.getLocalizedMessage();
            String expected = "Excelファイルが異常です。テスト条件のシートの定義が不正です。 file = src/test/data/Excel/ExcelUtils/NO_WIDTH2.xls, 行 = 32, 項目 = 精度";
            assertEquals(expected, actual);
        }
    }

    /**
     * getColumnInfos()のテスト
     * VARCHARカラムの桁数が未設定
     * @throws IOException
     */
    @Test
    public void testgetColumnInfos03() throws IOException {
        String filename = "src/test/data/Excel/ExcelUtils/NO_WIDTH3.xls";
        try {
            new ExcelUtils(filename);
        } catch (InvalidExcelBookException e) {
            String actual = e.getLocalizedMessage();
            String expected = "Excelファイルが異常です。テスト条件のシートの定義が不正です。 file = src/test/data/Excel/ExcelUtils/NO_WIDTH3.xls, 行 = 5, 項目 = 桁数";
            assertEquals(expected, actual);
        }
    }

    /**
     * getColumnInfos()のテスト
     * カラム名が未設定
     * @throws IOException
     */
    @Test
    public void testgetColumnInfos04() throws IOException {
        String filename = "src/test/data/Excel/ExcelUtils/NO_COLUMN_NAME.xls";
        try {
            new ExcelUtils(filename);
        } catch (InvalidExcelBookException e) {
            String actual = e.getLocalizedMessage();
            String expected = "Excelファイルが異常です。テスト条件のシートの定義が不正です。 file = src/test/data/Excel/ExcelUtils/NO_COLUMN_NAME.xls, 行 = 19, 項目 = カラム名";
            assertEquals(expected, actual);
        }
    }

    /**
     * getColumnInfos()のテスト
     * データ型が未設定
     * @throws IOException
     */
    @Test
    public void testgetColumnInfos05() throws IOException {
        String filename = "src/test/data/Excel/ExcelUtils/NO_DATA_TYPE.xls";
        try {
            new ExcelUtils(filename);
        } catch (InvalidExcelBookException e) {
            String actual = e.getLocalizedMessage();
            String expected = "Excelファイルが異常です。テスト条件のシートの定義が不正です。 file = src/test/data/Excel/ExcelUtils/NO_DATA_TYPE.xls, 行 = 13, 項目 = データ型";
            assertEquals(expected, actual);
        }
    }

    /**
     * getColumnInfos()のテスト
     * テスト条件が未設定
     * @throws IOException
     */
    @Test
    public void testgetColumnInfos06() throws IOException {
        String filename = "src/test/data/Excel/ExcelUtils/NO_TEST_CONDITION.xls";
        try {
            new ExcelUtils(filename);
        } catch (InvalidExcelBookException e) {
            String actual = e.getLocalizedMessage();
            String expected = "Excelファイルが異常です。テスト条件のシートの定義が不正です。 file = src/test/data/Excel/ExcelUtils/NO_TEST_CONDITION.xls, 行 = 26, 項目 = 比較条件";
            assertEquals(expected, actual);
        }
    }

    /**
     * getColumnInfos()のテスト
     * NULL値の取り扱いが未設定
     * @throws IOException
     */
    @Test
    public void testgetColumnInfos07() throws IOException {
        String filename = "src/test/data/Excel/ExcelUtils/NO_NULL_VALUE_CONDITION.xls";
        try {
            new ExcelUtils(filename);
        } catch (InvalidExcelBookException e) {
            String actual = e.getLocalizedMessage();
            String expected = "Excelファイルが異常です。テスト条件のシートの定義が不正です。 file = src/test/data/Excel/ExcelUtils/NO_NULL_VALUE_CONDITION.xls, 行 = 31, 項目 = NULL値";
            assertEquals(expected, actual);
        }
    }

    /**
     * getColumnInfos()のテスト
     * 正常系
     * @throws IOException
     */
    @Test
    public void testgetColumnInfos08() throws IOException {
        String filename = "src/test/data/Excel/ExcelUtils/FOO.xls";
        ExcelUtils excelUtils =  new ExcelUtils(filename);
        List<ColumnInfo> list = excelUtils.getColumnInfos();
        // カラム数の確認
        assertEquals(37, list.size());
        // 最初のカラムの確認
        ColumnInfo info;
        info = list.get(0);
        assertEquals("FOO", info.getTableName());
        assertEquals("PK", info.getColumnName());
        assertEquals("", info.getColumnComment());
        assertEquals(MySqlDataType.LONG, info.getDataType());
        assertTrue(info.isKey());
        assertFalse(info.isNullable());
        assertEquals(ColumnMatchingCondition.NONE, info.getColumnMatchingCondition());
        assertEquals(NullValueCondition.NORMAL, info.getNullValueCondition());

        // VARCHARのカラム(2番目)を確認
        info = list.get(2 - 1); // カラム番号は1オリジンなので、-1する
        assertEquals("FOO", info.getTableName());
        assertEquals("DETAIL_GROUP_ID", info.getColumnName());
        assertEquals("", info.getColumnComment());
        assertEquals(MySqlDataType.VARCHAR, info.getDataType());
        assertEquals(256, info.getCharacterMaximumLength());
        assertFalse(info.isKey());
        assertFalse(info.isNullable());
        assertEquals(ColumnMatchingCondition.PARTIAL, info.getColumnMatchingCondition());
        assertEquals(NullValueCondition.NULL_IS_NG, info.getNullValueCondition());

        // DECIMALのカラム(29番目)を確認
        info = list.get(29 - 1); // カラム番号は1オリジンなので、-1する
        assertEquals("FOO", info.getTableName());
        assertEquals("DEC_COL", info.getColumnName());
        assertEquals("DEC_COL_C", info.getColumnComment());
        assertEquals(MySqlDataType.DECIMAL, info.getDataType());
        assertEquals(10, info.getNumericPrecision());
        assertEquals(4, info.getNumericScale());
        assertFalse(info.isKey());
        assertTrue(info.isNullable());
        assertEquals(ColumnMatchingCondition.EXACT, info.getColumnMatchingCondition());
        assertEquals(NullValueCondition.NULL_IS_OK, info.getNullValueCondition());
    }


    /**
     * getColumnInfos()のテスト
     * 正常系 - 数値が文字列として入っている場合、文字列が数値と
     *          して入っている場合でも正しく動作することの確認
     */
    @Test
    public void testgetColumnInfos09() throws IOException {
        String filename = "src/test/data/Excel/ExcelUtils/BAR.xls";
        ExcelUtils excelUtils =  new ExcelUtils(filename);
        List<ColumnInfo> list = excelUtils.getColumnInfos();
        // カラム数の確認
        assertEquals(37, list.size());
        // 最初のカラムの確認
        ColumnInfo info;
        info = list.get(0);
        assertEquals("BAR", info.getTableName());
        assertEquals("PK", info.getColumnName());
        assertEquals("", info.getColumnComment());
        assertEquals(MySqlDataType.LONG, info.getDataType());
        assertTrue(info.isKey());
        assertFalse(info.isNullable());
        assertEquals(ColumnMatchingCondition.NONE, info.getColumnMatchingCondition());
        assertEquals(NullValueCondition.NORMAL, info.getNullValueCondition());

        // VARCHARのカラム(2番目)を確認
        info = list.get(2 - 1); // カラム番号は1オリジンなので、-1する
        assertEquals("BAR", info.getTableName());
        assertEquals("DETAIL_GROUP_ID", info.getColumnName());
        assertEquals("52", info.getColumnComment());
        assertEquals(MySqlDataType.VARCHAR, info.getDataType());
        assertEquals(256, info.getCharacterMaximumLength());
        assertFalse(info.isKey());
        assertFalse(info.isNullable());
        assertEquals(ColumnMatchingCondition.PARTIAL, info.getColumnMatchingCondition());
        assertEquals(NullValueCondition.NULL_IS_NG, info.getNullValueCondition());

        // DECIMALのカラム(29番目)を確認
        info = list.get(29 - 1); // カラム番号は1オリジンなので、-1する
        assertEquals("BAR", info.getTableName());
        assertEquals("DEC_COL", info.getColumnName());
        assertEquals("123456", info.getColumnComment());
        assertEquals(MySqlDataType.DECIMAL, info.getDataType());
        assertEquals(10, info.getNumericPrecision());
        assertEquals(4, info.getNumericScale());
        assertFalse(info.isKey());
        assertTrue(info.isNullable());
        assertEquals(ColumnMatchingCondition.EXACT, info.getColumnMatchingCondition());
        assertEquals(NullValueCondition.NULL_IS_OK, info.getNullValueCondition());
    }

    /**
     * getColumnInfos()のテスト
     * 数値のカラムに数値に変換できない文字列が設定されている
     * @throws IOException
     */
    @Test
    public void testgetColumnInfos10() throws IOException {
        String filename = "src/test/data/Excel/ExcelUtils/INVALID_NUM1.xls";
        try {
            new ExcelUtils(filename);
        } catch (InvalidExcelBookException e) {
            String actual = e.getLocalizedMessage();
            String expected = "Excelファイルが異常です。数値のセルに数値以外の値が設定されています。 file = src/test/data/Excel/ExcelUtils/INVALID_NUM1.xls, sheet = テスト条件, row = 5, col = 5";
            assertEquals(expected, actual);
        }
    }

    /**
     * getColumnInfos()のテスト
     * 数値のカラムに真偽値が設定されている
     * @throws IOException
     */
    @Test
    public void testgetColumnInfos11() throws IOException {
        String filename = "src/test/data/Excel/ExcelUtils/INVALID_NUM2.xls";
        try {
            new ExcelUtils(filename);
        } catch (InvalidExcelBookException e) {
            String actual = e.getLocalizedMessage();
            String expected = "Excelファイルが異常です。数値のセルに数値以外の値が設定されています。 file = src/test/data/Excel/ExcelUtils/INVALID_NUM2.xls, sheet = テスト条件, row = 5, col = 5";
            assertEquals(expected, actual);
        }
    }

    /**
     * getColumnInfos()のテスト
     * 文字列のカラムに数式が設定されている
     * @throws IOException
     */
    @Test
    public void testGetColumnInfos12() throws IOException {
        String filename = "src/test/data/Excel/ExcelUtils/INVALID_STR.xls";
        try {
            new ExcelUtils(filename);
        } catch (InvalidExcelBookException e) {
            String actual = e.getLocalizedMessage();
            String expected = "Excelファイルが異常です。文字列のセルに文字列以外の値が設定されています。 file = src/test/data/Excel/ExcelUtils/INVALID_STR.xls, sheet = テスト条件, row = 4, col = 3";
            assertEquals(expected, actual);
        }
    }


    /**
     * getXXXoption()のテスト
     * @throws Exception
     */
    @SuppressWarnings("deprecation")
    @Test
    public void testGetXXXOption() throws Exception {
        String filename = "src/test/data/Excel/ExcelUtils/ALLT_TYPES.xls";

        // テスト対象のEXCELシートを取得
        InputStream is = new FileInputStream(filename);
        HSSFWorkbook workbook = new HSSFWorkbook(is);
        HSSFSheet sheet = workbook.getSheet(Constants.OUTPUT_DATA_SHEET_NAME);

        // テスト対象のExcelUtilsオブジェクトを生成
        ExcelUtils excelUtils =  new ExcelUtils(filename);


        // getLongOptionのテスト

        LongOption longOption = new LongOption();
        longOption.modify(0);
        testGetXXXOptionDo(excelUtils, sheet,  DATA.NUMERIC_0, TYPES.BIGINT, longOption);
        longOption.modify(1);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_1, TYPES.BIGINT, longOption);
        longOption.modify(-1);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_MINUS1, TYPES.BIGINT, longOption);
        longOption.modify(ExcelUtils.EXCEL_MAX_LONG);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_MAX, TYPES.BIGINT, longOption);
        longOption.modify(ExcelUtils.EXCEL_MIN_LONG);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_MIN, TYPES.BIGINT, longOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_DECIMAL, TYPES.BIGINT, new NumberFormatException("小数部を持つ数値を整数型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_OVER_MAX, TYPES.BIGINT, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_UNDER_MIN, TYPES.BIGINT, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_BIG_VALUE, TYPES.BIGINT, new NumberFormatException("表現可能な範囲外の数値"));
        longOption.modify(0);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_0, TYPES.BIGINT, longOption);
        longOption.modify(1);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_1, TYPES.BIGINT, longOption);
        longOption.modify(-1);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_MINUS1, TYPES.BIGINT, longOption);
        longOption.modify(Long.MAX_VALUE);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_MAX, TYPES.BIGINT, longOption);
        longOption.modify(Long.MIN_VALUE);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_MIN, TYPES.BIGINT, longOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_DECIMAL, TYPES.BIGINT, new CellTypeMismatchException("数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_OVER_MAX, TYPES.BIGINT, new CellTypeMismatchException("数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_UNDER_MIN, TYPES.BIGINT, new CellTypeMismatchException("数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_BIG_VALUE, TYPES.BIGINT, new CellTypeMismatchException("数値"));
        longOption.setNull();
        testGetXXXOptionDo(excelUtils, sheet, DATA.BLANK, TYPES.BIGINT, longOption);
        longOption.setNull();
        testGetXXXOptionDo(excelUtils, sheet, DATA.NULL_STRING, TYPES.BIGINT, new CellTypeMismatchException("数値"));
        longOption.modify(1);
        testGetXXXOptionDo(excelUtils, sheet, DATA.BOOL_TRUE, TYPES.BIGINT, longOption);
        longOption.modify(0);
        testGetXXXOptionDo(excelUtils, sheet, DATA.BOOL_FALSE, TYPES.BIGINT, longOption);
        longOption.modify(40179);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_DATE, TYPES.BIGINT, longOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATE_FMT1, TYPES.BIGINT, longOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATE_FMT2, TYPES.BIGINT, longOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATETIME_FIMT1, TYPES.BIGINT, longOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATETIME_FIMT2, TYPES.BIGINT, longOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_DATE, TYPES.BIGINT, new CellTypeMismatchException("数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_DATETIME, TYPES.BIGINT, new NumberFormatException("小数部を持つ数値を整数型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATE_FMT1, TYPES.BIGINT, new NumberFormatException("小数部を持つ数値を整数型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATE_FMT2, TYPES.BIGINT, new NumberFormatException("小数部を持つ数値を整数型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATETIME_FIMT1, TYPES.BIGINT, new NumberFormatException("小数部を持つ数値を整数型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATETIME_FIMT2, TYPES.BIGINT, new NumberFormatException("小数部を持つ数値を整数型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_DATETIME, TYPES.BIGINT, new CellTypeMismatchException("数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.ERROR, TYPES.BIGINT,  new CellTypeMismatchException("数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.FORMULA, TYPES.BIGINT, new CellTypeMismatchException("数値"));

        // getIntOptionのテスト

        IntOption intOption = new IntOption();
        intOption.modify(0);
        testGetXXXOptionDo(excelUtils, sheet,  DATA.NUMERIC_0, TYPES.INT, intOption);
        intOption.modify(1);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_1, TYPES.INT, intOption);
        intOption.modify(-1);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_MINUS1, TYPES.INT, intOption);
        intOption.modify(Integer.MAX_VALUE);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_MAX, TYPES.INT, intOption);
        intOption.modify(Integer.MIN_VALUE);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_MIN, TYPES.INT, intOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_DECIMAL, TYPES.INT, new NumberFormatException("小数部を持つ数値を整数型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_OVER_MAX, TYPES.INT, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_UNDER_MIN, TYPES.INT, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_BIG_VALUE, TYPES.INT, new NumberFormatException("表現可能な範囲外の数値"));
        intOption.modify(0);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_0, TYPES.INT, intOption);
        intOption.modify(1);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_1, TYPES.INT, intOption);
        intOption.modify(-1);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_MINUS1, TYPES.INT, intOption);
        intOption.modify(Integer.MAX_VALUE);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_MAX, TYPES.INT, intOption);
        intOption.modify(Integer.MIN_VALUE);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_MIN, TYPES.INT, intOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_DECIMAL, TYPES.INT, new CellTypeMismatchException("数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_OVER_MAX, TYPES.INT, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_UNDER_MIN, TYPES.INT, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_BIG_VALUE, TYPES.INT, new CellTypeMismatchException("数値"));
        intOption.setNull();
        testGetXXXOptionDo(excelUtils, sheet, DATA.BLANK, TYPES.INT, intOption);
        longOption.setNull();
        testGetXXXOptionDo(excelUtils, sheet, DATA.NULL_STRING, TYPES.INT, new CellTypeMismatchException("数値"));
        intOption.modify(1);
        testGetXXXOptionDo(excelUtils, sheet, DATA.BOOL_TRUE, TYPES.INT, intOption);
        intOption.modify(0);
        testGetXXXOptionDo(excelUtils, sheet, DATA.BOOL_FALSE, TYPES.INT, intOption);
        intOption.modify(40179);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_DATE, TYPES.INT, intOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATE_FMT1, TYPES.INT, intOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATE_FMT2, TYPES.INT, intOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATETIME_FIMT1, TYPES.INT, intOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATETIME_FIMT2, TYPES.INT, intOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_DATE, TYPES.INT, new CellTypeMismatchException("数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_DATETIME, TYPES.INT, new NumberFormatException("小数部を持つ数値を整数型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATE_FMT1, TYPES.INT, new NumberFormatException("小数部を持つ数値を整数型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATE_FMT2, TYPES.INT, new NumberFormatException("小数部を持つ数値を整数型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATETIME_FIMT1, TYPES.INT, new NumberFormatException("小数部を持つ数値を整数型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATETIME_FIMT2, TYPES.INT, new NumberFormatException("小数部を持つ数値を整数型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_DATETIME, TYPES.INT, new CellTypeMismatchException("数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.ERROR, TYPES.INT,  new CellTypeMismatchException("数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.FORMULA, TYPES.INT, new CellTypeMismatchException("数値"));

        // getShortOptionのテスト

        ShortOption shortOption = new ShortOption();
        shortOption.modify((short) 0);
        testGetXXXOptionDo(excelUtils, sheet,  DATA.NUMERIC_0, TYPES.SMALLINT, shortOption);
        shortOption.modify((short) 1);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_1, TYPES.SMALLINT, shortOption);
        shortOption.modify((short) -1);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_MINUS1, TYPES.SMALLINT, shortOption);
        shortOption.modify(Short.MAX_VALUE);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_MAX, TYPES.SMALLINT, shortOption);
        shortOption.modify(Short.MIN_VALUE);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_MIN, TYPES.SMALLINT, shortOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_DECIMAL, TYPES.SMALLINT, new NumberFormatException("小数部を持つ数値を整数型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_OVER_MAX, TYPES.SMALLINT, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_UNDER_MIN, TYPES.SMALLINT, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_BIG_VALUE, TYPES.SMALLINT, new NumberFormatException("表現可能な範囲外の数値"));
        shortOption.modify((short)0);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_0, TYPES.SMALLINT, shortOption);
        shortOption.modify((short)1);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_1, TYPES.SMALLINT, shortOption);
        shortOption.modify((short)-1);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_MINUS1, TYPES.SMALLINT, shortOption);
        shortOption.modify(Short.MAX_VALUE);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_MAX, TYPES.SMALLINT, shortOption);
        shortOption.modify(Short.MIN_VALUE);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_MIN, TYPES.SMALLINT, shortOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_DECIMAL, TYPES.SMALLINT, new CellTypeMismatchException("数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_OVER_MAX, TYPES.SMALLINT, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_UNDER_MIN, TYPES.SMALLINT, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_BIG_VALUE, TYPES.SMALLINT, new CellTypeMismatchException("数値"));
        shortOption.setNull();
        testGetXXXOptionDo(excelUtils, sheet, DATA.BLANK, TYPES.SMALLINT, shortOption);
        longOption.setNull();
        testGetXXXOptionDo(excelUtils, sheet, DATA.NULL_STRING, TYPES.SMALLINT, new CellTypeMismatchException("数値"));
        shortOption.modify((short)1);
        testGetXXXOptionDo(excelUtils, sheet, DATA.BOOL_TRUE, TYPES.SMALLINT, shortOption);
        shortOption.modify((short)0);
        testGetXXXOptionDo(excelUtils, sheet, DATA.BOOL_FALSE, TYPES.SMALLINT, shortOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_DATE, TYPES.SMALLINT, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATE_FMT1, TYPES.SMALLINT, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATE_FMT2, TYPES.SMALLINT, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATETIME_FIMT1, TYPES.SMALLINT, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATETIME_FIMT2, TYPES.SMALLINT, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_DATE, TYPES.SMALLINT, new CellTypeMismatchException("数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_DATETIME, TYPES.SMALLINT, new NumberFormatException("小数部を持つ数値を整数型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATE_FMT1, TYPES.SMALLINT, new NumberFormatException("小数部を持つ数値を整数型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATE_FMT2, TYPES.SMALLINT, new NumberFormatException("小数部を持つ数値を整数型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATETIME_FIMT1, TYPES.SMALLINT, new NumberFormatException("小数部を持つ数値を整数型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATETIME_FIMT2, TYPES.SMALLINT, new NumberFormatException("小数部を持つ数値を整数型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_DATETIME, TYPES.SMALLINT, new CellTypeMismatchException("数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.ERROR, TYPES.SMALLINT,  new CellTypeMismatchException("数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.FORMULA, TYPES.SMALLINT, new CellTypeMismatchException("数値"));

        // getByteOptionのテスト
        ByteOption byteOption = new ByteOption();
        byteOption.modify((byte) 0);
        testGetXXXOptionDo(excelUtils, sheet,  DATA.NUMERIC_0, TYPES.TINYINT, byteOption);
        byteOption.modify((byte) 1);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_1, TYPES.TINYINT, byteOption);
        byteOption.modify((byte) -1);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_MINUS1, TYPES.TINYINT, byteOption);
        byteOption.modify(Byte.MAX_VALUE);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_MAX, TYPES.TINYINT, byteOption);
        byteOption.modify(Byte.MIN_VALUE);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_MIN, TYPES.TINYINT, byteOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_DECIMAL, TYPES.TINYINT, new NumberFormatException("小数部を持つ数値を整数型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_OVER_MAX, TYPES.TINYINT, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_UNDER_MIN, TYPES.TINYINT, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_BIG_VALUE, TYPES.TINYINT, new NumberFormatException("表現可能な範囲外の数値"));
        byteOption.modify((byte)0);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_0, TYPES.TINYINT, byteOption);
        byteOption.modify((byte)1);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_1, TYPES.TINYINT, byteOption);
        byteOption.modify((byte)-1);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_MINUS1, TYPES.TINYINT, byteOption);
        byteOption.modify(Byte.MAX_VALUE);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_MAX, TYPES.TINYINT, byteOption);
        byteOption.modify(Byte.MIN_VALUE);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_MIN, TYPES.TINYINT, byteOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_DECIMAL, TYPES.TINYINT, new CellTypeMismatchException("数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_OVER_MAX, TYPES.TINYINT, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_UNDER_MIN, TYPES.TINYINT, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_BIG_VALUE, TYPES.TINYINT, new CellTypeMismatchException("数値"));
        byteOption.setNull();
        testGetXXXOptionDo(excelUtils, sheet, DATA.BLANK, TYPES.TINYINT, byteOption);
        longOption.setNull();
        testGetXXXOptionDo(excelUtils, sheet, DATA.NULL_STRING, TYPES.TINYINT, new CellTypeMismatchException("数値"));
        byteOption.modify((byte)1);
        testGetXXXOptionDo(excelUtils, sheet, DATA.BOOL_TRUE, TYPES.TINYINT, byteOption);
        byteOption.modify((byte)0);
        testGetXXXOptionDo(excelUtils, sheet, DATA.BOOL_FALSE, TYPES.TINYINT, byteOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_DATE, TYPES.TINYINT, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATE_FMT1, TYPES.TINYINT, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATE_FMT2, TYPES.TINYINT, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATETIME_FIMT1, TYPES.TINYINT, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATETIME_FIMT2, TYPES.TINYINT, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_DATE, TYPES.TINYINT, new CellTypeMismatchException("数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_DATETIME, TYPES.TINYINT, new NumberFormatException("小数部を持つ数値を整数型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATE_FMT1, TYPES.TINYINT, new NumberFormatException("小数部を持つ数値を整数型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATE_FMT2, TYPES.TINYINT, new NumberFormatException("小数部を持つ数値を整数型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATETIME_FIMT1, TYPES.TINYINT, new NumberFormatException("小数部を持つ数値を整数型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATETIME_FIMT2, TYPES.TINYINT, new NumberFormatException("小数部を持つ数値を整数型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_DATETIME, TYPES.TINYINT, new CellTypeMismatchException("数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.ERROR, TYPES.TINYINT,  new CellTypeMismatchException("数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.FORMULA, TYPES.TINYINT, new CellTypeMismatchException("数値"));

        // getStringOptionのテスト

        StringOption stringOption = new StringOption();
        stringOption.modify("0");
        testGetXXXOptionDo(excelUtils, sheet,  DATA.NUMERIC_0, TYPES.CHAR, stringOption);
        stringOption.modify("1");
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_1, TYPES.CHAR, stringOption);
        stringOption.modify("-1");
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_MINUS1, TYPES.CHAR, stringOption);
        stringOption.modify("6.54321");
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_DECIMAL, TYPES.CHAR, stringOption);
        stringOption.modify("9.2233720368547697E18");
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_OVER_MAX, TYPES.CHAR, stringOption);
        stringOption.modify("-9.2233720368547697E18");
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_UNDER_MIN, TYPES.CHAR, stringOption);
        stringOption.modify("1.23456789012345E19");
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_BIG_VALUE, TYPES.CHAR, stringOption);
        stringOption.modify("0");
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_0, TYPES.CHAR, stringOption);
        stringOption.modify("1");
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_1, TYPES.CHAR, stringOption);
        stringOption.modify("-1");
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_MINUS1, TYPES.CHAR, stringOption);
        stringOption.modify("6.54321");
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_DECIMAL, TYPES.CHAR, stringOption);
        stringOption.modify("9223372036854775808");
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_OVER_MAX, TYPES.CHAR, stringOption);
        stringOption.modify("-9223372036854775809");
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_UNDER_MIN, TYPES.CHAR, stringOption);
        stringOption.modify("12345678901234567890");
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_BIG_VALUE, TYPES.CHAR, stringOption);
        stringOption.setNull();
        testGetXXXOptionDo(excelUtils, sheet, DATA.BLANK, TYPES.CHAR, stringOption);
        stringOption.modify("");
        testGetXXXOptionDo(excelUtils, sheet, DATA.NULL_STRING, TYPES.CHAR, stringOption);
        stringOption.modify("1");
        testGetXXXOptionDo(excelUtils, sheet, DATA.BOOL_TRUE, TYPES.CHAR, stringOption);
        stringOption.modify("0");
        testGetXXXOptionDo(excelUtils, sheet, DATA.BOOL_FALSE, TYPES.CHAR, stringOption);
        stringOption.modify("40179");
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_DATE, TYPES.CHAR, stringOption);
        stringOption.modify("2010-01-01 00:00:00");
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATE_FMT1, TYPES.CHAR, stringOption);
        stringOption.modify("2010-01-01 00:00:00");
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATE_FMT2, TYPES.CHAR, stringOption);
        stringOption.modify("2010-01-01 00:00:00");
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATETIME_FIMT1, TYPES.CHAR, stringOption);
        stringOption.modify("2010-01-01 00:00:00");
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATETIME_FIMT2, TYPES.CHAR, stringOption);
        stringOption.modify("2010-01-01");
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_DATE, TYPES.CHAR, stringOption);
        stringOption.modify("40452.50090277778");
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_DATETIME, TYPES.CHAR, stringOption);
        stringOption.modify("2010-10-01 12:01:18");
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATE_FMT1, TYPES.CHAR, stringOption);
        stringOption.modify("2010-10-01 12:01:18");
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATE_FMT2, TYPES.CHAR, stringOption);
        stringOption.modify("2010-10-01 12:01:18");
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATETIME_FIMT1, TYPES.CHAR, stringOption);
        stringOption.modify("2010-10-01 12:01:18");
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATETIME_FIMT2, TYPES.CHAR, stringOption);
        stringOption.modify("2010-10-01 12:01:18");
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_DATETIME, TYPES.CHAR, stringOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.ERROR, TYPES.CHAR,  new CellTypeMismatchException("文字列"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.FORMULA, TYPES.CHAR, new CellTypeMismatchException("文字列"));

        // getDateOptionのテスト

        DateOption dateOption = new DateOption();

        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_0, TYPES.DATE, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_1, TYPES.DATE, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_MINUS1, TYPES.DATE, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_DECIMAL, TYPES.DATE, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_OVER_MAX, TYPES.DATE, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_UNDER_MIN, TYPES.DATE, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_BIG_VALUE, TYPES.DATE, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_0, TYPES.DATE, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_1, TYPES.DATE, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_MINUS1, TYPES.DATE, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_DECIMAL, TYPES.DATE, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_OVER_MAX, TYPES.DATE, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_UNDER_MIN, TYPES.DATE, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_BIG_VALUE, TYPES.DATE, new CellTypeMismatchException("日付"));
        dateOption.setNull();
        testGetXXXOptionDo(excelUtils, sheet, DATA.BLANK, TYPES.DATE, dateOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NULL_STRING, TYPES.DATE, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.BOOL_TRUE, TYPES.DATE, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.BOOL_FALSE, TYPES.DATE, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_DATE, TYPES.DATE, new CellTypeMismatchException("日付"));
        dateOption.modify(DateUtil.getDayFromDate(2010, 1, 1));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATE_FMT1, TYPES.DATE, dateOption);
        dateOption.modify(DateUtil.getDayFromDate(2010, 1, 1));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATE_FMT2, TYPES.DATE, dateOption);
        dateOption.modify(DateUtil.getDayFromDate(2010, 1, 1));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATETIME_FIMT1, TYPES.DATE, dateOption);
        dateOption.modify(DateUtil.getDayFromDate(2010, 1, 1));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATETIME_FIMT2, TYPES.DATE, dateOption);
        dateOption.modify(DateUtil.getDayFromDate(2010, 1, 1));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_DATE, TYPES.DATE, dateOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_DATETIME, TYPES.DATE, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATE_FMT1, TYPES.DATE, new CellTypeMismatchException("時分秒が0でない値は日付型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATE_FMT2, TYPES.DATE, new CellTypeMismatchException("時分秒が0でない値は日付型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATETIME_FIMT1, TYPES.DATE, new CellTypeMismatchException("時分秒が0でない値は日付型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATETIME_FIMT2, TYPES.DATE, new CellTypeMismatchException("時分秒が0でない値は日付型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_DATETIME, TYPES.DATE, new CellTypeMismatchException("時分秒が0でない値は日付型に変換できません"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.ERROR, TYPES.DATE,  new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.FORMULA, TYPES.DATE, new CellTypeMismatchException("日付"));

        // getDateTimeOptionのテスト

        DateTimeOption dateTimeOption = new DateTimeOption();
        DateTime dateTime = new DateTime();

        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_0, TYPES.DATETIME, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_1, TYPES.DATETIME, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_MINUS1, TYPES.DATETIME, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_DECIMAL, TYPES.DATETIME, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_OVER_MAX, TYPES.DATETIME, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_UNDER_MIN, TYPES.DATETIME, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_BIG_VALUE, TYPES.DATETIME, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_0, TYPES.DATETIME, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_1, TYPES.DATETIME, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_MINUS1, TYPES.DATETIME, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_DECIMAL, TYPES.DATETIME, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_OVER_MAX, TYPES.DATETIME, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_UNDER_MIN, TYPES.DATETIME, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_BIG_VALUE, TYPES.DATETIME, new CellTypeMismatchException("日付"));
        dateTimeOption.setNull();
        testGetXXXOptionDo(excelUtils, sheet, DATA.BLANK, TYPES.DATETIME, dateTimeOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NULL_STRING, TYPES.DATETIME, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.BOOL_TRUE, TYPES.DATETIME, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.BOOL_FALSE, TYPES.DATETIME, new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_DATE, TYPES.DATETIME, new CellTypeMismatchException("日付"));
        dateTime.setElapsedSeconds(DateUtil.getDayFromDate(2010, 1, 1) * 86400L);
        dateTimeOption.modify(dateTime);
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATE_FMT1, TYPES.DATETIME, dateTimeOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATE_FMT2, TYPES.DATETIME, dateTimeOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATETIME_FIMT1, TYPES.DATETIME, dateTimeOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATETIME_FIMT2, TYPES.DATETIME, dateTimeOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_DATE, TYPES.DATETIME, dateTimeOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_DATETIME, TYPES.DATETIME, new CellTypeMismatchException("日付"));
        dateTime.setElapsedSeconds(DateUtil.getDayFromDate(2010, 10, 1) * 86400L + DateUtil.getSecondFromTime(12, 1, 18));
        dateTimeOption.modify(dateTime);
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATE_FMT1, TYPES.DATETIME, dateTimeOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATE_FMT2, TYPES.DATETIME, dateTimeOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATETIME_FIMT1, TYPES.DATETIME, dateTimeOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATETIME_FIMT2, TYPES.DATETIME, dateTimeOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_DATETIME, TYPES.DATETIME, dateTimeOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.ERROR, TYPES.DATETIME,  new CellTypeMismatchException("日付"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.FORMULA, TYPES.DATETIME, new CellTypeMismatchException("日付"));


        // getDecimalOptionのテスト

        DecimalOption decimalOption = new DecimalOption();
        decimalOption.modify(new BigDecimal("0"));
        testGetXXXOptionDo(excelUtils, sheet,  DATA.NUMERIC_0, TYPES.DECIMAL, decimalOption);
        decimalOption.modify(new BigDecimal("1"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_1, TYPES.DECIMAL, decimalOption);
        decimalOption.modify(new BigDecimal("-1"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_MINUS1, TYPES.DECIMAL, decimalOption);
        decimalOption.modify(new BigDecimal("999999999999999"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_MAX, TYPES.DECIMAL, decimalOption);
        decimalOption.modify(new BigDecimal("-999999999999999"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_MIN, TYPES.DECIMAL, decimalOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_DECIMAL, TYPES.DECIMAL, new NumberFormatException("小数部を持つ実数をDECIMALに変換できません。"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_OVER_MAX, TYPES.DECIMAL, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_UNDER_MIN, TYPES.DECIMAL, new NumberFormatException("表現可能な範囲外の数値"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_BIG_VALUE, TYPES.DECIMAL, new NumberFormatException("表現可能な範囲外の数値"));
        decimalOption.modify(new BigDecimal("0"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_0, TYPES.DECIMAL, decimalOption);
        decimalOption.modify(new BigDecimal("1"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_1, TYPES.DECIMAL, decimalOption);
        decimalOption.modify(new BigDecimal("-1"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_MINUS1, TYPES.DECIMAL, decimalOption);
        decimalOption.modify(new BigDecimal("6.54321"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_DECIMAL, TYPES.DECIMAL, decimalOption);
        decimalOption.modify(new BigDecimal("9223372036854775808"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_OVER_MAX, TYPES.DECIMAL, decimalOption);
        decimalOption.modify(new BigDecimal("-9223372036854775809"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_UNDER_MIN, TYPES.DECIMAL, decimalOption);
        decimalOption.modify(new BigDecimal("12345678901234567890"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_BIG_VALUE, TYPES.DECIMAL, decimalOption);
        decimalOption.setNull();
        testGetXXXOptionDo(excelUtils, sheet, DATA.BLANK, TYPES.DECIMAL, decimalOption);
        longOption.setNull();
        testGetXXXOptionDo(excelUtils, sheet, DATA.NULL_STRING, TYPES.DECIMAL, new NumberFormatException("DECIMALに変換できない文字列"));
        decimalOption.modify(new BigDecimal("1"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.BOOL_TRUE, TYPES.DECIMAL, decimalOption);
        decimalOption.modify(new BigDecimal("0"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.BOOL_FALSE, TYPES.DECIMAL, decimalOption);
        decimalOption.modify(new BigDecimal("40179"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_DATE, TYPES.DECIMAL, decimalOption);
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATE_FMT1, TYPES.DECIMAL, new CellTypeMismatchException("DECIMAL"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATE_FMT2, TYPES.DECIMAL, new CellTypeMismatchException("DECIMAL"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATETIME_FIMT1, TYPES.DECIMAL, new CellTypeMismatchException("DECIMAL"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATE_DATETIME_FIMT2, TYPES.DECIMAL, new CellTypeMismatchException("DECIMAL"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_DATE, TYPES.DECIMAL, new NumberFormatException("DECIMALに変換できない文字列"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.NUMERIC_DATETIME, TYPES.DECIMAL, new NumberFormatException("小数部を持つ実数をDECIMALに変換できません。"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATE_FMT1, TYPES.DECIMAL, new CellTypeMismatchException("DECIMAL"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATE_FMT2, TYPES.DECIMAL, new CellTypeMismatchException("DECIMAL"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATETIME_FIMT1, TYPES.DECIMAL, new CellTypeMismatchException("DECIMAL"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.DATETIME_DATETIME_FIMT2, TYPES.DECIMAL, new CellTypeMismatchException("DECIMAL"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.STRING_DATETIME, TYPES.DECIMAL, new NumberFormatException("DECIMALに変換できない文字列"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.ERROR, TYPES.DECIMAL,  new CellTypeMismatchException("DECIMAL"));
        testGetXXXOptionDo(excelUtils, sheet, DATA.FORMULA, TYPES.DECIMAL, new CellTypeMismatchException("DECIMAL"));

    }



    public void testGetXXXOptionDo(ExcelUtils excelUtils, HSSFSheet sheet, DATA data, TYPES types, Object expected) throws Exception {
        int rownum = data.getRownum();
        int colpos = types.getColpos();
        HSSFCell cell = getCell(sheet, rownum, colpos);
        String methodName = types.getMethodName();
        Method method = excelUtils.getClass().getDeclaredMethod(methodName, HSSFCell.class);
        method.setAccessible(true);

        Throwable t = null;
        Object actual = null;
        try {
            actual = method.invoke(excelUtils, cell);
        } catch (InvocationTargetException e) {
            t = e.getCause();
        }

        String fmt = "テスト対象メソッド: %s, セルの値[%s]";
        String assertMsg = String.format(fmt, methodName, data.getComment());

        if (t instanceof RuntimeException) {
            if (expected instanceof RuntimeException) {
            // Exceptionの型が同じ
            assertEquals(assertMsg, expected.getClass(), t.getClass());
            String expectedMsg = ((RuntimeException) expected).getMessage();
            String actualMsg = t.getMessage();
            // Exception中のメッセージがマッチすることの確認
            assertTrue(assertMsg, actualMsg.matches(".*" + expectedMsg + ".*"));
            } else {
                throw (RuntimeException)t;
            }
        } else if (expected instanceof Writable) {
            assertEquals(assertMsg, expected, actual);
        } else if (expected instanceof Exception) {
            throw new RuntimeException("Expected exception is not cought (" + expected.getClass().toString() +")");
        } else {
            throw new RuntimeException("Unexpected object class:" + expected.getClass().toString());
        }

    }

    /**
     * シート、行位置、カラム位置を指定してセルを取得する
     * @param sheet
     * @param rownum
     * @param col
     * @return
     */
    private HSSFCell getCell(HSSFSheet sheet, int rownum, int col) {
        HSSFRow row = sheet.getRow(rownum);
        HSSFCell cell = row.getCell(col);
        return cell;
    }


    /**
     * テスト対象のデータ型が定義されている列挙型
     */
    private enum TYPES {
        BIGINT(2, "getLongOption"),
        INT(3, "getIntOption"),
        SMALLINT(4, "getShortOption"),
        TINYINT(5, "getByteOption"),
        CHAR(6, "getStringOption"),
        DATETIME(7, "getDateTimeOption"),
        DATE(8, "getDateOption"),
        DECIMAL(9, "getDecimalOption");

        /**
         * EXCELシートのカラム位置
         */
        private int colpos;

        /**
         * テストに使用するメソッド名
         */
        private String methodName;

        public int getColpos() {
            return colpos;
        }

        public String getMethodName() {
            return methodName;
        }

        private TYPES(int colpos, String methodName) {
            this.colpos = colpos;
            this.methodName = methodName;
        }
    }


    /**
     * 各行にどのようなテストデータが定義されているかを
     * 表す列挙型
     */
    private enum DATA {
        NUMERIC_0("数値の0", 1),
        NUMERIC_1("数値の1", 2),
        NUMERIC_MINUS1("数値の-1", 3),
        NUMERIC_MAX("表現可能な最大値(数値)", 4),
        NUMERIC_MIN("表現可能な最小値(数値)", 5),
        NUMERIC_DECIMAL("小数値(数値)", 6),
        NUMERIC_OVER_MAX("表現可能な最大値+1(数値)", 7),
        NUMERIC_UNDER_MIN("表現可能な最小値-1(数値)", 8),
        NUMERIC_BIG_VALUE("大きな値(数値)", 9),
        STRING_0("文字列の0", 10),
        STRING_1("文字列の1", 11),
        STRING_MINUS1("文字列の-1", 12),
        STRING_MAX("表現可能な最大値(文字列)", 13),
        STRING_MIN("表現可能な最小値(文字列)", 14),
        STRING_DECIMAL("小数値(文字列)", 15),
        STRING_OVER_MAX("表現可能な最大値+1(文字列)", 16),
        STRING_UNDER_MIN("表現可能な最小値-1(文字列)", 17),
        STRING_BIG_VALUE("大きな値(数値)", 18),
        BLANK("ブランク", 19),
        NULL_STRING("空文字列", 20),
        BOOL_TRUE("BOOL値(TRUE)", 21),
        BOOL_FALSE("BOOL値(FALSE)", 22),
        NUMERIC_DATE("日付(数値フォーマット)", 23),
        DATE_DATE_FMT1("日付(日付フォーマット1)", 24),
        DATE_DATE_FMT2("日付(日付フォーマット2)", 25),
        DATE_DATETIME_FIMT1("日付(時刻フォーマット1)", 26),
        DATE_DATETIME_FIMT2("日付(時刻フォーマット2)", 27),
        STRING_DATE("日付(文字列)", 28),
        NUMERIC_DATETIME("時刻(数値フォーマット)", 29),
        DATETIME_DATE_FMT1("時刻(日付フォーマット1)", 30),
        DATETIME_DATE_FMT2("時刻(日付フォーマット2)", 31),
        DATETIME_DATETIME_FIMT1("時刻(時刻フォーマット1)", 32),
        DATETIME_DATETIME_FIMT2("時刻(時刻フォーマット2)", 33),
        STRING_DATETIME("時刻(文字列)", 34),
        ERROR("エラーセル", 35),
        FORMULA("数式セル", 36);


        /**
         * コメント
         */
        private String comment;

        /**
         * EXCELシートの行位置
         */
        private int rownum;

        private DATA(String comment, int rownum) {
            this.comment = comment;
            this.rownum = rownum;
        }

        public String getComment() {
            return comment;
        }

        public int getRownum() {
            return rownum;
        }
    }


}
TOP

Related Classes of com.asakusafw.testtools.excel.ExcelUtilsTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.