package picard.util; import htsjdk.samtools.util.StringUtil; import org.testng.Assert; import org.testng.annotations.Test; import picard.util.TabbedTextFileWithHeaderParser.Row; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; /** * */ public class TabbedTextFileWithHeaderParserTest { @Test public void basicParsingTest() throws Exception { final String[][] data = new String[][] { new String[] {"FOO", "BAR", "SPLAT"}, new String[] {"1", "2", "3"}, new String[] {"a", "b", "c"}, new String[] {"foo", "bar", "splat"}, }; final File tmp = File.createTempFile("tabbedTextTest.", ".txt"); tmp.deleteOnExit(); final BufferedWriter out = new BufferedWriter(new FileWriter(tmp)); for (final String[] fields : data) { out.write(StringUtil.join("\t", fields)); out.newLine(); } out.close(); final TabbedTextFileWithHeaderParser parser = new TabbedTextFileWithHeaderParser(tmp); for (final String col : data[0]) Assert.assertTrue(parser.hasColumn(col)); int i=1; for (final Row row : parser) { final String[] expected = data[i++]; Assert.assertEquals(row.getFields(), expected); Assert.assertEquals(row.getCurrentLine(), StringUtil.join("\t", expected)); } Assert.assertEquals(i, data.length); } @Test public void parsingWithColumnHeadersTest() throws Exception { final String[][] data = new String[][] { new String[] {"1", "2", "3"}, new String[] {"a", "b", "2"}, new String[] {"foo", "bar", ""}, }; final String[] headers = {"STRING", "STRING2", "NUMBER"}; final File tmp = File.createTempFile("tabbedTextTest.", ".txt"); tmp.deleteOnExit(); final BufferedWriter out = new BufferedWriter(new FileWriter(tmp)); for (final String[] fields : data) { out.write(StringUtil.join("\t", fields)); out.newLine(); } out.close(); final TabbedTextFileWithHeaderParser parser = new TabbedTextFileWithHeaderParser(tmp, headers); for (final String col : headers) Assert.assertTrue(parser.hasColumn(col)); int i=0; for (final Row row : parser) { final String[] expected = data[i++]; final String[] actual = row.getFields(); for (int j = 0; j < expected.length; j++) { Assert.assertTrue((expected[j].equals("") && actual[j] == null) || expected[j].equals(actual[j])); } Assert.assertEquals(row.getCurrentLine(), StringUtil.join("\t", expected)); try { row.getField(headers[0]); row.getField(headers[1]); row.getIntegerField(headers[2]); } catch(Exception e) { Assert.fail("Failed to parse one of the fields in " + row.getCurrentLine() + ": " + e.getMessage()); } } Assert.assertEquals(i, data.length); } }