package com.gh.mygreen.xlsmapper.validation.fieldvalidation;
import static com.gh.mygreen.xlsmapper.TestUtils.*;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import java.awt.Point;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
import org.junit.Test;
import com.gh.mygreen.xlsmapper.validation.CellFieldError;
import com.gh.mygreen.xlsmapper.validation.SheetBindingErrors;
/**
* 日付型に関するテスタ。
* <p>テスト対象のValidator。
* <ul>
* <li>{@link MinValidator}</li>
* <li>{@link MaxValidator}</li>
* <li>{@link RangeValidator}</li>
* </ul>
*
* @since 0.5
* @author T.TSUCHIE
*
*/
public class DateValidatorTest {
/**
* 日時型の必須チェック - Date型
*/
@Test
public void test_validation_date_required() throws Exception {
// フィールド名の定義
String fieldName = "date";
// オブジェクトの定義
SampleSheet sheet = new SampleSheet();
sheet.addPosition(fieldName, toPointAddress("A5")).addLabel(fieldName, "日時");
SheetBindingErrors errors = new SheetBindingErrors(SampleSheet.class);
errors.setSheetName("サンプルシート");
{
// 必須チェック(値がnull)
errors.clearAllErrors();
sheet.date = null;
CellField<Date> field = new CellField<Date>(sheet, fieldName);
field.setRequired(true);
field.validate(errors);
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"));
}
{
// 必須チェック(値が0)
errors.clearAllErrors();
sheet.date = new Date(0);
CellField<Date> field = new CellField<Date>(sheet, fieldName);
field.setRequired(true);
field.validate(errors);
CellFieldError fieldError = errors.getFirstCellFieldError(fieldName);
assertThat(fieldError, is(nullValue()));
}
{
// 必須チェック(値がある)
errors.clearAllErrors();
sheet.date = toTimestamp("2015-06-01 10:12:13.456");
CellField<Date> field = new CellField<Date>(sheet, fieldName);
field.setRequired(true);
field.validate(errors);
CellFieldError fieldError = errors.getFirstCellFieldError(fieldName);
assertThat(fieldError, is(nullValue()));
}
}
/**
* 日時型のオプションチェック - Date型
*/
@Test
public void test_validation_date_optional() throws Exception {
// フィールド名の定義
String fieldName = "date";
// オブジェクトの定義
SampleSheet sheet = new SampleSheet();
sheet.addPosition(fieldName, toPointAddress("A5")).addLabel(fieldName, "日時");
SheetBindingErrors errors = new SheetBindingErrors(SampleSheet.class);
errors.setSheetName("サンプルシート");
{
// 必須チェック(値がnull)
errors.clearAllErrors();
sheet.date = null;
CellField<Date> field = new CellField<Date>(sheet, fieldName);
field.setRequired(false);
field.validate(errors);
CellFieldError fieldError = errors.getFirstCellFieldError(fieldName);
assertThat(fieldError, is(nullValue()));
}
{
// 必須チェック(値が0)
errors.clearAllErrors();
sheet.date = new Date(0);
CellField<Date> field = new CellField<Date>(sheet, fieldName);
field.setRequired(false);
field.validate(errors);
CellFieldError fieldError = errors.getFirstCellFieldError(fieldName);
assertThat(fieldError, is(nullValue()));
}
{
// 必須チェック(値がある)
errors.clearAllErrors();
sheet.date = toTimestamp("2015-06-01 10:12:13.456");
CellField<Date> field = new CellField<Date>(sheet, fieldName);
field.setRequired(false);
field.validate(errors);
CellFieldError fieldError = errors.getFirstCellFieldError(fieldName);
assertThat(fieldError, is(nullValue()));
}
}
/**
* 日時型の最大値チェック - Date型
*/
@Test
public void test_validation_date_max() throws Exception {
// フィールド名の定義
String fieldName = "date";
// オブジェクトの定義
SampleSheet sheet = new SampleSheet();
sheet.addPosition(fieldName, toPointAddress("A5")).addLabel(fieldName, "日時");
SheetBindingErrors errors = new SheetBindingErrors(SampleSheet.class);
errors.setSheetName("サンプルシート");
{
// 最大値チェック(値がnull)
errors.clearAllErrors();
sheet.date = null;
CellField<Date> field = new CellField<Date>(sheet, fieldName);
field.setRequired(false);
field.add(new MaxValidator<Date>(toTimestamp("2015-06-01 00:00:00.000")));
field.validate(errors);
CellFieldError fieldError = errors.getFirstCellFieldError(fieldName);
assertThat(fieldError, is(nullValue()));
}
{
// 最大値チェック(値が不正)
errors.clearAllErrors();
sheet.date = toTimestamp("2015-06-02 00:00:00.000");
CellField<Date> field = new CellField<Date>(sheet, fieldName);
field.setRequired(false);
field.add(new MaxValidator<Date>(toTimestamp("2015-06-01 00:00:00.000")));
field.validate(errors);
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.max"));
assertThat(fieldError.getVars(), hasEntry("validatedValue", (Object)sheet.date));
assertThat(fieldError.getVars(), hasEntry("formattedValidatedValue", (Object)"2015-06-02 00:00:00.0"));
assertThat(fieldError.getVars(), hasEntry("max", (Object)toTimestamp("2015-06-01 00:00:00.000")));
assertThat(fieldError.getVars(), hasEntry("formattedMax", (Object)"2015-06-01 00:00:00.0"));
}
{
// 最大値チェック(値が不正)(フォーマット指定あり)
errors.clearAllErrors();
sheet.date = toTimestamp("2015-06-02 00:00:00.000");
CellField<Date> field = new CellField<Date>(sheet, fieldName);
field.setRequired(false);
field.add(new MaxValidator<Date>(toTimestamp("2015-06-01 00:00:00.000"), "yyyy年MM月dd日 HH時mm分ss秒"));
field.validate(errors);
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.max"));
assertThat(fieldError.getVars(), hasEntry("validatedValue", (Object)sheet.date));
assertThat(fieldError.getVars(), hasEntry("formattedValidatedValue", (Object)"2015年06月02日 00時00分00秒"));
assertThat(fieldError.getVars(), hasEntry("max", (Object)toTimestamp("2015-06-01 00:00:00.000")));
assertThat(fieldError.getVars(), hasEntry("formattedMax", (Object)"2015年06月01日 00時00分00秒"));
}
{
// 最大値チェック(値が正しい)
errors.clearAllErrors();
sheet.date = toTimestamp("2015-06-01 00:00:00.000");
CellField<Date> field = new CellField<Date>(sheet, fieldName);
field.setRequired(false);
field.add(new MaxValidator<Date>(toTimestamp("2015-06-01 00:00:00.000")));
field.validate(errors);
CellFieldError fieldError = errors.getFirstCellFieldError(fieldName);
assertThat(fieldError, is(nullValue()));
}
}
/**
* 日時型の最小値チェック - Date型
*/
@Test
public void test_validation_date_min() throws Exception {
// フィールド名の定義
String fieldName = "date";
// オブジェクトの定義
SampleSheet sheet = new SampleSheet();
sheet.addPosition(fieldName, toPointAddress("A5")).addLabel(fieldName, "日時");
SheetBindingErrors errors = new SheetBindingErrors(SampleSheet.class);
errors.setSheetName("サンプルシート");
{
// 最小値チェック(値がnull)
errors.clearAllErrors();
sheet.date = null;
CellField<Date> field = new CellField<Date>(sheet, fieldName);
field.setRequired(false);
field.add(new MinValidator<Date>(toTimestamp("2015-06-01 00:00:00.000")));
field.validate(errors);
CellFieldError fieldError = errors.getFirstCellFieldError(fieldName);
assertThat(fieldError, is(nullValue()));
}
{
// 最小値チェック(値が不正)
errors.clearAllErrors();
sheet.date = toTimestamp("2015-05-31 00:00:00.000");
CellField<Date> field = new CellField<Date>(sheet, fieldName);
field.setRequired(false);
field.add(new MinValidator<Date>(toTimestamp("2015-06-01 00:00:00.000")));
field.validate(errors);
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.min"));
assertThat(fieldError.getVars(), hasEntry("validatedValue", (Object)sheet.date));
assertThat(fieldError.getVars(), hasEntry("formattedValidatedValue", (Object)"2015-05-31 00:00:00.0"));
assertThat(fieldError.getVars(), hasEntry("min", (Object)toTimestamp("2015-06-01 00:00:00.000")));
assertThat(fieldError.getVars(), hasEntry("formattedMin", (Object)"2015-06-01 00:00:00.0"));
}
{
// 最小値チェック(値が不正)(フォーマット指定あり)
errors.clearAllErrors();
sheet.date = toTimestamp("2015-05-31 00:00:00.000");
CellField<Date> field = new CellField<Date>(sheet, fieldName);
field.setRequired(false);
field.add(new MinValidator<Date>(toTimestamp("2015-06-01 00:00:00.000"), "yyyy年MM月dd日 HH時mm分ss秒"));
field.validate(errors);
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.min"));
assertThat(fieldError.getVars(), hasEntry("validatedValue", (Object)sheet.date));
assertThat(fieldError.getVars(), hasEntry("formattedValidatedValue", (Object)"2015年05月31日 00時00分00秒"));
assertThat(fieldError.getVars(), hasEntry("min", (Object)toTimestamp("2015-06-01 00:00:00.000")));
assertThat(fieldError.getVars(), hasEntry("formattedMin", (Object)"2015年06月01日 00時00分00秒"));
}
{
// 最小値チェック(値が正しい)
errors.clearAllErrors();
sheet.date = toTimestamp("2015-06-01 00:00:00.000");
CellField<Date> field = new CellField<Date>(sheet, fieldName);
field.setRequired(false);
field.add(new MinValidator<Date>(toTimestamp("2015-06-01 00:00:00.000")));
field.validate(errors);
CellFieldError fieldError = errors.getFirstCellFieldError(fieldName);
assertThat(fieldError, is(nullValue()));
}
}
/**
* 日時型の範囲値チェック - Date型
*/
@Test
public void test_validation_date_range() throws Exception {
// フィールド名の定義
String fieldName = "date";
// オブジェクトの定義
SampleSheet sheet = new SampleSheet();
sheet.addPosition(fieldName, toPointAddress("A5")).addLabel(fieldName, "日時");
SheetBindingErrors errors = new SheetBindingErrors(SampleSheet.class);
errors.setSheetName("サンプルシート");
{
// 範囲値チェック(値がnull)
errors.clearAllErrors();
sheet.date = null;
CellField<Date> field = new CellField<Date>(sheet, fieldName);
field.setRequired(false);
field.add(new RangeValidator<Date>(toTimestamp("2015-06-01 00:00:00.000"), toTimestamp("2015-06-30 00:00:00.000")));
field.validate(errors);
CellFieldError fieldError = errors.getFirstCellFieldError(fieldName);
assertThat(fieldError, is(nullValue()));
}
{
// 範囲値チェック(値が不正)(小さい)
errors.clearAllErrors();
sheet.date = toTimestamp("2015-05-31 00:00:00.000");
CellField<Date> field = new CellField<Date>(sheet, fieldName);
field.setRequired(false);
field.add(new RangeValidator<Date>(toTimestamp("2015-06-01 00:00:00.000"), toTimestamp("2015-06-30 00:00:00.000")));
field.validate(errors);
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.range"));
assertThat(fieldError.getVars(), hasEntry("validatedValue", (Object)sheet.date));
assertThat(fieldError.getVars(), hasEntry("formattedValidatedValue", (Object)"2015-05-31 00:00:00.0"));
assertThat(fieldError.getVars(), hasEntry("min", (Object)toTimestamp("2015-06-01 00:00:00.000")));
assertThat(fieldError.getVars(), hasEntry("formattedMin", (Object)"2015-06-01 00:00:00.0"));
assertThat(fieldError.getVars(), hasEntry("max", (Object)toTimestamp("2015-06-30 00:00:00.000")));
assertThat(fieldError.getVars(), hasEntry("formattedMax", (Object)"2015-06-30 00:00:00.0"));
}
{
// 範囲値チェック(値が不正)(大さい)
errors.clearAllErrors();
sheet.date = toTimestamp("2015-07-01 00:00:00.000");
CellField<Date> field = new CellField<Date>(sheet, fieldName);
field.setRequired(false);
field.add(new RangeValidator<Date>(toTimestamp("2015-06-01 00:00:00.000"), toTimestamp("2015-06-30 00:00:00.000")));
field.validate(errors);
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.range"));
assertThat(fieldError.getVars(), hasEntry("validatedValue", (Object)sheet.date));
assertThat(fieldError.getVars(), hasEntry("formattedValidatedValue", (Object)"2015-07-01 00:00:00.0"));
assertThat(fieldError.getVars(), hasEntry("min", (Object)toTimestamp("2015-06-01 00:00:00.000")));
assertThat(fieldError.getVars(), hasEntry("formattedMin", (Object)"2015-06-01 00:00:00.0"));
assertThat(fieldError.getVars(), hasEntry("max", (Object)toTimestamp("2015-06-30 00:00:00.000")));
assertThat(fieldError.getVars(), hasEntry("formattedMax", (Object)"2015-06-30 00:00:00.0"));
}
{
// 範囲値チェック(値が不正)(フォーマット指定あり)
errors.clearAllErrors();
sheet.date = toTimestamp("2015-05-31 00:00:00.000");
CellField<Date> field = new CellField<Date>(sheet, fieldName);
field.setRequired(false);
field.add(new RangeValidator<Date>(toTimestamp("2015-06-01 00:00:00.000"), toTimestamp("2015-06-30 00:00:00.000"), "yyyy年MM月dd日 HH時mm分ss秒"));
field.validate(errors);
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.range"));
assertThat(fieldError.getVars(), hasEntry("validatedValue", (Object)sheet.date));
assertThat(fieldError.getVars(), hasEntry("formattedValidatedValue", (Object)"2015年05月31日 00時00分00秒"));
assertThat(fieldError.getVars(), hasEntry("min", (Object)toTimestamp("2015-06-01 00:00:00.000")));
assertThat(fieldError.getVars(), hasEntry("formattedMin", (Object)"2015年06月01日 00時00分00秒"));
assertThat(fieldError.getVars(), hasEntry("max", (Object)toTimestamp("2015-06-30 00:00:00.000")));
assertThat(fieldError.getVars(), hasEntry("formattedMax", (Object)"2015年06月30日 00時00分00秒"));
}
{
// 範囲値チェック(値が正しい)
errors.clearAllErrors();
sheet.date = toTimestamp("2015-06-01 00:00:00.000");
CellField<Date> field = new CellField<Date>(sheet, fieldName);
field.setRequired(false);
field.add(new RangeValidator<Date>(toTimestamp("2015-06-01 00:00:00.000"), toTimestamp("2015-06-30 00:00:00.000")));
field.validate(errors);
CellFieldError fieldError = errors.getFirstCellFieldError(fieldName);
assertThat(fieldError, is(nullValue()));
}
}
private static class SampleSheet {
private Map<String, Point> positions;
private Map<String, String> labels;
private Date date;
private SampleSheet addPosition(String field, Point position) {
if(positions == null) {
this.positions = new LinkedHashMap<>();
}
this.positions.put(field, position);
return this;
}
private SampleSheet addLabel(String field, String label) {
if(labels == null) {
this.labels = new LinkedHashMap<>();
}
this.labels.put(field, label);
return this;
}
}
}