/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
* <p/>
* http://www.apache.org/licenses/LICENSE-2.0
* <p/>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ambari.view.hive2.resources.upload;
import com.opencsv.CSVParser;
import com.opencsv.CSVReader;
import com.opencsv.CSVWriter;
import org.junit.Assert;
import org.junit.Test;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
public class OpenCSVTest {
/**
* no exception in creating csvParser with emtpy stream
*
* @throws IOException
*/
@Test
public void testEmptyStream() throws Exception {
String csv = "";
CSVParser jp = new CSVParser();
String[] columns = jp.parseLine(csv);
Assert.assertEquals("Should detect one column.", 1, columns.length);
Assert.assertEquals("Should detect one column with empty value.", new String[]{""}, columns);
}
/**
* in case of csv an empty line is still considered as row
*
* @throws IOException
*/
@Test
public void testEmptyRow() throws Exception {
String csv = " ";
CSVParser jp = new CSVParser();
String[] columns = jp.parseLine(csv);
Assert.assertEquals("One column not detected.", 1, columns.length);
Assert.assertArrayEquals("Row should not be empty", new String[]{" "}, columns);
}
@Test
public void testParse1Row() throws Exception {
String csv = "value1,c,10,10.1";
String[] cols = csv.split(",");
CSVParser jp = new CSVParser();
String[] columns = jp.parseLine(csv);
Assert.assertEquals("4 columns not detect", 4, columns.length);
Assert.assertArrayEquals("Row not equal!", cols, columns);
}
@Test
public void testParseMultipleRow() throws Exception {
String csv = "value1,c,10,10.1\n" +
"value2,c2,102,true";
try(
StringReader sr = new StringReader(csv);
CSVReader csvReader = new CSVReader(sr,',','"','\\');
) {
String[] row1 = csvReader.readNext();
String[] row2 = csvReader.readNext();
Assert.assertArrayEquals("Failed to match 1st row!",new String[]{"value1", "c", "10", "10.1"}, row1);
Assert.assertArrayEquals("Failed to match 2nd row!",new String[]{"value2", "c2", "102", "true"}, row2);
}
}
@Test
public void testParseCustomSeparator() throws Exception {
String csv = "value1#c#10#10.1\n" +
"value2#c2#102#true";
try(
StringReader sr = new StringReader(csv);
CSVReader csvReader = new CSVReader(sr,'#','"','\\');
) {
String[] row1 = csvReader.readNext();
String[] row2 = csvReader.readNext();
Assert.assertArrayEquals("Failed to match 1st row!",new String[]{"value1", "c", "10", "10.1"}, row1);
Assert.assertArrayEquals("Failed to match 2nd row!",new String[]{"value2", "c2", "102", "true"}, row2);
}
}
@Test
public void testParseCustomSeparatorAndQuote() throws Exception {
String csv = "\"valu#e1\"#c#10#10.1\n" +
"value2#c2#102#true";
try(
StringReader sr = new StringReader(csv);
CSVReader csvReader = new CSVReader(sr,'#','"','\\');
) {
String[] row1 = csvReader.readNext();
String[] row2 = csvReader.readNext();
Assert.assertArrayEquals("Failed to match 1st row!",new String[]{"valu#e1", "c", "10", "10.1"}, row1);
Assert.assertArrayEquals("Failed to match 2nd row!",new String[]{"value2", "c2", "102", "true"}, row2);
}
}
@Test
public void testParseCustomSeparatorAndCustomQuote() throws Exception {
String csv = "\'valu#e1\'#c#10#10.1\n" +
"value2#c2#102#true";
try(
StringReader sr = new StringReader(csv);
CSVReader csvReader = new CSVReader(sr,'#','\'','\\');
) {
String[] row1 = csvReader.readNext();
String[] row2 = csvReader.readNext();
String[] row3 = csvReader.readNext();
Assert.assertArrayEquals("Failed to match 1st row!",new String[]{"valu#e1", "c", "10", "10.1"}, row1);
Assert.assertArrayEquals("Failed to match 2nd row!",new String[]{"value2", "c2", "102", "true"}, row2);
Assert.assertArrayEquals("should match Null", null, row3);
}
}
@Test
public void testWriter() throws Exception {
String csv = "\'valu#e1\'#c#10#10.1\n" +
"value2#c2#102#true";
try(
StringReader sr = new StringReader(csv);
CSVReader csvReader = new CSVReader(sr,'#','\'','\\');
StringWriter sw = new StringWriter();
CSVWriter csvWriter = new CSVWriter(sw);
) {
String[] row1 = csvReader.readNext();
csvWriter.writeNext(row1);
String[] row2 = csvReader.readNext();
csvWriter.writeNext(row2);
Assert.assertEquals("CSVWriter failed.","\"valu#e1\",\"c\",\"10\",\"10.1\"\n" +
"\"value2\",\"c2\",\"102\",\"true\"\n", sw.getBuffer().toString());
}
}
@Test
public void testWriterCustomSeparator() throws Exception {
String csv = "\'valu#e1\'#c#10#10.1\n" +
"value2#c2#102#true";
try(
StringReader sr = new StringReader(csv);
CSVReader csvReader = new CSVReader(sr,'#','\'','\\');
StringWriter sw = new StringWriter();
CSVWriter csvWriter = new CSVWriter(sw,'$');
) {
String[] row1 = csvReader.readNext();
csvWriter.writeNext(row1);
String[] row2 = csvReader.readNext();
csvWriter.writeNext(row2);
Assert.assertEquals("CSVWriter failed.","\"valu#e1\"$\"c\"$\"10\"$\"10.1\"\n" +
"\"value2\"$\"c2\"$\"102\"$\"true\"\n", sw.getBuffer().toString());
}
}
@Test
public void testWriterCustomSeparatorAndEnline() throws Exception {
String csv = "value1,c,10,10.1\n" +
"value2,c2,102,true";
try(
StringReader sr = new StringReader(csv);
CSVReader csvReader = new CSVReader(sr,',','\'','\\');
StringWriter sw = new StringWriter();
CSVWriter csvWriter = new CSVWriter(sw,'\002',',',"\003");
) {
String[] row1 = csvReader.readNext();
csvWriter.writeNext(row1,false);
String[] row2 = csvReader.readNext();
csvWriter.writeNext(row2,false);
Assert.assertEquals("CSVWriter failed.","value1\002c\00210\00210.1\003" +
"value2\002c2\002102\002true\003", sw.getBuffer().toString());
}
}
@Test
public void testWriterQuote() throws Exception {
String csv = "val#ue1,c,10,10.1\n" +
"'val,ue2',c2,102,true\n" +
"val\002ue3,c\0033,103,false";
try(
StringReader sr = new StringReader(csv);
CSVReader csvReader = new CSVReader(sr,',','\'','\\');
StringWriter sw = new StringWriter();
CSVWriter csvWriter = new CSVWriter(sw,'\002','\'',"\003");
) {
String[] row1 = csvReader.readNext();
csvWriter.writeNext(row1,false);
String[] row2 = csvReader.readNext();
csvWriter.writeNext(row2,false);
String[] row3 = csvReader.readNext();
csvWriter.writeNext(row3,false);
Assert.assertEquals("CSVWriter failed.","val#ue1\u0002c\u000210\u000210.1\u0003" +
"val,ue2\u0002c2\u0002102\u0002true\u0003" +
"'val\u0002ue3'\u0002c\u00033\u0002103\u0002false\u0003", sw.getBuffer().toString());
}
}
}