Skip to content

Commit f79d5d6

Browse files
DFUKDFUK
DFUK
authored and
DFUK
committed
Implement DataTable.toTable(List<Map<String,Object>>). Closes cucumber#433.
1 parent f83316c commit f79d5d6

File tree

4 files changed

+106
-8
lines changed

4 files changed

+106
-8
lines changed

core/src/main/java/cucumber/runtime/table/TableConverter.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import cucumber.runtime.xstream.ListOfComplexTypeReader;
1313
import cucumber.runtime.xstream.ListOfSingleValueWriter;
1414
import cucumber.runtime.xstream.LocalizedXStreams;
15+
import cucumber.runtime.xstream.MapWriter;
1516
import gherkin.formatter.model.Comment;
1617
import gherkin.formatter.model.DataTableRow;
1718
import gherkin.util.Mapper;
@@ -180,6 +181,8 @@ public DataTable toTable(List<?> objects, String... columnNames) {
180181
// XStream needs an instance of ArrayList
181182
object = new ArrayList<Object>(asList((Object[]) object));
182183
writer = new ListOfSingleValueWriter();
184+
} else if (object instanceof Map) {
185+
writer = new MapWriter(asList(columnNames));
183186
} else {
184187
writer = new ComplexTypeWriter(asList(columnNames));
185188
}

core/src/main/java/cucumber/runtime/xstream/ComplexTypeWriter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ public ComplexTypeWriter(List<String> columnNames) {
2020

2121
@Override
2222
public List<String> getHeader() {
23-
return columnNames.size() > 0 ? columnNames : fieldNames;
23+
return columnNames.isEmpty() ? fieldNames : columnNames;
2424
}
2525

2626
@Override
2727
public List<String> getValues() {
2828
CamelCaseStringConverter converter = new CamelCaseStringConverter();
29-
if (columnNames.size() > 0) {
29+
if (!columnNames.isEmpty()) {
3030
String[] explicitFieldValues = new String[columnNames.size()];
3131
int n = 0;
3232
for (String columnName : columnNames) {
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package cucumber.runtime.xstream;
2+
3+
import java.util.ArrayList;
4+
import java.util.LinkedHashMap;
5+
import java.util.List;
6+
import java.util.Map;
7+
8+
/**
9+
* Supports Map&lt;String, Object&gt; as the List item
10+
*/
11+
public class MapWriter extends CellWriter {
12+
private final List<String> columnNames;
13+
private final Map<String, Object> values = new LinkedHashMap<String, Object>();
14+
15+
private String key;
16+
17+
public MapWriter(List<String> columnNames) {
18+
this.columnNames = columnNames;
19+
}
20+
21+
@Override
22+
public List<String> getHeader() {
23+
return columnNames.isEmpty() ? new ArrayList<String>(values.keySet()) : columnNames;
24+
}
25+
26+
@Override
27+
public List<String> getValues() {
28+
List<String> values = new ArrayList<String>(columnNames.size());
29+
for (String columnName : getHeader()) {
30+
Object value = this.values.get(columnName);
31+
values.add(value == null ? "" : value.toString());
32+
}
33+
return values;
34+
}
35+
36+
@Override
37+
public void setValue(String value) {
38+
if (key == null) {
39+
key = value;
40+
} else {
41+
values.put(key, value);
42+
key = null;
43+
}
44+
}
45+
46+
@Override
47+
public void flush() {
48+
throw new UnsupportedOperationException();
49+
}
50+
51+
@Override
52+
public void close() {
53+
throw new UnsupportedOperationException();
54+
}
55+
56+
@Override
57+
public void startNode(String name) {
58+
}
59+
60+
@Override
61+
public void addAttribute(String name, String value) {
62+
}
63+
64+
@Override
65+
public void endNode() {
66+
}
67+
}

core/src/test/java/cucumber/runtime/table/ToDataTableTest.java

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@
99

1010
import java.lang.reflect.Type;
1111
import java.util.Date;
12+
import java.util.HashMap;
13+
import java.util.LinkedHashMap;
1214
import java.util.List;
1315
import java.util.Locale;
16+
import java.util.Map;
1417

1518
import static java.util.Arrays.asList;
1619
import static org.junit.Assert.assertEquals;
@@ -127,20 +130,45 @@ public void converts_list_of_list_of_number_to_table() {
127130
}
128131

129132
@Test
130-
public void converts_list_of_array_of_string_to_table() {
133+
public void converts_list_of_array_of_string_or_number_to_table_with_number_formatting() {
131134
List<Object[]> arrays = asList(
132135
new Object[]{"name", "birthDate", "credits"},
133-
new Object[]{"Sid Vicious", "10/05/1957", "1000"},
134-
new Object[]{"Frank Zappa", "21/12/1940", "3000"}
136+
new Object[]{"Sid Vicious", "10/05/1957", 1000},
137+
new Object[]{"Frank Zappa", "21/12/1940", 3000}
135138
);
136-
DataTable table = tc.toTable(arrays, "name", "credits", "birthDate");
139+
DataTable table = tc.toTable(arrays);
137140
assertEquals("" +
138141
" | name | birthDate | credits |\n" +
139-
" | Sid Vicious | 10/05/1957 | 1000 |\n" +
140-
" | Frank Zappa | 21/12/1940 | 3000 |\n" +
142+
" | Sid Vicious | 10/05/1957 | 1,000 |\n" +
143+
" | Frank Zappa | 21/12/1940 | 3,000 |\n" +
141144
"", table.toString());
142145
}
143146

147+
@Test
148+
public void convert_list_of_maps_to_table() {
149+
Map<String, Object> vicious = new LinkedHashMap<String, Object>();
150+
vicious.put("name", "Sid Vicious");
151+
vicious.put("birthDate", "10/05/1957");
152+
vicious.put("credits", 1000);
153+
Map<String, Object> zappa = new LinkedHashMap<String, Object>();
154+
zappa.put("name", "Frank Zappa");
155+
zappa.put("birthDate", "21/12/1940");
156+
zappa.put("credits", 3000);
157+
List<Map<String, Object>> maps = asList(vicious, zappa);
158+
159+
assertEquals("" +
160+
" | name | credits | birthDate |\n" +
161+
" | Sid Vicious | 1,000 | 10/05/1957 |\n" +
162+
" | Frank Zappa | 3,000 | 21/12/1940 |\n" +
163+
"", tc.toTable(maps, "name", "credits", "birthDate").toString());
164+
165+
assertEquals("" +
166+
" | name | birthDate | credits |\n" +
167+
" | Sid Vicious | 10/05/1957 | 1,000 |\n" +
168+
" | Frank Zappa | 21/12/1940 | 3,000 |\n" +
169+
"", tc.toTable(maps).toString());
170+
}
171+
144172
// No setters
145173
public static class UserPojo {
146174
public Integer credits;

0 commit comments

Comments
 (0)