cucumber-expressions 1.0.4 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/cucumber-expressions.gemspec +1 -1
- data/examples.txt +5 -1
- data/lib/cucumber/cucumber_expressions/{argument_matcher.rb → argument_builder.rb} +4 -4
- data/lib/cucumber/cucumber_expressions/cucumber_expression.rb +24 -17
- data/lib/cucumber/cucumber_expressions/cucumber_expression_generator.rb +38 -35
- data/lib/cucumber/cucumber_expressions/generated_expression.rb +3 -3
- data/lib/cucumber/cucumber_expressions/{transform.rb → parameter.rb} +11 -4
- data/lib/cucumber/cucumber_expressions/{transform_matcher.rb → parameter_matcher.rb} +5 -5
- data/lib/cucumber/cucumber_expressions/parameter_registry.rb +64 -0
- data/lib/cucumber/cucumber_expressions/regular_expression.rb +11 -11
- data/spec/cucumber/cucumber_expressions/cucumber_expression_generator_spec.rb +31 -34
- data/spec/cucumber/cucumber_expressions/cucumber_expression_regexp_spec.rb +3 -3
- data/spec/cucumber/cucumber_expressions/cucumber_expression_spec.rb +35 -20
- data/spec/cucumber/cucumber_expressions/custom_parameter_spec.rb +87 -0
- data/spec/cucumber/cucumber_expressions/expression_examples_spec.rb +3 -3
- data/spec/cucumber/cucumber_expressions/regular_expression_spec.rb +12 -12
- metadata +10 -10
- data/lib/cucumber/cucumber_expressions/transform_lookup.rb +0 -70
- data/spec/cucumber/cucumber_expressions/custom_transform_spec.rb +0 -87
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 882d05ea05136cc6af4f3bc4ef6bccfe42531645
|
4
|
+
data.tar.gz: 42c7abf6782587c48aa8e264598637a459bbdc86
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 598ce9757f1518d1e9eae317a3f9718efb6339001fa36a5dea1e03fd690f44abd34524652f7b195c271c8b5128082676ffbd2dfef8b2a9aa2ee4bc6cd71ba3c7
|
7
|
+
data.tar.gz: 38121b06c1d4ca408a28f407cb0ae3b0f47de3464fe20128de05667ab34fdd93b5f369dbb2d24b26b4f9f742a93744e1dbccbb0d930478c8de3633b305fa8891
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
Gem::Specification.new do |s|
|
3
3
|
s.name = 'cucumber-expressions'
|
4
|
-
s.version = '
|
4
|
+
s.version = '2.0.0'
|
5
5
|
s.authors = ["Aslak Hellesøy"]
|
6
6
|
s.description = 'Cucumber Expressions - a simpler alternative to Regular Expressions'
|
7
7
|
s.summary = "cucumber-expressions-#{s.version}"
|
data/examples.txt
CHANGED
@@ -2,10 +2,14 @@ I have {n} cuke(s) in my {bodypart} now
|
|
2
2
|
I have 22 cukes in my belly now
|
3
3
|
["22","belly"]
|
4
4
|
---
|
5
|
-
I have {
|
5
|
+
I have {int} cuke(s) in my {bodypart} now
|
6
6
|
I have 1 cuke in my belly now
|
7
7
|
[1,"belly"]
|
8
8
|
---
|
9
|
+
I have {int} cuke(s) and some \[]^$.|?*+ {something}
|
10
|
+
I have 1 cuke and some \[]^$.|?*+ characters
|
11
|
+
[1,"characters"]
|
12
|
+
---
|
9
13
|
/I have (\d+) cukes? in my (.+) now/
|
10
14
|
I have 22 cukes in my belly now
|
11
15
|
[22,"belly"]
|
@@ -2,14 +2,14 @@ require 'cucumber/cucumber_expressions/argument'
|
|
2
2
|
|
3
3
|
module Cucumber
|
4
4
|
module CucumberExpressions
|
5
|
-
class
|
6
|
-
def self.
|
5
|
+
class ArgumentBuilder
|
6
|
+
def self.build_arguments(regexp, text, parameters)
|
7
7
|
m = regexp.match(text)
|
8
8
|
return nil if m.nil?
|
9
9
|
(1...m.length).map do |index|
|
10
10
|
value = m[index]
|
11
|
-
|
12
|
-
transformed_value =
|
11
|
+
parameter = parameters[index-1]
|
12
|
+
transformed_value = parameter.transform(value)
|
13
13
|
Argument.new(m.offset(index)[0], value, transformed_value)
|
14
14
|
end
|
15
15
|
end
|
@@ -1,22 +1,25 @@
|
|
1
|
-
require 'cucumber/cucumber_expressions/
|
2
|
-
require 'cucumber/cucumber_expressions/
|
1
|
+
require 'cucumber/cucumber_expressions/argument_builder'
|
2
|
+
require 'cucumber/cucumber_expressions/parameter'
|
3
3
|
|
4
4
|
module Cucumber
|
5
5
|
module CucumberExpressions
|
6
6
|
class CucumberExpression
|
7
7
|
PARAMETER_PATTERN = /\{([^}:]+)(:([^}]+))?}/
|
8
|
-
OPTIONAL_PATTERN = /\(([
|
8
|
+
OPTIONAL_PATTERN = /\(([^)]+)\)/
|
9
9
|
|
10
10
|
attr_reader :source
|
11
11
|
|
12
|
-
def initialize(expression, types,
|
12
|
+
def initialize(expression, types, parameter_registry)
|
13
13
|
@source = expression
|
14
|
-
@
|
14
|
+
@parameters = []
|
15
15
|
regexp = "^"
|
16
16
|
type_index = 0
|
17
17
|
match = nil
|
18
18
|
match_offset = 0
|
19
19
|
|
20
|
+
# Does not include (){} because they have special meaning
|
21
|
+
expression = expression.gsub(/([\\\^\[$.|?*+\]])/, '\\\\\1')
|
22
|
+
|
20
23
|
# Create non-capturing, optional capture groups from parenthesis
|
21
24
|
expression = expression.gsub(OPTIONAL_PATTERN, '(?:\1)?')
|
22
25
|
|
@@ -26,26 +29,30 @@ module Cucumber
|
|
26
29
|
|
27
30
|
parameter_name = match[1]
|
28
31
|
type_name = match[3]
|
32
|
+
if type_name
|
33
|
+
$stderr.puts("Cucumber expression parameter syntax {#{parameter_name}:#{type_name}} is deprecated. Please use {#{type_name}} instead.")
|
34
|
+
end
|
35
|
+
|
29
36
|
type = types.length <= type_index ? nil : types[type_index]
|
30
37
|
type_index += 1
|
31
38
|
|
32
|
-
|
33
|
-
if
|
34
|
-
|
39
|
+
parameter = nil
|
40
|
+
if type
|
41
|
+
parameter = parameter_registry.lookup_by_type(type)
|
35
42
|
end
|
36
|
-
if
|
37
|
-
|
43
|
+
if parameter.nil? && type_name
|
44
|
+
parameter = parameter_registry.lookup_by_type_name(type_name)
|
38
45
|
end
|
39
|
-
if
|
40
|
-
|
46
|
+
if parameter.nil?
|
47
|
+
parameter = parameter_registry.lookup_by_type_name(parameter_name)
|
41
48
|
end
|
42
|
-
if
|
43
|
-
|
49
|
+
if parameter.nil?
|
50
|
+
parameter = parameter_registry.create_anonymous_lookup(lambda {|s| s})
|
44
51
|
end
|
45
|
-
@
|
52
|
+
@parameters.push(parameter)
|
46
53
|
|
47
54
|
text = expression.slice(match_offset...match.offset(0)[0])
|
48
|
-
capture_regexp = capture_group_regexp(
|
55
|
+
capture_regexp = capture_group_regexp(parameter.capture_group_regexps)
|
49
56
|
match_offset = match.offset(0)[1]
|
50
57
|
regexp += text
|
51
58
|
regexp += capture_regexp
|
@@ -56,7 +63,7 @@ module Cucumber
|
|
56
63
|
end
|
57
64
|
|
58
65
|
def match(text)
|
59
|
-
|
66
|
+
ArgumentBuilder.build_arguments(@regexp, text, @parameters)
|
60
67
|
end
|
61
68
|
|
62
69
|
private
|
@@ -1,46 +1,44 @@
|
|
1
|
-
require 'cucumber/cucumber_expressions/
|
1
|
+
require 'cucumber/cucumber_expressions/parameter_matcher'
|
2
2
|
require 'cucumber/cucumber_expressions/generated_expression'
|
3
3
|
|
4
4
|
module Cucumber
|
5
5
|
module CucumberExpressions
|
6
6
|
class CucumberExpressionGenerator
|
7
|
-
def initialize(
|
8
|
-
@
|
7
|
+
def initialize(parameter_registry)
|
8
|
+
@parameter_registry = parameter_registry
|
9
9
|
end
|
10
10
|
|
11
|
-
def generate_expression(text
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
def generate_expression(text)
|
12
|
+
parameter_names = []
|
13
|
+
parameter_matchers = create_parameter_matchers(text)
|
14
|
+
parameters = []
|
15
|
+
usage_by_type_name = Hash.new(0)
|
15
16
|
|
16
17
|
expression = ""
|
17
|
-
arg_counter = 0
|
18
18
|
pos = 0
|
19
19
|
|
20
20
|
loop do
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
if
|
25
|
-
|
21
|
+
matching_parameter_matchers = []
|
22
|
+
parameter_matchers.each do |parameter_matcher|
|
23
|
+
advanced_parameter_matcher = parameter_matcher.advance_to(pos)
|
24
|
+
if advanced_parameter_matcher.find
|
25
|
+
matching_parameter_matchers.push(advanced_parameter_matcher)
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
if
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
transforms.push(best_transform_matcher.transform)
|
29
|
+
if matching_parameter_matchers.any?
|
30
|
+
matching_parameter_matchers = matching_parameter_matchers.sort
|
31
|
+
best_parameter_matcher = matching_parameter_matchers[0]
|
32
|
+
parameter = best_parameter_matcher.parameter
|
33
|
+
parameters.push(parameter)
|
35
34
|
|
36
|
-
|
37
|
-
|
35
|
+
parameter_name = get_parameter_name(parameter.type_name, usage_by_type_name)
|
36
|
+
parameter_names.push(parameter_name)
|
38
37
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
pos = best_transform_matcher.start + best_transform_matcher.group.length
|
38
|
+
expression += text.slice(pos...best_parameter_matcher.start)
|
39
|
+
expression += "{#{parameter.type_name}}"
|
40
|
+
|
41
|
+
pos = best_parameter_matcher.start + best_parameter_matcher.group.length
|
44
42
|
else
|
45
43
|
break
|
46
44
|
end
|
@@ -51,25 +49,30 @@ module Cucumber
|
|
51
49
|
end
|
52
50
|
|
53
51
|
expression += text.slice(pos..-1)
|
54
|
-
GeneratedExpression.new(expression,
|
52
|
+
GeneratedExpression.new(expression, parameter_names, parameters)
|
55
53
|
end
|
56
54
|
|
57
55
|
private
|
58
56
|
|
59
|
-
def
|
60
|
-
|
61
|
-
|
62
|
-
|
57
|
+
def get_parameter_name(type_name, usage_by_type_name)
|
58
|
+
count = (usage_by_type_name[type_name] += 1)
|
59
|
+
count == 1 ? type_name : "#{type_name}#{count}"
|
60
|
+
end
|
61
|
+
|
62
|
+
def create_parameter_matchers(text)
|
63
|
+
parameter_matchers = []
|
64
|
+
@parameter_registry.parameters.each do |parameter|
|
65
|
+
parameter_matchers += create_parameter_matchers2(parameter, text)
|
63
66
|
end
|
64
|
-
|
67
|
+
parameter_matchers
|
65
68
|
end
|
66
69
|
|
67
|
-
def
|
70
|
+
def create_parameter_matchers2(parameter, text)
|
68
71
|
result = []
|
69
|
-
capture_group_regexps =
|
72
|
+
capture_group_regexps = parameter.capture_group_regexps
|
70
73
|
capture_group_regexps.each do |capture_group_regexp|
|
71
74
|
regexp = Regexp.new("(#{capture_group_regexp})")
|
72
|
-
result.push(
|
75
|
+
result.push(ParameterMatcher.new(parameter, regexp, text))
|
73
76
|
end
|
74
77
|
result
|
75
78
|
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module Cucumber
|
2
2
|
module CucumberExpressions
|
3
3
|
class GeneratedExpression
|
4
|
-
attr_reader :source, :
|
4
|
+
attr_reader :source, :parameter_names, :parameters
|
5
5
|
|
6
|
-
def initialize(source,
|
7
|
-
@source, @
|
6
|
+
def initialize(source, parameter_names, parameters)
|
7
|
+
@source, @parameter_names, @parameters = source, parameter_names, parameters
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
@@ -1,22 +1,29 @@
|
|
1
1
|
module Cucumber
|
2
2
|
module CucumberExpressions
|
3
|
-
class
|
3
|
+
class Parameter
|
4
4
|
attr_reader :type_name, :type, :capture_group_regexps
|
5
5
|
|
6
|
-
# Create a new
|
6
|
+
# Create a new Parameter
|
7
7
|
#
|
8
8
|
# @param type_name [Array] array of class or type name to use in {arg:type_name}
|
9
9
|
# @param capture_group_regexps [Array] list of regexps for capture groups.
|
10
|
-
# @param transformer lambda that transforms a String to another type
|
10
|
+
# @param transformer lambda that transforms a String to (possibly) another type
|
11
11
|
#
|
12
12
|
def initialize(type_name, type, capture_group_regexps, transformer)
|
13
13
|
@type_name, @type, @transformer = type_name, type, transformer
|
14
|
-
@capture_group_regexps = capture_group_regexps
|
14
|
+
@capture_group_regexps = string_array(capture_group_regexps)
|
15
15
|
end
|
16
16
|
|
17
17
|
def transform(value)
|
18
18
|
@transformer.call(value)
|
19
19
|
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def string_array(capture_group_regexps)
|
24
|
+
array = capture_group_regexps.is_a?(Array) ? capture_group_regexps : [capture_group_regexps]
|
25
|
+
array.map { |r| r.is_a?(String) ? r : r.source }
|
26
|
+
end
|
20
27
|
end
|
21
28
|
end
|
22
29
|
end
|
@@ -1,15 +1,15 @@
|
|
1
1
|
module Cucumber
|
2
2
|
module CucumberExpressions
|
3
|
-
class
|
4
|
-
attr_reader :
|
3
|
+
class ParameterMatcher
|
4
|
+
attr_reader :parameter
|
5
5
|
|
6
|
-
def initialize(
|
7
|
-
@
|
6
|
+
def initialize(parameter, regexp, text, match_position=0)
|
7
|
+
@parameter, @regexp, @text = parameter, regexp, text
|
8
8
|
@match = @regexp.match(@text, match_position)
|
9
9
|
end
|
10
10
|
|
11
11
|
def advance_to(new_match_position)
|
12
|
-
self.class.new(
|
12
|
+
self.class.new(parameter, @regexp, @text, new_match_position)
|
13
13
|
end
|
14
14
|
|
15
15
|
def find
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'cucumber/cucumber_expressions/parameter'
|
2
|
+
|
3
|
+
module Cucumber
|
4
|
+
module CucumberExpressions
|
5
|
+
class ParameterRegistry
|
6
|
+
INTEGER_REGEXPS = ['-?\d+', '\d+']
|
7
|
+
FLOATING_POINT_REGEXPS = ['-?\d*\.?\d+']
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@parameters_by_type_name = {}
|
11
|
+
@parameters_by_capture_group_regexp = {}
|
12
|
+
@parameters_by_class = {}
|
13
|
+
|
14
|
+
add_parameter(Parameter.new('int', Integer, INTEGER_REGEXPS, lambda {|s| s.to_i}))
|
15
|
+
add_parameter(Parameter.new('float', Float, FLOATING_POINT_REGEXPS, lambda {|s| s.to_f}))
|
16
|
+
end
|
17
|
+
|
18
|
+
def lookup_by_type(type)
|
19
|
+
if type.is_a?(Class)
|
20
|
+
lookup_by_class(type)
|
21
|
+
elsif type.is_a?(String)
|
22
|
+
lookup_by_type_name(type)
|
23
|
+
else
|
24
|
+
raise Exception.new("Type must be string or class, but was #{type} of type #{type.class}")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def lookup_by_class(clazz)
|
29
|
+
parameter = @parameters_by_class[clazz]
|
30
|
+
if parameter.nil?
|
31
|
+
create_anonymous_lookup(lambda {|s| clazz.new(s)})
|
32
|
+
else
|
33
|
+
parameter
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def lookup_by_type_name(type_name)
|
38
|
+
@parameters_by_type_name[type_name]
|
39
|
+
end
|
40
|
+
|
41
|
+
def lookup_by_capture_group_regexp(capture_group_regexp)
|
42
|
+
@parameters_by_capture_group_regexp[capture_group_regexp]
|
43
|
+
end
|
44
|
+
|
45
|
+
def create_anonymous_lookup(proc)
|
46
|
+
Parameter.new(nil, nil, ['.+'], proc)
|
47
|
+
end
|
48
|
+
|
49
|
+
def add_parameter(parameter)
|
50
|
+
@parameters_by_type_name[parameter.type_name] = parameter
|
51
|
+
@parameters_by_class[parameter.type] = parameter
|
52
|
+
|
53
|
+
parameter.capture_group_regexps.each do |capture_group_regexp|
|
54
|
+
@parameters_by_capture_group_regexp[capture_group_regexp] = parameter
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def parameters
|
59
|
+
@parameters_by_type_name.values
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -1,13 +1,13 @@
|
|
1
|
-
require 'cucumber/cucumber_expressions/
|
1
|
+
require 'cucumber/cucumber_expressions/argument_builder'
|
2
2
|
|
3
3
|
module Cucumber
|
4
4
|
module CucumberExpressions
|
5
5
|
class RegularExpression
|
6
6
|
CAPTURE_GROUP_PATTERN = /\(([^(]+)\)/
|
7
7
|
|
8
|
-
def initialize(regexp, types,
|
8
|
+
def initialize(regexp, types, parameter_registry)
|
9
9
|
@regexp = regexp
|
10
|
-
@
|
10
|
+
@parameters = []
|
11
11
|
|
12
12
|
type_index = 0
|
13
13
|
match = nil
|
@@ -21,24 +21,24 @@ module Cucumber
|
|
21
21
|
type = types.length <= type_index ? nil : types[type_index]
|
22
22
|
type_index += 1
|
23
23
|
|
24
|
-
|
24
|
+
parameter = nil
|
25
25
|
if (type)
|
26
|
-
|
26
|
+
parameter = parameter_registry.lookup_by_type(type)
|
27
27
|
end
|
28
|
-
if (
|
29
|
-
|
28
|
+
if (parameter.nil?)
|
29
|
+
parameter = parameter_registry.lookup_by_capture_group_regexp(capture_group_pattern)
|
30
30
|
end
|
31
|
-
if (
|
32
|
-
|
31
|
+
if (parameter.nil?)
|
32
|
+
parameter = parameter_registry.create_anonymous_lookup(lambda {|s| s})
|
33
33
|
end
|
34
34
|
|
35
|
-
@
|
35
|
+
@parameters.push(parameter)
|
36
36
|
match_offset = match.offset(0)[1]
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
40
|
def match(text)
|
41
|
-
|
41
|
+
ArgumentBuilder.build_arguments(@regexp, text, @parameters)
|
42
42
|
end
|
43
43
|
|
44
44
|
def source
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'cucumber/cucumber_expressions/cucumber_expression_generator'
|
2
|
-
require 'cucumber/cucumber_expressions/
|
3
|
-
require 'cucumber/cucumber_expressions/
|
2
|
+
require 'cucumber/cucumber_expressions/parameter'
|
3
|
+
require 'cucumber/cucumber_expressions/parameter_registry'
|
4
4
|
|
5
5
|
module Cucumber
|
6
6
|
module CucumberExpressions
|
@@ -9,69 +9,66 @@ module Cucumber
|
|
9
9
|
end
|
10
10
|
|
11
11
|
before do
|
12
|
-
@
|
13
|
-
@generator = CucumberExpressionGenerator.new(@
|
12
|
+
@parameter_registry = ParameterRegistry.new
|
13
|
+
@generator = CucumberExpressionGenerator.new(@parameter_registry)
|
14
14
|
end
|
15
15
|
|
16
16
|
it "documents expression generation" do
|
17
|
-
|
17
|
+
parameter_registry = ParameterRegistry.new
|
18
18
|
### [generate-expression]
|
19
|
-
generator = CucumberExpressionGenerator.new(
|
19
|
+
generator = CucumberExpressionGenerator.new(parameter_registry)
|
20
20
|
undefined_step_text = "I have 2 cucumbers and 1.5 tomato"
|
21
|
-
generated_expression = generator.generate_expression(undefined_step_text
|
22
|
-
expect(generated_expression.source).to eq("I have {
|
23
|
-
expect(generated_expression.
|
24
|
-
expect(generated_expression.transforms[1].type).to eq(Float)
|
21
|
+
generated_expression = generator.generate_expression(undefined_step_text)
|
22
|
+
expect(generated_expression.source).to eq("I have {int} cucumbers and {float} tomato")
|
23
|
+
expect(generated_expression.parameters[1].type).to eq(Float)
|
25
24
|
### [generate-expression]
|
26
25
|
end
|
27
26
|
|
28
27
|
it "generates expression for no args" do
|
29
|
-
|
28
|
+
assert_expression("hello", [], "hello")
|
30
29
|
end
|
31
30
|
|
32
|
-
it "generates expression for int
|
33
|
-
|
34
|
-
"I have {
|
31
|
+
it "generates expression for int float arg" do
|
32
|
+
assert_expression(
|
33
|
+
"I have {int} cukes and {float} euro", ["int", "float"],
|
35
34
|
"I have 2 cukes and 1.5 euro")
|
36
35
|
end
|
37
36
|
|
38
37
|
it "generates expression for just int" do
|
39
|
-
|
40
|
-
"{
|
38
|
+
assert_expression(
|
39
|
+
"{int}", ["int"],
|
41
40
|
"99999")
|
42
41
|
end
|
43
42
|
|
44
|
-
it "
|
45
|
-
|
46
|
-
"I have {
|
47
|
-
"I have 2 cukes and
|
43
|
+
it "numbers only second argument when builtin type is not reserved keyword" do
|
44
|
+
assert_expression(
|
45
|
+
"I have {int} cukes and {int} euro", ["int", "int2"],
|
46
|
+
"I have 2 cukes and 5 euro")
|
48
47
|
end
|
49
48
|
|
50
|
-
it "
|
51
|
-
@
|
49
|
+
it "numbers only second argument when type is not reserved keyword" do
|
50
|
+
@parameter_registry.add_parameter(Parameter.new(
|
52
51
|
'currency',
|
53
52
|
Currency,
|
54
53
|
'[A-Z]{3}',
|
55
54
|
nil
|
56
55
|
))
|
57
56
|
|
58
|
-
|
59
|
-
"I have a {
|
60
|
-
"I have a EUR account")
|
57
|
+
assert_expression(
|
58
|
+
"I have a {currency} account and a {currency} account", ["currency", "currency2"],
|
59
|
+
"I have a EUR account and a GBP account")
|
61
60
|
end
|
62
61
|
|
63
|
-
it "exposes
|
64
|
-
expression = @generator.generate_expression("I have 2 cukes and 1.5 euro"
|
65
|
-
types = expression.
|
62
|
+
it "exposes parameters in generated expression" do
|
63
|
+
expression = @generator.generate_expression("I have 2 cukes and 1.5 euro")
|
64
|
+
types = expression.parameters.map(&:type)
|
66
65
|
expect(types).to eq([Integer, Float])
|
67
66
|
end
|
68
67
|
|
69
|
-
def
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
def assert_untyped_expression(expected, text)
|
74
|
-
expect(@generator.generate_expression(text, false).source).to eq(expected)
|
68
|
+
def assert_expression(expected_expression, expected_argument_names, text)
|
69
|
+
generated_expression = @generator.generate_expression(text)
|
70
|
+
expect(generated_expression.parameter_names).to eq(expected_argument_names)
|
71
|
+
expect(generated_expression.source).to eq(expected_expression)
|
75
72
|
end
|
76
73
|
end
|
77
74
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
require 'cucumber/cucumber_expressions/cucumber_expression'
|
2
|
-
require 'cucumber/cucumber_expressions/
|
2
|
+
require 'cucumber/cucumber_expressions/parameter_registry'
|
3
3
|
|
4
4
|
module Cucumber
|
5
5
|
module CucumberExpressions
|
6
6
|
describe CucumberExpression do
|
7
7
|
context "Regexp translation" do
|
8
8
|
def assert_regexp(expression, regexp)
|
9
|
-
cucumber_expression = CucumberExpression.new(expression, [],
|
9
|
+
cucumber_expression = CucumberExpression.new(expression, [], ParameterRegistry.new)
|
10
10
|
expect(regexp).to eq(cucumber_expression.instance_variable_get('@regexp'))
|
11
11
|
end
|
12
12
|
|
@@ -26,7 +26,7 @@ module Cucumber
|
|
26
26
|
|
27
27
|
it "translates three typed arguments" do
|
28
28
|
assert_regexp(
|
29
|
-
"I have {
|
29
|
+
"I have {float} cukes in my {bodypart} at {int} o'clock",
|
30
30
|
/^I have (-?\d*\.?\d+) cukes in my (.+) at ((?:-?\d+)|(?:\d+)) o'clock$/
|
31
31
|
)
|
32
32
|
end
|
@@ -1,28 +1,28 @@
|
|
1
1
|
require 'cucumber/cucumber_expressions/cucumber_expression'
|
2
|
-
require 'cucumber/cucumber_expressions/
|
2
|
+
require 'cucumber/cucumber_expressions/parameter_registry'
|
3
3
|
|
4
4
|
module Cucumber
|
5
5
|
module CucumberExpressions
|
6
6
|
describe CucumberExpression do
|
7
7
|
it "documents match arguments" do
|
8
|
-
|
8
|
+
parameter_registry = ParameterRegistry.new
|
9
9
|
|
10
10
|
### [capture-match-arguments]
|
11
11
|
expr = "I have {n} cuke(s) in my {bodypart} now"
|
12
12
|
types = ['int', nil]
|
13
|
-
expression = CucumberExpression.new(expr, types,
|
13
|
+
expression = CucumberExpression.new(expr, types, parameter_registry)
|
14
14
|
args = expression.match("I have 7 cukes in my belly now")
|
15
15
|
expect( args[0].transformed_value ).to eq(7)
|
16
16
|
expect( args[1].transformed_value ).to eq("belly")
|
17
17
|
### [capture-match-arguments]
|
18
18
|
end
|
19
19
|
|
20
|
-
it "
|
20
|
+
it "does no transform by default" do
|
21
21
|
expect( match("{what}", "22") ).to eq(["22"])
|
22
22
|
end
|
23
23
|
|
24
|
-
it "transforms to int by
|
25
|
-
expect( match("{
|
24
|
+
it "transforms to int by parameter type" do
|
25
|
+
expect( match("{int}", "22") ).to eq([22])
|
26
26
|
end
|
27
27
|
|
28
28
|
it "transforms to int by explicit type" do
|
@@ -30,17 +30,17 @@ module Cucumber
|
|
30
30
|
end
|
31
31
|
|
32
32
|
# Ruby-specific
|
33
|
-
it "
|
33
|
+
it "parameters to Integer by explicit type" do
|
34
34
|
expect( match("{what}", "22", [Integer]) ).to eq([22])
|
35
35
|
end
|
36
36
|
|
37
|
-
it "doesn't match a float
|
38
|
-
expect( match("{
|
37
|
+
it "doesn't match a float with an int parameter" do
|
38
|
+
expect( match("{int}", "1.22") ).to be_nil
|
39
39
|
end
|
40
40
|
|
41
|
-
it "transforms to float by
|
42
|
-
expect( match("{
|
43
|
-
expect( match("{
|
41
|
+
it "transforms to float by parameter type" do
|
42
|
+
expect( match("{float}", "0.22") ).to eq([0.22])
|
43
|
+
expect( match("{float}", ".22") ).to eq([0.22])
|
44
44
|
end
|
45
45
|
|
46
46
|
it "transforms to float by explicit type" do
|
@@ -48,26 +48,41 @@ module Cucumber
|
|
48
48
|
expect( match("{what}", ".22", ['float']) ).to eq([0.22])
|
49
49
|
end
|
50
50
|
|
51
|
-
it "
|
52
|
-
expect
|
53
|
-
|
51
|
+
it "leaves unknown type untransformed" do
|
52
|
+
expect( match("{unknown}", "something") ).to eq(["something"])
|
53
|
+
end
|
54
|
+
|
55
|
+
it "supports deprecated {name:type} syntax for now" do
|
56
|
+
expect( match("{param:unknown}", "something") ).to eq(["something"])
|
54
57
|
end
|
55
58
|
|
56
59
|
it "exposes source" do
|
57
|
-
expr = "I have {
|
58
|
-
expect(CucumberExpression.new(expr, [],
|
60
|
+
expr = "I have {int} cuke(s) in my {bodypart} now"
|
61
|
+
expect(CucumberExpression.new(expr, [], ParameterRegistry.new).source).to eq(expr)
|
59
62
|
end
|
60
63
|
|
61
64
|
it "exposes offset and value" do
|
62
|
-
expr = "I have {
|
63
|
-
expression = CucumberExpression.new(expr, [],
|
65
|
+
expr = "I have {int} cuke(s) in my {bodypart} now"
|
66
|
+
expression = CucumberExpression.new(expr, [], ParameterRegistry.new)
|
64
67
|
arg1 = expression.match("I have 800 cukes in my brain now")[0]
|
65
68
|
expect(arg1.offset).to eq(7)
|
66
69
|
expect(arg1.value).to eq("800")
|
67
70
|
end
|
68
71
|
|
72
|
+
describe "RegExp special characters" do
|
73
|
+
%w(\\ [ ] ^ $ . | ? * +).each do |character|
|
74
|
+
it "escapes #{character}" do
|
75
|
+
expr = "I have {int} cuke(s) and #{character}"
|
76
|
+
expression = CucumberExpression.new(expr, [], ParameterRegistry.new)
|
77
|
+
arg1 = expression.match("I have 800 cukes and #{character}")[0]
|
78
|
+
expect(arg1.offset).to eq(7)
|
79
|
+
expect(arg1.value).to eq("800")
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
69
84
|
def match(expression, text, types = [])
|
70
|
-
cucumber_expression = CucumberExpression.new(expression, types,
|
85
|
+
cucumber_expression = CucumberExpression.new(expression, types, ParameterRegistry.new)
|
71
86
|
args = cucumber_expression.match(text)
|
72
87
|
return nil if args.nil?
|
73
88
|
args.map { |arg| arg.transformed_value }
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'cucumber/cucumber_expressions/cucumber_expression'
|
2
|
+
require 'cucumber/cucumber_expressions/regular_expression'
|
3
|
+
require 'cucumber/cucumber_expressions/parameter_registry'
|
4
|
+
|
5
|
+
module Cucumber
|
6
|
+
module CucumberExpressions
|
7
|
+
class Color
|
8
|
+
attr_reader :name
|
9
|
+
|
10
|
+
### [color-constructor]
|
11
|
+
def initialize(name)
|
12
|
+
@name = name
|
13
|
+
end
|
14
|
+
### [color-constructor]
|
15
|
+
|
16
|
+
def ==(other)
|
17
|
+
other.is_a?(Color) && other.name == name
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "Custom parameter" do
|
22
|
+
before do
|
23
|
+
@parameter_registry = ParameterRegistry.new
|
24
|
+
### [add-color-parameter]
|
25
|
+
@parameter_registry.add_parameter(Parameter.new(
|
26
|
+
'color',
|
27
|
+
Color,
|
28
|
+
[/red|blue|yellow/, /(?:dark|light) (?:red|blue|yellow)/],
|
29
|
+
lambda { |s| Color.new(s) }
|
30
|
+
))
|
31
|
+
### [add-color-parameter]
|
32
|
+
end
|
33
|
+
|
34
|
+
describe CucumberExpression do
|
35
|
+
it "matches typed parameters" do
|
36
|
+
expression = CucumberExpression.new("I have a {color} ball", [], @parameter_registry)
|
37
|
+
parametered_argument_value = expression.match("I have a red ball")[0].transformed_value
|
38
|
+
expect( parametered_argument_value ).to eq(Color.new('red'))
|
39
|
+
end
|
40
|
+
|
41
|
+
it "matches typed parameters with optional group" do
|
42
|
+
expression = CucumberExpression.new("I have a {color} ball", [], @parameter_registry)
|
43
|
+
parametered_argument_value = expression.match("I have a dark red ball")[0].transformed_value
|
44
|
+
expect( parametered_argument_value ).to eq(Color.new('dark red'))
|
45
|
+
end
|
46
|
+
|
47
|
+
it "matches untyped parameters with explicit type" do
|
48
|
+
expression = CucumberExpression.new("I have a {color} ball", [Color], @parameter_registry)
|
49
|
+
parametered_argument_value = expression.match("I have a red ball")[0].transformed_value
|
50
|
+
expect( parametered_argument_value ).to eq(Color.new('red'))
|
51
|
+
end
|
52
|
+
|
53
|
+
it "matches untyped parameters with same name as type" do
|
54
|
+
expression = CucumberExpression.new("I have a {color} ball", [], @parameter_registry)
|
55
|
+
parametered_argument_value = expression.match("I have a red ball")[0].transformed_value
|
56
|
+
expect( parametered_argument_value ).to eq(Color.new('red'))
|
57
|
+
end
|
58
|
+
|
59
|
+
it "matches parameters with explicit type that isn't registered" do
|
60
|
+
expression = CucumberExpression.new("I have a {color} ball", [Color], ParameterRegistry.new)
|
61
|
+
parametered_argument_value = expression.match("I have a red ball")[0].transformed_value
|
62
|
+
expect( parametered_argument_value ).to eq(Color.new('red'))
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe RegularExpression do
|
67
|
+
it "matches parameters with explicit constructor" do
|
68
|
+
expression = RegularExpression.new(/I have a (red|blue|yellow) ball/, [Color], @parameter_registry)
|
69
|
+
parametered_argument_value = expression.match("I have a red ball")[0].transformed_value
|
70
|
+
expect( parametered_argument_value ).to eq(Color.new('red'))
|
71
|
+
end
|
72
|
+
|
73
|
+
it "matches parameters without explicit constructor" do
|
74
|
+
expression = RegularExpression.new(/I have a (red|blue|yellow) ball/, [], @parameter_registry)
|
75
|
+
parametered_argument_value = expression.match("I have a red ball")[0].transformed_value
|
76
|
+
expect( parametered_argument_value ).to eq(Color.new('red'))
|
77
|
+
end
|
78
|
+
|
79
|
+
it "matches parameters with explicit type that isn't registered" do
|
80
|
+
expression = RegularExpression.new(/I have a (red|blue|yellow) ball/, [Color], ParameterRegistry.new)
|
81
|
+
parametered_argument_value = expression.match("I have a red ball")[0].transformed_value
|
82
|
+
expect( parametered_argument_value ).to eq(Color.new('red'))
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'cucumber/cucumber_expressions/cucumber_expression'
|
2
2
|
require 'cucumber/cucumber_expressions/regular_expression'
|
3
|
-
require 'cucumber/cucumber_expressions/
|
3
|
+
require 'cucumber/cucumber_expressions/parameter_registry'
|
4
4
|
require 'json'
|
5
5
|
|
6
6
|
module Cucumber
|
@@ -8,8 +8,8 @@ module Cucumber
|
|
8
8
|
describe 'examples.txt' do
|
9
9
|
def match(expression_text, text)
|
10
10
|
expression = expression_text =~ /\/(.*)\// ?
|
11
|
-
RegularExpression.new(Regexp.new($1), [],
|
12
|
-
CucumberExpression.new(expression_text, [],
|
11
|
+
RegularExpression.new(Regexp.new($1), [], ParameterRegistry.new) :
|
12
|
+
CucumberExpression.new(expression_text, [], ParameterRegistry.new)
|
13
13
|
|
14
14
|
arguments = expression.match(text)
|
15
15
|
return nil if arguments.nil?
|
@@ -1,47 +1,47 @@
|
|
1
1
|
require 'cucumber/cucumber_expressions/regular_expression'
|
2
|
-
require 'cucumber/cucumber_expressions/
|
2
|
+
require 'cucumber/cucumber_expressions/parameter_registry'
|
3
3
|
|
4
4
|
module Cucumber
|
5
5
|
module CucumberExpressions
|
6
6
|
describe RegularExpression do
|
7
7
|
it "documents match arguments" do
|
8
|
-
|
8
|
+
parameter_registry = ParameterRegistry.new
|
9
9
|
|
10
10
|
### [capture-match-arguments]
|
11
11
|
expr = /I have (\d+) cukes? in my (\w*) now/
|
12
12
|
types = ['int', nil]
|
13
|
-
expression = RegularExpression.new(expr, types,
|
13
|
+
expression = RegularExpression.new(expr, types, parameter_registry)
|
14
14
|
args = expression.match("I have 7 cukes in my belly now")
|
15
15
|
expect( args[0].transformed_value ).to eq(7)
|
16
16
|
expect( args[1].transformed_value ).to eq("belly")
|
17
17
|
### [capture-match-arguments]
|
18
18
|
end
|
19
19
|
|
20
|
-
it "
|
20
|
+
it "does no transform by default" do
|
21
21
|
expect( match(/(\d\d)/, "22") ).to eq(["22"])
|
22
22
|
end
|
23
23
|
|
24
|
-
it "transforms
|
24
|
+
it "transforms int to float by explicit type name" do
|
25
25
|
expect( match(/(.*)/, "22", ['float']) ).to eq([22.0])
|
26
26
|
end
|
27
27
|
|
28
|
-
it "transforms
|
28
|
+
it "transforms int to float by explicit function" do
|
29
29
|
expect( match(/(.*)/, "22", [Float]) ).to eq([22.0])
|
30
30
|
end
|
31
31
|
|
32
|
-
it "transforms
|
32
|
+
it "transforms int by parameter pattern" do
|
33
33
|
expect( match(/(-?\d+)/, "22") ).to eq([22])
|
34
34
|
end
|
35
35
|
|
36
|
-
it "transforms
|
36
|
+
it "transforms int by alternate parameter pattern" do
|
37
37
|
expect( match(/(\d+)/, "22") ).to eq([22])
|
38
38
|
end
|
39
39
|
|
40
|
-
it "transforms
|
40
|
+
it "transforms float without integer part" do
|
41
41
|
expect( match(/(.*)/, ".22", ['float']) ).to eq([0.22])
|
42
42
|
end
|
43
43
|
|
44
|
-
it "transforms
|
44
|
+
it "transforms float with sign" do
|
45
45
|
expect( match(/(.*)/, "-1.22", ['float']) ).to eq([-1.22])
|
46
46
|
end
|
47
47
|
|
@@ -57,11 +57,11 @@ module Cucumber
|
|
57
57
|
|
58
58
|
it "exposes source" do
|
59
59
|
expr = /I have (\d+) cukes? in my (\+) now/
|
60
|
-
expect(RegularExpression.new(expr, [],
|
60
|
+
expect(RegularExpression.new(expr, [], ParameterRegistry.new).source).to eq(expr)
|
61
61
|
end
|
62
62
|
|
63
63
|
def match(expression, text, types = [])
|
64
|
-
regular_expression = RegularExpression.new(expression, types,
|
64
|
+
regular_expression = RegularExpression.new(expression, types, ParameterRegistry.new)
|
65
65
|
arguments = regular_expression.match(text)
|
66
66
|
return nil if arguments.nil?
|
67
67
|
arguments.map { |arg| arg.transformed_value }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cucumber-expressions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aslak Hellesøy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-02-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -82,20 +82,20 @@ files:
|
|
82
82
|
- cucumber-expressions.gemspec
|
83
83
|
- examples.txt
|
84
84
|
- lib/cucumber/cucumber_expressions/argument.rb
|
85
|
-
- lib/cucumber/cucumber_expressions/
|
85
|
+
- lib/cucumber/cucumber_expressions/argument_builder.rb
|
86
86
|
- lib/cucumber/cucumber_expressions/cucumber_expression.rb
|
87
87
|
- lib/cucumber/cucumber_expressions/cucumber_expression_generator.rb
|
88
88
|
- lib/cucumber/cucumber_expressions/generated_expression.rb
|
89
|
+
- lib/cucumber/cucumber_expressions/parameter.rb
|
90
|
+
- lib/cucumber/cucumber_expressions/parameter_matcher.rb
|
91
|
+
- lib/cucumber/cucumber_expressions/parameter_registry.rb
|
89
92
|
- lib/cucumber/cucumber_expressions/regular_expression.rb
|
90
|
-
- lib/cucumber/cucumber_expressions/transform.rb
|
91
|
-
- lib/cucumber/cucumber_expressions/transform_lookup.rb
|
92
|
-
- lib/cucumber/cucumber_expressions/transform_matcher.rb
|
93
93
|
- spec/capture_warnings.rb
|
94
94
|
- spec/coverage.rb
|
95
95
|
- spec/cucumber/cucumber_expressions/cucumber_expression_generator_spec.rb
|
96
96
|
- spec/cucumber/cucumber_expressions/cucumber_expression_regexp_spec.rb
|
97
97
|
- spec/cucumber/cucumber_expressions/cucumber_expression_spec.rb
|
98
|
-
- spec/cucumber/cucumber_expressions/
|
98
|
+
- spec/cucumber/cucumber_expressions/custom_parameter_spec.rb
|
99
99
|
- spec/cucumber/cucumber_expressions/expression_examples_spec.rb
|
100
100
|
- spec/cucumber/cucumber_expressions/regular_expression_spec.rb
|
101
101
|
homepage: https://github.com/cucumber/cucumber-expressions-ruby#readme
|
@@ -119,16 +119,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
119
119
|
version: '0'
|
120
120
|
requirements: []
|
121
121
|
rubyforge_project:
|
122
|
-
rubygems_version: 2.
|
122
|
+
rubygems_version: 2.5.2
|
123
123
|
signing_key:
|
124
124
|
specification_version: 4
|
125
|
-
summary: cucumber-expressions-
|
125
|
+
summary: cucumber-expressions-2.0.0
|
126
126
|
test_files:
|
127
127
|
- spec/capture_warnings.rb
|
128
128
|
- spec/coverage.rb
|
129
129
|
- spec/cucumber/cucumber_expressions/cucumber_expression_generator_spec.rb
|
130
130
|
- spec/cucumber/cucumber_expressions/cucumber_expression_regexp_spec.rb
|
131
131
|
- spec/cucumber/cucumber_expressions/cucumber_expression_spec.rb
|
132
|
-
- spec/cucumber/cucumber_expressions/
|
132
|
+
- spec/cucumber/cucumber_expressions/custom_parameter_spec.rb
|
133
133
|
- spec/cucumber/cucumber_expressions/expression_examples_spec.rb
|
134
134
|
- spec/cucumber/cucumber_expressions/regular_expression_spec.rb
|
@@ -1,70 +0,0 @@
|
|
1
|
-
require 'cucumber/cucumber_expressions/transform'
|
2
|
-
|
3
|
-
module Cucumber
|
4
|
-
module CucumberExpressions
|
5
|
-
class TransformLookup
|
6
|
-
INTEGER_REGEXPS = ['-?\d+', '\d+']
|
7
|
-
FLOATING_POINT_REGEXPS = ['-?\d*\.?\d+']
|
8
|
-
|
9
|
-
def initialize
|
10
|
-
@transforms_by_type_name = {}
|
11
|
-
@transforms_by_capture_group_regexp = {}
|
12
|
-
@transforms_by_class = {}
|
13
|
-
|
14
|
-
add_transform(Transform.new('int', Integer, INTEGER_REGEXPS, lambda {|s| s.to_i}))
|
15
|
-
add_transform(Transform.new('float', Float, FLOATING_POINT_REGEXPS, lambda {|s| s.to_f}))
|
16
|
-
end
|
17
|
-
|
18
|
-
def lookup_by_type(type)
|
19
|
-
if type.is_a?(Class)
|
20
|
-
lookup_by_class(type)
|
21
|
-
elsif type.is_a?(String)
|
22
|
-
lookup_by_type_name(type, false)
|
23
|
-
else
|
24
|
-
raise Exception.new("Type must be string or class, but was #{type} of type #{type.class}")
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def lookup_by_class(clazz)
|
29
|
-
transform = @transforms_by_class[clazz]
|
30
|
-
if transform.nil?
|
31
|
-
create_anonymous_lookup(lambda {|s| clazz.new(s)})
|
32
|
-
else
|
33
|
-
transform
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def lookup_by_type_name(type_name, ignore_unknown_type_name)
|
38
|
-
transform = @transforms_by_type_name[type_name]
|
39
|
-
if transform.nil?
|
40
|
-
return nil if ignore_unknown_type_name
|
41
|
-
raise Exception.new("No transform for type name \"#{type_name}\"")
|
42
|
-
else
|
43
|
-
transform
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def lookup_by_capture_group_regexp(capture_group_regexp)
|
48
|
-
@transforms_by_capture_group_regexp[capture_group_regexp]
|
49
|
-
end
|
50
|
-
|
51
|
-
def create_anonymous_lookup(proc)
|
52
|
-
Transform.new(nil, nil, ['.+'], proc)
|
53
|
-
end
|
54
|
-
|
55
|
-
def add_transform(transform)
|
56
|
-
@transforms_by_type_name[transform.type_name] = transform
|
57
|
-
@transforms_by_class[transform.type] = transform
|
58
|
-
|
59
|
-
transform.capture_group_regexps.each do |capture_group_regexp|
|
60
|
-
@transforms_by_capture_group_regexp[capture_group_regexp] = transform
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def transforms
|
65
|
-
@transforms_by_type_name.values
|
66
|
-
end
|
67
|
-
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
@@ -1,87 +0,0 @@
|
|
1
|
-
require 'cucumber/cucumber_expressions/cucumber_expression'
|
2
|
-
require 'cucumber/cucumber_expressions/regular_expression'
|
3
|
-
require 'cucumber/cucumber_expressions/transform_lookup'
|
4
|
-
|
5
|
-
module Cucumber
|
6
|
-
module CucumberExpressions
|
7
|
-
class Color
|
8
|
-
attr_reader :name
|
9
|
-
|
10
|
-
### [color-constructor]
|
11
|
-
def initialize(name)
|
12
|
-
@name = name
|
13
|
-
end
|
14
|
-
### [color-constructor]
|
15
|
-
|
16
|
-
def ==(other)
|
17
|
-
other.is_a?(Color) && other.name == name
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
describe "Custom transform" do
|
22
|
-
before do
|
23
|
-
@transform_lookup = TransformLookup.new
|
24
|
-
### [add-color-transform]
|
25
|
-
@transform_lookup.add_transform(Transform.new(
|
26
|
-
'color',
|
27
|
-
Color,
|
28
|
-
['red|blue|yellow', '(?:dark|light) (?:red|blue|yellow)'],
|
29
|
-
lambda { |s| Color.new(s) }
|
30
|
-
))
|
31
|
-
### [add-color-transform]
|
32
|
-
end
|
33
|
-
|
34
|
-
describe CucumberExpression do
|
35
|
-
it "transforms arguments with expression type I" do
|
36
|
-
expression = CucumberExpression.new("I have a {color:color} ball", [], @transform_lookup)
|
37
|
-
transformed_argument_value = expression.match("I have a red ball")[0].transformed_value
|
38
|
-
expect( transformed_argument_value ).to eq(Color.new('red'))
|
39
|
-
end
|
40
|
-
|
41
|
-
it "transforms arguments with expression type II" do
|
42
|
-
expression = CucumberExpression.new("I have a {color:color} ball", [], @transform_lookup)
|
43
|
-
transformed_argument_value = expression.match("I have a dark red ball")[0].transformed_value
|
44
|
-
expect( transformed_argument_value ).to eq(Color.new('dark red'))
|
45
|
-
end
|
46
|
-
|
47
|
-
it "transforms arguments with explicit type" do
|
48
|
-
expression = CucumberExpression.new("I have a {color} ball", [Color], @transform_lookup)
|
49
|
-
transformed_argument_value = expression.match("I have a red ball")[0].transformed_value
|
50
|
-
expect( transformed_argument_value ).to eq(Color.new('red'))
|
51
|
-
end
|
52
|
-
|
53
|
-
it "transforms arguments using argument name as type" do
|
54
|
-
expression = CucumberExpression.new("I have a {color} ball", [], @transform_lookup)
|
55
|
-
transformed_argument_value = expression.match("I have a red ball")[0].transformed_value
|
56
|
-
expect( transformed_argument_value ).to eq(Color.new('red'))
|
57
|
-
end
|
58
|
-
|
59
|
-
it "transforms arguments with explicit type using constructor directly" do
|
60
|
-
expression = CucumberExpression.new("I have a {color} ball", [Color], TransformLookup.new)
|
61
|
-
transformed_argument_value = expression.match("I have a red ball")[0].transformed_value
|
62
|
-
expect( transformed_argument_value ).to eq(Color.new('red'))
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
describe RegularExpression do
|
67
|
-
it "transforms arguments with expression type" do
|
68
|
-
expression = RegularExpression.new(/I have a (red|blue|yellow) ball/, [], @transform_lookup)
|
69
|
-
transformed_argument_value = expression.match("I have a red ball")[0].transformed_value
|
70
|
-
expect( transformed_argument_value ).to eq(Color.new('red'))
|
71
|
-
end
|
72
|
-
|
73
|
-
it "transforms arguments with explicit type" do
|
74
|
-
expression = RegularExpression.new(/I have a (red|blue|yellow) ball/, ['color'], @transform_lookup)
|
75
|
-
transformed_argument_value = expression.match("I have a red ball")[0].transformed_value
|
76
|
-
expect( transformed_argument_value ).to eq(Color.new('red'))
|
77
|
-
end
|
78
|
-
|
79
|
-
it "transforms arguments with explicit type using constructor directly" do
|
80
|
-
expression = RegularExpression.new(/I have a (red|blue|yellow) ball/, [Color], TransformLookup.new)
|
81
|
-
transformed_argument_value = expression.match("I have a red ball")[0].transformed_value
|
82
|
-
expect( transformed_argument_value ).to eq(Color.new('red'))
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|