001: /*
002: * CsvLineParserTest.java
003: *
004: * This file is part of SQL Workbench/J, http://www.sql-workbench.net
005: *
006: * Copyright 2002-2008, Thomas Kellerer
007: * No part of this code maybe reused without the permission of the author
008: *
009: * To contact the author please send an email to: support@sql-workbench.net
010: *
011: */
012: package workbench.util;
013:
014: import java.util.ArrayList;
015: import java.util.List;
016: import junit.framework.*;
017:
018: /**
019: *
020: * @author support@sql-workbench.net
021: */
022: public class CsvLineParserTest extends TestCase {
023:
024: public CsvLineParserTest(String testName) {
025: super (testName);
026: }
027:
028: public void testEscapedQuotes() {
029: try {
030: CsvLineParser parser = new CsvLineParser('\t', '"');
031: parser
032: .setLine("one\twith\\\"quotes\t\"three\tvalues\\\"\"\t\tdef");
033: parser.setQuoteEscaping(QuoteEscapeType.escape);
034: List<String> result = getParserElements(parser);
035: assertEquals("Not enough values", 5, result.size());
036: String v = result.get(1);
037: assertEquals("Wrong second value", "with\"quotes", v);
038: v = result.get(2);
039: assertEquals("Wrong third value", "three\tvalues\"", v);
040: assertNull(result.get(3));
041: } catch (Exception e) {
042: fail(e.getMessage());
043: }
044: }
045:
046: public void testDuplicatedQuotes() {
047: try {
048: CsvLineParser parser = new CsvLineParser('\t', '"');
049: parser
050: .setLine("one\twith\"\"quotes\t\"three\tvalue\"\"s\"\t");
051: parser.setQuoteEscaping(QuoteEscapeType.duplicate);
052: List<String> result = getParserElements(parser);
053: assertEquals("Not enough values", 4, result.size());
054: String v = result.get(1);
055: assertEquals("Wrong second value", "with\"quotes", v);
056: v = result.get(2);
057: assertEquals("Wrong third value", "three\tvalue\"s", v);
058:
059: assertNull(result.get(3));
060: } catch (Exception e) {
061: fail(e.getMessage());
062: }
063: }
064:
065: public void testGetEmptyValues() {
066: // Check for empty elements at the end
067: CsvLineParser parser = new CsvLineParser('\t');
068: parser.setLine("one\t");
069: parser.setReturnEmptyStrings(true);
070: List<String> result = getParserElements(parser);
071: assertEquals("Not enough values", 2, result.size());
072:
073: assertNotNull("Null string returned", result.get(1));
074:
075: parser.setLine("one\t");
076: parser.setReturnEmptyStrings(false);
077: result = getParserElements(parser);
078: assertEquals("Not enough values", 2, result.size());
079: assertNull("Empty string returned", result.get(1));
080:
081: // Check for empty element at the beginning
082: parser.setReturnEmptyStrings(true);
083: parser.setLine("\ttwo\tthree");
084: if (parser.hasNext()) {
085: String value = parser.getNext();
086: assertEquals("First value not an empty string", "", value);
087: } else {
088: fail("No value returned");
089: }
090:
091: parser.setReturnEmptyStrings(false);
092: parser.setLine("\ttwo\tthree");
093: if (parser.hasNext()) {
094: String value = parser.getNext();
095: assertNull("First value not null", value);
096: } else {
097: fail("No value returned");
098: }
099: }
100:
101: public void testParser() {
102: String line = "one\ttwo\tthree\tfour\tfive";
103: CsvLineParser parser = new CsvLineParser('\t');
104: parser.setLine(line);
105: List<String> elements = getParserElements(parser);
106: assertEquals("Wrong number of elements", 5, elements.size());
107: assertEquals("Wrong first value", "one", elements.get(0));
108: assertEquals("Wrong second value", "two", elements.get(1));
109:
110: // check for embedded quotes without a quote defined!
111: parser.setLine("one\ttwo\"values\tthree");
112: parser.getNext(); // skip the first
113: String value = parser.getNext();
114: assertEquals("Invalid second element", "two\"values", value);
115:
116: parser = new CsvLineParser('\t', '"');
117: parser.setTrimValues(false);
118: parser.setReturnEmptyStrings(false);
119: parser.setLine("one\t\"quoted\tdelimiter\"\t three ");
120: List<String> l = getParserElements(parser);
121:
122: assertEquals("Not enough values", 3, l.size());
123: assertEquals("Wrong quoted value", "quoted\tdelimiter", l
124: .get(1));
125: assertEquals("Value was trimmed", " three ", l.get(2));
126:
127: parser.setTrimValues(true);
128: parser.setLine("one\t two ");
129: l = getParserElements(parser);
130:
131: assertEquals("Not enough values", 2, l.size());
132: assertEquals("Value was not trimmed", "two", l.get(1));
133:
134: // Test a different delimiter
135: parser = new CsvLineParser(';', '"');
136: parser.setLine("one;two;\"one;element\"");
137: elements = getParserElements(parser);
138: assertEquals("Wrong number of elements", 3, elements.size());
139: assertEquals("Wrong first value", "one", elements.get(0));
140: assertEquals("Wrong second value", "two", elements.get(1));
141: assertEquals("Wrong third value", "one;element", elements
142: .get(2));
143:
144: }
145:
146: private List<String> getParserElements(CsvLineParser parser) {
147: List<String> result = new ArrayList<String>();
148: while (parser.hasNext()) {
149: result.add(parser.getNext());
150: }
151: return result;
152: }
153: }
|