Skip to content

Commit fa717ba

Browse files
committed
Bugfix for Tables with empty cells make the column disappear. Closes #320
1 parent ac58b73 commit fa717ba

File tree

4 files changed

+52
-18
lines changed

4 files changed

+52
-18
lines changed

History.md

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
## [Git master](https://github.com/cucumber/cucumber-jvm/compare/v1.0.7...master)
22

3+
* [Core] Tables with empty cells make the column disappear ([#320](https://github.com/cucumber/cucumber-jvm/pull/320) Aslak Hellesøy, Gilles Philippart)
34
* [Java] Add 'throws Exception' to generated Java stepdef snippets ([#318](https://github.com/cucumber/cucumber-jvm/issues/318), [#319](https://github.com/cucumber/cucumber-jvm/pull/319) Petter Måhlén)
45
* [Core] Remove forced UTC timezone. ([#317](https://github.com/cucumber/cucumber-jvm/pull/317) Gilles Philippart)
56
* [Core] Options (Command line or `@Cucumber.Options`) can be overriden with the `cucumber.options` system property. (Aslak Hellesøy)

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

+22-5
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import cucumber.table.xstream.ListOfObjectWriter;
1616
import gherkin.util.Mapper;
1717

18+
import java.lang.reflect.Field;
1819
import java.lang.reflect.ParameterizedType;
1920
import java.lang.reflect.Type;
2021
import java.util.ArrayList;
@@ -67,12 +68,26 @@ public DataTable toTable(List<?> objects, String... columnNames) {
6768
objects = wrapLists((List<List<?>>) objects);
6869
writer = new ListOfListOfSingleValueWriter(this);
6970
} else {
70-
writer = new ListOfObjectWriter(this);
71+
if (columnNames.length == 0) {
72+
// Figure out column names by looking at class
73+
columnNames = fieldNames(objects.get(0).getClass());
74+
}
75+
writer = new ListOfObjectWriter(this, columnNames);
7176
}
7277
xStream.marshal(objects, writer);
7378
return writer.getDataTable();
7479
}
7580

81+
private String[] fieldNames(Class clazz) {
82+
Field[] fields = clazz.getFields();
83+
String[] fieldNames = new String[fields.length];
84+
int i = 0;
85+
for (Field field : fields) {
86+
fieldNames[i++] = field.getName();
87+
}
88+
return fieldNames;
89+
}
90+
7691
// This is a hack to prevent XStream from outputting weird-looking "XML" for Arrays.asList() - created lists.
7792
private List<List<?>> wrapLists(List<List<?>> lists) {
7893
List<List<?>> result = new ArrayList<List<?>>();
@@ -95,10 +110,12 @@ public String map(String attributeName) {
95110
}
96111

97112
private boolean isListOfListOfSingleValue(List<?> objects) {
98-
if (objects.size() > 0 && objects.get(0) instanceof List) {
99-
List firstList = (List) objects.get(0);
100-
if (firstList.size() > 0 && isSingleValue(firstList.get(0).getClass())) {
101-
return true;
113+
for (Object object : objects) {
114+
if (object instanceof List) {
115+
List list = (List) object;
116+
if (list.size() > 0 && isSingleValue(list.get(0).getClass())) {
117+
return true;
118+
}
102119
}
103120
}
104121
return false;

core/src/main/java/cucumber/table/xstream/ListOfObjectWriter.java

+29-12
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,25 @@
88
import java.util.ArrayList;
99
import java.util.List;
1010

11+
import static java.util.Arrays.asList;
1112
import static java.util.Collections.emptyList;
1213

1314
public class ListOfObjectWriter extends DataTableWriter {
1415
private static final List<Comment> NO_COMMENTS = emptyList();
1516
private final List<DataTableRow> rows = new ArrayList<DataTableRow>();
1617
private final TableConverter tableConverter;
18+
private final List<String> fieldNames;
19+
1720
private int nodeDepth = 0;
18-
private List<String> header = new ArrayList<String>();
19-
private List<String> cells;
21+
private String[] fieldValues;
22+
private int fieldIndex = -1;
2023

21-
public ListOfObjectWriter(TableConverter tableConverter) {
24+
public ListOfObjectWriter(TableConverter tableConverter, String... columnNames) {
2225
this.tableConverter = tableConverter;
26+
fieldNames = asList(columnNames);
27+
28+
DataTableRow headerRow = new DataTableRow(NO_COMMENTS, fieldNames, 0);
29+
rows.add(headerRow);
2330
}
2431

2532
@Override
@@ -31,10 +38,10 @@ public DataTable getDataTable() {
3138
public void startNode(String name) {
3239
nodeDepth++;
3340
if (nodeDepth == 2) {
34-
cells = new ArrayList<String>();
41+
fieldValues = new String[fieldNames.size()];
3542
}
36-
if (nodeDepth == 3 && header != null) {
37-
header.add(name);
43+
if (nodeDepth == 3) {
44+
fieldIndex = fieldNames.indexOf(name);
3845
}
3946
}
4047

@@ -44,23 +51,33 @@ public void addAttribute(String name, String value) {
4451

4552
@Override
4653
public void setValue(String text) {
47-
cells.add(text);
54+
if(fieldIndex != -1) {
55+
fieldValues[fieldIndex] = text;
56+
}
4857
}
4958

5059
@Override
5160
public void endNode() {
5261
if (nodeDepth == 2) {
53-
if (header != null) {
54-
DataTableRow headerRow = new DataTableRow(NO_COMMENTS, header, 0);
55-
rows.add(headerRow);
56-
header = null;
57-
}
62+
List<String> cells = toArrayReplacingNullWithEmptyString();
5863
DataTableRow row = new DataTableRow(NO_COMMENTS, cells, 0);
5964
rows.add(row);
6065
}
6166
nodeDepth--;
6267
}
6368

69+
private List<String> toArrayReplacingNullWithEmptyString() {
70+
List<String> cells = new ArrayList<String>(fieldValues.length);
71+
for(int i = 0; i < fieldValues.length; i++) {
72+
String fieldValue = fieldValues[i];
73+
if(fieldValue == null) {
74+
fieldValue = "";
75+
}
76+
cells.add(fieldValue);
77+
}
78+
return cells;
79+
}
80+
6481
@Override
6582
public void flush() {
6683
throw new UnsupportedOperationException();

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

-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ public void gives_a_nice_error_message_when_primitive_field_is_null() {
8484
}
8585

8686
@Test
87-
@Ignore
8887
public void converts_list_of_beans_to_table_with_explicit_columns() {
8988
List<UserPojo> users = tc.toList(UserPojo.class, personTable());
9089
DataTable table = tc.toTable(users, "name", "birthDate", "credits");

0 commit comments

Comments
 (0)