From c4b2ceadc3c06c7880b11a34bdeb394f3ca0cd49 Mon Sep 17 00:00:00 2001 From: arunachalam Date: Mon, 15 Aug 2022 16:01:44 +0800 Subject: [PATCH] Freva-Ascii-Table-Issue-10 Added utility methods to return rows in table as List of Strings --- .../github/freva/asciitable/AsciiTable.java | 62 +++++++++++++------ .../freva/asciitable/AsciiTableTest.java | 32 ++++++++++ 2 files changed, 74 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/github/freva/asciitable/AsciiTable.java b/src/main/java/com/github/freva/asciitable/AsciiTable.java index b49b56d..2b79504 100644 --- a/src/main/java/com/github/freva/asciitable/AsciiTable.java +++ b/src/main/java/com/github/freva/asciitable/AsciiTable.java @@ -9,7 +9,8 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -public class AsciiTable { +public class AsciiTable +{ private static final int MIN_PADDING = 1; public static final Character[] NO_BORDERS = new Character[29]; @@ -26,38 +27,53 @@ public class AsciiTable { public static final Character[] BASIC_ASCII_NO_OUTSIDE_BORDER = {null, null, null, null, null, '|', null, null, '-', '+', null, null, '|', null, null, '-', '+', null, null, '-', '+', null, null, '|', null, null, null, null, null}; - public static final Character[] FANCY_ASCII = {'╔', '═', '╤', '╗', '║', '│', '║', '╠', '═', + public static final Character[] FANCY_ASCII = {'╔', '═', '╤', '╗', '║', '│', '║', '╠', '═', '╪', '╣', '║', '│', '║', '╟', '─', '┼', '╢', '╠', '═', '╪', '╣', '║', '│', '║', '╚', '═', '╧', '╝'}; - public static String getTable(Collection objects, List> columns) { + public static String getTable(Collection objects, List> columns) + { return getTable(BASIC_ASCII, objects, columns); } - public static String getTable(Character[] borderChars, Collection objects, List> columns) { + public static String getTable(Character[] borderChars, Collection objects, List> columns) + { Column[] rawColumns = columns.toArray(new Column[columns.size()]); - String[][] data = objects.stream() - .map(object -> columns.stream() - .map(dataColumn -> dataColumn.getCellValue(object)) + return getTable(borderChars, rawColumns, objectCollectionToObjectArray(objects, columns)); + } + + public static List getTableRows(Character[] borderChars, Collection objects, List> columns) + { + Column[] rawColumns = columns.toArray(new Column[columns.size()]); + return getTableRows(borderChars, rawColumns, objectCollectionToObjectArray(objects, columns)); + } + + private static String[][] objectCollectionToObjectArray(Collection objects, List> columns) + { + return objects.stream() + .map(object -> columns.stream() + .map(dataColumn -> dataColumn.getCellValue(object)) .toArray(String[]::new)) .toArray(String[][]::new); - - return getTable(borderChars, rawColumns, data); } - public static String getTable(Object[][] data) { + public static String getTable(Object[][] data) + { return getTable((String[]) null, data); } - public static String getTable(String[] header, Object[][] data) { + public static String getTable(String[] header, Object[][] data) + { return getTable(BASIC_ASCII, header, null, data); } - public static String getTable(String[] header, String[] footer, Object[][] data) { + public static String getTable(String[] header, String[] footer, Object[][] data) + { return getTable(BASIC_ASCII, header, footer, data); } - public static String getTable(Character[] borderChars, String[] header, String[] footer, Object[][] data) { + public static String getTable(Character[] borderChars, String[] header, String[] footer, Object[][] data) + { String[] nonNullHeader = header != null ? header : new String[0]; String[] nonNullFooter = footer != null ? footer : new String[0]; @@ -70,11 +86,21 @@ public static String getTable(Character[] borderChars, String[] header, String[] return getTable(borderChars, headerCol, data); } - public static String getTable(Column[] columns, Object[][] data) { + public static String getTable(Column[] columns, Object[][] data) + { return getTable(BASIC_ASCII, columns, data); } - public static String getTable(Character[] borderChars, Column[] rawColumns, Object[][] data) { + public static String getTable(Character[] borderChars, Column[] rawColumns, Object[][] data) + { + List tableRows = getTableRows(borderChars, rawColumns, data); + return tableRows.stream() + .filter(line -> !line.isEmpty()) + .collect(Collectors.joining(System.lineSeparator())); + } + + public static List getTableRows(Character[] borderChars, Column[] rawColumns, Object[][] data) + { if (borderChars.length != NO_BORDERS.length) throw new IllegalArgumentException("Border characters array must be exactly " + NO_BORDERS.length + " elements long"); @@ -92,11 +118,7 @@ public static String getTable(Character[] borderChars, Column[] rawColumns, Obje String[] header = Arrays.stream(columns).map(Column::getHeader).toArray(String[]::new); String[] footer = Arrays.stream(columns).map(Column::getFooter).toArray(String[]::new); - List tableRows = getTableRows(colWidths, headerAligns, dataAligns, footerAligns, borderChars, header, stringData, footer); - - return tableRows.stream() - .filter(line -> !line.isEmpty()) - .collect(Collectors.joining(System.lineSeparator())); + return getTableRows(colWidths, headerAligns, dataAligns, footerAligns, borderChars, header, stringData, footer); } private static List getTableRows(int[] colWidths, HorizontalAlign[] headerAligns, diff --git a/src/test/java/com/github/freva/asciitable/AsciiTableTest.java b/src/test/java/com/github/freva/asciitable/AsciiTableTest.java index b5a7ff3..691172c 100644 --- a/src/test/java/com/github/freva/asciitable/AsciiTableTest.java +++ b/src/test/java/com/github/freva/asciitable/AsciiTableTest.java @@ -510,6 +510,38 @@ public void testJustify() { assertJustify(string, string, CENTER, string.length(), 3); } + @Test + public void testTableRows() { + String[] headers = {"", "Name", "Diameter", "Mass", "Atmosphere"}; + String[][] data = {{"1", "Mercury", "0.382", "0.06", "minimal"}, + {"2", "Venus", "0.949", "0.82", "Carbon dioxide, Nitrogen"}, + {"3", "Earth", "1.000", "1.00", "Nitrogen, Oxygen, Argon"}, + {"4", "Mars", "0.532", "0.11", "Carbon dioxide, Nitrogen, Argon"}}; + + String actualArray = AsciiTable.getTable(headers, null, data); + List actualObjects = AsciiTable.getTableRows(AsciiTable.BASIC_ASCII, planets, Arrays.asList( + new Column().with(planet -> Integer.toString(planet.num)), + new Column().header("Name").with(planet -> planet.name), + new Column().header("Diameter").with(planet -> String.format(Locale.US, "%.03f", planet.diameter)), + new Column().header("Mass").with(planet -> String.format(Locale.US, "%.02f", planet.mass)), + new Column().header("Atmosphere").with(planet -> planet.atmosphere))); + + String expected = String.join(System.lineSeparator(), + "+---+---------+----------+------+---------------------------------+", + "| | Name | Diameter | Mass | Atmosphere |", + "+---+---------+----------+------+---------------------------------+", + "| 1 | Mercury | 0.382 | 0.06 | minimal |", + "+---+---------+----------+------+---------------------------------+", + "| 2 | Venus | 0.949 | 0.82 | Carbon dioxide, Nitrogen |", + "+---+---------+----------+------+---------------------------------+", + "| 3 | Earth | 1.000 | 1.00 | Nitrogen, Oxygen, Argon |", + "+---+---------+----------+------+---------------------------------+", + "| 4 | Mars | 0.532 | 0.11 | Carbon dioxide, Nitrogen, Argon |", + "+---+---------+----------+------+---------------------------------+"); + assertEquals(expected, actualArray); + assertEquals(expected, String.join(System.lineSeparator(), actualObjects)); + } + private static void assertJustify(String expected, String str, HorizontalAlign align, int length, int minPadding) { StringBuilder sb = new StringBuilder(); AsciiTable.appendJustified(sb, str, align, length, minPadding);