Skip to content

Commit 1d958e9

Browse files
committed
test: verify custom converters do not leak across ExcelReader instances
1 parent 595085f commit 1d958e9

File tree

1 file changed

+51
-4
lines changed

1 file changed

+51
-4
lines changed

fesod/src/test/java/org/apache/fesod/sheet/converter/ConverterIsolationTest.java

Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,15 @@
2121

2222
import static org.junit.jupiter.api.Assertions.*;
2323
import java.io.File;
24+
import java.util.ArrayList;
25+
26+
import org.apache.fesod.sheet.ExcelReader;
2427
import org.apache.fesod.sheet.ExcelWriter;
2528
import org.apache.fesod.sheet.FesodSheet;
2629
import org.apache.fesod.sheet.converters.Converter;
2730
import org.apache.fesod.sheet.enums.CellDataTypeEnum;
2831
import org.apache.fesod.sheet.metadata.GlobalConfiguration;
32+
import org.apache.fesod.sheet.metadata.data.ReadCellData;
2933
import org.apache.fesod.sheet.metadata.data.WriteCellData;
3034
import org.apache.fesod.sheet.metadata.property.ExcelContentProperty;
3135
import org.apache.fesod.sheet.util.TestFileUtil;
@@ -35,7 +39,7 @@ public class ConverterIsolationTest {
3539

3640
public static class TestData {}
3741

38-
public static class ConverterA implements Converter<String> {
42+
public static class WriteConverterA implements Converter<String> {
3943

4044
@Override
4145
public Class<String> supportJavaTypeKey() {
@@ -53,21 +57,64 @@ public WriteCellData<?> convertToExcelData(String value, ExcelContentProperty p,
5357
}
5458
}
5559

60+
public static class ReadConverterA implements Converter<String> {
61+
62+
@Override
63+
public Class<String> supportJavaTypeKey() {
64+
return String.class;
65+
}
66+
67+
@Override
68+
public CellDataTypeEnum supportExcelTypeKey() {
69+
return CellDataTypeEnum.STRING;
70+
}
71+
72+
@Override
73+
public String convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty p, GlobalConfiguration g) {
74+
return "A-" + cellData.getStringValue();
75+
}
76+
}
77+
5678
@Test
57-
public void testConverterIsolation() {
79+
public void testWriterConverterIsolation() {
5880
ExcelWriter writer1 = FesodSheet.write(new File(TestFileUtil.getPath() + "writer1.xlsx"), TestData.class)
59-
.registerConverter(new ConverterA())
81+
.registerConverter(new WriteConverterA())
6082
.build();
6183

6284
ExcelWriter writer2 = FesodSheet.write(new File(TestFileUtil.getPath() + "writer2.xlsx"), TestData.class)
6385
.build();
6486

6587
boolean writer2HasConverterA = writer2.writeContext().currentWriteHolder().converterMap().values().stream()
66-
.anyMatch(c -> c instanceof ConverterA);
88+
.anyMatch(c -> c instanceof WriteConverterA);
6789

6890
writer1.finish();
6991
writer2.finish();
7092

7193
assertFalse(writer2HasConverterA, "Custom converter should not leak between ExcelWriter instances");
7294
}
95+
96+
@Test
97+
public void testReaderConverterIsolation() {
98+
File testFile = TestFileUtil.createNewFile("converter_isolation_test.xlsx");
99+
100+
FesodSheet.write(testFile, TestData.class)
101+
.sheet()
102+
.doWrite(new ArrayList<>());
103+
104+
ExcelReader reader1 = FesodSheet.read(testFile, TestData.class, null)
105+
.registerConverter(new ReadConverterA())
106+
.build();
107+
108+
ExcelReader reader2 = FesodSheet.read(testFile, TestData.class, null)
109+
.build();
110+
111+
boolean leaked = reader2.analysisContext().currentReadHolder()
112+
.converterMap().values().stream()
113+
.anyMatch(c -> c instanceof ReadConverterA);
114+
115+
reader1.finish();
116+
reader2.finish();
117+
118+
assertFalse(leaked);
119+
}
73120
}

0 commit comments

Comments
 (0)