package org.basex.build; import static org.junit.Assert.*; import org.basex.*; import org.basex.build.csv.*; import org.basex.build.csv.CsvOptions.*; import org.basex.core.*; import org.basex.core.MainOptions.MainParser; import org.basex.core.cmd.*; import org.basex.io.*; import org.basex.util.*; import org.junit.*; import org.junit.Test; /** * CSV Parser Test. * * @author BaseX Team 2005-17, BSD License * @author Christian Gruen */ public final class CsvParserTest extends SandboxTest { /** CSV options. */ private CsvParserOptions copts; /** Test CSV file. */ private static final String FILE = "src/test/resources/input.csv"; /** Temporary CSV file. */ private static final String TEMP = Prop.TMP + NAME + IO.CSVSUFFIX; /** * Creates the initial database. */ @BeforeClass public static void before() { set(MainOptions.PARSER, MainParser.CSV); } /** * Removes the temporary CSV file. */ @AfterClass public static void after() { new IOFile(TEMP).delete(); } /** * Sets initial options. */ @Before public void init() { copts = new CsvParserOptions(); context.options.set(MainOptions.CSVPARSER, copts); } /** * Drops the database. */ @After public void finish() { execute(new DropDB(NAME)); } /** * Adds an empty CSV file. */ @Test public void empty() { write(new IOFile(TEMP), ""); execute(new CreateDB(NAME, TEMP)); assertEquals("<csv/>", query(".")); } /** * Adds the sample CSV file. */ @Test public void one() { copts.set(CsvOptions.HEADER, true); execute(new CreateDB(NAME, FILE)); assertEquals("3", query("count(//Name)")); assertEquals("2", query("count(//Email)")); execute(new CreateDB(NAME, FILE)); assertEquals("3", query("count(//record)")); assertEquals("true", query("//text() = 'Picard'")); } /** * Adds the sample CSV file, using different separators. */ @Test public void separator() { copts.set(CsvOptions.HEADER, true); copts.set(CsvOptions.SEPARATOR, "tab"); execute(new CreateDB(NAME, FILE)); assertEquals("0", query("count(//Name)")); copts.set(CsvOptions.SEPARATOR, ";"); execute(new CreateDB(NAME, FILE)); assertEquals("0", query("count(//Name)")); } /** * Checks the quotes flag. */ @Test public void quotes() { copts.set(CsvOptions.HEADER, true); copts.set(CsvOptions.QUOTES, false); execute(new CreateDB(NAME, FILE)); assertEquals("\"H ", query("(//Props[1])/text()")); copts.set(CsvOptions.QUOTES, true); execute(new CreateDB(NAME, FILE)); assertEquals("H \"U\\", query("normalize-space((//Props)[1])")); } /** * Checks the backslash flag. */ @Test public void backslash() { copts.set(CsvOptions.HEADER, true); // "H \n""U\",a@b.c.... copts.set(CsvOptions.BACKSLASHES, false); execute(new CreateDB(NAME, FILE)); // H \n"U\ assertEquals("H \"U\\", query("normalize-space((//Props)[1])")); copts.set(CsvOptions.BACKSLASHES, true); execute(new CreateDB(NAME, FILE)); // H \nU,a assertEquals("H \"\"U\"", query("replace(normalize-space((//Props)[1]), ',.*', '')")); } /** * Adds the sample CSV file, using different separators. */ @Test public void atts() { copts.set(CsvOptions.HEADER, true); copts.set(CsvOptions.FORMAT, CsvFormat.ATTRIBUTES); execute(new CreateDB(NAME, FILE)); assertEquals("true", query("exists(//entry[@name = 'Name'])")); } }