package net.w_horse.excelpojo.annotation;

import static org.junit.Assert.assertEquals;

import java.io.FileInputStream;
import java.io.IOException;

import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.junit.Test;

import test.annotation.AnnotationTestRangeLabeledCell;
import test.annotation.LabeledCellMargedLabel;
import test.annotation.LabeledCellRetrieveFrom;
import test.annotation.LabeledCellUseRequired;
import net.w_horse.excelpojo.AbstractTest;
import net.w_horse.excelpojo.ExcelPOJOBridge;
import net.w_horse.excelpojo.ExcelPOJOException;
import net.w_horse.excelpojo.excel.CellNotFoundException;

public class LabeledCellTest extends AbstractTest {
	/**
	 * 結合されたラベルによるデータ取得（margedLabel）の動作テスト
	 *
	 */
	@Test
	public void testReadAndSaveLabeledCellMargedLabel() throws ExcelPOJOException, IOException {
		ExcelPOJOBridge bridge = new ExcelPOJOBridge(LabeledCellMargedLabel.class);
		LabeledCellMargedLabel targetBean = (LabeledCellMargedLabel) bridge.load("./files/upload/ParserTest.xls", "Users2");

		assertEquals("基本（取得）：LabeledCell：String", "会員リスト", targetBean.getRetrievMargedLable0());
		assertEquals("基本（取得）：LabeledCell：String", "ExcelPOJOの会員", targetBean.getRetrievMargedLable1());
		assertEquals("基本（取得）：LabeledCell：String", "会員リスト（２）", targetBean.getRetrievMargedLableNone());

		bridge.save(
				"./files/template/ParserTest_Template.xls",
				"Users2",
				"./files/export/AnnotationParserTest_ラベル連結.xls",
				targetBean);

		FileInputStream fileInputStream = null;
		try {
			fileInputStream = new FileInputStream("./files/export/AnnotationParserTest_ラベル連結.xls");
			HSSFWorkbook workBook = new HSSFWorkbook(new POIFSFileSystem(fileInputStream));
			HSSFSheet sheet = workBook.getSheet("Users2");

			assertEquals("基本（書き込み）：LabeledCell：String", "会員リスト", getCellValue(sheet, 1, 2, CELL_TYPE_STRING));
			assertEquals("基本（書き込み）：LabeledCell：String", "ExcelPOJOの会員", getCellValue(sheet, 2, 2, CELL_TYPE_STRING));
			assertEquals("基本（書き込み）：LabeledCell：String", "会員リスト（２）", getCellValue(sheet, 1, 5, CELL_TYPE_STRING));
		} finally {
			try { fileInputStream.close(); } catch (Exception e) { }
		}
	}

	/**
	 * ラベルの読み込みに必須指定（use=required）を指定した際の動作テスト
	 * 必須だが該当する表が見つからない場合⇒例外があがる
	 */
	@Test(expected=CellNotFoundException.class)
	public void testReadAndSaveLabeledCellUseRequired() throws ExcelPOJOException, IOException {
		ExcelPOJOBridge bridge = new ExcelPOJOBridge(LabeledCellUseRequired.class);
		@SuppressWarnings("unused")
		LabeledCellUseRequired targetBean = (LabeledCellUseRequired) bridge.load("./files/upload/ParserTest.xls", "ラベル読み込み位置");
	}

	/**
	 * ラベルによる位置検索に対し、データ取得位置（retrieveFrom）の動作テスト
	 *
	 */
	@Test
	public void testReadAndSaveLabeledCellRetrieveFrom() throws ExcelPOJOException, IOException {
		ExcelPOJOBridge bridge = new ExcelPOJOBridge(LabeledCellRetrieveFrom.class);
		LabeledCellRetrieveFrom targetBean = (LabeledCellRetrieveFrom) bridge.load("./files/upload/ParserTest.xls", "ラベル読み込み位置");

		assertEquals("基本（取得）：LabeledCell：String", "右のデータ", targetBean.getRetrievFromRight());
		assertEquals("基本（取得）：LabeledCell：String", "下のデータ", targetBean.getRetrievFromBottom());
		assertEquals("基本（取得）：LabeledCell：String", "左のデータ", targetBean.getRetrievFromLeft());

		bridge.save(
				"./files/template/ParserTest_Template.xls",
				"ラベル読み込み位置",
				"./files/export/AnnotationParserTest_ラベル読み込み位置.xls",
				targetBean);

		FileInputStream fileInputStream = null;
		try {
			fileInputStream = new FileInputStream("./files/export/AnnotationParserTest_ラベル読み込み位置.xls");
			HSSFWorkbook workBook = new HSSFWorkbook(new POIFSFileSystem(fileInputStream));
			HSSFSheet sheet = workBook.getSheet("ラベル読み込み位置");

			assertEquals("基本（書き込み）：LabeledCell：String", "右のデータ", getCellValue(sheet, 4, 4, CELL_TYPE_STRING));
			assertEquals("基本（書き込み）：LabeledCell：String", "下のデータ", getCellValue(sheet, 5, 3, CELL_TYPE_STRING));
			assertEquals("基本（書き込み）：LabeledCell：String", "左のデータ", getCellValue(sheet, 4, 2, CELL_TYPE_STRING));
		} finally {
			try { fileInputStream.close(); } catch (Exception e) { }
		}
	}

	/**
	 * 範囲指定検索のテスト
	 * ラベルに対する指定の場合（必須にしているので検索不一致の場合は例外があがる）
	 * @throws ExcelPOJOException
	 */
	@Test(expected=CellNotFoundException.class)
	public void testRangeLabeledCell() throws ExcelPOJOException {
		ExcelPOJOBridge bridge = new ExcelPOJOBridge(AnnotationTestRangeLabeledCell.class);
		@SuppressWarnings("unused")
		AnnotationTestRangeLabeledCell targetBean = (AnnotationTestRangeLabeledCell) bridge.load("./files/upload/ParserTest.xls", "基本");
	}


}
