cucumber-expressions 2.0.1 → 3.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/lib/cucumber/cucumber_expressions/argument.rb +3 -3
- data/lib/cucumber/cucumber_expressions/argument_builder.rb +3 -3
- data/lib/cucumber/cucumber_expressions/cucumber_expression.rb +30 -26
- data/lib/cucumber/cucumber_expressions/cucumber_expression_generator.rb +32 -32
- data/lib/cucumber/cucumber_expressions/generated_expression.rb +3 -3
- data/lib/cucumber/cucumber_expressions/parameter_type.rb +29 -0
- data/lib/cucumber/cucumber_expressions/{parameter_matcher.rb → parameter_type_matcher.rb} +1 -1
- data/lib/cucumber/cucumber_expressions/parameter_type_registry.rb +82 -0
- data/lib/cucumber/cucumber_expressions/regular_expression.rb +10 -10
- data/spec/cucumber/cucumber_expressions/cucumber_expression_generator_spec.rb +8 -8
- data/spec/cucumber/cucumber_expressions/cucumber_expression_regexp_spec.rb +9 -2
- data/spec/cucumber/cucumber_expressions/cucumber_expression_spec.rb +6 -6
- data/spec/cucumber/cucumber_expressions/custom_parameter_type_spec.rb +164 -0
- data/spec/cucumber/cucumber_expressions/expression_examples_spec.rb +3 -3
- data/spec/cucumber/cucumber_expressions/regular_expression_spec.rb +5 -5
- metadata +8 -8
- data/lib/cucumber/cucumber_expressions/parameter.rb +0 -29
- data/lib/cucumber/cucumber_expressions/parameter_registry.rb +0 -64
- data/spec/cucumber/cucumber_expressions/custom_parameter_spec.rb +0 -100
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8ec8564fdc53d2078266f3cfb82f7eb8db6e8957
|
4
|
+
data.tar.gz: 2bb4c9234813e74029bd93c6448ff41ae1a85abb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3c592d0e6e4fad991e45fd27e1f54c466f418f204ba2f65f304c9f9400d9c5289b9472712e19a71637a71fedc762ccea4ef4bf3e00a7600d68dba2c02992dc4
|
7
|
+
data.tar.gz: 26195cf45a0624e6920e44fb1a6c99e05300603ec053be5cb13f99df70d55e48a98ecdfda78fb085cbeadaddc394ddceb2149bb244399d1bfde199ad498550d0
|
@@ -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 = '3.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}"
|
@@ -3,12 +3,12 @@ module Cucumber
|
|
3
3
|
class Argument
|
4
4
|
attr_reader :offset, :value
|
5
5
|
|
6
|
-
def initialize(offset, value,
|
7
|
-
@offset, @value, @
|
6
|
+
def initialize(offset, value, parameter_type)
|
7
|
+
@offset, @value, @parameter_type = offset, value, parameter_type
|
8
8
|
end
|
9
9
|
|
10
10
|
def transformed_value
|
11
|
-
@
|
11
|
+
@parameter_type.transform(@value)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
@@ -3,13 +3,13 @@ require 'cucumber/cucumber_expressions/argument'
|
|
3
3
|
module Cucumber
|
4
4
|
module CucumberExpressions
|
5
5
|
class ArgumentBuilder
|
6
|
-
def self.build_arguments(regexp, text,
|
6
|
+
def self.build_arguments(regexp, text, parameter_types)
|
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
|
-
Argument.new(m.offset(index)[0], value,
|
11
|
+
parameter_type = parameter_types[index-1]
|
12
|
+
Argument.new(m.offset(index)[0], value, parameter_type)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
@@ -1,58 +1,62 @@
|
|
1
1
|
require 'cucumber/cucumber_expressions/argument_builder'
|
2
|
-
require 'cucumber/cucumber_expressions/
|
2
|
+
require 'cucumber/cucumber_expressions/parameter_type'
|
3
3
|
|
4
4
|
module Cucumber
|
5
5
|
module CucumberExpressions
|
6
6
|
class CucumberExpression
|
7
|
-
|
8
|
-
|
7
|
+
PARAMETER_REGEXP = /\{([^}:]+)(:([^}]+))?}/
|
8
|
+
OPTIONAL_REGEXP = /\(([^)]+)\)/
|
9
|
+
ALTERNATIVE_WORD_REGEXP = /([[:alpha:]]+)((\/[[:alpha:]]+)+)/
|
9
10
|
|
10
11
|
attr_reader :source
|
11
12
|
|
12
|
-
def initialize(expression, types,
|
13
|
+
def initialize(expression, types, parameter_type_registry)
|
13
14
|
@source = expression
|
14
|
-
@
|
15
|
+
@parameter_types = []
|
15
16
|
regexp = "^"
|
16
17
|
type_index = 0
|
17
|
-
match = nil
|
18
18
|
match_offset = 0
|
19
19
|
|
20
|
-
# Does not include (){} because they have special meaning
|
20
|
+
# Escape Does not include (){} because they have special meaning
|
21
21
|
expression = expression.gsub(/([\\\^\[$.|?*+\]])/, '\\\\\1')
|
22
22
|
|
23
23
|
# Create non-capturing, optional capture groups from parenthesis
|
24
|
-
expression = expression.gsub(
|
24
|
+
expression = expression.gsub(OPTIONAL_REGEXP, '(?:\1)?')
|
25
|
+
|
26
|
+
expression = expression.gsub(ALTERNATIVE_WORD_REGEXP) do |_|
|
27
|
+
"(?:#{$1}#{$2.tr('/', '|')})"
|
28
|
+
end
|
25
29
|
|
26
30
|
loop do
|
27
|
-
match =
|
31
|
+
match = PARAMETER_REGEXP.match(expression, match_offset)
|
28
32
|
break if match.nil?
|
29
33
|
|
30
34
|
parameter_name = match[1]
|
31
|
-
|
32
|
-
if
|
33
|
-
$stderr.puts("Cucumber expression parameter syntax {#{parameter_name}:#{
|
35
|
+
parameter_type_name = match[3]
|
36
|
+
if parameter_type_name
|
37
|
+
$stderr.puts("Cucumber expression parameter syntax {#{parameter_name}:#{parameter_type_name}} is deprecated. Please use {#{parameter_type_name}} instead.")
|
34
38
|
end
|
35
39
|
|
36
40
|
type = types.length <= type_index ? nil : types[type_index]
|
37
41
|
type_index += 1
|
38
42
|
|
39
|
-
|
43
|
+
parameter_type = nil
|
40
44
|
if type
|
41
|
-
|
45
|
+
parameter_type = parameter_type_registry.lookup_by_type(type)
|
42
46
|
end
|
43
|
-
if
|
44
|
-
|
47
|
+
if parameter_type.nil? && parameter_type_name
|
48
|
+
parameter_type = parameter_type_registry.lookup_by_name(parameter_type_name)
|
45
49
|
end
|
46
|
-
if
|
47
|
-
|
50
|
+
if parameter_type.nil?
|
51
|
+
parameter_type = parameter_type_registry.lookup_by_name(parameter_name)
|
48
52
|
end
|
49
|
-
if
|
50
|
-
|
53
|
+
if parameter_type.nil?
|
54
|
+
parameter_type = parameter_type_registry.create_anonymous_lookup(lambda {|s| s})
|
51
55
|
end
|
52
|
-
@
|
56
|
+
@parameter_types.push(parameter_type)
|
53
57
|
|
54
58
|
text = expression.slice(match_offset...match.offset(0)[0])
|
55
|
-
capture_regexp =
|
59
|
+
capture_regexp = regexp(parameter_type.regexps)
|
56
60
|
match_offset = match.offset(0)[1]
|
57
61
|
regexp += text
|
58
62
|
regexp += capture_regexp
|
@@ -63,14 +67,14 @@ module Cucumber
|
|
63
67
|
end
|
64
68
|
|
65
69
|
def match(text)
|
66
|
-
ArgumentBuilder.build_arguments(@regexp, text, @
|
70
|
+
ArgumentBuilder.build_arguments(@regexp, text, @parameter_types)
|
67
71
|
end
|
68
72
|
|
69
73
|
private
|
70
74
|
|
71
|
-
def
|
72
|
-
return "(#{
|
73
|
-
capture_groups =
|
75
|
+
def regexp(regexps)
|
76
|
+
return "(#{regexps[0]})" if regexps.size == 1
|
77
|
+
capture_groups = regexps.map { |group| "(?:#{group})" }
|
74
78
|
"(#{capture_groups.join('|')})"
|
75
79
|
end
|
76
80
|
end
|
@@ -1,44 +1,44 @@
|
|
1
|
-
require 'cucumber/cucumber_expressions/
|
1
|
+
require 'cucumber/cucumber_expressions/parameter_type_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_type_registry)
|
8
|
+
@parameter_type_registry = parameter_type_registry
|
9
9
|
end
|
10
10
|
|
11
11
|
def generate_expression(text)
|
12
12
|
parameter_names = []
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
parameter_type_matchers = create_parameter_type_matchers(text)
|
14
|
+
parameter_types = []
|
15
|
+
usage_by_name = Hash.new(0)
|
16
16
|
|
17
17
|
expression = ""
|
18
18
|
pos = 0
|
19
19
|
|
20
20
|
loop do
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
if
|
25
|
-
|
21
|
+
matching_parameter_type_matchers = []
|
22
|
+
parameter_type_matchers.each do |parameter_type_matcher|
|
23
|
+
advanced_parameter_type_matcher = parameter_type_matcher.advance_to(pos)
|
24
|
+
if advanced_parameter_type_matcher.find
|
25
|
+
matching_parameter_type_matchers.push(advanced_parameter_type_matcher)
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
if
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
29
|
+
if matching_parameter_type_matchers.any?
|
30
|
+
matching_parameter_type_matchers = matching_parameter_type_matchers.sort
|
31
|
+
best_parameter_type_matcher = matching_parameter_type_matchers[0]
|
32
|
+
parameter_type = best_parameter_type_matcher.parameter
|
33
|
+
parameter_types.push(parameter_type)
|
34
34
|
|
35
|
-
parameter_name = get_parameter_name(
|
35
|
+
parameter_name = get_parameter_name(parameter_type.name, usage_by_name)
|
36
36
|
parameter_names.push(parameter_name)
|
37
37
|
|
38
|
-
expression += text.slice(pos...
|
39
|
-
expression += "{#{
|
38
|
+
expression += text.slice(pos...best_parameter_type_matcher.start)
|
39
|
+
expression += "{#{parameter_type.name}}"
|
40
40
|
|
41
|
-
pos =
|
41
|
+
pos = best_parameter_type_matcher.start + best_parameter_type_matcher.group.length
|
42
42
|
else
|
43
43
|
break
|
44
44
|
end
|
@@ -49,30 +49,30 @@ module Cucumber
|
|
49
49
|
end
|
50
50
|
|
51
51
|
expression += text.slice(pos..-1)
|
52
|
-
GeneratedExpression.new(expression, parameter_names,
|
52
|
+
GeneratedExpression.new(expression, parameter_names, parameter_types)
|
53
53
|
end
|
54
54
|
|
55
55
|
private
|
56
56
|
|
57
|
-
def get_parameter_name(
|
58
|
-
count = (
|
59
|
-
count == 1 ?
|
57
|
+
def get_parameter_name(name, usage_by_name)
|
58
|
+
count = (usage_by_name[name] += 1)
|
59
|
+
count == 1 ? name : "#{name}#{count}"
|
60
60
|
end
|
61
61
|
|
62
|
-
def
|
62
|
+
def create_parameter_type_matchers(text)
|
63
63
|
parameter_matchers = []
|
64
|
-
@
|
65
|
-
parameter_matchers +=
|
64
|
+
@parameter_type_registry.parameter_types.each do |parameter_type|
|
65
|
+
parameter_matchers += create_parameter_type_matchers2(parameter_type, text)
|
66
66
|
end
|
67
67
|
parameter_matchers
|
68
68
|
end
|
69
69
|
|
70
|
-
def
|
70
|
+
def create_parameter_type_matchers2(parameter_type, text)
|
71
71
|
result = []
|
72
|
-
|
73
|
-
|
74
|
-
regexp = Regexp.new("(#{
|
75
|
-
result.push(
|
72
|
+
regexps = parameter_type.regexps
|
73
|
+
regexps.each do |regexp|
|
74
|
+
regexp = Regexp.new("(#{regexp})")
|
75
|
+
result.push(ParameterTypeMatcher.new(parameter_type, regexp, text))
|
76
76
|
end
|
77
77
|
result
|
78
78
|
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module Cucumber
|
2
2
|
module CucumberExpressions
|
3
3
|
class GeneratedExpression
|
4
|
-
attr_reader :source, :parameter_names, :
|
4
|
+
attr_reader :source, :parameter_names, :parameter_types
|
5
5
|
|
6
|
-
def initialize(source, parameter_names,
|
7
|
-
@source, @parameter_names, @
|
6
|
+
def initialize(source, parameter_names, parameters_types)
|
7
|
+
@source, @parameter_names, @parameter_types = source, parameter_names, parameters_types
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Cucumber
|
2
|
+
module CucumberExpressions
|
3
|
+
class ParameterType
|
4
|
+
attr_reader :name, :type, :regexps
|
5
|
+
|
6
|
+
# Create a new Parameter
|
7
|
+
#
|
8
|
+
# @param name the name of the parameter type
|
9
|
+
# @param regexps [Array] list of regexps for capture groups. A single regexp can also be used.
|
10
|
+
# @param transformer lambda that transforms a String to (possibly) another type
|
11
|
+
#
|
12
|
+
def initialize(name, type, regexp, transformer)
|
13
|
+
@name, @type, @transformer = name, type, transformer
|
14
|
+
@regexps = string_array(regexp)
|
15
|
+
end
|
16
|
+
|
17
|
+
def transform(value)
|
18
|
+
@transformer ? @transformer.call(value) : value
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def string_array(regexp)
|
24
|
+
array = regexp.is_a?(Array) ? regexp : [regexp]
|
25
|
+
array.map { |r| r.is_a?(String) ? r : r.source }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'cucumber/cucumber_expressions/parameter_type'
|
2
|
+
|
3
|
+
module Cucumber
|
4
|
+
module CucumberExpressions
|
5
|
+
class ParameterTypeRegistry
|
6
|
+
INTEGER_REGEXPS = [/-?\d+/, /\d+/]
|
7
|
+
FLOAT_REGEXP = /-?\d*\.?\d+/
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@parameter_types_by_name = {}
|
11
|
+
@parameter_types_by_regexp = {}
|
12
|
+
@parameter_types_by_class = {}
|
13
|
+
|
14
|
+
define_predefined_parameter_type(ParameterType.new('int', Integer, INTEGER_REGEXPS, lambda { |s| s.to_i }))
|
15
|
+
define_predefined_parameter_type(ParameterType.new('float', Float, FLOAT_REGEXP, 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_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 = @parameter_types_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_name(name)
|
38
|
+
@parameter_types_by_name[name]
|
39
|
+
end
|
40
|
+
|
41
|
+
def lookup_by_regexp(regexp)
|
42
|
+
@parameter_types_by_regexp[regexp]
|
43
|
+
end
|
44
|
+
|
45
|
+
def create_anonymous_lookup(proc)
|
46
|
+
ParameterType.new(nil, nil, ['.+'], proc)
|
47
|
+
end
|
48
|
+
|
49
|
+
def parameter_types
|
50
|
+
@parameter_types_by_name.values
|
51
|
+
end
|
52
|
+
|
53
|
+
def define_parameter_type(parameter_type)
|
54
|
+
define_parameter_type0(parameter_type, true)
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def define_predefined_parameter_type(parameter_type)
|
60
|
+
define_parameter_type0(parameter_type, false)
|
61
|
+
end
|
62
|
+
|
63
|
+
def define_parameter_type0(parameter_type, check_conflicts)
|
64
|
+
if parameter_type.type
|
65
|
+
put(@parameter_types_by_class, parameter_type.type, parameter_type, "type", check_conflicts)
|
66
|
+
end
|
67
|
+
put(@parameter_types_by_name, parameter_type.name, parameter_type, "type name", check_conflicts)
|
68
|
+
|
69
|
+
parameter_type.regexps.each do |regexp|
|
70
|
+
put(@parameter_types_by_regexp, regexp, parameter_type, "regexp", check_conflicts)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def put(map, key, parameter, prop, check_conflicts)
|
75
|
+
if check_conflicts && map.has_key?(key)
|
76
|
+
raise "There is already a parameter with #{prop} #{key}"
|
77
|
+
end
|
78
|
+
map[key] = parameter
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -5,9 +5,9 @@ module Cucumber
|
|
5
5
|
class RegularExpression
|
6
6
|
CAPTURE_GROUP_PATTERN = /\(([^(]+)\)/
|
7
7
|
|
8
|
-
def initialize(regexp, types,
|
8
|
+
def initialize(regexp, types, parameter_type_registry)
|
9
9
|
@regexp = regexp
|
10
|
-
@
|
10
|
+
@parameter_types = []
|
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_type = nil
|
25
25
|
if (type)
|
26
|
-
|
26
|
+
parameter_type = parameter_type_registry.lookup_by_type(type)
|
27
27
|
end
|
28
|
-
if (
|
29
|
-
|
28
|
+
if (parameter_type.nil?)
|
29
|
+
parameter_type = parameter_type_registry.lookup_by_regexp(capture_group_pattern)
|
30
30
|
end
|
31
|
-
if (
|
32
|
-
|
31
|
+
if (parameter_type.nil?)
|
32
|
+
parameter_type = parameter_type_registry.create_anonymous_lookup(lambda {|s| s})
|
33
33
|
end
|
34
34
|
|
35
|
-
@
|
35
|
+
@parameter_types.push(parameter_type)
|
36
36
|
match_offset = match.offset(0)[1]
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
40
|
def match(text)
|
41
|
-
ArgumentBuilder.build_arguments(@regexp, text, @
|
41
|
+
ArgumentBuilder.build_arguments(@regexp, text, @parameter_types)
|
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_type'
|
3
|
+
require 'cucumber/cucumber_expressions/parameter_type_registry'
|
4
4
|
|
5
5
|
module Cucumber
|
6
6
|
module CucumberExpressions
|
@@ -9,18 +9,18 @@ module Cucumber
|
|
9
9
|
end
|
10
10
|
|
11
11
|
before do
|
12
|
-
@
|
13
|
-
@generator = CucumberExpressionGenerator.new(@
|
12
|
+
@parameter_type_registry = ParameterTypeRegistry.new
|
13
|
+
@generator = CucumberExpressionGenerator.new(@parameter_type_registry)
|
14
14
|
end
|
15
15
|
|
16
16
|
it "documents expression generation" do
|
17
|
-
parameter_registry =
|
17
|
+
parameter_registry = ParameterTypeRegistry.new
|
18
18
|
### [generate-expression]
|
19
19
|
generator = CucumberExpressionGenerator.new(parameter_registry)
|
20
20
|
undefined_step_text = "I have 2 cucumbers and 1.5 tomato"
|
21
21
|
generated_expression = generator.generate_expression(undefined_step_text)
|
22
22
|
expect(generated_expression.source).to eq("I have {int} cucumbers and {float} tomato")
|
23
|
-
expect(generated_expression.
|
23
|
+
expect(generated_expression.parameter_types[1].type).to eq(Float)
|
24
24
|
### [generate-expression]
|
25
25
|
end
|
26
26
|
|
@@ -47,7 +47,7 @@ module Cucumber
|
|
47
47
|
end
|
48
48
|
|
49
49
|
it "numbers only second argument when type is not reserved keyword" do
|
50
|
-
@
|
50
|
+
@parameter_type_registry.define_parameter_type(ParameterType.new(
|
51
51
|
'currency',
|
52
52
|
Currency,
|
53
53
|
'[A-Z]{3}',
|
@@ -61,7 +61,7 @@ module Cucumber
|
|
61
61
|
|
62
62
|
it "exposes parameters in generated expression" do
|
63
63
|
expression = @generator.generate_expression("I have 2 cukes and 1.5 euro")
|
64
|
-
types = expression.
|
64
|
+
types = expression.parameter_types.map(&:type)
|
65
65
|
expect(types).to eq([Integer, Float])
|
66
66
|
end
|
67
67
|
|
@@ -1,12 +1,12 @@
|
|
1
1
|
require 'cucumber/cucumber_expressions/cucumber_expression'
|
2
|
-
require 'cucumber/cucumber_expressions/
|
2
|
+
require 'cucumber/cucumber_expressions/parameter_type_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, [], ParameterTypeRegistry.new)
|
10
10
|
expect(regexp).to eq(cucumber_expression.instance_variable_get('@regexp'))
|
11
11
|
end
|
12
12
|
|
@@ -17,6 +17,13 @@ module Cucumber
|
|
17
17
|
)
|
18
18
|
end
|
19
19
|
|
20
|
+
it "translates alternation" do
|
21
|
+
assert_regexp(
|
22
|
+
"I had/have a great/nice/charming friend",
|
23
|
+
/^I (?:had|have) a (?:great|nice|charming) friend$/
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
20
27
|
it "translates two untyped arguments" do
|
21
28
|
assert_regexp(
|
22
29
|
"I have {n} cukes in my {bodypart} now",
|
@@ -1,11 +1,11 @@
|
|
1
1
|
require 'cucumber/cucumber_expressions/cucumber_expression'
|
2
|
-
require 'cucumber/cucumber_expressions/
|
2
|
+
require 'cucumber/cucumber_expressions/parameter_type_registry'
|
3
3
|
|
4
4
|
module Cucumber
|
5
5
|
module CucumberExpressions
|
6
6
|
describe CucumberExpression do
|
7
7
|
it "documents match arguments" do
|
8
|
-
parameter_registry =
|
8
|
+
parameter_registry = ParameterTypeRegistry.new
|
9
9
|
|
10
10
|
### [capture-match-arguments]
|
11
11
|
expr = "I have {n} cuke(s) in my {bodypart} now"
|
@@ -58,12 +58,12 @@ module Cucumber
|
|
58
58
|
|
59
59
|
it "exposes source" do
|
60
60
|
expr = "I have {int} cuke(s) in my {bodypart} now"
|
61
|
-
expect(CucumberExpression.new(expr, [],
|
61
|
+
expect(CucumberExpression.new(expr, [], ParameterTypeRegistry.new).source).to eq(expr)
|
62
62
|
end
|
63
63
|
|
64
64
|
it "exposes offset and value" do
|
65
65
|
expr = "I have {int} cuke(s) in my {bodypart} now"
|
66
|
-
expression = CucumberExpression.new(expr, [],
|
66
|
+
expression = CucumberExpression.new(expr, [], ParameterTypeRegistry.new)
|
67
67
|
arg1 = expression.match("I have 800 cukes in my brain now")[0]
|
68
68
|
expect(arg1.offset).to eq(7)
|
69
69
|
expect(arg1.value).to eq("800")
|
@@ -73,7 +73,7 @@ module Cucumber
|
|
73
73
|
%w(\\ [ ] ^ $ . | ? * +).each do |character|
|
74
74
|
it "escapes #{character}" do
|
75
75
|
expr = "I have {int} cuke(s) and #{character}"
|
76
|
-
expression = CucumberExpression.new(expr, [],
|
76
|
+
expression = CucumberExpression.new(expr, [], ParameterTypeRegistry.new)
|
77
77
|
arg1 = expression.match("I have 800 cukes and #{character}")[0]
|
78
78
|
expect(arg1.offset).to eq(7)
|
79
79
|
expect(arg1.value).to eq("800")
|
@@ -82,7 +82,7 @@ module Cucumber
|
|
82
82
|
end
|
83
83
|
|
84
84
|
def match(expression, text, types = [])
|
85
|
-
cucumber_expression = CucumberExpression.new(expression, types,
|
85
|
+
cucumber_expression = CucumberExpression.new(expression, types, ParameterTypeRegistry.new)
|
86
86
|
args = cucumber_expression.match(text)
|
87
87
|
return nil if args.nil?
|
88
88
|
args.map { |arg| arg.transformed_value }
|
@@ -0,0 +1,164 @@
|
|
1
|
+
require 'cucumber/cucumber_expressions/cucumber_expression'
|
2
|
+
require 'cucumber/cucumber_expressions/regular_expression'
|
3
|
+
require 'cucumber/cucumber_expressions/parameter_type_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 = ParameterTypeRegistry.new
|
24
|
+
### [add-color-parameter]
|
25
|
+
parameter_registry.define_parameter_type(ParameterType.new(
|
26
|
+
'color',
|
27
|
+
Color,
|
28
|
+
/red|blue|yellow/,
|
29
|
+
lambda { |s| Color.new(s) }
|
30
|
+
))
|
31
|
+
### [add-color-parameter]
|
32
|
+
@parameter_type_registry = parameter_registry
|
33
|
+
end
|
34
|
+
|
35
|
+
describe CucumberExpression do
|
36
|
+
it "matches parameters with custom parameter type" do
|
37
|
+
expression = CucumberExpression.new("I have a {color} ball", [], @parameter_type_registry)
|
38
|
+
transformed_argument_value = expression.match("I have a red ball")[0].transformed_value
|
39
|
+
expect( transformed_argument_value ).to eq(Color.new('red'))
|
40
|
+
end
|
41
|
+
|
42
|
+
it "matches parameters with custom parameter type using optional capture group" do
|
43
|
+
parameter_registry = ParameterTypeRegistry.new
|
44
|
+
parameter_registry.define_parameter_type(ParameterType.new(
|
45
|
+
'color',
|
46
|
+
Color,
|
47
|
+
[/red|blue|yellow/, /(?:dark|light) (?:red|blue|yellow)/],
|
48
|
+
lambda { |s| Color.new(s) }
|
49
|
+
))
|
50
|
+
expression = CucumberExpression.new("I have a {color} ball", [], parameter_registry)
|
51
|
+
transformed_argument_value = expression.match("I have a dark red ball")[0].transformed_value
|
52
|
+
expect( transformed_argument_value ).to eq(Color.new('dark red'))
|
53
|
+
end
|
54
|
+
|
55
|
+
it "matches parameters with custom parameter type without constructor function and transform" do
|
56
|
+
parameter_registry = ParameterTypeRegistry.new
|
57
|
+
parameter_registry.define_parameter_type(ParameterType.new(
|
58
|
+
'color',
|
59
|
+
nil,
|
60
|
+
/red|blue|yellow/,
|
61
|
+
nil
|
62
|
+
))
|
63
|
+
expression = CucumberExpression.new("I have a {color} ball", [], parameter_registry)
|
64
|
+
transformed_argument_value = expression.match("I have a red ball")[0].transformed_value
|
65
|
+
expect( transformed_argument_value ).to eq('red')
|
66
|
+
end
|
67
|
+
|
68
|
+
it "matches parameters with explicit type" do
|
69
|
+
expression = CucumberExpression.new("I have a {color} ball", [Color], @parameter_type_registry)
|
70
|
+
transformed_argument_value = expression.match("I have a red ball")[0].transformed_value
|
71
|
+
expect( transformed_argument_value ).to eq(Color.new('red'))
|
72
|
+
end
|
73
|
+
|
74
|
+
it "matches parameters with explicit type that isn't registered" do
|
75
|
+
expression = CucumberExpression.new("I have a {color} ball", [Color], ParameterTypeRegistry.new)
|
76
|
+
transformed_argument_value = expression.match("I have a red ball")[0].transformed_value
|
77
|
+
expect( transformed_argument_value ).to eq(Color.new('red'))
|
78
|
+
end
|
79
|
+
|
80
|
+
it "defers transformation until queried from argument" do
|
81
|
+
@parameter_type_registry.define_parameter_type(ParameterType.new(
|
82
|
+
'throwing',
|
83
|
+
String,
|
84
|
+
/bad/,
|
85
|
+
lambda { |s| raise "Can't transform [#{s}]" }
|
86
|
+
))
|
87
|
+
expression = CucumberExpression.new("I have a {throwing} parameter", [], @parameter_type_registry)
|
88
|
+
args = expression.match("I have a bad parameter")
|
89
|
+
expect { args[0].transformed_value }.to raise_error("Can't transform [bad]")
|
90
|
+
end
|
91
|
+
|
92
|
+
describe "conflicting parameter type" do
|
93
|
+
it "is detected for type name" do
|
94
|
+
expect {
|
95
|
+
@parameter_type_registry.define_parameter_type(ParameterType.new(
|
96
|
+
'color',
|
97
|
+
String,
|
98
|
+
/.*/,
|
99
|
+
lambda { |s| s }
|
100
|
+
))
|
101
|
+
}.to raise_error("There is already a parameter with type name color")
|
102
|
+
end
|
103
|
+
|
104
|
+
it "is detected for type" do
|
105
|
+
expect {
|
106
|
+
@parameter_type_registry.define_parameter_type(ParameterType.new(
|
107
|
+
'color2',
|
108
|
+
Color,
|
109
|
+
/.*/,
|
110
|
+
lambda { |s| Color.new(s) }
|
111
|
+
))
|
112
|
+
}.to raise_error("There is already a parameter with type Cucumber::CucumberExpressions::Color")
|
113
|
+
end
|
114
|
+
|
115
|
+
it "is detected for regexp" do
|
116
|
+
expect {
|
117
|
+
@parameter_type_registry.define_parameter_type(ParameterType.new(
|
118
|
+
'color2',
|
119
|
+
String,
|
120
|
+
/red|blue|yellow/,
|
121
|
+
lambda { |s| s }
|
122
|
+
))
|
123
|
+
}.to raise_error("There is already a parameter with regexp red|blue|yellow")
|
124
|
+
end
|
125
|
+
|
126
|
+
it "is not detected when type is nil" do
|
127
|
+
@parameter_type_registry.define_parameter_type(ParameterType.new(
|
128
|
+
'foo',
|
129
|
+
nil,
|
130
|
+
/foo/,
|
131
|
+
lambda { |s| s }
|
132
|
+
))
|
133
|
+
@parameter_type_registry.define_parameter_type(ParameterType.new(
|
134
|
+
'bar',
|
135
|
+
nil,
|
136
|
+
/bar/,
|
137
|
+
lambda { |s| s }
|
138
|
+
))
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
describe RegularExpression do
|
144
|
+
it "matches parameters with explicit constructor" do
|
145
|
+
expression = RegularExpression.new(/I have a (red|blue|yellow) ball/, [Color], @parameter_type_registry)
|
146
|
+
transformed_argument_value = expression.match("I have a red ball")[0].transformed_value
|
147
|
+
expect( transformed_argument_value ).to eq(Color.new('red'))
|
148
|
+
end
|
149
|
+
|
150
|
+
it "matches parameters without explicit constructor" do
|
151
|
+
expression = RegularExpression.new(/I have a (red|blue|yellow) ball/, [], @parameter_type_registry)
|
152
|
+
transformed_argument_value = expression.match("I have a red ball")[0].transformed_value
|
153
|
+
expect( transformed_argument_value ).to eq(Color.new('red'))
|
154
|
+
end
|
155
|
+
|
156
|
+
it "matches parameters with explicit type that isn't registered" do
|
157
|
+
expression = RegularExpression.new(/I have a (red|blue|yellow) ball/, [Color], ParameterTypeRegistry.new)
|
158
|
+
transformed_argument_value = expression.match("I have a red ball")[0].transformed_value
|
159
|
+
expect( transformed_argument_value ).to eq(Color.new('red'))
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
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_type_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), [], ParameterTypeRegistry.new) :
|
12
|
+
CucumberExpression.new(expression_text, [], ParameterTypeRegistry.new)
|
13
13
|
|
14
14
|
arguments = expression.match(text)
|
15
15
|
return nil if arguments.nil?
|
@@ -1,16 +1,16 @@
|
|
1
1
|
require 'cucumber/cucumber_expressions/regular_expression'
|
2
|
-
require 'cucumber/cucumber_expressions/
|
2
|
+
require 'cucumber/cucumber_expressions/parameter_type_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_type_registry = ParameterTypeRegistry.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_type_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")
|
@@ -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, [], ParameterTypeRegistry.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, ParameterTypeRegistry.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: 3.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-03-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -86,16 +86,16 @@ files:
|
|
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/
|
90
|
-
- lib/cucumber/cucumber_expressions/
|
91
|
-
- lib/cucumber/cucumber_expressions/
|
89
|
+
- lib/cucumber/cucumber_expressions/parameter_type.rb
|
90
|
+
- lib/cucumber/cucumber_expressions/parameter_type_matcher.rb
|
91
|
+
- lib/cucumber/cucumber_expressions/parameter_type_registry.rb
|
92
92
|
- lib/cucumber/cucumber_expressions/regular_expression.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_type_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
|
@@ -122,13 +122,13 @@ rubyforge_project:
|
|
122
122
|
rubygems_version: 2.5.2
|
123
123
|
signing_key:
|
124
124
|
specification_version: 4
|
125
|
-
summary: cucumber-expressions-
|
125
|
+
summary: cucumber-expressions-3.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_type_spec.rb
|
133
133
|
- spec/cucumber/cucumber_expressions/expression_examples_spec.rb
|
134
134
|
- spec/cucumber/cucumber_expressions/regular_expression_spec.rb
|
@@ -1,29 +0,0 @@
|
|
1
|
-
module Cucumber
|
2
|
-
module CucumberExpressions
|
3
|
-
class Parameter
|
4
|
-
attr_reader :type_name, :type, :capture_group_regexps
|
5
|
-
|
6
|
-
# Create a new Parameter
|
7
|
-
#
|
8
|
-
# @param type_name [Array] array of class or type name to use in {arg:type_name}
|
9
|
-
# @param capture_group_regexps [Array] list of regexps for capture groups.
|
10
|
-
# @param transformer lambda that transforms a String to (possibly) another type
|
11
|
-
#
|
12
|
-
def initialize(type_name, type, capture_group_regexps, transformer)
|
13
|
-
@type_name, @type, @transformer = type_name, type, transformer
|
14
|
-
@capture_group_regexps = string_array(capture_group_regexps)
|
15
|
-
end
|
16
|
-
|
17
|
-
def transform(value)
|
18
|
-
@transformer.call(value)
|
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
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
@@ -1,64 +0,0 @@
|
|
1
|
-
require 'cucumber/cucumber_expressions/parameter'
|
2
|
-
|
3
|
-
module Cucumber
|
4
|
-
module CucumberExpressions
|
5
|
-
class ParameterRegistry
|
6
|
-
INTEGER_REGEXPS = [/-?\d+/, /\d+/]
|
7
|
-
FLOAT_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, FLOAT_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,100 +0,0 @@
|
|
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
|
-
### [add-color-parameter]
|
24
|
-
parameter_registry = ParameterRegistry.new
|
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
|
-
@parameter_registry = parameter_registry
|
33
|
-
end
|
34
|
-
|
35
|
-
describe CucumberExpression do
|
36
|
-
it "matches typed parameters" do
|
37
|
-
expression = CucumberExpression.new("I have a {color} ball", [], @parameter_registry)
|
38
|
-
transformed_argument_value = expression.match("I have a red ball")[0].transformed_value
|
39
|
-
expect( transformed_argument_value ).to eq(Color.new('red'))
|
40
|
-
end
|
41
|
-
|
42
|
-
it "matches typed parameters with optional group" do
|
43
|
-
expression = CucumberExpression.new("I have a {color} ball", [], @parameter_registry)
|
44
|
-
transformed_argument_value = expression.match("I have a dark red ball")[0].transformed_value
|
45
|
-
expect( transformed_argument_value ).to eq(Color.new('dark red'))
|
46
|
-
end
|
47
|
-
|
48
|
-
it "matches untyped parameters with explicit type" do
|
49
|
-
expression = CucumberExpression.new("I have a {color} ball", [Color], @parameter_registry)
|
50
|
-
transformed_argument_value = expression.match("I have a red ball")[0].transformed_value
|
51
|
-
expect( transformed_argument_value ).to eq(Color.new('red'))
|
52
|
-
end
|
53
|
-
|
54
|
-
it "matches untyped parameters with same name as type" do
|
55
|
-
expression = CucumberExpression.new("I have a {color} ball", [], @parameter_registry)
|
56
|
-
transformed_argument_value = expression.match("I have a red ball")[0].transformed_value
|
57
|
-
expect( transformed_argument_value ).to eq(Color.new('red'))
|
58
|
-
end
|
59
|
-
|
60
|
-
it "matches parameters with explicit type that isn't registered" do
|
61
|
-
expression = CucumberExpression.new("I have a {color} ball", [Color], ParameterRegistry.new)
|
62
|
-
transformed_argument_value = expression.match("I have a red ball")[0].transformed_value
|
63
|
-
expect( transformed_argument_value ).to eq(Color.new('red'))
|
64
|
-
end
|
65
|
-
|
66
|
-
it("defers transformation until queried from argument") do
|
67
|
-
@parameter_registry.add_parameter(Parameter.new(
|
68
|
-
'throwing',
|
69
|
-
String,
|
70
|
-
/bad/,
|
71
|
-
lambda { |s| raise "Can't transform [#{s}]" }
|
72
|
-
))
|
73
|
-
expression = CucumberExpression.new("I have a {throwing} parameter", [], @parameter_registry)
|
74
|
-
args = expression.match("I have a bad parameter")
|
75
|
-
expect { args[0].transformed_value }.to raise_error("Can't transform [bad]")
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
describe RegularExpression do
|
80
|
-
it "matches parameters with explicit constructor" do
|
81
|
-
expression = RegularExpression.new(/I have a (red|blue|yellow) ball/, [Color], @parameter_registry)
|
82
|
-
transformed_argument_value = expression.match("I have a red ball")[0].transformed_value
|
83
|
-
expect( transformed_argument_value ).to eq(Color.new('red'))
|
84
|
-
end
|
85
|
-
|
86
|
-
it "matches parameters without explicit constructor" do
|
87
|
-
expression = RegularExpression.new(/I have a (red|blue|yellow) ball/, [], @parameter_registry)
|
88
|
-
transformed_argument_value = expression.match("I have a red ball")[0].transformed_value
|
89
|
-
expect( transformed_argument_value ).to eq(Color.new('red'))
|
90
|
-
end
|
91
|
-
|
92
|
-
it "matches parameters with explicit type that isn't registered" do
|
93
|
-
expression = RegularExpression.new(/I have a (red|blue|yellow) ball/, [Color], ParameterRegistry.new)
|
94
|
-
transformed_argument_value = expression.match("I have a red ball")[0].transformed_value
|
95
|
-
expect( transformed_argument_value ).to eq(Color.new('red'))
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|