package com.ricebridge.csvman.test;
import com.ricebridge.csvman.*;
import com.ricebridge.data.Text;
import junit.framework.*;
import junit.textui.*;
import java.util.*;
public class EdgeCasesTest extends TestCase {
public EdgeCasesTest( String pName ) {
super( pName );
}
public static TestSuite suite() {
return new TestSuite( EdgeCasesTest.class );
}
public static void main( String[] pArgs ) {
TestRunner.run( suite() );
}
public void testEmptyLines() {
CsvManager cm = new CsvManager();
assertEquals( "[[a], [], [], [b]]", cm.loadAsListsFromString("a\n\n\nb").toString() );
assertEquals( "[[a], [], [], [b]]", cm.loadAsListsFromString("a\r\n\r\n\r\nb").toString() );
cm.getCsvSpec().setIgnoreEmptyLines( true );
assertEquals( "[[a], [b]]", cm.loadAsListsFromString("a\n\n\nb").toString() );
assertEquals( "[[a], [b]]", cm.loadAsListsFromString("a\r\n\r\n\r\nb").toString() );
}
public void testLastComma() {
CsvManager cm = new CsvManager();
assertEquals( "[[, ]]", cm.loadAsListsFromString(",").toString() );
assertEquals( "[[, 1]]", cm.loadAsListsFromString(",1").toString() );
assertEquals( "[[1, ]]", cm.loadAsListsFromString("1,").toString() );
assertEquals( "[[1, ], [1, 2]]", cm.loadAsListsFromString("1,\n1,2").toString() );
assertEquals( "[[1, 2], [1, ]]", cm.loadAsListsFromString("1,2\n1,").toString() );
assertEquals( "[[1, 2], [1, ], [1, 2]]", cm.loadAsListsFromString("1,2\n1,\n1,2").toString() );
cm.getCsvSpec().setMergeSeparators( true );
assertEquals( "[[, ]]", cm.loadAsListsFromString(",").toString() );
assertEquals( "[[, 1]]", cm.loadAsListsFromString(",1").toString() );
assertEquals( "[[1, ]]", cm.loadAsListsFromString("1,").toString() );
assertEquals( "[[1, ], [1, 2]]", cm.loadAsListsFromString("1,\n1,2").toString() );
assertEquals( "[[1, 2], [1, ]]", cm.loadAsListsFromString("1,2\n1,").toString() );
assertEquals( "[[1, 2], [1, ], [1, 2]]", cm.loadAsListsFromString("1,2\n1,\n1,2").toString() );
}
public void testQuotedEscapeSep() {
CsvManager csvManager = new CsvManager();
csvManager.getCsvSpec().setEncoding("UTF-8");
csvManager.setSeparator(";");
csvManager.setIgnoreBadLines(true);
List out = csvManager.loadAsListsFromString("test1;test2;\"test3;test4\";test5");
assertEquals("[[test1, test2, test3;test4, test5]]", out.toString() );
out = csvManager.loadAsListsFromString("test1;test2;\"test3\\;test4\";test5");
assertEquals("[[test1, test2, test3\\;test4, test5]]", out.toString() );
out = csvManager.loadAsListsFromString("test1;test2;\"test3\\; test4\";test5");
assertEquals("[[test1, test2, test3\\; test4, test5]]", out.toString() );
}
public void testLastCommaNumFields() {
CsvManager cm = new CsvManager();
NumFieldLineListener nf = new NumFieldLineListener();
cm.loadFromString(",",nf); assertEquals( "1:2:2:,~", nf.log.toString() );
cm.loadFromString("a",nf); assertEquals( "1:1:1:a~", nf.log.toString() );
cm.loadFromString("a,",nf); assertEquals( "1:2:2:a,~", nf.log.toString() );
cm.loadFromString(",a",nf); assertEquals( "1:2:2:,a~", nf.log.toString() );
cm.loadFromString("a,b",nf); assertEquals( "1:2:2:a,b~", nf.log.toString() );
cm.loadFromString("a,b,",nf); assertEquals( "1:3:3:a,b,~", nf.log.toString() );
cm.loadFromString(",a,b,",nf); assertEquals( "1:4:4:,a,b,~", nf.log.toString() );
cm.loadFromString(",\n",nf); assertEquals( "1:2:2:,~", nf.log.toString() );
cm.loadFromString("a\n",nf); assertEquals( "1:1:1:a~", nf.log.toString() );
cm.loadFromString("a,\n",nf); assertEquals( "1:2:2:a,~", nf.log.toString() );
cm.loadFromString(",a\n",nf); assertEquals( "1:2:2:,a~", nf.log.toString() );
cm.loadFromString("a,b\n",nf); assertEquals( "1:2:2:a,b~", nf.log.toString() );
cm.loadFromString("a,b,\n",nf); assertEquals( "1:3:3:a,b,~", nf.log.toString() );
cm.loadFromString(",a,b,\n",nf); assertEquals( "1:4:4:,a,b,~", nf.log.toString() );
cm.loadFromString(",\n,",nf); assertEquals( "1:2:2:,~2:2:2:,~", nf.log.toString() );
cm.loadFromString("a\na",nf); assertEquals( "1:1:1:a~2:1:1:a~", nf.log.toString() );
cm.loadFromString("a,\na,",nf); assertEquals( "1:2:2:a,~2:2:2:a,~", nf.log.toString() );
cm.loadFromString(",a\n,a",nf); assertEquals( "1:2:2:,a~2:2:2:,a~", nf.log.toString() );
cm.loadFromString("a,b\na,b",nf); assertEquals( "1:2:2:a,b~2:2:2:a,b~", nf.log.toString() );
cm.loadFromString("a,b,\na,b,",nf); assertEquals( "1:3:3:a,b,~2:3:3:a,b,~", nf.log.toString() );
cm.loadFromString(",a,b,\n,a,b,",nf); assertEquals( "1:4:4:,a,b,~2:4:4:,a,b,~", nf.log.toString() );
}
public void testDisallowQuotedNewlines() {
CsvManager csvman = new CsvManager();
CsvSpec csvspec = csvman.getCsvSpec();
csvspec.setAllowQuotedLineEnds(false);
try {
csvman.loadFromString("1,2,3\na,\"b\nb\",c");
fail();
}
catch( CsvManagerException cme ) {
assertEquals( CsvManagerException.CODE_bad_line, cme.getCode() );
System.out.println( cme.getBadLine() );
}
csvspec.setIgnoreBadLines(true);
List data = csvman.loadAsListsFromString("1,2,3\na,\"b,c\nx,y,a\nA,\"B\nB\",C\n4,5,6" ); System.out.println( data );
System.out.println( csvman.getBadLines() );
assertEquals( 2, csvman.getBadLineCount() );
}
public void testLastLine() throws Exception {
CsvManager cm = new CsvManager();
NumFieldLineListener nf = new NumFieldLineListener();
cm.load( TestUtil.getTextCsvFile("08") ,nf ); assertEquals( "1:1:1:no newline at EOF~2:3:3:a,b,c~", nf.log.toString() );
}
public void testStartEndLineWithLoader() {
String csv = "1,a\n2,b\n3,c\n4,d\n5,c";
CsvSpec cs = new CsvSpec();
cs.setStartLine(2);
cs.setEndLine(4);
CsvManager csvman = new CsvManager(cs);
assertEquals("[[2, b], [3, c], [4, d]]",csvman.loadAsLists(new Text(csv)).toString());
CsvLoader ldr = csvman.makeLoader(new Text(csv));
StringBuffer res = new StringBuffer();
ldr.begin();
while( ldr.hasNext() ) {
String[] row = ldr.next();
res.append( Arrays.asList(row));
}
ldr.end();
assertEquals("[2, b][3, c][4, d]",res.toString());
cs.setStartLine(2);
cs.setEndLine(2);
ldr = csvman.makeLoader(new Text(csv));
res = new StringBuffer();
ldr.begin();
while( ldr.hasNext() ) {
String[] row = ldr.next();
res.append( Arrays.asList(row));
}
ldr.end();
assertEquals("[2, b]",res.toString());
}
public static class NumFieldLineListener extends CustomLineListener {
StringBuffer log;
public void startProcessImpl() throws Exception {
log = new StringBuffer();
}
public BadLine handleLineImpl( String[] pLine, int pNumFields, long pLineNumber, String pOriginalLine ) throws Exception {
log.append( pLineNumber+":"+pNumFields+":"+pLine.length+":"+pOriginalLine+"~" );
return null;
}
}
}