Skip to content

Commit fd4ffdb

Browse files
committed
[Core] Convert empty pickle table cells to null
Fixes: #1617
1 parent b07c057 commit fd4ffdb

File tree

5 files changed

+30
-35
lines changed

5 files changed

+30
-35
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package io.cucumber.core.stepexpression;
22

3-
3+
@FunctionalInterface
44
interface DocStringTransformer<T> {
55
T transform(String docString);
66
}

core/src/main/java/io/cucumber/core/stepexpression/PickleTableConverter.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,12 @@ private PickleTableConverter() {
1414
}
1515

1616
static List<List<String>> toTable(PickleTable pickleTable) {
17-
List<List<String>> table = new ArrayList<List<String>>();
17+
List<List<String>> table = new ArrayList<>();
1818
for (PickleRow pickleRow : pickleTable.getRows()) {
19-
List<String> row = new ArrayList<String>();
19+
List<String> row = new ArrayList<>();
2020
for (PickleCell pickleCell : pickleRow.getCells()) {
21-
row.add(pickleCell.getValue());
21+
String value = pickleCell.getValue();
22+
row.add(value.isEmpty() ? null : value);
2223
}
2324
table.add(row);
2425
}

core/src/main/java/io/cucumber/core/stepexpression/RawTableTransformer.java

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.util.List;
44

5+
@FunctionalInterface
56
interface RawTableTransformer<T> {
67
T transform(List<List<String>> raw);
78
}

core/src/main/java/io/cucumber/core/stepexpression/StepExpressionFactory.java

+14-31
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,6 @@ public final class StepExpressionFactory {
1616
private final io.cucumber.cucumberexpressions.ExpressionFactory expressionFactory;
1717
private final DataTableTypeRegistryTableConverter tableConverter;
1818

19-
private static final DocStringTransformer<String> DOC_STRING_IDENTITY = new DocStringTransformer<String>() {
20-
@Override
21-
public String transform(String input) {
22-
return input;
23-
}
24-
};
25-
2619
public StepExpressionFactory(TypeRegistry registry) {
2720
this.expressionFactory = new io.cucumber.cucumberexpressions.ExpressionFactory(registry.parameterTypeRegistry());
2821
this.tableConverter = new DataTableTypeRegistryTableConverter(registry.dataTableTypeRegistry());
@@ -32,13 +25,9 @@ public StepExpression createExpression(String expressionString) {
3225
if (expressionString == null) throw new NullPointerException("expression can not be null");
3326
Expression expression = expressionFactory.createExpression(expressionString);
3427

35-
RawTableTransformer<DataTable> toDataTable = new RawTableTransformer<DataTable>() {
36-
@Override
37-
public DataTable transform(List<List<String>> raw) {
38-
return DataTable.create(raw, tableConverter);
39-
}
40-
};
41-
return new StepExpression(expression, DOC_STRING_IDENTITY, toDataTable);
28+
RawTableTransformer<DataTable> toDataTable = raw -> DataTable.create(raw, tableConverter);
29+
DocStringTransformer<Object> toDocString = (String input) -> input;
30+
return new StepExpression(expression, toDocString, toDataTable);
4231
}
4332

4433
public StepExpression createExpression(String expressionString, Type tableOrDocStringType) {
@@ -64,26 +53,20 @@ public StepExpression createExpression(String expressionString, final TypeResolv
6453
throw registerTypeInConfiguration(expressionString, e);
6554
}
6655

67-
RawTableTransformer<?> tableTransform = new RawTableTransformer<Object>() {
68-
@Override
69-
public Object transform(List<List<String>> raw) {
70-
DataTable dataTable = DataTable.create(raw, StepExpressionFactory.this.tableConverter);
71-
Type targetType = tableOrDocStringType.resolve();
72-
return dataTable.convert(Object.class.equals(targetType) ? DataTable.class : targetType, transpose);
73-
}
56+
RawTableTransformer<?> tableTransform = (List<List<String>> raw) -> {
57+
DataTable dataTable = DataTable.create(raw, StepExpressionFactory.this.tableConverter);
58+
Type targetType = tableOrDocStringType.resolve();
59+
return dataTable.convert(Object.class.equals(targetType) ? DataTable.class : targetType, transpose);
7460
};
7561

76-
DocStringTransformer<?> docStringTransform = new DocStringTransformer<Object>() {
77-
@Override
78-
public Object transform(String docString) {
79-
Type targetType = tableOrDocStringType.resolve();
80-
if (Object.class.equals(targetType)) {
81-
return docString;
82-
}
83-
84-
List<List<String>> raw = singletonList(singletonList(docString));
85-
return DataTable.create(raw, StepExpressionFactory.this.tableConverter).convert(targetType, transpose);
62+
DocStringTransformer<?> docStringTransform = (String docString) -> {
63+
Type targetType = tableOrDocStringType.resolve();
64+
if (Object.class.equals(targetType)) {
65+
return docString;
8666
}
67+
68+
List<List<String>> raw = singletonList(singletonList(docString));
69+
return DataTable.create(raw, StepExpressionFactory.this.tableConverter).convert(targetType, transpose);
8770
};
8871
return new StepExpression(expression, docStringTransform, tableTransform);
8972
}

core/src/test/java/io/cucumber/core/runner/CoreStepDefinitionTest.java

+10
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,16 @@ public void should_apply_identity_transform_to_data_table_when_target_type_is_ob
5454
assertEquals(DataTable.create(singletonList(singletonList("content"))), arguments.get(0).getValue());
5555
}
5656

57+
@Test
58+
public void should_convert_empty_pickle_table_cells_to_null_values() {
59+
StubStepDefinition stub = new StubStepDefinition("I have some step", Object.class);
60+
CoreStepDefinition stepDefinition = new CoreStepDefinition(stub, typeRegistry);
61+
62+
PickleTable table = new PickleTable(singletonList(new PickleRow(singletonList(new PickleCell(null, "")))));
63+
List<Argument> arguments = stepDefinition.matchedArguments(new PickleStep("I have some step", singletonList(table), emptyList()));
64+
assertEquals(DataTable.create(singletonList(singletonList(null))), arguments.get(0).getValue());
65+
}
66+
5767

5868
public static class StepDefs {
5969
public void listOfListOfDoubles(List<List<Double>> listOfListOfDoubles) {

0 commit comments

Comments
 (0)