package org.simpleflatmapper.csv.test; import org.junit.Before; import org.junit.Test; import org.simpleflatmapper.csv.CsvMapper; import org.simpleflatmapper.csv.CsvMapperBuilder; import org.simpleflatmapper.csv.CsvMapperFactory; import org.simpleflatmapper.test.beans.DbFinalObject; import org.simpleflatmapper.test.jdbc.DbHelper; import org.simpleflatmapper.map.MapperBuildingException; import org.simpleflatmapper.util.TypeReference; import org.simpleflatmapper.tuple.Tuple2; import org.simpleflatmapper.util.ListCollector; import java.io.IOException; import java.io.StringReader; import java.text.ParseException; import java.util.Iterator; import java.util.List; import java.util.Optional; import static org.junit.Assert.*; public class CsvMapperOptionalTest { private CsvMapperFactory csvMapperFactory; private CsvMapperFactory csvMapperFactoryNoAsm; @Before public void setUp() { csvMapperFactory = CsvMapperFactory.newInstance().failOnAsm(true); csvMapperFactoryNoAsm = CsvMapperFactory.newInstance().useAsm(false); } @Test public void testMapDbObject() throws Exception { testMapDbObject(csvMapperFactory.newBuilder(new TypeReference<Optional<DbFinalObject>>(){}.getType())); } @Test public void testMapDbObjectNoAsm() throws Exception { testMapDbObject(csvMapperFactoryNoAsm.newBuilder(new TypeReference<Optional<DbFinalObject>>(){}.getType())); } @Test public void testMapOptionalInteger() throws IOException { final CsvMapper<Optional<Integer>> mapper = CsvMapperFactory.newInstance().newBuilder(new TypeReference<Optional<Integer>>() { }).addMapping("str1").mapper(); final Iterator<Optional<Integer>> iterator = mapper.iterator(new StringReader("1\n\n2")); Optional<Integer> optional = iterator.next(); assertEquals(1, optional.get().intValue()); optional = iterator.next(); assertFalse(optional.isPresent()); optional = iterator.next(); assertEquals(2, optional.get().intValue()); assertFalse(iterator.hasNext()); } @Test public void testMapOptionIntegerTwoPropFails() { try { CsvMapperFactory.newInstance().newBuilder(new TypeReference<Optional<Integer>>() { }) .addMapping("str1") .addMapping("str2"); fail(); } catch(MapperBuildingException e) { // expecter } } @Test public void testMapListOptionInteger() throws IOException { final CsvMapper<List<Optional<Integer>>> mapper = CsvMapperFactory.newInstance().newBuilder(new TypeReference<List<Optional<Integer>>>() { }) .addMapping("v0") .addMapping("v1") .mapper(); final Iterator<List<Optional<Integer>>> iterator = mapper.iterator(new StringReader("1,2\n3")); List<Optional<Integer>> optionalList = iterator.next(); assertEquals(2, optionalList.size()); assertEquals(1, optionalList.get(0).get().intValue()); assertEquals(2, optionalList.get(1).get().intValue()); optionalList = iterator.next(); assertEquals(1, optionalList.size()); assertEquals(3, optionalList.get(0).get().intValue()); } private void testMapDbObject(CsvMapperBuilder<Optional<DbFinalObject>> builder) throws IOException, ParseException { addDbObjectFields(builder); CsvMapper<Optional<DbFinalObject>> mapper = builder.mapper(); List<Optional<DbFinalObject>> list = mapper.forEach(CsvMapperImplTest.dbObjectCsvReader(), new ListCollector<Optional<DbFinalObject>>()).getList(); assertEquals(1, list.size()); DbHelper.assertDbObjectMapping(list.get(0).get()); } @Test public void testMapTypeReferenceDynamic() throws IOException { Tuple2<String, String> next = CsvMapperFactory .newInstance() .newMapper(new TypeReference<Tuple2<String, String>>() { }) .iterator(new StringReader("e0,e1\nv0,v1")).next(); assertEquals("v0", next.first()); assertEquals("v1", next.second()); } @Test public void testMapTypeReferenceBuild() throws IOException { Tuple2<String, String> next = CsvMapperFactory .newInstance() .newBuilder(new TypeReference<Tuple2<String, String>>() { }).addMapping("e0").addMapping("e1") .mapper() .iterator(new StringReader("v0,v1")).next(); assertEquals("v0", next.first()); assertEquals("v1", next.second()); } public static void addDbObjectFields(CsvMapperBuilder<?> builder) { builder.addMapping("id") .addMapping("name") .addMapping("email") .addMapping("creationTime") .addMapping("typeOrdinal") .addMapping("typeName"); } }