package com.gh.mygreen.xlsmapper.cellconvert;
import static com.gh.mygreen.xlsmapper.TestUtils.*;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import java.awt.Point;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.junit.BeforeClass;
import org.junit.Test;
import com.gh.mygreen.xlsmapper.IsEmptyBuilder;
import com.gh.mygreen.xlsmapper.TestUtils;
import com.gh.mygreen.xlsmapper.XlsMapper;
import com.gh.mygreen.xlsmapper.annotation.OverRecordOperate;
import com.gh.mygreen.xlsmapper.annotation.RecordTerminal;
import com.gh.mygreen.xlsmapper.annotation.XlsBooleanConverter;
import com.gh.mygreen.xlsmapper.annotation.XlsColumn;
import com.gh.mygreen.xlsmapper.annotation.XlsConverter;
import com.gh.mygreen.xlsmapper.annotation.XlsFormula;
import com.gh.mygreen.xlsmapper.annotation.XlsHint;
import com.gh.mygreen.xlsmapper.annotation.XlsHorizontalRecords;
import com.gh.mygreen.xlsmapper.annotation.XlsIsEmpty;
import com.gh.mygreen.xlsmapper.annotation.XlsSheet;
import com.gh.mygreen.xlsmapper.cellconvert.converter.BooleanCellConverter;
import com.gh.mygreen.xlsmapper.validation.SheetBindingErrors;
/**
* {@link BooleanCellConverter}のテスタ
* @version 1.5
* @author T.TSUCHIE
*
*/
public class BooleanCellConverterTest {
/**
* テスト結果ファイルの出力ディレクトリ
*/
private static File OUT_DIR;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
OUT_DIR = createOutDir();
}
/**
* boolean/Boolen型の読み込みテスト
*/
@Test
public void test_load_boolean() throws Exception {
XlsMapper mapper = new XlsMapper();
mapper.getConig().setContinueTypeBindFailure(true);
try(InputStream in = new FileInputStream("src/test/data/convert.xlsx")) {
SheetBindingErrors errors = new SheetBindingErrors(BooleanSheet.class);
BooleanSheet sheet = mapper.load(in, BooleanSheet.class, errors);
if(sheet.simpleRecords != null) {
for(SimpleRecord record : sheet.simpleRecords) {
assertRecord(record, errors);
}
}
if(sheet.formattedRecords != null) {
for(FormattedRecord record : sheet.formattedRecords) {
assertRecord(record, errors);
}
}
if(sheet.formulaRecords != null) {
for(FormulaRecord record : sheet.formulaRecords) {
assertRecord(record, errors);
}
}
}
}
/**
* 入力用のシートのレコードの値を検証する。
* @param record
* @param errors
*/
private void assertRecord(final SimpleRecord record, final SheetBindingErrors errors) {
if(record.no == 1) {
// 空文字
assertThat(record.b1, is(false));
assertThat(record.b2, is(nullValue()));
} else if(record.no == 2) {
// Excelの型(true)
assertThat(record.b1, is(true));
assertThat(record.b2, is(Boolean.TRUE));
} else if(record.no == 3) {
// Excelの型(false)
assertThat(record.b1, is(false));
assertThat(record.b2, is(Boolean.FALSE));
} else if(record.no == 4) {
// 文字列(yes)
assertThat(record.b1, is(true));
assertThat(record.b2, is(Boolean.TRUE));
} else if(record.no == 5) {
// 文字列(false)
assertThat(record.b1, is(false));
assertThat(record.b2, is(Boolean.FALSE));
} else if(record.no == 6) {
// 不正な文字
assertThat(cellFieldError(errors, cellAddress(record.positions.get("b1"))).isTypeBindFailure(), is(true));
assertThat(cellFieldError(errors, cellAddress(record.positions.get("b2"))).isTypeBindFailure(), is(true));
} else if(record.no == 7) {
// 空白の文字
assertThat(cellFieldError(errors, cellAddress(record.positions.get("b1"))).isTypeBindFailure(), is(true));
assertThat(cellFieldError(errors, cellAddress(record.positions.get("b2"))).isTypeBindFailure(), is(true));
} else {
fail(String.format("not support test case. No=%d.", record.no));
}
}
/**
* 入力用のシートのレコードの値を検証する。
* @param record
* @param errors
*/
private void assertRecord(final FormattedRecord record, final SheetBindingErrors errors) {
if(record.no == 1) {
// 空文字
assertThat(record.b1, is(true));
assertThat(record.b2, is(Boolean.TRUE));
assertThat(record.b3, is(false));
assertThat(record.b4, is(Boolean.FALSE));
} else if(record.no == 2) {
// Excelの型(true)
assertThat(record.b1, is(true));
assertThat(record.b2, is(Boolean.TRUE));
assertThat(record.b3, is(true));
assertThat(record.b4, is(Boolean.TRUE));
} else if(record.no == 3) {
// Excelの型(false)
assertThat(record.b1, is(false));
assertThat(record.b2, is(Boolean.FALSE));
assertThat(record.b3, is(false));
assertThat(record.b4, is(Boolean.FALSE));
} else if(record.no == 4) {
// 文字列(yes)
assertThat(record.b1, is(true));
assertThat(record.b2, is(Boolean.TRUE));
assertThat(record.b3, is(true));
assertThat(record.b4, is(Boolean.TRUE));
} else if(record.no == 5) {
// 文字列(false)
assertThat(record.b1, is(false));
assertThat(record.b2, is(Boolean.FALSE));
assertThat(record.b3, is(false));
assertThat(record.b4, is(Boolean.FALSE));
} else if(record.no == 6) {
// 不正な文字
assertThat(record.b1, is(false));
assertThat(record.b2, is(Boolean.FALSE));
assertThat(record.b3, is(false));
assertThat(record.b4, is(Boolean.FALSE));
} else if(record.no == 7) {
// 空白の文字
assertThat(record.b1, is(true));
assertThat(record.b2, is(Boolean.TRUE));
assertThat(record.b3, is(true));
assertThat(record.b4, is(Boolean.TRUE));
} else {
fail(String.format("not support test case. No=%d.", record.no));
}
}
/**
* 入力用のシートのレコードの値を検証する。
* @param record
* @param errors
*/
private void assertRecord(final FormulaRecord record, final SheetBindingErrors errors) {
if(record.no == 1) {
// 空文字
assertThat(record.b1, is(false));
assertThat(record.b2, is(nullValue()));
} else if(record.no == 2) {
// Excelの型(true)
assertThat(record.b1, is(true));
assertThat(record.b2, is(Boolean.TRUE));
} else if(record.no == 3) {
// Excelの型(false)
assertThat(record.b1, is(false));
assertThat(record.b2, is(Boolean.FALSE));
} else {
fail(String.format("not support test case. No=%d.", record.no));
}
}
/**
* boolean/Boolean型の書き込みテスト
*/
@Test
public void test_save_boolean() throws Exception {
// テストデータの作成
BooleanSheet outSheet = new BooleanSheet();
// Converterアノテーションなしのデータ作成
outSheet.add(new SimpleRecord()
.comment("空文字"));
outSheet.add(new SimpleRecord()
.b1(true)
.b2(true)
.comment("Trueの値"));
outSheet.add(new SimpleRecord()
.b1(false)
.b2(false)
.comment("falseの値"));
// Converterアノテーションありのデータ作成
outSheet.add(new FormattedRecord()
.comment("空文字"));
outSheet.add(new FormattedRecord()
.b1(true)
.b2(true)
.b3(true)
.b4(true)
.comment("Trueの値"));
outSheet.add(new FormattedRecord()
.b1(false)
.b2(false)
.b3(false)
.b4(false)
.comment("falseの値"));
// 数式のデータ作成
outSheet.add(new FormulaRecord().comment("1つ目"));
outSheet.add(new FormulaRecord().comment("2つ目"));
// ファイルへの書き込み
XlsMapper mapper = new XlsMapper();
mapper.getConig().setContinueTypeBindFailure(true);
File outFile = new File(OUT_DIR, "convert_boolean.xlsx");
try(InputStream template = new FileInputStream("src/test/data/convert_template.xlsx");
OutputStream out = new FileOutputStream(outFile)) {
mapper.save(template, out, outSheet);
}
// 書き込んだファイルを読み込み値の検証を行う。
try(InputStream in = new FileInputStream(outFile)) {
SheetBindingErrors errors = new SheetBindingErrors(BooleanSheet.class);
BooleanSheet sheet = mapper.load(in, BooleanSheet.class, errors);
if(sheet.simpleRecords != null) {
assertThat(sheet.simpleRecords, hasSize(outSheet.simpleRecords.size()));
for(int i=0; i < sheet.simpleRecords.size(); i++) {
assertRecord(sheet.simpleRecords.get(i), outSheet.simpleRecords.get(i), errors);
}
}
if(sheet.formattedRecords != null) {
assertThat(sheet.formattedRecords, hasSize(outSheet.formattedRecords.size()));
for(int i=0; i < sheet.formattedRecords.size(); i++) {
assertRecord(sheet.formattedRecords.get(i), outSheet.formattedRecords.get(i), errors);
}
}
if(sheet.formulaRecords != null) {
assertThat(sheet.formulaRecords, hasSize(outSheet.formulaRecords.size()));
for(int i=0; i < sheet.formulaRecords.size(); i++) {
assertRecord(sheet.formulaRecords.get(i), outSheet.formulaRecords.get(i), errors);
}
}
}
}
/**
* 書き込んだレコードを検証するための
* @param inRecord
* @param outRecord
* @param errors
*/
private void assertRecord(final SimpleRecord inRecord, final SimpleRecord outRecord, final SheetBindingErrors errors) {
System.out.printf("%s - assertRecord::%s no=%d, comment=%s\n",
this.getClass().getSimpleName(), inRecord.getClass().getSimpleName(), inRecord.no, inRecord.comment);
assertThat(inRecord.no, is(outRecord.no));
assertThat(inRecord.b1, is(outRecord.b1));
assertThat(inRecord.b2, is(outRecord.b2));
assertThat(inRecord.comment, is(outRecord.comment));
}
/**
* 書き込んだレコードを検証するための
* @param inRecord
* @param outRecord
* @param errors
*/
private void assertRecord(final FormattedRecord inRecord, final FormattedRecord outRecord, final SheetBindingErrors errors) {
System.out.printf("%s - assertRecord::%s no=%d, comment=%s\n",
this.getClass().getSimpleName(), inRecord.getClass().getSimpleName(), inRecord.no, inRecord.comment);
if(inRecord.no == 1) {
assertThat(inRecord.no, is(outRecord.no));
assertThat(inRecord.b1, is(false));
assertThat(inRecord.b2, is(true));
assertThat(inRecord.b3, is(false));
assertThat(inRecord.b4, is(false));
assertThat(inRecord.comment, is(outRecord.comment));
} else {
assertThat(inRecord.no, is(outRecord.no));
assertThat(inRecord.b1, is(outRecord.b1));
assertThat(inRecord.b2, is(outRecord.b2));
assertThat(inRecord.b3, is(outRecord.b3));
assertThat(inRecord.b4, is(outRecord.b4));
assertThat(inRecord.comment, is(outRecord.comment));
}
}
/**
* 書き込んだレコードを検証するための
* @param inRecord
* @param outRecord
* @param errors
*/
private void assertRecord(final FormulaRecord inRecord, final FormulaRecord outRecord, final SheetBindingErrors errors) {
System.out.printf("%s - assertRecord::%s no=%d, comment=%s\n",
this.getClass().getSimpleName(), inRecord.getClass().getSimpleName(), inRecord.no, inRecord.comment);
if(inRecord.no == 1) {
assertThat(inRecord.no, is(outRecord.no));
assertThat(inRecord.b1, is(false));
assertThat(inRecord.b2, is(Boolean.FALSE));
assertThat(inRecord.comment, is(outRecord.comment));
} else if(inRecord.no == 2) {
assertThat(inRecord.no, is(outRecord.no));
assertThat(inRecord.b1, is(true));
assertThat(inRecord.b2, is(Boolean.TRUE));
assertThat(inRecord.comment, is(outRecord.comment));
} else {
assertThat(inRecord.no, is(outRecord.no));
assertThat(inRecord.b1, is(outRecord.b1));
assertThat(inRecord.b2, is(outRecord.b2));
assertThat(inRecord.comment, is(outRecord.comment));
}
}
@XlsSheet(name="ブール型")
private static class BooleanSheet {
@XlsHint(order=1)
@XlsHorizontalRecords(tableLabel="ブール型(アノテーションなし)", terminal=RecordTerminal.Border, ignoreEmptyRecord=true,
overRecord=OverRecordOperate.Insert)
private List<SimpleRecord> simpleRecords;
@XlsHint(order=2)
@XlsHorizontalRecords(tableLabel="ブール型(初期値、書式)", terminal=RecordTerminal.Border, ignoreEmptyRecord=true,
overRecord=OverRecordOperate.Insert)
private List<FormattedRecord> formattedRecords;
@XlsHint(order=3)
@XlsHorizontalRecords(tableLabel="ブール型(数式)", terminal=RecordTerminal.Border, ignoreEmptyRecord=true,
overRecord=OverRecordOperate.Insert)
private List<FormulaRecord> formulaRecords;
/**
* noを自動的に付与する。
* @param record
* @return 自身のインスタンス
*/
public BooleanSheet add(SimpleRecord record) {
if(simpleRecords == null) {
this.simpleRecords = new ArrayList<>();
}
this.simpleRecords.add(record);
record.no(simpleRecords.size());
return this;
}
/**
* noを自動的に付与する。
* @param record
* @return 自身のインスタンス
*/
public BooleanSheet add(FormattedRecord record) {
if(formattedRecords == null) {
this.formattedRecords = new ArrayList<>();
}
this.formattedRecords.add(record);
record.no(formattedRecords.size());
return this;
}
/**
* noを自動的に付与する。
* @param record
* @return 自身のインスタンス
*/
public BooleanSheet add(FormulaRecord record) {
if(formulaRecords == null) {
this.formulaRecords = new ArrayList<>();
}
this.formulaRecords.add(record);
record.no(formulaRecords.size());
return this;
}
}
/**
* ブール値 - アノテーションなし
*
*/
private static class SimpleRecord {
private Map<String, Point> positions;
private Map<String, String> labels;
@XlsColumn(columnName="No.")
private int no;
@XlsColumn(columnName="boolean型")
private boolean b1;
@XlsColumn(columnName="Boolean型")
private Boolean b2;
@XlsColumn(columnName="備考")
private String comment;
@XlsIsEmpty
public boolean isEmpty() {
return IsEmptyBuilder.reflectionIsEmpty(this, "positions", "labels", "no");
}
public SimpleRecord no(int no) {
this.no = no;
return this;
}
public SimpleRecord b1(boolean b1) {
this.b1 = b1;
return this;
}
public SimpleRecord b2(Boolean b2) {
this.b2 = b2;
return this;
}
public SimpleRecord comment(String comment) {
this.comment = comment;
return this;
}
}
private static class FormattedRecord {
private Map<String, Point> positions;
private Map<String, String> labels;
@XlsColumn(columnName="No.")
private int no;
@XlsConverter(defaultValue="true", trim=true)
@XlsBooleanConverter(failToFalse=true, ignoreCase=true)
@XlsColumn(columnName="boolean型")
private boolean b1;
@XlsConverter(defaultValue="true", trim=true)
@XlsBooleanConverter(failToFalse=true, ignoreCase=true)
@XlsColumn(columnName="Boolean型")
private Boolean b2;
@XlsConverter(defaultValue="abc", trim=true)
@XlsBooleanConverter(loadForTrue={"○", "真"}, loadForFalse={"×", "偽", ""}, saveAsTrue="○", saveAsFalse="×",
failToFalse=true, ignoreCase=true)
@XlsColumn(columnName="boolean型(パターン)")
private boolean b3;
@XlsConverter(defaultValue="def", trim=true)
@XlsBooleanConverter(loadForTrue={"OK", "RIGHT"}, loadForFalse={"NOT", "-", ""}, saveAsTrue="OK", saveAsFalse="NOT",
failToFalse=true, ignoreCase=false)
@XlsColumn(columnName="Boolean型(パターン)")
private Boolean b4;
@XlsColumn(columnName="備考")
private String comment;
@XlsIsEmpty
public boolean isEmpty() {
return IsEmptyBuilder.reflectionIsEmpty(this, "positions", "labels", "no");
}
public FormattedRecord no(int no) {
this.no = no;
return this;
}
public FormattedRecord b1(boolean b1) {
this.b1 = b1;
return this;
}
public FormattedRecord b2(Boolean b2) {
this.b2 = b2;
return this;
}
public FormattedRecord b3(boolean b3) {
this.b3 = b3;
return this;
}
public FormattedRecord b4(Boolean b4) {
this.b4 = b2;
return this;
}
public FormattedRecord comment(String comment) {
this.comment = comment;
return this;
}
}
private static class FormulaRecord {
private Map<String, Point> positions;
private Map<String, String> labels;
@XlsColumn(columnName="No.")
private int no;
@XlsConverter(defaultValue="false", trim=true)
@XlsBooleanConverter(failToFalse=true, ignoreCase=true)
@XlsColumn(columnName="boolean型")
@XlsFormula(value="MOD(A${rowNumber},2)=0", primary=true)
private boolean b1;
@XlsConverter(trim=true)
@XlsBooleanConverter(loadForTrue={"偶数"}, loadForFalse={"奇数"}, saveAsTrue="偶数", saveAsFalse="奇数",
failToFalse=false, ignoreCase=false)
@XlsColumn(columnName="Boolean型(パターン)")
@XlsFormula(value="IF(MOD(A{rowNumber},2)=0, \"偶数\", \"奇数\")")
private Boolean b2;
@XlsColumn(columnName="備考")
private String comment;
public FormulaRecord no(int no) {
this.no = no;
return this;
}
public FormulaRecord b1(boolean b1) {
this.b1 = b1;
return this;
}
public FormulaRecord b2(Boolean b2) {
this.b2 = b2;
return this;
}
public FormulaRecord comment(String comment) {
this.comment = comment;
return this;
}
}
}