package org.simpleflatmapper.csv.test.writer.time; import org.junit.Test; import org.simpleflatmapper.csv.CsvColumnKey; import org.simpleflatmapper.csv.impl.writer.CsvCellWriter; import org.simpleflatmapper.csv.mapper.FieldMapperToAppendableFactory; import org.simpleflatmapper.map.FieldMapper; import org.simpleflatmapper.map.context.MappingContextFactory; import org.simpleflatmapper.map.property.time.JavaDateTimeFormatterProperty; import org.simpleflatmapper.map.property.FieldMapperColumnDefinition; import org.simpleflatmapper.map.mapper.PropertyMapping; import org.simpleflatmapper.map.context.KeySourceGetter; import org.simpleflatmapper.map.context.MappingContextFactoryBuilder; import org.simpleflatmapper.reflect.ReflectionService; import org.simpleflatmapper.reflect.meta.ClassMeta; import org.simpleflatmapper.reflect.meta.DefaultPropertyNameMatcher; import org.simpleflatmapper.reflect.meta.PropertyMeta; import org.simpleflatmapper.util.ConstantPredicate; import org.simpleflatmapper.util.Predicate; import java.time.*; import java.time.format.DateTimeFormatter; import static org.junit.Assert.assertEquals; public class FieldMapperToAppendableFactoryJavaTimeTest { private FieldMapperToAppendableFactory defaultFieldAppenderFactory = new FieldMapperToAppendableFactory(CsvCellWriter.DEFAULT_WRITER); private ClassMeta<JavaTimeObject> javaTimeObjectClassMeta = ReflectionService.newInstance().getClassMeta(JavaTimeObject.class); static class JavaTimeObject { public LocalDate localDate; public LocalDateTime localDateTime; public LocalTime localTime; public OffsetDateTime offsetDateTime; public OffsetTime offsetTime; public ZonedDateTime zonedDateTime; public Instant instant; public MonthDay monthDay; public Year year; public YearMonth yearMonth; } JavaTimeObject javaTimeObject = new JavaTimeObject(); { javaTimeObject.zonedDateTime = ZonedDateTime.parse("2011-12-03T10:15:30+01:00[Europe/Paris]"); javaTimeObject.localDateTime = javaTimeObject.zonedDateTime.toLocalDateTime(); javaTimeObject.localDate = javaTimeObject.zonedDateTime.toLocalDate(); javaTimeObject.localTime = javaTimeObject.zonedDateTime.toLocalTime(); javaTimeObject.offsetDateTime = javaTimeObject.zonedDateTime.toOffsetDateTime(); javaTimeObject.offsetTime = javaTimeObject.zonedDateTime.toOffsetDateTime().toOffsetTime(); javaTimeObject.instant = javaTimeObject.zonedDateTime.toInstant(); javaTimeObject.monthDay = MonthDay.from(javaTimeObject.zonedDateTime); javaTimeObject.year = Year.from(javaTimeObject.zonedDateTime); javaTimeObject.yearMonth = YearMonth.from(javaTimeObject.zonedDateTime); } @Test public void testZonedDateTimeAppender() throws Exception { testFieldMapperForClassAndProp("2011-12-03T10:15:30+01:00[Europe/Paris]", "zonedDateTime", javaTimeObjectClassMeta); } @Test public void testLocalDateTimeAppender() throws Exception { testFieldMapperForClassAndProp("2011-12-03T10:15:30", "localDateTime", javaTimeObjectClassMeta); } @Test public void testLocalDateAppender() throws Exception { testFieldMapperForClassAndProp("2011-12-03", "localDate", javaTimeObjectClassMeta); } @Test public void testLocalTimeAppender() throws Exception { testFieldMapperForClassAndProp("10:15:30", "localTime", javaTimeObjectClassMeta); } @Test public void testOffsetDateTimeAppender() throws Exception { testFieldMapperForClassAndProp("2011-12-03T10:15:30+01:00", "offsetDateTime", javaTimeObjectClassMeta); } @Test public void testOffsetTimeAppender() throws Exception { testFieldMapperForClassAndProp("10:15:30+01:00", "offsetTime", javaTimeObjectClassMeta); } @Test public void testInstantAppender() throws Exception { testFieldMapperForClassAndProp("2011-12-03T09:15:30Z", "instant", javaTimeObjectClassMeta); } @Test public void testMonthDayAppender() throws Exception { testFieldMapperForClassAndProp("--12-03", "monthDay", javaTimeObjectClassMeta); } @Test public void testYearAppender() throws Exception { testFieldMapperForClassAndProp("2011", "year", javaTimeObjectClassMeta); } @Test public void testYearMonthAppender() throws Exception { testFieldMapperForClassAndProp("2011-12", "yearMonth", javaTimeObjectClassMeta); } @Test public void testLocalDateTimeWithFormaterAppender() throws Exception { MappingContextFactoryBuilder<JavaTimeObject, CsvColumnKey> builder = getMappingContextBuilder(); FieldMapper<JavaTimeObject, Appendable> fieldMapper = defaultFieldAppenderFactory.newFieldMapper( newPropertyMapping("localDateTime", javaTimeObjectClassMeta, FieldMapperColumnDefinition.<CsvColumnKey>identity().add(new JavaDateTimeFormatterProperty(DateTimeFormatter.ofPattern("dd/MM/yyyy")))), builder, null); testFieldMapper("03/12/2011", fieldMapper, javaTimeObject, builder.newFactory()); } public void testFieldMapperForClassAndProp(String expected, String propName, ClassMeta<JavaTimeObject> classMeta) throws Exception { MappingContextFactoryBuilder<JavaTimeObject, CsvColumnKey> builder = getMappingContextBuilder(); FieldMapper<JavaTimeObject, Appendable> fieldMapper = defaultFieldAppenderFactory.newFieldMapper(newPropertyMapping(propName, classMeta), builder, null); testFieldMapper(expected, fieldMapper, javaTimeObject, builder.newFactory()); } private <T> void testFieldMapper(String expected, FieldMapper<T, Appendable> fieldMapper, T source, MappingContextFactory<T> dbObjectMappingContextFactory) throws Exception { StringBuilder sb = new StringBuilder(); fieldMapper.mapTo(source, sb, dbObjectMappingContextFactory.newContext()); assertEquals(expected, sb.toString()); } private <T> PropertyMapping<T, String, CsvColumnKey, FieldMapperColumnDefinition<CsvColumnKey>> newPropertyMapping(String col, ClassMeta<T> classMeta) { return newPropertyMapping(col, classMeta, FieldMapperColumnDefinition.<CsvColumnKey>identity()); } private <T> PropertyMapping<T, String, CsvColumnKey, FieldMapperColumnDefinition<CsvColumnKey>> newPropertyMapping(String col, ClassMeta<T> classMeta, FieldMapperColumnDefinition<CsvColumnKey> columnDefinition) { PropertyMeta<T, String> propertyMeta = classMeta.newPropertyFinder(ConstantPredicate.<PropertyMeta<?, ?>>truePredicate()).findProperty(DefaultPropertyNameMatcher.of(col)); if (propertyMeta == null) throw new IllegalArgumentException("cannot find prop " + col); return new PropertyMapping<T, String, CsvColumnKey, FieldMapperColumnDefinition<CsvColumnKey>>( propertyMeta, new CsvColumnKey(col, 1), columnDefinition); } public <T> MappingContextFactoryBuilder<T, CsvColumnKey> getMappingContextBuilder() { return new MappingContextFactoryBuilder<T, CsvColumnKey>(new KeySourceGetter<CsvColumnKey, T>() { @Override public Object getValue(CsvColumnKey key, T source) throws Exception { return null; } }); } }