package com.gh.mygreen.xlsmapper.validation;
import static com.gh.mygreen.xlsmapper.TestUtils.*;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import java.awt.Point;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import com.gh.mygreen.xlsmapper.IsEmptyBuilder;
import com.gh.mygreen.xlsmapper.XlsMapper;
import com.gh.mygreen.xlsmapper.annotation.LabelledCellType;
import com.gh.mygreen.xlsmapper.annotation.RecordTerminal;
import com.gh.mygreen.xlsmapper.annotation.XlsColumn;
import com.gh.mygreen.xlsmapper.annotation.XlsDateConverter;
import com.gh.mygreen.xlsmapper.annotation.XlsHorizontalRecords;
import com.gh.mygreen.xlsmapper.annotation.XlsIsEmpty;
import com.gh.mygreen.xlsmapper.annotation.XlsLabelledCell;
import com.gh.mygreen.xlsmapper.annotation.XlsSheet;
import com.gh.mygreen.xlsmapper.annotation.XlsSheetName;
import com.gh.mygreen.xlsmapper.validation.fieldvalidation.CellField;
import com.gh.mygreen.xlsmapper.validation.fieldvalidation.MaxValidator;
import com.gh.mygreen.xlsmapper.validation.fieldvalidation.PatternValidator;
import com.gh.mygreen.xlsmapper.validation.fieldvalidation.StringValidator;
/**
* {@link AbstractObjectValidator}のテスタ
*
* @since 0.5
* @author T.TSUCHIE
*
*/
public class ObjectValidatorTest {
private SheetMessageConverter messageConverter;
@Before
public void setUp() throws Exception {
this.messageConverter = new SheetMessageConverter();
}
/**
* エラーなし
*/
@Test
public void test_success() throws Exception {
XlsMapper mapper = new XlsMapper();
mapper.getConig().setContinueTypeBindFailure(true);
// シートの読み込み
SheetBindingErrors errors = new SheetBindingErrors(SampleSheet.class);;
SampleSheet sheet;
try(InputStream in = new FileInputStream("src/test/data/validator_field.xlsx")) {
sheet = mapper.load(in, SampleSheet.class, errors);
}
// 入力値検証
SampleSheetValidator validator = new SampleSheetValidator();
validator.validate(sheet, errors);
assertThat(errors.getAllErrors(), hasSize(0));
}
/**
* エラーあり
*/
@Test
public void test_error() throws Exception {
XlsMapper mapper = new XlsMapper();
mapper.getConig().setContinueTypeBindFailure(true);
// シートの読み込み
SheetBindingErrors errors = new SheetBindingErrors(SampleSheet.class);;
SampleSheet sheet;
try(InputStream in = new FileInputStream("src/test/data/validator_field.xlsx")) {
sheet = mapper.load(in, SampleSheet.class, errors);
}
// データの書き換え
sheet.className = null;
sheet.list.get(1).email = "test";
sheet.list.get(2).birthday = getDateByDay(new Date(), 1);
// 入力値検証
SampleSheetValidator validator = new SampleSheetValidator();
validator.validate(sheet, errors);
printErrors(errors);
{
String fieldName = "className";
CellFieldError fieldError = errors.getFirstCellFieldError(fieldName);
assertThat(fieldError.getCellAddress(), is(sheet.positions.get(fieldName)));
assertThat(fieldError.getLabel(), is(sheet.labels.get(fieldName)));
assertThat(fieldError.getCodes(), hasItemInArray("cellFieldError.required"));
assertThat(fieldError.getVars(), hasEntry("validatedValue", (Object)sheet.className));
}
{
try {
errors.pushNestedPath("list", 1);
PersonRecord record = sheet.list.get(1);
String fieldName = "email";
CellFieldError fieldError = errors.getFirstCellFieldError(fieldName);
assertThat(fieldError.getCellAddress(), is(record.positions.get(fieldName)));
assertThat(fieldError.getLabel(), is(record.labels.get(fieldName)));
assertThat(fieldError.getCodes(), hasItemInArray("cellFieldError.pattern"));
assertThat(fieldError.getVars(), hasEntry("validatedValue", (Object)record.email));
} finally {
errors.popNestedPath();
}
}
{
try {
errors.pushNestedPath("list", 2);
PersonRecord record = sheet.list.get(2);
String fieldName = "birthday";
CellFieldError fieldError = errors.getFirstCellFieldError(fieldName);
assertThat(fieldError.getCellAddress(), is(record.positions.get(fieldName)));
assertThat(fieldError.getLabel(), is(record.labels.get(fieldName)));
assertThat(fieldError.getCodes(), hasItemInArray("cellFieldError.max"));
assertThat(fieldError.getVars(), hasEntry("validatedValue", (Object)record.birthday));
} finally {
errors.popNestedPath();
}
}
}
private void printErrors(SheetBindingErrors errors) {
for(ObjectError error : errors.getAllErrors()) {
String message = messageConverter.convertMessage(error);
System.out.println(message);
}
}
@XlsSheet(name="サンプル")
private static class SampleSheet {
private Map<String, Point> positions;
private Map<String, String> labels;
@XlsSheetName
private String sheetName;
@XlsLabelledCell(label="クラス名", type=LabelledCellType.Right)
private String className;
@XlsHorizontalRecords(tableLabel="名簿一覧", terminal=RecordTerminal.Border, ignoreEmptyRecord=true)
private List<PersonRecord> list;
public String getClassName() {
return className;
}
}
private static class PersonRecord {
private Map<String, Point> positions;
private Map<String, String> labels;
@XlsColumn(columnName="No.")
private int no;
@XlsColumn(columnName="氏名")
private String name;
@XlsColumn(columnName="メールアドレス")
private String email;
@XlsDateConverter(lenient=true, javaPattern="yyyy年M月d日")
@XlsColumn(columnName="生年月日")
private Date birthday;
@XlsIsEmpty
public boolean isEmpty() {
return IsEmptyBuilder.reflectionIsEmpty(this, "positions", "labels", "no");
}
public int getNo() {
return no;
}
public String getName() {
return name;
}
public String getEmail() {
return email;
}
public Date getBirthday() {
return birthday;
}
}
/**
* {@link SampleSheet}のValidator.
*
*/
private static class SampleSheetValidator extends AbstractObjectValidator<SampleSheet> {
private PersonRecordVaidator personRecordValidator;
public SampleSheetValidator() {
this.personRecordValidator = new PersonRecordVaidator();
}
@Override
public void validate(final SampleSheet targetObj, final SheetBindingErrors errors) {
CellField<String> classNameField = new CellField<String>(targetObj, "className")
.setRequired(true)
.validate(errors);
for(int i=0; i < targetObj.list.size();i ++) {
invokeNestedValidator(personRecordValidator, targetObj.list.get(i), errors, "list", i);
}
}
}
/**
* {@link PersonRecordRecord}のValidator.
*
*/
private static class PersonRecordVaidator extends AbstractObjectValidator<PersonRecord> {
@Override
public void validate(final PersonRecord targetObj, final SheetBindingErrors errors) {
CellField<String> nameField = new CellField<String>(targetObj, "name")
.setRequired(true)
.add(StringValidator.maxLength(10))
.validate(errors);
CellField<String> emailField = new CellField<String>(targetObj, "email")
.setRequired(true)
.add(new PatternValidator(".*@.*", "メールアドレス"))
.validate(errors);
CellField<Date> birthdayField = new CellField<Date>(targetObj, "birthday")
.setRequired(true)
.add(new MaxValidator<Date>(new Date(), "yyyy年M月d日"))
.validate(errors);
}
}
}