package org.simpleflatmapper.csv.test;
import org.junit.Test;
import org.simpleflatmapper.csv.CsvMapper;
import org.simpleflatmapper.csv.CsvMapperFactory;
import org.simpleflatmapper.test.beans.DbFinalObject;
import org.simpleflatmapper.test.beans.DbListObject;
import org.simpleflatmapper.test.beans.DbObject;
import org.simpleflatmapper.test.beans.DbObject.Type;
import org.simpleflatmapper.test.beans.DbPartialFinalObject;
import org.simpleflatmapper.test.jdbc.DbHelper;
import org.simpleflatmapper.util.ListCollector;
import org.simpleflatmapper.util.CheckedConsumer;
import java.io.Reader;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicLong;
//IFJAVA8_START
import java.util.function.Consumer;
import java.util.stream.Stream;
//IFJAVA8_END
import static org.junit.Assert.*;
public class DynamicCsvMapperImplTest {
public static Reader dbObjectCsvReader() throws UnsupportedEncodingException {
return new StringReader("id,name,email,creationTime,typeOrdinal,typeName\n"
+ "1,name 1,name1@mail.com,2014-03-04 11:10:03,2,type4");
}
public static Reader dbObjectCsvReader3LinesWithLineToSkip() throws UnsupportedEncodingException {
return new StringReader("\nid,name,email,creationTime,typeOrdinal,typeName\n"
+ "1,name 1,name1@mail.com,2014-03-04 11:10:03,2,type4\n"
+ "2,name 2,name2@mail.com,2014-03-04 11:10:03,2,type4"
);
}
public static Reader dbObjectCsvReader3Lines() throws UnsupportedEncodingException {
return new StringReader("id,name,email,creationTime,typeOrdinal,typeName\n"
+ "1,name 1,name1@mail.com,2014-03-04 11:10:03,2,type4\n"
+ "2,name 2,name2@mail.com,2014-03-04 11:10:03,2,type4"
);
}
@Test
public void testDbObject() throws Exception {
CsvMapper<DbObject> mapper = CsvMapperFactory.newInstance().newMapper(DbObject.class);
List<DbObject> list = mapper.forEach(dbObjectCsvReader3Lines(), new ListCollector<DbObject>()).getList();
assertEquals(2, list.size());
DbHelper.assertDbObjectMapping(1, list.get(0));
DbHelper.assertDbObjectMapping(2, list.get(1));
}
@Test
public void testDbObjectWithSkip() throws Exception {
CsvMapper<DbObject> mapper = CsvMapperFactory.newInstance().newMapper(DbObject.class);
List<DbObject> list = mapper.forEach(dbObjectCsvReader3LinesWithLineToSkip(), new ListCollector<DbObject>(),1).getList();
assertEquals(2, list.size());
DbHelper.assertDbObjectMapping(1, list.get(0));
DbHelper.assertDbObjectMapping(2, list.get(1));
}
@Test
public void testDbObjectWithSkipAndLimit() throws Exception {
CsvMapper<DbObject> mapper = CsvMapperFactory.newInstance().newMapper(DbObject.class);
List<DbObject> list = mapper.forEach(dbObjectCsvReader3LinesWithLineToSkip(), new ListCollector<DbObject>(),1,1).getList();
assertEquals(1, list.size());
DbHelper.assertDbObjectMapping(list.get(0));
}
@Test
public void testFinalDbObject() throws Exception {
CsvMapper<DbFinalObject> mapper = CsvMapperFactory.newInstance().newMapper(DbFinalObject.class);
List<DbFinalObject> list = mapper.forEach(dbObjectCsvReader(), new ListCollector<DbFinalObject>()).getList();
assertEquals(1, list.size());
DbHelper.assertDbObjectMapping(list.get(0));
}
@Test
public void testPartialFinalDbObject() throws Exception {
CsvMapper<DbPartialFinalObject> mapper = CsvMapperFactory.newInstance().newMapper(DbPartialFinalObject.class);
List<DbPartialFinalObject> list = mapper.forEach(dbObjectCsvReader(), new ListCollector<DbPartialFinalObject>()).getList();
assertEquals(1, list.size());
DbHelper.assertDbObjectMapping(list.get(0));
}
@Test
public void testDbObjectIterator() throws Exception {
CsvMapper<DbObject> mapper = CsvMapperFactory.newInstance().newMapper(DbObject.class);
Iterator<DbObject> it = mapper.iterator(dbObjectCsvReader3Lines());
assertTrue(it.hasNext());
DbHelper.assertDbObjectMapping(1, it.next());
assertTrue(it.hasNext());
DbHelper.assertDbObjectMapping(2, it.next());
assertFalse(it.hasNext());
}
@Test
public void testDbObjectIteratorWithSkip() throws Exception {
CsvMapper<DbObject> mapper = CsvMapperFactory.newInstance().newMapper(DbObject.class);
Iterator<DbObject> it = mapper.iterator(dbObjectCsvReader3LinesWithLineToSkip(), 1);
assertTrue(it.hasNext());
DbHelper.assertDbObjectMapping(1, it.next());
assertTrue(it.hasNext());
DbHelper.assertDbObjectMapping(2, it.next());
assertFalse(it.hasNext());
}
int i;
//IFJAVA8_START
@Test
public void testDbObjectStream() throws Exception {
CsvMapper<DbObject> mapper = CsvMapperFactory.newInstance().newMapper(DbObject.class);
Stream<DbObject> it = mapper.stream(dbObjectCsvReader3Lines());
i = 1;
it.forEach(new Consumer<DbObject>() {
@Override
public void accept(DbObject dbObject) {
try {
DbHelper.assertDbObjectMapping(i, dbObject);
} catch (ParseException e) {
throw new RuntimeException(e);
}
i++;
}
});
assertEquals(3, i);
}
@Test
public void testDbObjectStreamLimit() throws Exception {
CsvMapper<DbObject> mapper = CsvMapperFactory.newInstance().newMapper(DbObject.class);
Stream<DbObject> it = mapper.stream(dbObjectCsvReader3Lines());
i = 1;
it.limit(1).forEach(new Consumer<DbObject>() {
@Override
public void accept(DbObject dbObject) {
try {
DbHelper.assertDbObjectMapping(i, dbObject);
} catch (ParseException e) {
throw new RuntimeException(e);
}
i++;
}
});
assertEquals(2, i);
}
@Test
public void testDbObjectStreamWithSkip() throws Exception {
CsvMapper<DbObject> mapper = CsvMapperFactory.newInstance().newMapper(DbObject.class);
Stream<DbObject> it = mapper.stream(dbObjectCsvReader3LinesWithLineToSkip(), 1);
i = 1;
it.forEach(new Consumer<DbObject>() {
@Override
public void accept(DbObject dbObject) {
try {
DbHelper.assertDbObjectMapping(i, dbObject);
} catch (ParseException e) {
throw new RuntimeException(e);
}
i++;
}
});
assertEquals(3, i);
}
//IFJAVA8_END
private static final String CSV_LIST = "id,objects_0_id,objects_0_name,objects_0_email,objects_0_creationTime,objects_0_typeOrdinal,objects_0_typeName\n"
+ "1,1,name 1,name1@mail.com,2014-03-04 11:10:03,2,type4";
@Test
public void testDbListObject() throws Exception {
CsvMapper<DbListObject> mapper = CsvMapperFactory.newInstance().newMapper(DbListObject.class);
List<DbListObject> list = mapper.forEach(new StringReader(CSV_LIST), new ListCollector<DbListObject>()).getList();
assertEquals(1, list.size());
DbHelper.assertDbObjectMapping(list.get(0).getObjects().get(0));
}
private static final int NBROW = 2;
private static final int NBFUTURE = 10000;
@Test
public void testMultipleThread() throws InterruptedException, ExecutionException {
final CsvMapper<DbObject> mapper = CsvMapperFactory.newInstance().newMapper(DbObject.class);
ExecutorService service = Executors.newFixedThreadPool(4);
final AtomicLong sumOfAllIds = new AtomicLong();
final AtomicLong nbRow = new AtomicLong();
final CheckedConsumer<DbObject> handler = new CheckedConsumer<DbObject>() {
@Override
public void accept(DbObject t) throws Exception {
long id = t.getId();
assertEquals("name" + Long.toHexString(id), t.getName());
assertEquals("email" + Long.toHexString(id), t.getEmail());
assertEquals(Type.values()[(int)(id) % 4], t.getTypeName());
assertEquals(Type.values()[(int)(id) % 4], t.getTypeOrdinal());
assertEquals(id, t.getCreationTime().getTime() / 1000);
sumOfAllIds.addAndGet(id);
nbRow.incrementAndGet();
}
};
final String str = buildCsvContent();
List<Future<Object>> futures = new ArrayList<Future<Object>>();
for(int i = 0; i < NBFUTURE; i++) {
futures.add(service.submit(new Callable<Object>() {
@Override
public Object call() throws Exception {
mapper.forEach(new StringReader(str), handler);
return null;
}
}));
}
int i = 0;
for(Future<Object> future : futures) {
try {
future.get();
} catch(Exception e) {
System.out.println("Future " + i + " fail " + e);
}
i++;
}
assertEquals(NBFUTURE, i);
assertEquals(nbRow.get(), NBFUTURE * NBROW);
int sum = 0;
for(i = 0 ; i < NBROW ; i++) {
sum += i;
}
assertEquals(sumOfAllIds.get(), NBFUTURE * sum);
}
private String buildCsvContent() {
StringBuilder sb = new StringBuilder();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sb.append("id,name,email,type_name,type_ordinal,creation_time\n");
for(int i = 0; i < NBROW; i++) {
sb.append(Long.toString(i)).append(",");
sb.append("name" + Long.toHexString(i)).append(",");
sb.append("email" + Long.toHexString(i)).append(",");
sb.append("type" + ((i % 4) + 1)).append(",");
sb.append(Long.toString(i % 4)).append(",");
sb.append(sdf.format(new Date(i * 1000))).append("\n");
}
return sb.toString();
}
}