package org.simpleflatmapper.csv.test; import org.junit.Before; import org.junit.Test; import org.simpleflatmapper.csv.CellValueReader; import org.simpleflatmapper.csv.CellValueReaderFactory; import org.simpleflatmapper.csv.CsvColumnDefinition; import org.simpleflatmapper.csv.CsvColumnKey; import org.simpleflatmapper.csv.CsvMapper; import org.simpleflatmapper.csv.CsvMapperBuilder; import org.simpleflatmapper.csv.CsvMapperFactory; import org.simpleflatmapper.csv.ParsingContext; import org.simpleflatmapper.csv.ParsingContextFactoryBuilder; import org.simpleflatmapper.test.beans.DbFinalObject; import org.simpleflatmapper.test.beans.DbObject; import org.simpleflatmapper.test.beans.DbPrimitiveObject; import org.simpleflatmapper.csv.impl.cellreader.*; import org.simpleflatmapper.tuple.Tuple2; import org.simpleflatmapper.tuple.Tuples; import org.simpleflatmapper.util.ListCollector; import org.simpleflatmapper.util.Predicate; import java.io.IOException; import java.io.StringReader; import java.lang.reflect.Type; import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; public class CsvMapperCustomReaderTest { private CsvMapperFactory csvMapperFactory; @Before public void setUp() { csvMapperFactory = CsvMapperFactory.newInstance(); } @Test public void testMapDbObjectCustomReaderWithWrongType() throws Exception { csvMapperFactory .addCustomValueReader("id", new CellValueReader<String>() { @Override public String read(char[] chars, int offset, int length, ParsingContext parsingContext) { return "dddd"; } }) .addCustomValueReader("typeName", new CellValueReader<String>() { @Override public String read(char[] chars, int offset, int length, ParsingContext parsingContext) { return "dddd"; } }); try { csvMapperFactory.newBuilder(DbObject.class).addMapping("id"); fail("Expect exception due to incompatible custom reader"); } catch(Exception e) { } try { csvMapperFactory.newBuilder(DbObject.class).addMapping("typeName"); fail("Expect exception due to incompatible custom reader"); } catch(Exception e) { } } @Test public void testMapDbObjectCustomReader() throws Exception { CsvMapperBuilder<DbObject> builder = csvMapperFactory.addCustomValueReader("id", new CellValueReader<Long>() { @Override public Long read(char[] chars, int offset, int length, ParsingContext parsingContext) { return 0x5677al; } }).newBuilder(DbObject.class); CsvMapperBuilderTest.addDbObjectFields(builder); CsvMapper<DbObject> mapper = builder.mapper(); List<DbObject> list = mapper.forEach(CsvMapperImplTest.dbObjectCsvReader(), new ListCollector<DbObject>()).getList(); assertEquals(1, list.size()); assertEquals(0x5677al, list.get(0).getId()); assertEquals("name 1", list.get(0).getName()); } @Test public void testMapDbFinalObjectCustomReader() throws Exception { CsvMapperBuilder<DbFinalObject> builder = csvMapperFactory.addCustomValueReader("id", new CellValueReader<Long>() { @Override public Long read(char[] chars, int offset, int length, ParsingContext parsingContext) { return 0x5677al; } }).newBuilder(DbFinalObject.class); CsvMapperBuilderTest.addDbObjectFields(builder); CsvMapper<DbFinalObject> mapper = builder.mapper(); List<DbFinalObject> list = mapper.forEach(CsvMapperImplTest.dbObjectCsvReader(), new ListCollector<DbFinalObject>()).getList(); assertEquals(1, list.size()); assertEquals(0x5677al, list.get(0).getId()); assertEquals("name 1", list.get(0).getName()); } @Test public void testCustomReaderPrimitivesWithBoxReader() throws IOException { CsvMapper<DbPrimitiveObject> intMapper = csvMapperFactory .newBuilder(DbPrimitiveObject.class) .addMapping("p_boolean", CsvColumnDefinition.customReaderDefinition(new CellValueReader<Boolean>() { @Override public Boolean read(char[] chars, int offset, int length, ParsingContext parsingContext) { return true; } } )) .addMapping("p_byte", CsvColumnDefinition.customReaderDefinition(new CellValueReader<Byte>() { @Override public Byte read(char[] chars, int offset, int length, ParsingContext parsingContext) { return 35; } } )) .addMapping("p_character", CsvColumnDefinition.customReaderDefinition(new CellValueReader<Character>() { @Override public Character read(char[] chars, int offset, int length, ParsingContext parsingContext) { return 37; } } )) .addMapping("p_short", CsvColumnDefinition.customReaderDefinition(new CellValueReader<Short>() { @Override public Short read(char[] chars, int offset, int length, ParsingContext parsingContext) { return 39; } } )) .addMapping("p_int", CsvColumnDefinition.customReaderDefinition(new CellValueReader<Integer>() { @Override public Integer read(char[] chars, int offset, int length, ParsingContext parsingContext) { return 0x76666; } } )) .addMapping("p_long", CsvColumnDefinition.customReaderDefinition(new CellValueReader<Long>() { @Override public Long read(char[] chars, int offset, int length, ParsingContext parsingContext) { return 0xf76666l; } } )) .addMapping("p_float", CsvColumnDefinition.customReaderDefinition(new CellValueReader<Float>() { @Override public Float read(char[] chars, int offset, int length, ParsingContext parsingContext) { return 3.14f; } } )) .addMapping("p_double", CsvColumnDefinition.customReaderDefinition(new CellValueReader<Double>() { @Override public Double read(char[] chars, int offset, int length, ParsingContext parsingContext) { return 3.1526; } } )) .mapper(); DbPrimitiveObject object = intMapper.iterator(new StringReader("false,12,12,12,12,12,12,12")).next(); assertEquals(true, object.ispBoolean()); assertEquals(35, object.getpByte()); assertEquals(37, object.getpCharacter()); assertEquals(39, object.getpShort()); assertEquals(0x76666, object.getpInt()); assertEquals(0xf76666l, object.getpLong()); assertEquals(3.14f, object.getpFloat(), 0.0001); assertEquals(3.1526, object.getpDouble(), 0.000001); } @Test public void testCustomReaderPrimitivesWithDirectReader() throws IOException { CsvMapper<DbPrimitiveObject> intMapper = csvMapperFactory .newBuilder(DbPrimitiveObject.class) .addMapping("p_boolean", CsvColumnDefinition.customReaderDefinition(new BooleanCellValueReader() { @Override public Boolean read(char[] chars, int offset, int length, ParsingContext parsingContext) { return true; } @Override public boolean readBoolean(char[] chars, int offset, int length, ParsingContext parsingContext) { return true; } } )) .addMapping("p_byte", CsvColumnDefinition.customReaderDefinition(new ByteCellValueReader() { @Override public Byte read(char[] chars, int offset, int length, ParsingContext parsingContext) { return 35; } @Override public byte readByte(char[] chars, int offset, int length, ParsingContext parsingContext) { return 35; } } )) .addMapping("p_character", CsvColumnDefinition.customReaderDefinition(new CharCellValueReader() { @Override public Character read(char[] chars, int offset, int length, ParsingContext parsingContext) { return 37; } @Override public char readChar(char[] chars, int offset, int length, ParsingContext parsingContext) { return 37; } } )) .addMapping("p_short", CsvColumnDefinition.customReaderDefinition(new ShortCellValueReader() { @Override public Short read(char[] chars, int offset, int length, ParsingContext parsingContext) { return 39; } @Override public short readShort(char[] chars, int offset, int length, ParsingContext parsingContext) { return 39; } } )) .addMapping("p_int", CsvColumnDefinition.customReaderDefinition(new IntegerCellValueReader() { @Override public Integer read(char[] chars, int offset, int length, ParsingContext parsingContext) { return 0x76666; } @Override public int readInt(char[] chars, int offset, int length, ParsingContext parsingContext) { return 0x76666; } } )) .addMapping("p_long", CsvColumnDefinition.customReaderDefinition(new LongCellValueReader() { @Override public long readLong(char[] chars, int offset, int length, ParsingContext parsingContext) { return 0xf76666l; } @Override public Long read(char[] chars, int offset, int length, ParsingContext parsingContext) { return 0xf76666l; } } )) .addMapping("p_float", CsvColumnDefinition.customReaderDefinition(new FloatCellValueReader() { @Override public Float read(char[] chars, int offset, int length, ParsingContext parsingContext) { return 3.14f; } @Override public float readFloat(char[] chars, int offset, int length, ParsingContext parsingContext) { return 3.14f; } } )) .addMapping("p_double", CsvColumnDefinition.customReaderDefinition(new DoubleCellValueReader() { @Override public Double read(char[] chars, int offset, int length, ParsingContext parsingContext) { return 3.1526; } @Override public double readDouble(char[] chars, int offset, int length, ParsingContext parsingContext) { return 3.1526; } } )) .mapper(); DbPrimitiveObject object = intMapper.iterator(new StringReader("false,12,12,12,12,12,12,12")).next(); assertEquals(true, object.ispBoolean()); assertEquals(35, object.getpByte()); assertEquals(37, object.getpCharacter()); assertEquals(39, object.getpShort()); assertEquals(0x76666, object.getpInt()); assertEquals(0xf76666l, object.getpLong()); assertEquals(3.14f, object.getpFloat(), 0.0001); assertEquals(3.1526, object.getpDouble(), 0.000001); } @Test public void testCustomCsvReaderValueFactory() throws IOException { CsvMapper<Tuple2<String, String>> csvMapper = CsvMapperFactory.newInstance().addColumnDefinition(new Predicate<CsvColumnKey>() { @Override public boolean test(CsvColumnKey csvColumnKey) { return true; } }, CsvColumnDefinition.customCellValueReaderFactoryDefinition(new CellValueReaderFactory() { @SuppressWarnings("unchecked") @Override public <P> CellValueReader<P> getReader(Type propertyType, final int index, CsvColumnDefinition columnDefinition, ParsingContextFactoryBuilder builder) { return (CellValueReader<P>) new CellValueReader<String>() { @Override public String read(char[] chars, int offset, int length, ParsingContext parsingContext) { return "g" + index; } }; } })).newMapper(Tuples.typeDef(String.class, String.class)); Tuple2<String, String> value = csvMapper.iterator(new StringReader("b0,b1\nc0,c1")).next(); assertEquals("g0", value.first()); assertEquals("g1", value.second()); } }