package net.codjo.dataprocess.gui.util.std; import net.codjo.dataprocess.gui.util.std.ExportTextBuilder.ExportTextWriter; import net.codjo.gui.toolkit.table.GroupableTableHeaderBuilder; import net.codjo.mad.client.request.RequestException; import net.codjo.mad.client.request.Result; import net.codjo.mad.client.request.Row; import net.codjo.mad.gui.framework.DefaultGuiContext; import net.codjo.mad.gui.framework.LocalGuiContext; import net.codjo.mad.gui.request.Column; import net.codjo.mad.gui.request.ListDataSource; import net.codjo.mad.gui.request.Preference; import net.codjo.mad.gui.request.RequestTable; import java.io.StringWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Assert; import org.junit.Before; import org.junit.Test; /** * */ public class ExportTextBuilderTest { private static final String VALUES_SEPARATOR = ";"; private RequestTable tableWith3Columns; private RequestTable tableWith2Columns; private ExportTextBuilder exportTextBuilder; @Before public void setUp() throws Exception { exportTextBuilder = new ExportTextBuilder(); DefaultGuiContext defaultGuiContext = new DefaultGuiContext(); LocalGuiContext guiContext = new LocalGuiContext(defaultGuiContext); guiContext.putProperty("export.text.fileSeparator", VALUES_SEPARATOR); guiContext.putProperty("export.text.decimalSeparator", ","); exportTextBuilder.setGuiContext(guiContext); tableWith3Columns = createTable(new String[]{"lettre", "chiffre", "lettre_chiffre"}, new String[][]{{"a", "1", "a1"}, {"b", "2", "b2"}, {"c", "3", "c3"}, {"d", "4", "d4"}, }); tableWith2Columns = createTable(new String[]{"toto", "tata"}, new String[][]{{"x", "9"}, {"y", "8"}, {"z", "7"}}); } @Test public void test_single_table() throws Exception { StringWriter stringWriter = new StringWriter(); exportTextBuilder.add(tableWith3Columns) .setHeaderData(tableWith3Columns, ExportTextBuilder.createColumnHeader(tableWith3Columns)) .buildTextDatas(true, new ExportTextWriter(exportTextBuilder.getContext(), stringWriter, 1)); assertMatrixEquals(new String[][]{ {"\"lettre\"", "\"chiffre\"", "\"lettre_chiffre\""}, {"\"a\"", "\"1\"", "\"a1\""}, {"\"b\"", "\"2\"", "\"b2\""}, {"\"c\"", "\"3\"", "\"c3\""}, {"\"d\"", "\"4\"", "\"d4\""}}, stringWriter); } @Test public void test_multiple_tables() throws Exception { StringWriter stringWriter = new StringWriter(); exportTextBuilder.add(tableWith3Columns) .setHeaderData(tableWith3Columns, ExportTextBuilder.createColumnHeader(tableWith3Columns)) .add(tableWith2Columns) .setHeaderData(tableWith2Columns, ExportTextBuilder.createColumnHeader(tableWith2Columns)) .buildTextDatas(true, new ExportTextWriter(exportTextBuilder.getContext(), stringWriter, 1)); assertMatrixEquals(new String[][]{ {"\"lettre\"", "\"chiffre\"", "\"lettre_chiffre\""}, {"\"a\"", "\"1\"", "\"a1\""}, {"\"b\"", "\"2\"", "\"b2\""}, {"\"c\"", "\"3\"", "\"c3\""}, {"\"d\"", "\"4\"", "\"d4\""}, {"\"toto\"", "\"tata\"", ""}, {"\"x\"", "\"9\"", ""}, {"\"y\"", "\"8\"", ""}, {"\"z\"", "\"7\"", ""}, }, stringWriter); } @Test public void test_multiple_table_with_customized_header() throws Exception { StringWriter stringWriter = new StringWriter(); exportTextBuilder.add(tableWith3Columns) .setHeaderData(tableWith3Columns, ExportTextBuilder.createColumnHeader(tableWith3Columns)) .add(tableWith2Columns) .buildTextDatas(true, new ExportTextWriter(exportTextBuilder.getContext(), stringWriter, 1)); assertMatrixEquals(new String[][]{ {"\"lettre\"", "\"chiffre\"", "\"lettre_chiffre\""}, {"\"a\"", "\"1\"", "\"a1\""}, {"\"b\"", "\"2\"", "\"b2\""}, {"\"c\"", "\"3\"", "\"c3\""}, {"\"d\"", "\"4\"", "\"d4\""}, {"\"x\"", "\"9\"", ""}, {"\"y\"", "\"8\"", ""}, {"\"z\"", "\"7\"", ""}, }, stringWriter); } @Test public void test_multiple_table_with_groupable_header() throws Exception { StringWriter stringWriter = new StringWriter(); GroupableTableHeaderBuilder.install(tableWith3Columns) .createGroupColumn("Groupe 1", 0, 1).build(); exportTextBuilder.add(tableWith3Columns) .setHeaderData(tableWith3Columns, ExportTextBuilder.createColumnHeader(tableWith3Columns)) .add(tableWith2Columns) .setHeaderData(tableWith2Columns, ExportTextBuilder.createColumnHeader(tableWith2Columns)) .buildTextDatas(true, new ExportTextWriter(exportTextBuilder.getContext(), stringWriter, 1)); assertMatrixEquals(new String[][]{ {"\"Groupe 1\"", "\"Groupe 1\"", ""}, {"\"lettre\"", "\"chiffre\"", "\"lettre_chiffre\""}, {"\"a\"", "\"1\"", "\"a1\""}, {"\"b\"", "\"2\"", "\"b2\""}, {"\"c\"", "\"3\"", "\"c3\""}, {"\"d\"", "\"4\"", "\"d4\""}, {"\"toto\"", "\"tata\"", ""}, {"\"x\"", "\"9\"", ""}, {"\"y\"", "\"8\"", ""}, {"\"z\"", "\"7\"", ""}, }, stringWriter); } @Test public void test_multiple_header() throws Exception { StringWriter stringWriter = new StringWriter(); GroupableTableHeaderBuilder.install(tableWith3Columns) .createGroupColumn("Groupe 1", 0, 1).build(); Object[][] mainHeader = ExportTextBuilder.createColumnHeader(tableWith3Columns); Object[][] upperHeader = new Object[][]{{"Casse", "toi", "pauvre mec!"}}; Object[][] lowerHeader = new Object[][]{{"pauvre fille!"}, {"t chiante"}}; exportTextBuilder.add(tableWith3Columns) .setHeaderData(tableWith3Columns, upperHeader, mainHeader, lowerHeader) .add(tableWith2Columns) .setHeaderData(tableWith2Columns, ExportTextBuilder.createColumnHeader(tableWith2Columns)) .buildTextDatas(true, new ExportTextWriter(exportTextBuilder.getContext(), stringWriter, 1)); assertMatrixEquals(new String[][]{ {"\"Casse\"", "\"toi\"", "\"pauvre mec!\""}, {"\"Groupe 1\"", "\"Groupe 1\"", ""}, {"\"lettre\"", "\"chiffre\"", "\"lettre_chiffre\""}, {"\"pauvre fille!\"", "", ""}, {"\"t chiante\"", "", ""}, {"\"a\"", "\"1\"", "\"a1\""}, {"\"b\"", "\"2\"", "\"b2\""}, {"\"c\"", "\"3\"", "\"c3\""}, {"\"d\"", "\"4\"", "\"d4\""}, {"\"toto\"", "\"tata\"", ""}, {"\"x\"", "\"9\"", ""}, {"\"y\"", "\"8\"", ""}, {"\"z\"", "\"7\"", ""}, }, stringWriter); } @Test public void test_multi_pages() throws Exception { String[][] datas = new String[][]{ {"a", "1", "a1"}, {"b", "2", "b2"}, {"c", "3", "c3"}, {"d", "4", "d4"}, }; String[] columnNames = new String[]{"lettre", "chiffre", "lettre_chiffre"}; OnePageOneRowListDataSource dataSource = new OnePageOneRowListDataSource(columnNames, datas); tableWith3Columns = createTable(columnNames, datas, dataSource); dataSource.load(); StringWriter stringWriter = new StringWriter(); exportTextBuilder.add(tableWith3Columns) .setHeaderData(tableWith3Columns, ExportTextBuilder.createColumnHeader(tableWith3Columns)) .buildTextDatas(true, new ExportTextWriter(exportTextBuilder.getContext(), stringWriter, 1)); assertMatrixEquals(new String[][]{ {"\"lettre\"", "\"chiffre\"", "\"lettre_chiffre\""}, {"\"a\"", "\"1\"", "\"a1\""}, {"\"b\"", "\"2\"", "\"b2\""}, {"\"c\"", "\"3\"", "\"c3\""}, {"\"d\"", "\"4\"", "\"d4\""}}, stringWriter); } @Test public void test_multi_pages_disabled() throws Exception { String[][] datas = new String[][]{ {"a", "1", "a1"}, {"b", "2", "b2"}, {"c", "3", "c3"}, {"d", "4", "d4"}, }; String[] columnNames = new String[]{"lettre", "chiffre", "lettre_chiffre"}; OnePageOneRowListDataSource dataSource = new OnePageOneRowListDataSource(columnNames, datas); tableWith3Columns = createTable(columnNames, datas, dataSource); dataSource.load(); StringWriter stringWriter = new StringWriter(); exportTextBuilder.add(tableWith3Columns) .setHeaderData(tableWith3Columns, ExportTextBuilder.createColumnHeader(tableWith3Columns)) .buildTextDatas(false, new ExportTextWriter(exportTextBuilder.getContext(), stringWriter, 1)); assertMatrixEquals(new String[][]{ {"\"lettre\"", "\"chiffre\"", "\"lettre_chiffre\""}, {"\"a\"", "\"1\"", "\"a1\""},} , stringWriter); } @Test public void test_decimalSeparator() throws Exception { String decimalSep = (String)exportTextBuilder.getContext() .getProperty("export.text.decimalSeparator"); Assert.assertEquals(",", decimalSep); RequestTable table = createTable(new String[]{"chiffre avec sorter", "chiffre sans sorter"}, new String[][]{{"1.5", "2.0"}, {"5.0", "6.2"}}); table.getPreference().getColumns().get(0).setSorter("Numeric"); StringWriter stringWriter = new StringWriter(); exportTextBuilder.add(table) .setHeaderData(table, ExportTextBuilder.createColumnHeader(table)) .buildTextDatas(true, new ExportTextWriter(exportTextBuilder.getContext(), stringWriter, 1)); assertMatrixEquals(new String[][]{ {"\"chiffre avec sorter\"", "\"chiffre sans sorter\""}, {"\"1,5\"", "\"2.0\""}, {"\"5,0\"", "\"6.2\""}} , stringWriter); } @SuppressWarnings({"LocalVariableNamingConvention"}) private static void assertMatrixEquals(String[][] expected, StringWriter actual) { String[] actuals = actual.toString().split("\n"); Assert.assertEquals("Expected " + expected.length + " rows but was " + actuals.length, expected.length, actuals.length); for (int i = 0; i < expected.length; i++) { int j = 0; Collection<String> tmp = new ArrayList<String>(); while (j <= actuals[i].length()) { int k = actuals[i].indexOf(VALUES_SEPARATOR, j); if (-1 == k) { tmp.add(actuals[i].substring(j)); break; } tmp.add(actuals[i].substring(j, k)); j = k + 1; } String[] values = tmp.toArray(new String[tmp.size()]); Assert.assertArrayEquals( "Expected: " + Arrays.asList(expected[i]) + " but was: " + Arrays.asList(values), expected[i], values); } } private static RequestTable createTable(String[] columnNames, String[][] values) throws Exception { return createTable(columnNames, values, new ListDataSource()); } private static RequestTable createTable(String[] columnNames, String[][] values, ListDataSource listDataSource) throws Exception { Preference preference = new Preference(); for (String columnName : columnNames) { preference.getColumns().add(new Column(columnName, columnName)); } RequestTable table = new RequestTable(listDataSource); table.setPreference(preference); listDataSource.setColumns(columnNames); for (String[] row : values) { listDataSource.addRow(createRow(columnNames, row)); } return table; } private static Row createRow(String[] columnNames, String[] values) { Map<String, String> map = new HashMap<String, String>(); for (int i = 0; i < columnNames.length; i++) { map.put(columnNames[i], values[i]); } return new Row(map); } private static class OnePageOneRowListDataSource extends ListDataSource { private Row[] rows; private OnePageOneRowListDataSource(String[] columnNames, String[][] datas) { List<Row> rowList = new ArrayList<Row>(); for (String[] data : datas) { rowList.add(createRow(columnNames, data)); } rows = rowList.toArray(new Row[rowList.size()]); setPageSize(1); } @Override public void load() throws RequestException { super.load(); setRow(rows[0]); } @Override public void loadNextPage() throws RequestException { super.loadNextPage(); if (getCurrentPage() <= rows.length) { setRow(rows[getCurrentPage() - 1]); } else { setLoadResult(null); } } private void setRow(Row row) { Result result = new Result(); result.addRow(row); setLoadResult(result); } @Override public int getTotalRowCount() { return rows.length; } } }