Skip to content

Commit d5d147a

Browse files
committed
Fix using the same previous data table column multiple times in the same cell (#2083)
1 parent 6c584d3 commit d5d147a

File tree

3 files changed

+72
-2
lines changed

3 files changed

+72
-2
lines changed

spock-core/src/main/java/org/spockframework/compiler/WhereBlockRewriter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -675,7 +675,7 @@ private void turnIntoSimpleParameterization(List<Expression> column) throws Inva
675675

676676
// otherwise generate the extractors and closure
677677
List<Statement> statements = new ArrayList<>();
678-
List<String> referencedPreviousVariables = previousVariableAccesses.stream().map(VariableExpression::getName).collect(toList());
678+
Set<String> referencedPreviousVariables = previousVariableAccesses.stream().map(VariableExpression::getName).collect(toSet());
679679
generatePreviousColumnExtractorStatements(referencedPreviousVariables, row, statements);
680680
ReturnStatement providerStatement = new ReturnStatement(providerExpression);
681681
providerStatement.setSourcePosition(providerExpression);
@@ -702,7 +702,7 @@ private void turnIntoSimpleParameterization(List<Expression> column) throws Inva
702702
rewriteSimpleParameterization(binExpr, varExpr, true);
703703
}
704704

705-
private void generatePreviousColumnExtractorStatements(List<String> referencedPreviousVariables, int row,
705+
private void generatePreviousColumnExtractorStatements(Set<String> referencedPreviousVariables, int row,
706706
List<Statement> statements) {
707707
for (String referencedPreviousVariable : referencedPreviousVariables) {
708708
statements.add(new ExpressionStatement(

spock-specs/src/test/groovy/org/spockframework/smoke/ast/DataTablesAstSpec.groovy

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package org.spockframework.smoke.ast
1616

1717
import org.spockframework.EmbeddedSpecification
1818
import org.spockframework.specs.extension.SpockSnapshotter
19+
import spock.lang.Issue
1920
import spock.lang.Snapshot
2021
import spock.util.Show
2122

@@ -83,4 +84,24 @@ class DataTablesAstSpec extends EmbeddedSpecification {
8384
then:
8485
snapshotter.assertThat(result.source).matchesSnapshot()
8586
}
87+
88+
@Issue('https://github.com/spockframework/spock/issues/2083')
89+
def 'using a variable in a cell multiple times compiles'() {
90+
given:
91+
snapshotter.featureBody()
92+
93+
when:
94+
def result = compiler.transpileFeatureBody '''
95+
expect:
96+
a + b == result
97+
98+
where:
99+
a | b | result
100+
1 | 2 | a + b
101+
3 | 4 | a + a // causes the compile error
102+
''', EnumSet.of(Show.METHODS)
103+
104+
then:
105+
snapshotter.assertThat(result.source).matchesSnapshot()
106+
}
86107
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package aPackage
2+
import spock.lang.*
3+
4+
class ASpec extends Specification {
5+
def "aFeature"() {
6+
/*--------- tag::snapshot[] ---------*/
7+
public void $spock_feature_0_0(java.lang.Object a, java.lang.Object b, java.lang.Object result) {
8+
org.spockframework.runtime.ErrorCollector $spock_errorCollector = org.spockframework.runtime.ErrorRethrower.INSTANCE
9+
org.spockframework.runtime.ValueRecorder $spock_valueRecorder = new org.spockframework.runtime.ValueRecorder()
10+
org.spockframework.runtime.SpockRuntime.callBlockEntered(this, 0)
11+
try {
12+
org.spockframework.runtime.SpockRuntime.verifyCondition($spock_errorCollector, $spock_valueRecorder.reset(), 'a + b == result', 2, 9, null, $spock_valueRecorder.record($spock_valueRecorder.startRecordingValue(4), $spock_valueRecorder.record($spock_valueRecorder.startRecordingValue(2), $spock_valueRecorder.record($spock_valueRecorder.startRecordingValue(0), a) + $spock_valueRecorder.record($spock_valueRecorder.startRecordingValue(1), b)) == $spock_valueRecorder.record($spock_valueRecorder.startRecordingValue(3), result)))
13+
}
14+
catch (java.lang.Throwable $spock_condition_throwable) {
15+
org.spockframework.runtime.SpockRuntime.conditionFailedWithException($spock_errorCollector, $spock_valueRecorder, 'a + b == result', 2, 9, null, $spock_condition_throwable)}
16+
finally {
17+
}
18+
org.spockframework.runtime.SpockRuntime.callBlockExited(this, 0)
19+
this.getSpecificationContext().getMockController().leaveScope()
20+
}
21+
22+
public java.lang.Object $spock_feature_0_0prov0() {
23+
return [1, 3]
24+
}
25+
26+
public java.lang.Object $spock_feature_0_0prov1(java.util.List $spock_p_a) {
27+
return [2, 4]
28+
}
29+
30+
public java.lang.Object $spock_feature_0_0prov2(java.util.List $spock_p_a, java.util.List $spock_p_b) {
31+
return [{ ->
32+
java.lang.Object a = $spock_p_a.get(0)
33+
java.lang.Object b = $spock_p_b.get(0)
34+
return a + b
35+
}.call(), { ->
36+
java.lang.Object a = $spock_p_a.get(1)
37+
return a + a
38+
}.call()]
39+
}
40+
41+
public java.lang.Object $spock_feature_0_0proc(java.lang.Object $spock_p0, java.lang.Object $spock_p1, java.lang.Object $spock_p2) {
42+
java.lang.Object a = (( $spock_p0 ) as java.lang.Object)
43+
java.lang.Object b = (( $spock_p1 ) as java.lang.Object)
44+
java.lang.Object result = (( $spock_p2 ) as java.lang.Object)
45+
return new java.lang.Object[]{ a , b , result }
46+
}
47+
/*--------- end::snapshot[] ---------*/
48+
}
49+
}

0 commit comments

Comments
 (0)