--- /dev/null 2016-07-20 19:17:54.000000000 -0700 +++ new/test/tools/jdeprscan/tests/jdk/jdeprscan/TestCSV.java 2016-07-20 19:17:54.000000000 -0700 @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @summary Basic tests CSV printing and parsing + * @modules jdk.jdeps/com.sun.tools.jdeprscan + * @build TestCSV + * @run testng jdk.jdeprscan.TestCSV + */ + +package jdk.jdeprscan; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; + +import java.util.List; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import com.sun.tools.jdeprscan.CSV; +import com.sun.tools.jdeprscan.CSVParseException; + +@Test +public class TestCSV { + static String NL = System.lineSeparator(); + ByteArrayOutputStream baos; + PrintStream out; + + @BeforeMethod + public void setup() throws UnsupportedEncodingException { + baos = new ByteArrayOutputStream(); + out = new PrintStream(baos, true, "UTF-8"); + } + + String result() { + out.flush(); + return new String(baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8); + } + + /** + * Asserts string equality after checking for and removing a trailing line separator. + * + * @param expected expected result + */ + void checkString(String expected) { + String actual = result(); + assertTrue(actual.endsWith(NL)); + assertEquals(actual.substring(0, actual.length() - NL.length()), expected); + } + + @DataProvider(name = "csvdata") + public Object[][] getCSVData() { + return new Object[][] { + { "", List.of("") }, + { "a", List.of("a") }, + { "a,b", List.of("a", "b") }, + { "a,b,c", List.of("a", "b", "c") }, + { ",a,b", List.of("", "a", "b") }, + { "a,b,", List.of("a", "b", "") }, + { ",a,b,", List.of("", "a", "b", "") }, + { ",a,,b,", List.of("", "a", "", "b", "") }, + { ",", List.of("", "") }, + { ",,", List.of("", "", "") }, + { ",,,", List.of("", "", "", "") }, + { " a , b ", List.of(" a ", " b ") }, + { "a,\",\",b", List.of("a", ",", "b") }, + { "a,\"b\"\"c\",d", List.of("a", "b\"c", "d") }, + { "a,\"b,c\",d", List.of("a", "b,c", "d") }, + + // from https://en.wikipedia.org/wiki/Comma-separated_values + // slightly modified to enable round-tripping + + { "Year,Make,Model,Description,Price", + List.of("Year", "Make", "Model", "Description", "Price") }, + { "1997,Ford,E350,\"ac, abs, moon\",3000.00", + List.of("1997", "Ford", "E350", "ac, abs, moon", "3000.00") }, + { "1999,Chevy,\"Venture \"\"Extended Edition\"\"\",,4900.00", + List.of("1999", "Chevy", "Venture \"Extended Edition\"", "", "4900.00") }, + { "1999,Chevy,\"Venture \"\"Extended Edition, Very Large\"\"\",,5000.00", + List.of("1999", "Chevy", "Venture \"Extended Edition, Very Large\"", "", "5000.00") }, + { "1996,Jeep,Grand Cherokee,\"MUST SELL!\nair, moon roof, loaded\",4799.00", + List.of("1996", "Jeep", "Grand Cherokee", "MUST SELL!\nair, moon roof, loaded", "4799.00") } + }; + } + + @Test(dataProvider = "csvdata") + public void roundTrip(String input, List parsed) { + List actual = CSV.split(input); + assertEquals(actual, parsed); + CSV.write(out, actual.toArray()); + checkString(input); + } + + // won't round-trip + public void testExtraQuote() { + assertEquals(CSV.split("a,\"b\",c"), List.of("a", "b", "c")); + } + + // won't round-trip + public void testEmptyQuote() { + assertEquals(CSV.split("a,\"\",b"), List.of("a", "", "b")); + } + + @Test(expectedExceptions=CSVParseException.class) + public void errorUnexpectedQuote() { + CSV.split("ab\"cd"); + } + + @Test(expectedExceptions=CSVParseException.class) + public void errorCharacterAfterQuote() { + CSV.split("a,\"b\"c,d"); + } + + @Test(expectedExceptions=CSVParseException.class) + public void errorUnclosedQuote() { + CSV.split("a,\"b"); + } +}