Skip to content

Commit 3752c87

Browse files
committed
Add DefaultParameterType/DefaultTableCell/DefaultTableEntry in the DSL
1 parent 73dc172 commit 3752c87

11 files changed

+429
-6
lines changed

scala/sources/src/main/scala/io/cucumber/scala/Aliases.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,10 @@ object Aliases {
1111

1212
type DocStringDefinitionBody[T] = String => T
1313

14+
type DefaultParameterTransformerBody = (String, java.lang.reflect.Type) => AnyRef
15+
16+
type DefaultDataTableCellTransformerBody = (String, java.lang.reflect.Type) => AnyRef
17+
18+
type DefaultDataTableEntryTransformerBody = (Map[String, String], java.lang.reflect.Type) => AnyRef
19+
1420
}

scala/sources/src/main/scala/io/cucumber/scala/GlueAdaptor.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ class GlueAdaptor(glue: Glue) {
1919
registry.docStringTypes.map(ScalaDocStringTypeDefinition(_, scenarioScoped)).foreach(glue.addDocStringType)
2020
registry.dataTableTypes.map(ScalaDataTableTypeDefinition(_, scenarioScoped)).foreach(glue.addDataTableType)
2121
registry.parameterTypes.map(ScalaParameterTypeDefinition(_, scenarioScoped)).foreach(glue.addParameterType)
22+
registry.defaultParameterTransformers.map(ScalaDefaultParameterTransformerDefinition(_, scenarioScoped)).foreach(glue.addDefaultParameterTransformer)
23+
registry.defaultDataTableCellTransformers.map(ScalaDefaultDataTableCellTransformerDefinition(_, scenarioScoped)).foreach(glue.addDefaultDataTableCellTransformer)
24+
registry.defaultDataTableEntryTransformers.map(ScalaDefaultDataTableEntryTransformerDefinition(_, scenarioScoped)).foreach(glue.addDefaultDataTableEntryTransformer)
2225
}
2326

2427
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package io.cucumber.scala
2+
3+
import java.lang.reflect.Type
4+
5+
import io.cucumber.core.backend.{DefaultDataTableCellTransformerDefinition, ScenarioScoped}
6+
import io.cucumber.datatable.TableCellByTypeTransformer
7+
8+
trait ScalaDefaultDataTableCellTransformerDefinition extends DefaultDataTableCellTransformerDefinition with AbstractDatatableElementTransformerDefinition {
9+
10+
val details: ScalaDefaultDataTableCellTransformerDetails
11+
12+
override val emptyPatterns: Seq[String] = details.emptyPatterns
13+
14+
override val location: StackTraceElement = new Exception().getStackTrace()(3)
15+
16+
override val tableCellByTypeTransformer: TableCellByTypeTransformer = new TableCellByTypeTransformer {
17+
override def transform(fromValue: String, toTypeValue: Type): AnyRef = {
18+
details.body.apply(replaceEmptyPatternsWithEmptyString(fromValue), toTypeValue)
19+
}
20+
}
21+
22+
}
23+
24+
object ScalaDefaultDataTableCellTransformerDefinition {
25+
26+
def apply(details: ScalaDefaultDataTableCellTransformerDetails, scenarioScoped: Boolean): ScalaDefaultDataTableCellTransformerDefinition = {
27+
if (scenarioScoped) {
28+
new ScalaScenarioScopedDataTableCellTransformerDefinition(details)
29+
} else {
30+
new ScalaGlobalDataTableCellTransformerDefinition(details)
31+
}
32+
}
33+
34+
}
35+
36+
class ScalaScenarioScopedDataTableCellTransformerDefinition(override val details: ScalaDefaultDataTableCellTransformerDetails) extends ScalaDefaultDataTableCellTransformerDefinition with ScenarioScoped {
37+
}
38+
39+
class ScalaGlobalDataTableCellTransformerDefinition(override val details: ScalaDefaultDataTableCellTransformerDetails) extends ScalaDefaultDataTableCellTransformerDefinition {
40+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package io.cucumber.scala
2+
3+
import java.lang.reflect.Type
4+
import java.util.{Map => JavaMap}
5+
6+
import io.cucumber.core.backend.{DefaultDataTableEntryTransformerDefinition, ScenarioScoped}
7+
import io.cucumber.datatable.{TableCellByTypeTransformer, TableEntryByTypeTransformer}
8+
9+
import scala.collection.JavaConverters._
10+
11+
trait ScalaDefaultDataTableEntryTransformerDefinition extends DefaultDataTableEntryTransformerDefinition with AbstractDatatableElementTransformerDefinition {
12+
13+
val details: ScalaDefaultDataTableEntryTransformerDetails
14+
15+
override val emptyPatterns: Seq[String] = details.emptyPatterns
16+
17+
override val location: StackTraceElement = new Exception().getStackTrace()(3)
18+
19+
override val tableEntryByTypeTransformer: TableEntryByTypeTransformer = new TableEntryByTypeTransformer {
20+
override def transform(fromValue: JavaMap[String, String], toValueType: Type, tableCellByTypeTransformer: TableCellByTypeTransformer): AnyRef = {
21+
replaceEmptyPatternsWithEmptyString(fromValue.asScala.toMap)
22+
.map(details.body.apply(_, toValueType))
23+
.get
24+
}
25+
}
26+
27+
override val headersToProperties: Boolean = true
28+
29+
}
30+
31+
object ScalaDefaultDataTableEntryTransformerDefinition {
32+
33+
def apply(details: ScalaDefaultDataTableEntryTransformerDetails, scenarioScoped: Boolean): ScalaDefaultDataTableEntryTransformerDefinition = {
34+
if (scenarioScoped) {
35+
new ScalaScenarioScopedDataTableEntryTransformerDefinition(details)
36+
} else {
37+
new ScalaGlobalDataTableEntryTransformerDefinition(details)
38+
}
39+
}
40+
41+
}
42+
43+
class ScalaScenarioScopedDataTableEntryTransformerDefinition(override val details: ScalaDefaultDataTableEntryTransformerDetails) extends ScalaDefaultDataTableEntryTransformerDefinition with ScenarioScoped {
44+
}
45+
46+
class ScalaGlobalDataTableEntryTransformerDefinition(override val details: ScalaDefaultDataTableEntryTransformerDetails) extends ScalaDefaultDataTableEntryTransformerDefinition {
47+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package io.cucumber.scala
2+
3+
import java.lang.reflect.Type
4+
5+
import io.cucumber.core.backend.{DefaultParameterTransformerDefinition, ScenarioScoped}
6+
import io.cucumber.cucumberexpressions.ParameterByTypeTransformer
7+
8+
trait ScalaDefaultParameterTransformerDefinition extends DefaultParameterTransformerDefinition with AbstractGlueDefinition {
9+
10+
val details: ScalaDefaultParameterTransformerDetails
11+
12+
override val location: StackTraceElement = new Exception().getStackTrace()(3)
13+
14+
override val parameterByTypeTransformer: ParameterByTypeTransformer = new ParameterByTypeTransformer {
15+
override def transform(fromValue: String, toValue: Type): AnyRef = {
16+
details.body.apply(fromValue, toValue)
17+
}
18+
}
19+
20+
}
21+
22+
object ScalaDefaultParameterTransformerDefinition {
23+
24+
def apply(details: ScalaDefaultParameterTransformerDetails, scenarioScoped: Boolean): ScalaDefaultParameterTransformerDefinition = {
25+
if (scenarioScoped) {
26+
new ScalaScenarioScopedDefaultParameterTransformerDefinition(details)
27+
} else {
28+
new ScalaGlobalDefaultParameterTransformerDefinition(details)
29+
}
30+
}
31+
32+
}
33+
34+
class ScalaScenarioScopedDefaultParameterTransformerDefinition(override val details: ScalaDefaultParameterTransformerDetails) extends ScalaDefaultParameterTransformerDefinition with ScenarioScoped {
35+
}
36+
37+
class ScalaGlobalDefaultParameterTransformerDefinition(override val details: ScalaDefaultParameterTransformerDetails) extends ScalaDefaultParameterTransformerDefinition {
38+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package io.cucumber.scala
2+
3+
import io.cucumber.scala.Aliases.{DefaultDataTableCellTransformerBody, DefaultDataTableEntryTransformerBody, DefaultParameterTransformerBody}
4+
5+
case class ScalaDefaultParameterTransformerDetails(body: DefaultParameterTransformerBody)
6+
7+
case class ScalaDefaultDataTableCellTransformerDetails(emptyPatterns: Seq[String], body: DefaultDataTableCellTransformerBody)
8+
9+
case class ScalaDefaultDataTableEntryTransformerDetails(emptyPatterns: Seq[String], body: DefaultDataTableEntryTransformerBody)

scala/sources/src/main/scala/io/cucumber/scala/ScalaDsl.scala

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package io.cucumber.scala
22

33
import java.lang.reflect.{ParameterizedType, Type}
44

5-
import io.cucumber.scala.Aliases.{DocStringDefinitionBody, HookBody}
5+
import io.cucumber.scala.Aliases.{DefaultDataTableCellTransformerBody, DefaultDataTableEntryTransformerBody, DefaultParameterTransformerBody, DocStringDefinitionBody, HookBody}
66

77
import scala.reflect.ClassTag
88

@@ -22,7 +22,7 @@ private[scala] trait BaseScalaDsl {
2222
/**
2323
* Base trait for a scala step definition implementation.
2424
*/
25-
trait ScalaDsl extends BaseScalaDsl with StepDsl with HookDsl with DataTableTypeDsl with DocStringTypeDsl with ParameterTypeDsl {
25+
trait ScalaDsl extends BaseScalaDsl with StepDsl with HookDsl with DataTableTypeDsl with DocStringTypeDsl with ParameterTypeDsl with DefaultTransformerDsl {
2626

2727
}
2828

@@ -304,6 +304,38 @@ private[scala] trait ParameterTypeDsl extends BaseScalaDsl {
304304

305305
}
306306

307+
private[scala] trait DefaultTransformerDsl extends BaseScalaDsl {
308+
309+
def DefaultParameterTransformer(body: DefaultParameterTransformerBody): Unit = {
310+
registry.defaultParameterTransformers += ScalaDefaultParameterTransformerDetails(body)
311+
}
312+
313+
def DefaultDataTableCellTransformer(body: DefaultDataTableCellTransformerBody): Unit = {
314+
DefaultDataTableCellTransformer(NO_REPLACEMENT)(body)
315+
}
316+
317+
def DefaultDataTableCellTransformer(replaceWithEmptyString: String)(body: DefaultDataTableCellTransformerBody): Unit = {
318+
DefaultDataTableCellTransformer(Seq(replaceWithEmptyString))(body)
319+
}
320+
321+
private def DefaultDataTableCellTransformer(replaceWithEmptyString: Seq[String])(body: DefaultDataTableCellTransformerBody): Unit = {
322+
registry.defaultDataTableCellTransformers += ScalaDefaultDataTableCellTransformerDetails(replaceWithEmptyString, body)
323+
}
324+
325+
def DefaultDataTableEntryTransformer(body: DefaultDataTableEntryTransformerBody): Unit = {
326+
DefaultDataTableEntryTransformer(NO_REPLACEMENT)(body)
327+
}
328+
329+
def DefaultDataTableEntryTransformer(replaceWithEmptyString: String)(body: DefaultDataTableEntryTransformerBody): Unit = {
330+
DefaultDataTableEntryTransformer(Seq(replaceWithEmptyString))(body)
331+
}
332+
333+
private def DefaultDataTableEntryTransformer(replaceWithEmptyString: Seq[String])(body: DefaultDataTableEntryTransformerBody): Unit = {
334+
registry.defaultDataTableEntryTransformers += ScalaDefaultDataTableEntryTransformerDetails(replaceWithEmptyString, body)
335+
}
336+
337+
}
338+
307339
private[scala] trait StepDsl extends BaseScalaDsl {
308340
self =>
309341

scala/sources/src/main/scala/io/cucumber/scala/ScalaDslRegistry.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,11 @@ class ScalaDslRegistry {
2020

2121
val parameterTypes = new ArrayBuffer[ScalaParameterTypeDetails[_]]
2222

23+
val defaultParameterTransformers = new ArrayBuffer[ScalaDefaultParameterTransformerDetails]
24+
25+
val defaultDataTableCellTransformers = new ArrayBuffer[ScalaDefaultDataTableCellTransformerDetails]
26+
27+
val defaultDataTableEntryTransformers = new ArrayBuffer[ScalaDefaultDataTableEntryTransformerDetails]
28+
2329
}
2430

scala/sources/src/test/resources/tests/parametertypes/ParameterTypes.feature

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,28 @@ Feature: As Cucumber Scala, I want to handle ParameterType definitions
88

99
Scenario: define parameter type with three arguments
1010
Given kebab made from mushroom, meat and veg, defined by lambda
11+
12+
Scenario: define default parameter transformer
13+
Given kebab made from anonymous meat, defined by lambda
14+
15+
Scenario: define default data table cell transformer - DataTable
16+
Given default data table cells, defined by lambda
17+
| Kebab |
18+
| [empty] |
19+
20+
Scenario: define default data table cell transformer - JList[Jlist]
21+
Given default data table cells, defined by lambda, as rows
22+
| Kebab |
23+
| [empty] |
24+
25+
Scenario: define default data table entry transformer - DataTable
26+
Given default data table entries, defined by lambda
27+
| dinner |
28+
| Kebab |
29+
| [empty] |
30+
31+
Scenario: define default data table entry transformer - JList
32+
Given default data table entries, defined by lambda, as rows
33+
| dinner |
34+
| Kebab |
35+
| [empty] |

0 commit comments

Comments
 (0)