diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/DefaultConverterLoader.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/DefaultConverterLoader.java index ccc8a9f6a..95a247442 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/DefaultConverterLoader.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/DefaultConverterLoader.java @@ -85,6 +85,9 @@ import org.apache.fesod.sheet.converters.string.StringErrorConverter; import org.apache.fesod.sheet.converters.string.StringNumberConverter; import org.apache.fesod.sheet.converters.string.StringStringConverter; +import org.apache.fesod.sheet.converters.timestamp.TimestampDateConverter; +import org.apache.fesod.sheet.converters.timestamp.TimestampNumberConverter; +import org.apache.fesod.sheet.converters.timestamp.TimestampStringConverter; import org.apache.fesod.sheet.converters.url.UrlImageConverter; import org.apache.fesod.sheet.converters.uuid.UUIDStringConverter; import org.apache.fesod.sheet.converters.year.YearStringConverter; @@ -136,6 +139,8 @@ private static void initAllConverter() { putAllConverter(new LocalTimeStringConverter()); putAllConverter(new SqlTimeNumberConverter()); putAllConverter(new SqlTimeStringConverter()); + putAllConverter(new TimestampNumberConverter()); + putAllConverter(new TimestampStringConverter()); putAllConverter(new OffsetDateTimeNumberConverter()); putAllConverter(new OffsetDateTimeStringConverter()); @@ -185,6 +190,7 @@ private static void initDefaultWriteConverter() { putWriteConverter(new LocalTimeDateConverter()); putWriteConverter(new InstantStringConverter()); putWriteConverter(new SqlTimeDateConverter()); + putWriteConverter(new TimestampDateConverter()); putWriteConverter(new OffsetDateTimeDateConverter()); putWriteConverter(new DoubleNumberConverter()); putWriteConverter(new FloatNumberConverter()); @@ -212,6 +218,7 @@ private static void initDefaultWriteConverter() { putWriteStringConverter(new LocalTimeStringConverter()); putWriteStringConverter(new InstantStringConverter()); putWriteStringConverter(new SqlTimeStringConverter()); + putWriteStringConverter(new TimestampStringConverter()); putWriteStringConverter(new OffsetDateTimeStringConverter()); putWriteStringConverter(new DoubleStringConverter()); putWriteStringConverter(new FloatStringConverter()); diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/timestamp/TimestampDateConverter.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/timestamp/TimestampDateConverter.java new file mode 100644 index 000000000..7f8386c55 --- /dev/null +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/timestamp/TimestampDateConverter.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.fesod.sheet.converters.timestamp; + +import java.sql.Timestamp; +import org.apache.fesod.sheet.converters.Converter; +import org.apache.fesod.sheet.metadata.GlobalConfiguration; +import org.apache.fesod.sheet.metadata.data.WriteCellData; +import org.apache.fesod.sheet.metadata.property.ExcelContentProperty; +import org.apache.fesod.sheet.util.DateUtils; +import org.apache.fesod.sheet.util.WorkBookUtil; + +/** Timestamp and date converter. */ +public class TimestampDateConverter implements Converter { + @Override + public Class supportJavaTypeKey() { + return Timestamp.class; + } + + @Override + public WriteCellData convertToExcelData( + Timestamp value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) + throws Exception { + WriteCellData cellData = new WriteCellData<>(value.toLocalDateTime()); + String format = null; + if (contentProperty != null && contentProperty.getDateTimeFormatProperty() != null) { + format = contentProperty.getDateTimeFormatProperty().getFormat(); + } + WorkBookUtil.fillDataFormat( + cellData, format == null || format.isEmpty() ? null : format, DateUtils.defaultDateFormat); + return cellData; + } +} diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/timestamp/TimestampNumberConverter.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/timestamp/TimestampNumberConverter.java new file mode 100644 index 000000000..35e53f292 --- /dev/null +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/timestamp/TimestampNumberConverter.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.fesod.sheet.converters.timestamp; + +import java.math.BigDecimal; +import java.sql.Timestamp; +import java.time.LocalDateTime; +import org.apache.fesod.sheet.converters.Converter; +import org.apache.fesod.sheet.enums.CellDataTypeEnum; +import org.apache.fesod.sheet.metadata.GlobalConfiguration; +import org.apache.fesod.sheet.metadata.data.ReadCellData; +import org.apache.fesod.sheet.metadata.data.WriteCellData; +import org.apache.fesod.sheet.metadata.property.ExcelContentProperty; +import org.apache.fesod.sheet.util.DateUtils; +import org.apache.poi.ss.usermodel.DateUtil; + +/** Timestamp and number converter. */ +public class TimestampNumberConverter implements Converter { + + @Override + public Class supportJavaTypeKey() { + return Timestamp.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.NUMBER; + } + + @Override + public Timestamp convertToJavaData( + ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + LocalDateTime localDateTime = DateUtils.getLocalDateTime( + cellData.getNumberValue().doubleValue(), DateUtils.isDate1904(contentProperty, globalConfiguration)); + return localDateTime == null ? null : Timestamp.valueOf(localDateTime); + } + + @Override + public WriteCellData convertToExcelData( + Timestamp value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + return new WriteCellData<>(BigDecimal.valueOf(DateUtil.getExcelDate( + value.toLocalDateTime(), DateUtils.isDate1904(contentProperty, globalConfiguration)))); + } +} diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/timestamp/TimestampStringConverter.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/timestamp/TimestampStringConverter.java new file mode 100644 index 000000000..f73841950 --- /dev/null +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/timestamp/TimestampStringConverter.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.fesod.sheet.converters.timestamp; + +import java.sql.Timestamp; +import java.text.ParseException; +import org.apache.fesod.sheet.converters.Converter; +import org.apache.fesod.sheet.enums.CellDataTypeEnum; +import org.apache.fesod.sheet.metadata.GlobalConfiguration; +import org.apache.fesod.sheet.metadata.data.ReadCellData; +import org.apache.fesod.sheet.metadata.data.WriteCellData; +import org.apache.fesod.sheet.metadata.property.ExcelContentProperty; +import org.apache.fesod.sheet.util.DateUtils; + +/** Timestamp and string converter. */ +public class TimestampStringConverter implements Converter { + @Override + public Class supportJavaTypeKey() { + return Timestamp.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public Timestamp convertToJavaData( + ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) + throws ParseException { + if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) { + return Timestamp.valueOf( + DateUtils.parseLocalDateTime(cellData.getStringValue(), null, globalConfiguration.getLocale())); + } else { + return Timestamp.valueOf(DateUtils.parseLocalDateTime( + cellData.getStringValue(), + contentProperty.getDateTimeFormatProperty().getFormat(), + globalConfiguration.getLocale())); + } + } + + @Override + public WriteCellData convertToExcelData( + Timestamp value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) { + return new WriteCellData<>( + DateUtils.format(value.toLocalDateTime(), null, globalConfiguration.getLocale())); + } else { + return new WriteCellData<>(DateUtils.format( + value.toLocalDateTime(), + contentProperty.getDateTimeFormatProperty().getFormat(), + globalConfiguration.getLocale())); + } + } +} diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/converters/DefaultConverterLoaderTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converters/DefaultConverterLoaderTest.java index 77a57ebc7..bd5f19d41 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/converters/DefaultConverterLoaderTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converters/DefaultConverterLoaderTest.java @@ -20,6 +20,7 @@ package org.apache.fesod.sheet.converters; import java.sql.Time; +import java.sql.Timestamp; import java.time.Instant; import java.time.LocalTime; import java.util.Map; @@ -32,6 +33,9 @@ import org.apache.fesod.sheet.converters.sqltime.SqlTimeDateConverter; import org.apache.fesod.sheet.converters.sqltime.SqlTimeNumberConverter; import org.apache.fesod.sheet.converters.sqltime.SqlTimeStringConverter; +import org.apache.fesod.sheet.converters.timestamp.TimestampDateConverter; +import org.apache.fesod.sheet.converters.timestamp.TimestampNumberConverter; +import org.apache.fesod.sheet.converters.timestamp.TimestampStringConverter; import org.apache.fesod.sheet.converters.uuid.UUIDStringConverter; import org.apache.fesod.sheet.enums.CellDataTypeEnum; import org.junit.jupiter.api.Assertions; @@ -121,6 +125,24 @@ void loadConvertersRegistersSqlTimeFamily() { writeConverter.get(ConverterKeyBuild.buildKey(Time.class, CellDataTypeEnum.STRING))); } + @Test + void loadConvertersRegistersTimestampFamily() { + Map> allConverter = DefaultConverterLoader.loadAllConverter(); + Assertions.assertInstanceOf( + TimestampNumberConverter.class, + allConverter.get(ConverterKeyBuild.buildKey(Timestamp.class, CellDataTypeEnum.NUMBER))); + Assertions.assertInstanceOf( + TimestampStringConverter.class, + allConverter.get(ConverterKeyBuild.buildKey(Timestamp.class, CellDataTypeEnum.STRING))); + + Map> writeConverter = DefaultConverterLoader.loadDefaultWriteConverter(); + Assertions.assertInstanceOf( + TimestampDateConverter.class, writeConverter.get(ConverterKeyBuild.buildKey(Timestamp.class))); + Assertions.assertInstanceOf( + TimestampStringConverter.class, + writeConverter.get(ConverterKeyBuild.buildKey(Timestamp.class, CellDataTypeEnum.STRING))); + } + private static void assertLoadIsImmutableAndCopyIsMutable( Map> loaded, Map> copy) { Map.Entry> entry = diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/converters/timestamp/TimestampConverterTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converters/timestamp/TimestampConverterTest.java new file mode 100644 index 000000000..c58c15d08 --- /dev/null +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converters/timestamp/TimestampConverterTest.java @@ -0,0 +1,210 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.fesod.sheet.converters.timestamp; + +import java.math.BigDecimal; +import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.util.Locale; +import org.apache.fesod.sheet.converters.ConverterKeyBuild; +import org.apache.fesod.sheet.converters.DefaultConverterLoader; +import org.apache.fesod.sheet.enums.CellDataTypeEnum; +import org.apache.fesod.sheet.metadata.GlobalConfiguration; +import org.apache.fesod.sheet.metadata.data.ReadCellData; +import org.apache.fesod.sheet.metadata.data.WriteCellData; +import org.apache.fesod.sheet.metadata.property.DateTimeFormatProperty; +import org.apache.fesod.sheet.metadata.property.ExcelContentProperty; +import org.apache.fesod.sheet.testkit.Tags; +import org.apache.fesod.sheet.util.DateUtils; +import org.apache.poi.ss.usermodel.DateUtil; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +/** + * Unit tests for java.sql.Timestamp converter implementations. + */ +@Tag(Tags.UNIT) +class TimestampConverterTest { + + private static final GlobalConfiguration GLOBAL_CONFIGURATION = new GlobalConfiguration(); + + @AfterEach + void tearDown() { + DateUtils.removeThreadLocalCache(); + } + + @Test + void supportKeys() { + Assertions.assertEquals(Timestamp.class, new TimestampDateConverter().supportJavaTypeKey()); + + TimestampNumberConverter numberConverter = new TimestampNumberConverter(); + Assertions.assertEquals(Timestamp.class, numberConverter.supportJavaTypeKey()); + Assertions.assertEquals(CellDataTypeEnum.NUMBER, numberConverter.supportExcelTypeKey()); + + TimestampStringConverter stringConverter = new TimestampStringConverter(); + Assertions.assertEquals(Timestamp.class, stringConverter.supportJavaTypeKey()); + Assertions.assertEquals(CellDataTypeEnum.STRING, stringConverter.supportExcelTypeKey()); + } + + @Test + void numberConverterReadAndWrite() throws Exception { + TimestampNumberConverter converter = new TimestampNumberConverter(); + LocalDateTime localDateTime = LocalDateTime.of(2020, 1, 1, 1, 1, 1); + double excelDate = DateUtil.getExcelDate(localDateTime); + + Timestamp javaData = converter.convertToJavaData( + new ReadCellData<>(BigDecimal.valueOf(excelDate)), null, GLOBAL_CONFIGURATION); + Assertions.assertEquals(Timestamp.valueOf(localDateTime), javaData); + + WriteCellData writeCellData = + converter.convertToExcelData(Timestamp.valueOf(localDateTime), null, GLOBAL_CONFIGURATION); + Assertions.assertEquals(0, writeCellData.getNumberValue().compareTo(BigDecimal.valueOf(excelDate))); + } + + @Test + void numberConverterRespectsUse1904Windowing() throws Exception { + TimestampNumberConverter converter = new TimestampNumberConverter(); + LocalDateTime localDateTime = LocalDateTime.of(2020, 1, 1, 1, 1, 1); + + ExcelContentProperty contentProperty = new ExcelContentProperty(); + DateTimeFormatProperty dateTimeFormatProperty = new DateTimeFormatProperty(null, true); + contentProperty.setDateTimeFormatProperty(dateTimeFormatProperty); + + double excelDate1904 = DateUtil.getExcelDate(localDateTime, true); + Timestamp javaData = converter.convertToJavaData( + new ReadCellData<>(BigDecimal.valueOf(excelDate1904)), contentProperty, GLOBAL_CONFIGURATION); + Assertions.assertEquals(Timestamp.valueOf(localDateTime), javaData); + + WriteCellData writeCellData = + converter.convertToExcelData(Timestamp.valueOf(localDateTime), contentProperty, GLOBAL_CONFIGURATION); + Assertions.assertEquals(0, writeCellData.getNumberValue().compareTo(BigDecimal.valueOf(excelDate1904))); + } + + @Test + void numberConverterFallsBackToGlobalWindowingWhenFormatLeaves1904Unset() throws Exception { + TimestampNumberConverter converter = new TimestampNumberConverter(); + LocalDateTime localDateTime = LocalDateTime.of(2020, 1, 1, 1, 1, 1); + + ExcelContentProperty contentProperty = new ExcelContentProperty(); + contentProperty.setDateTimeFormatProperty(new DateTimeFormatProperty("yyyy/MM/dd HH:mm:ss", null)); + + double excelDate = DateUtil.getExcelDate(localDateTime); + Timestamp javaData = converter.convertToJavaData( + new ReadCellData<>(BigDecimal.valueOf(excelDate)), contentProperty, GLOBAL_CONFIGURATION); + Assertions.assertEquals(Timestamp.valueOf(localDateTime), javaData); + + WriteCellData writeCellData = + converter.convertToExcelData(Timestamp.valueOf(localDateTime), contentProperty, GLOBAL_CONFIGURATION); + Assertions.assertEquals(0, writeCellData.getNumberValue().compareTo(BigDecimal.valueOf(excelDate))); + + GlobalConfiguration globalConfiguration1904 = new GlobalConfiguration(); + globalConfiguration1904.setUse1904windowing(Boolean.TRUE); + double excelDate1904 = DateUtil.getExcelDate(localDateTime, true); + Timestamp javaData1904 = converter.convertToJavaData( + new ReadCellData<>(BigDecimal.valueOf(excelDate1904)), contentProperty, globalConfiguration1904); + Assertions.assertEquals(Timestamp.valueOf(localDateTime), javaData1904); + + WriteCellData writeCellData1904 = converter.convertToExcelData( + Timestamp.valueOf(localDateTime), contentProperty, globalConfiguration1904); + Assertions.assertEquals(0, writeCellData1904.getNumberValue().compareTo(BigDecimal.valueOf(excelDate1904))); + } + + @Test + void numberConverterReturnsNullForInvalidExcelDate() throws Exception { + TimestampNumberConverter converter = new TimestampNumberConverter(); + Assertions.assertNull( + converter.convertToJavaData(new ReadCellData<>(BigDecimal.valueOf(-1)), null, GLOBAL_CONFIGURATION)); + } + + @Test + void stringConverterReadAndWrite() throws Exception { + TimestampStringConverter converter = new TimestampStringConverter(); + Timestamp timestamp = Timestamp.valueOf("2020-01-01 01:01:01"); + + Timestamp javaData = + converter.convertToJavaData(new ReadCellData<>("2020-01-01 01:01:01"), null, GLOBAL_CONFIGURATION); + Assertions.assertEquals(timestamp, javaData); + + WriteCellData writeCellData = converter.convertToExcelData(timestamp, null, GLOBAL_CONFIGURATION); + Assertions.assertEquals("2020-01-01 01:01:01", writeCellData.getStringValue()); + } + + @Test + void stringConverterRespectsDateTimeFormatAndLocale() throws Exception { + TimestampStringConverter converter = new TimestampStringConverter(); + Timestamp timestamp = Timestamp.valueOf("2020-01-01 01:01:01"); + + ExcelContentProperty contentProperty = new ExcelContentProperty(); + DateTimeFormatProperty dateTimeFormatProperty = new DateTimeFormatProperty("dd MMMM yyyy HH:mm:ss", null); + contentProperty.setDateTimeFormatProperty(dateTimeFormatProperty); + + GlobalConfiguration globalConfiguration = new GlobalConfiguration(); + globalConfiguration.setLocale(Locale.US); + + Timestamp javaData = converter.convertToJavaData( + new ReadCellData<>("01 January 2020 01:01:01"), contentProperty, globalConfiguration); + Assertions.assertEquals(timestamp, javaData); + + WriteCellData writeCellData = converter.convertToExcelData(timestamp, contentProperty, globalConfiguration); + Assertions.assertEquals("01 January 2020 01:01:01", writeCellData.getStringValue()); + } + + @Test + void dateConverterWrite() throws Exception { + TimestampDateConverter converter = new TimestampDateConverter(); + Timestamp timestamp = Timestamp.valueOf("2020-01-01 01:01:01"); + + WriteCellData writeCellData = converter.convertToExcelData(timestamp, null, GLOBAL_CONFIGURATION); + Assertions.assertEquals(CellDataTypeEnum.DATE, writeCellData.getType()); + Assertions.assertEquals(timestamp.toLocalDateTime(), writeCellData.getDateValue()); + Assertions.assertEquals( + DateUtils.defaultDateFormat, + writeCellData.getWriteCellStyle().getDataFormatData().getFormat()); + } + + @Test + void dateConverterFallsBackToDefaultFormatForEmptyDateTimeFormat() throws Exception { + TimestampDateConverter converter = new TimestampDateConverter(); + Timestamp timestamp = Timestamp.valueOf("2020-01-01 01:01:01"); + + ExcelContentProperty contentProperty = new ExcelContentProperty(); + contentProperty.setDateTimeFormatProperty(new DateTimeFormatProperty("", false)); + + WriteCellData writeCellData = converter.convertToExcelData(timestamp, contentProperty, GLOBAL_CONFIGURATION); + Assertions.assertEquals( + DateUtils.defaultDateFormat, + writeCellData.getWriteCellStyle().getDataFormatData().getFormat()); + } + + @Test + void defaultConverterLoaderRegistersTimestampConverters() { + Assertions.assertTrue(DefaultConverterLoader.loadAllConverter() + .containsKey(ConverterKeyBuild.buildKey(Timestamp.class, CellDataTypeEnum.NUMBER))); + Assertions.assertTrue(DefaultConverterLoader.loadAllConverter() + .containsKey(ConverterKeyBuild.buildKey(Timestamp.class, CellDataTypeEnum.STRING))); + + Assertions.assertTrue(DefaultConverterLoader.loadDefaultWriteConverter() + .containsKey(ConverterKeyBuild.buildKey(Timestamp.class))); + Assertions.assertTrue(DefaultConverterLoader.loadDefaultWriteConverter() + .containsKey(ConverterKeyBuild.buildKey(Timestamp.class, CellDataTypeEnum.STRING))); + } +} diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/converters/timestamp/TimestampRoundTripData.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converters/timestamp/TimestampRoundTripData.java new file mode 100644 index 000000000..468665715 --- /dev/null +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converters/timestamp/TimestampRoundTripData.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.fesod.sheet.converters.timestamp; + +import java.sql.Timestamp; +import lombok.Getter; +import lombok.Setter; +import org.apache.fesod.sheet.annotation.ExcelProperty; + +@Getter +@Setter +public class TimestampRoundTripData { + @ExcelProperty("timestamp") + private Timestamp timestamp; +} diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/converters/timestamp/TimestampRoundTripTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converters/timestamp/TimestampRoundTripTest.java new file mode 100644 index 000000000..73a5541d9 --- /dev/null +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converters/timestamp/TimestampRoundTripTest.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.fesod.sheet.converters.timestamp; + +import java.io.File; +import java.sql.Timestamp; +import java.util.Collections; +import java.util.List; +import org.apache.fesod.sheet.testkit.Tags; +import org.apache.fesod.sheet.testkit.base.AbstractExcelTest; +import org.apache.fesod.sheet.testkit.enums.ExcelFormat; +import org.apache.fesod.sheet.testkit.helpers.RoundTripHelper; +import org.apache.fesod.sheet.testkit.params.ExcelFormatSource; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.params.ParameterizedTest; + +@Tag(Tags.ROUND_TRIP) +class TimestampRoundTripTest extends AbstractExcelTest { + @ParameterizedTest + @ExcelFormatSource + void roundTrip(ExcelFormat format) throws Exception { + File file = createTempFile(format); + TimestampRoundTripData input = new TimestampRoundTripData(); + input.setTimestamp(Timestamp.valueOf("2020-01-01 01:01:01")); + List result = + RoundTripHelper.writeAndRead(file, TimestampRoundTripData.class, Collections.singletonList(input)); + Assertions.assertEquals(1, result.size()); + Assertions.assertEquals(input.getTimestamp(), result.get(0).getTimestamp()); + } +}