cucumber 2.0.0.rc.3 → 2.0.0.rc.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c3363dbec0a2d978fa0a971074ef94dfb1ec7516
4
- data.tar.gz: 5b3cb7daf670ad60c76e2fa72f880ed2beb5d7c1
3
+ metadata.gz: 3110fb4364ae31f8a5da94139d812effa7acd9bf
4
+ data.tar.gz: 0fb0d7f3a973bb50ee76195c9380730e03cb3382
5
5
  SHA512:
6
- metadata.gz: e237d67c0e80e105bcfab384d4fd1de2d0fe72dbeaf3444317529fd4dfc4122fc94e88997b59f7e22a12bf5386cae490d6caeaec2a201438fc285f7b43eec3d3
7
- data.tar.gz: 068a225dac075315c61f5e9a43ad9ca830273ae41113e37d3220edd8854ef2ba012b2b625fdadf7f81020a0cf075ce6b8c5a38d154169aece93345ce20065ea6
6
+ metadata.gz: 661376d7cf4efabbdc1e08183be15c758ce97083821267fbfd164c3a5e5a490ccd74c7a964e62ef1770d0b74d69ae1ca9375d1bcab2b3df33b0d92eb4cc73949
7
+ data.tar.gz: fd834e7e4c21bbedf1f5b1981ecdc6bdd4775a5c6e5facbbe122c6c47961370738e69068b58c015346adb311c2b920d773b096c34a5cfb643a16d1b68fbccf6c
data/History.md CHANGED
@@ -1,4 +1,17 @@
1
1
  ## [In Git](https://github.com/cucumber/cucumber/compare/v2.0.0.rc.3...master)
2
+
3
+ ### Features
4
+
5
+ * [Add custom filters from Ruby configuration code](https://github.com/cucumber/cucumber/blob/master/features/docs/extending_cucumber/custom_filter.feature) (@mattwynne)
6
+
7
+ ### Bugfixes
8
+
9
+ * Fix missing `require Forwardable` (@tooky)
10
+ * Fix snippet suggestions ([765](https://github.com/cucumber/cucumber/pull/765) @richarda), also with i18n languages (@brasmusson)
11
+ * Fix transformation of regex with lookahead/lookbehind ([796](https://github.com/cucumber/cucumber/pull/796) @bolshakov)
12
+ * Sort scenarios by location ([789](https://github.com/cucumber/cucumber/issues/789) @mattwynne)
13
+ * Remove keyword from name property of test case object yielded to hooks ([768](https://github.com/cucumber/cucumber/issues/768) @richarda, @akostadinov)
14
+
2
15
  ## [v2.0.0.rc.3](https://github.com/cucumber/cucumber/compare/v2.0.0.rc.2...v2.0.0.rc.3)
3
16
 
4
17
  ### Bugfixes
@@ -14,12 +14,12 @@ Gem::Specification.new do |s|
14
14
  s.platform = Gem::Platform::RUBY
15
15
  s.required_ruby_version = ">= 1.9.3"
16
16
 
17
- s.add_dependency 'cucumber-core', '~> 1.0.0'
17
+ s.add_dependency 'cucumber-core', '~> 1.1.0'
18
18
  s.add_dependency 'builder', '>= 2.1.2'
19
19
  s.add_dependency 'diff-lcs', '>= 1.1.3'
20
20
  s.add_dependency 'gherkin', '~> 2.12'
21
21
  s.add_dependency 'multi_json', '>= 1.7.5', '< 2.0'
22
- s.add_dependency 'multi_test', '>= 0.1.1'
22
+ s.add_dependency 'multi_test', '>= 0.1.2'
23
23
 
24
24
  s.add_development_dependency 'aruba', '~> 0.6.1'
25
25
  s.add_development_dependency 'json', '~> 1.7'
@@ -111,3 +111,20 @@ Feature: Run specific scenarios
111
111
  1 scenario (1 passed)
112
112
  1 step (1 passed)
113
113
  """
114
+
115
+ Scenario: Specify order of scenarios
116
+ Given a file named "features/test.feature" with:
117
+ """
118
+ Feature:
119
+ Scenario:
120
+ Given this step passes
121
+
122
+ Scenario:
123
+ Given this step fails
124
+ """
125
+ When I run `cucumber features/test.feature:5 features/test.feature:3 -f progress`
126
+ Then it should fail with:
127
+ """
128
+ F.
129
+ """
130
+
@@ -13,6 +13,9 @@ Feature: Snippets
13
13
  \"\"\"
14
14
  example with <html> entities
15
15
  \"\"\"
16
+ When a simple when step
17
+ And another when step
18
+ Then a simple then step
16
19
  """
17
20
  When I run `cucumber features/undefined_steps.feature -s`
18
21
  Then the output should contain:
@@ -20,6 +23,18 @@ Feature: Snippets
20
23
  Given(/^a pystring$/) do |string|
21
24
  pending # Write code here that turns the phrase above into concrete actions
22
25
  end
26
+
27
+ When(/^a simple when step$/) do
28
+ pending # Write code here that turns the phrase above into concrete actions
29
+ end
30
+
31
+ When(/^another when step$/) do
32
+ pending # Write code here that turns the phrase above into concrete actions
33
+ end
34
+
35
+ Then(/^a simple then step$/) do
36
+ pending # Write code here that turns the phrase above into concrete actions
37
+ end
23
38
  """
24
39
 
25
40
  Scenario: Snippet for undefined step with a step table
@@ -0,0 +1,29 @@
1
+ Feature: Custom filter
2
+
3
+ Scenario: Add a custom filter via AfterConfiguration hook
4
+ Given a file named "features/test.feature" with:
5
+ """
6
+ Feature:
7
+ Scenario:
8
+ Given my special step
9
+ """
10
+ And a file named "features/support/my_filter.rb" with:
11
+ """
12
+ require 'cucumber/core/filter'
13
+
14
+ MakeAnythingPass = Cucumber::Core::Filter.new do
15
+ def test_case(test_case)
16
+ activated_steps = test_case.test_steps.map do |test_step|
17
+ test_step.with_action { }
18
+ end
19
+ test_case.with_steps(activated_steps).describe_to receiver
20
+ end
21
+ end
22
+
23
+ AfterConfiguration do |config|
24
+ config.filters << MakeAnythingPass.new
25
+ end
26
+ """
27
+ When I run `cucumber --strict`
28
+ Then it should pass
29
+
@@ -65,7 +65,7 @@ module Cucumber
65
65
  end
66
66
 
67
67
  def name
68
- @test_case.name
68
+ "#{@test_case.keyword}: #{@test_case.name}"
69
69
  end
70
70
 
71
71
  def title
@@ -147,7 +147,6 @@ module Cucumber
147
147
  @options[:name_regexps]
148
148
  end
149
149
 
150
- # todo: remove as unused
151
150
  def filters
152
151
  @options.filters
153
152
  end
@@ -179,7 +178,8 @@ module Cucumber
179
178
  end
180
179
  end
181
180
 
182
- private
181
+ private
182
+
183
183
  def with_default_features_path(paths)
184
184
  return ['features'] if paths.empty?
185
185
  paths
@@ -191,7 +191,6 @@ module Cucumber
191
191
  end
192
192
  end
193
193
 
194
-
195
194
  def set_environment_variables
196
195
  @options[:env_vars].each do |var, value|
197
196
  ENV[var] = value
@@ -266,7 +266,7 @@ TEXT
266
266
  end
267
267
 
268
268
  def filters
269
- @options.values_at(:name_regexps, :tag_expressions).select{|v| !v.empty?}.first || []
269
+ @options[:filters] ||= []
270
270
  end
271
271
 
272
272
  protected
@@ -1,4 +1,6 @@
1
+ require 'cucumber'
1
2
  require 'cucumber/core/ast/location'
3
+
2
4
  module Cucumber
3
5
  class FileSpecs
4
6
  FILE_COLON_LINE_PATTERN = /^([\w\W]*?)(?::([\d:]+))?$/ #:nodoc:
@@ -1,4 +1,3 @@
1
- require 'cucumber/multiline_argument'
2
1
  require 'cucumber/core/filter'
3
2
 
4
3
  module Cucumber
@@ -132,18 +132,24 @@ module Cucumber
132
132
  s.gsub(/.{1,#{max}}(?:\s|\Z)/){($& + 5.chr).gsub(/\n\005/,"\n").gsub(/\005/,"\n")}.rstrip
133
133
  end
134
134
 
135
+ def collect_snippet_data(test_step, result)
136
+ # collect snippet data for undefined steps
137
+ unless hook?(test_step)
138
+ keyword = test_step.source.last.actual_keyword(@previous_step_keyword)
139
+ @previous_step_keyword = keyword
140
+ if result.undefined?
141
+ @snippets_input << Console::SnippetData.new(keyword, test_step.source.last)
142
+ end
143
+ end
144
+ end
145
+
135
146
  def print_snippets(options)
136
147
  return unless options[:snippets]
137
- undefined = runtime.steps(:undefined)
138
- return if undefined.empty?
148
+ return if runtime.steps(:undefined).empty?
139
149
 
140
- unknown_programming_language = runtime.unknown_programming_language?
141
- snippets = undefined.map do |step|
142
- # step_name = Undefined === step.exception ? step.exception.step_name : step.name
143
- # TODO: This probably won't work for nested steps :( See above for old code.
144
- step_name = step.name
145
- @runtime.snippet_text(step.actual_keyword, step_name, step.multiline_arg)
146
- end.compact.uniq
150
+ snippets = @snippets_input.map do |data|
151
+ @runtime.snippet_text(data.actual_keyword, data.step.name, data.step.multiline_arg)
152
+ end.uniq
147
153
 
148
154
  text = "\nYou can implement step definitions for undefined steps with these snippets:\n\n"
149
155
  text += snippets.join("\n\n")
@@ -215,16 +221,27 @@ module Cucumber
215
221
  @io.puts "Using the #{profiles_sentence} profile#{'s' if profiles.size> 1}..."
216
222
  end
217
223
 
218
- private
224
+ private
219
225
 
220
- FORMATS = Hash.new{ |hash, format| hash[format] = method(format).to_proc }
226
+ FORMATS = Hash.new{ |hash, format| hash[format] = method(format).to_proc }
221
227
 
222
- def format_for(*keys)
223
- key = keys.join('_').to_sym
224
- fmt = FORMATS[key]
225
- raise "No format for #{key.inspect}: #{FORMATS.inspect}" if fmt.nil?
226
- fmt
227
- end
228
+ def format_for(*keys)
229
+ key = keys.join('_').to_sym
230
+ fmt = FORMATS[key]
231
+ raise "No format for #{key.inspect}: #{FORMATS.inspect}" if fmt.nil?
232
+ fmt
233
+ end
234
+
235
+ def hook?(test_step)
236
+ not test_step.source.last.respond_to?(:actual_keyword)
237
+ end
238
+
239
+ class SnippetData
240
+ attr_reader :actual_keyword, :step
241
+ def initialize(actual_keyword, step)
242
+ @actual_keyword, @step = actual_keyword, step
243
+ end
244
+ end
228
245
 
229
246
  end
230
247
  end
@@ -33,6 +33,7 @@ module Cucumber
33
33
  @img_id = 0
34
34
  @text_id = 0
35
35
  @inside_outline = false
36
+ @previous_step_keyword = nil
36
37
  end
37
38
 
38
39
  def embed(src, mime_type, label)
@@ -160,6 +161,10 @@ module Cucumber
160
161
  end
161
162
  end
162
163
 
164
+ def before_test_case(test_case)
165
+ @previous_step_keyword = nil
166
+ end
167
+
163
168
  def before_background(background)
164
169
  @in_background = true
165
170
  @builder << '<div class="background">'
@@ -279,8 +284,11 @@ module Cucumber
279
284
  def after_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background, file_colon_line)
280
285
  return if @hide_this_step
281
286
  # print snippet for undefined steps
287
+ unless outline_step?(@step)
288
+ keyword = @step.actual_keyword(@previous_step_keyword)
289
+ @previous_step_keyword = keyword
290
+ end
282
291
  if status == :undefined
283
- keyword = @step.actual_keyword if @step.respond_to?(:actual_keyword)
284
292
  @builder.pre do |pre|
285
293
  # TODO: snippet text should be an event sent to the formatter so we don't
286
294
  # have this couping to the runtime.
@@ -608,6 +616,10 @@ module Cucumber
608
616
  Builder::XmlMarkup.new(:target => io, :indent => 0)
609
617
  end
610
618
 
619
+ def outline_step?(step)
620
+ not @step.step.respond_to?(:actual_keyword)
621
+ end
622
+
611
623
  class SnippetExtractor #:nodoc:
612
624
  class NullConverter; def convert(code, pre); code; end; end #:nodoc:
613
625
  begin; require 'syntax/convertors/html'; @@converter = Syntax::Convertors::HTML.for_syntax "ruby"; rescue LoadError => e; @@converter = NullConverter.new; end
@@ -54,7 +54,7 @@ module Cucumber
54
54
  end
55
55
 
56
56
  def record_test_case_result(test_case, result)
57
- scenario = LegacyResultBuilder.new(result).scenario(test_case.name, test_case.location)
57
+ scenario = LegacyResultBuilder.new(result).scenario("#{test_case.keyword}: #{test_case.name}", test_case.location)
58
58
  results.scenario_visited(scenario)
59
59
  end
60
60
 
@@ -138,11 +138,8 @@ module Cucumber
138
138
 
139
139
  end
140
140
 
141
- def actual_keyword
142
- # TODO: This should return the keyword for the snippet
143
- # `actual_keyword` translates 'And', 'But', etc. to 'Given', 'When',
144
- # 'Then' as appropriate
145
- "Given"
141
+ def actual_keyword(previous_step_keyword = nil)
142
+ step.actual_keyword(previous_step_keyword)
146
143
  end
147
144
 
148
145
  def file_colon_line
@@ -26,6 +26,8 @@ module Cucumber
26
26
  @indent = 0
27
27
  @prefixes = options[:prefixes] || {}
28
28
  @delayed_messages = []
29
+ @previous_step_keyword = nil
30
+ @snippets_input = []
29
31
  end
30
32
 
31
33
  def before_features(features)
@@ -209,6 +211,14 @@ module Cucumber
209
211
  @io.flush
210
212
  end
211
213
 
214
+ def before_test_case(test_case)
215
+ @previous_step_keyword = nil
216
+ end
217
+
218
+ def after_test_step(test_step, result)
219
+ collect_snippet_data(test_step, result)
220
+ end
221
+
212
222
  private
213
223
 
214
224
  def print_feature_element_name(keyword, name, file_colon_line, source_indent)
@@ -11,6 +11,8 @@ module Cucumber
11
11
 
12
12
  def initialize(runtime, path_or_io, options)
13
13
  @runtime, @io, @options = runtime, ensure_io(path_or_io, "progress"), options
14
+ @previous_step_keyword = nil
15
+ @snippets_input = []
14
16
  end
15
17
 
16
18
  def before_features(features)
@@ -64,6 +66,14 @@ module Cucumber
64
66
  @exception_raised = true
65
67
  end
66
68
 
69
+ def before_test_case(test_case)
70
+ @previous_step_keyword = nil
71
+ end
72
+
73
+ def after_test_step(test_step, result)
74
+ collect_snippet_data(test_step, result)
75
+ end
76
+
67
77
  private
68
78
 
69
79
  def print_summary(features)
@@ -1,3 +1,4 @@
1
+ require 'forwardable'
1
2
  require 'gherkin/formatter/escaping'
2
3
  require 'cucumber/core/ast/describes_itself'
3
4
 
@@ -4,7 +4,7 @@ require 'rbconfig'
4
4
 
5
5
  module Cucumber
6
6
  unless defined?(Cucumber::VERSION)
7
- VERSION = '2.0.0.rc.3'
7
+ VERSION = '2.0.0.rc.4'
8
8
  BINARY = File.expand_path(File.dirname(__FILE__) + '/../../bin/cucumber')
9
9
  LIBDIR = File.expand_path(File.dirname(__FILE__) + '/../../lib')
10
10
  JRUBY = defined?(JRUBY_VERSION)
@@ -39,7 +39,9 @@ module Cucumber
39
39
 
40
40
  private
41
41
  def convert_captures(regexp_source)
42
- regexp_source.gsub(/(\()(?!\?:)/,'(?:')
42
+ regexp_source
43
+ .gsub(/(\()(?!\?[<:=!])/,'(?:')
44
+ .gsub(/(\(\?<)(?![=!])/,'(?:<')
43
45
  end
44
46
 
45
47
  def strip_captures(regexp_source)
@@ -219,6 +219,9 @@ module Cucumber
219
219
  filters << Cucumber::Core::Test::LocationsFilter.new(filespecs.locations)
220
220
  filters << Filters::Quit.new
221
221
  filters << Filters::ActivateSteps.new(@support_code)
222
+ @configuration.filters.each do |filter|
223
+ filters << filter
224
+ end
222
225
  unless configuration.dry_run?
223
226
  filters << Filters::ApplyAfterStepHooks.new(@support_code)
224
227
  filters << Filters::ApplyBeforeHooks.new(@support_code)
@@ -45,5 +45,16 @@ module Cucumber
45
45
  ]
46
46
  end
47
47
  end
48
+
49
+ context "when the same file is referenced more than once" do
50
+ let(:file_specs) { FileSpecs.new(["features/foo.feature:10", "features/foo.feature:1"]) }
51
+
52
+ it "returns locations in the order specified" do
53
+ expect(locations).to eq [
54
+ Cucumber::Core::Ast::Location.new("features/foo.feature", 10),
55
+ Cucumber::Core::Ast::Location.new("features/foo.feature", 1),
56
+ ]
57
+ end
58
+ end
48
59
  end
49
60
  end
@@ -343,6 +343,34 @@ module Cucumber
343
343
  it { expect(@doc.css('pre').map { |pre| /^(Given|And)/.match(pre.text)[1] }).to eq ["Given", "Given"] }
344
344
  end
345
345
 
346
+ describe "with an undefined When step then an undefined And step" do
347
+ define_feature(<<-FEATURE)
348
+ Feature:
349
+ Scenario:
350
+ Given some undefined step
351
+ When a different undefined step
352
+ And another undefined step
353
+ FEATURE
354
+
355
+ it { expect(@doc.css('pre').map { |pre| /^(Given|When|And)/.match(pre.text)[1] }).to eq ["Given", "When", "When"] }
356
+ end
357
+
358
+ describe "with an passing Then step and an undefined And step" do
359
+ define_feature <<-FEATURE
360
+ Feature:
361
+ Scenario:
362
+ Given this step passes
363
+ Then this step passes
364
+ And this step is undefined
365
+ FEATURE
366
+
367
+ define_steps do
368
+ Given(/^this step passes$/) {}
369
+ end
370
+
371
+ it { expect(@doc.css('pre').map { |pre| /^(Given|Then)/.match(pre.text)[1] }).to eq ["Then"] }
372
+ end
373
+
346
374
  describe "with a output from hooks" do
347
375
  describe "in a scenario" do
348
376
  define_feature <<-FEATURE
@@ -399,6 +427,33 @@ module Cucumber
399
427
  end
400
428
  end
401
429
  end
430
+ context "in --expand mode" do
431
+ let(:runtime) { Runtime.new({:expand => true})}
432
+ before(:each) do
433
+ @out = StringIO.new
434
+ @formatter = Html.new(runtime, @out, {})
435
+ run_defined_feature
436
+ @doc = Nokogiri.HTML(@out.string)
437
+ end
438
+ describe "with undefined * steps in a Scenario Outline" do
439
+ define_feature <<-FEATURE
440
+ Feature:
441
+ Scenario Outline:
442
+ * this step is <status>
443
+ Then this step passes
444
+ Examples:
445
+ | status |
446
+ | undefined |
447
+ | undefined |
448
+ FEATURE
449
+
450
+ define_steps do
451
+ Given(/^this step passes$/) {}
452
+ end
453
+
454
+ it { expect(@doc.css('pre').map { |pre| /^(Given|Then|When)/.match(pre.text)[1] }).to eq ["Given", "Given"] }
455
+ end
456
+ end
402
457
  end
403
458
  end
404
459
  end
@@ -698,6 +698,113 @@ OUTPUT
698
698
  end
699
699
  end
700
700
  end
701
+
702
+ context "snippets contain relevant keyword replacements" do
703
+
704
+ before(:each) do
705
+ Cucumber::Term::ANSIColor.coloring = false
706
+ @out = StringIO.new
707
+ @formatter = Pretty.new(runtime, @out, {snippets: true})
708
+ run_defined_feature
709
+ end
710
+
711
+ describe "With a scenario that has undefined steps" do
712
+ define_feature <<-FEATURE
713
+ Feature: Banana party
714
+
715
+ Scenario: many monkeys eat many things
716
+ Given there are bananas and apples
717
+ And other monkeys are around
718
+ When one monkey eats a banana
719
+ And the other monkeys eat all the apples
720
+ Then bananas remain
721
+ But there are no apples left
722
+ FEATURE
723
+
724
+ it "containes snippets with 'And' or 'But' replaced by previous step name" do
725
+ expect(@out.string).to include("Given(/^there are bananas and apples$/)")
726
+ expect(@out.string).to include("Given(/^other monkeys are around$/)")
727
+ expect(@out.string).to include("When(/^one monkey eats a banana$/)")
728
+ expect(@out.string).to include("When(/^the other monkeys eat all the apples$/)")
729
+ expect(@out.string).to include("Then(/^bananas remain$/)")
730
+ expect(@out.string).to include("Then(/^there are no apples left$/)")
731
+ end
732
+ end
733
+
734
+ describe "With a scenario that uses * and 'But'" do
735
+ define_feature <<-FEATURE
736
+ Feature: Banana party
737
+
738
+ Scenario: many monkeys eat many things
739
+ * there are bananas and apples
740
+ * other monkeys are around
741
+ When one monkey eats a banana
742
+ * the other monkeys eat all the apples
743
+ Then bananas remain
744
+ * there are no apples left
745
+ FEATURE
746
+ it "replaces the first step with 'Given'" do
747
+ expect(@out.string).to include("Given(/^there are bananas and apples$/)")
748
+ end
749
+ it "uses actual keywords as the 'previous' keyword for future replacements" do
750
+ expect(@out.string).to include("Given(/^other monkeys are around$/)")
751
+ expect(@out.string).to include("When(/^the other monkeys eat all the apples$/)")
752
+ expect(@out.string).to include("Then(/^there are no apples left$/)")
753
+ end
754
+ end
755
+
756
+ describe "With a scenario where the only undefined step uses 'And'" do
757
+ define_feature <<-FEATURE
758
+ Feature:
759
+
760
+ Scenario:
761
+ Given this step passes
762
+ Then this step passes
763
+ And this step is undefined
764
+ FEATURE
765
+ define_steps do
766
+ Given(/^this step passes$/) {}
767
+ end
768
+ it "uses actual keyword of the previous passing step for the undefined step" do
769
+ expect(@out.string).to include("Then(/^this step is undefined$/)")
770
+ end
771
+ end
772
+
773
+ describe "With scenarios where the first step is undefined and uses '*'" do
774
+ define_feature <<-FEATURE
775
+ Feature:
776
+
777
+ Scenario:
778
+ * this step is undefined
779
+ Then this step passes
780
+
781
+ Scenario:
782
+ * this step is also undefined
783
+ Then this step passes
784
+ FEATURE
785
+ define_steps do
786
+ Given(/^this step passes$/) {}
787
+ end
788
+ it "uses 'Given' as actual keyword the step in each scenario" do
789
+ expect(@out.string).to include("Given(/^this step is undefined$/)")
790
+ expect(@out.string).to include("Given(/^this step is also undefined$/)")
791
+ end
792
+ end
793
+
794
+ describe "with a scenario in en-lol" do
795
+ define_feature <<-FEATURE
796
+ # language: en-lol
797
+ OH HAI: STUFFING
798
+
799
+ MISHUN: CUCUMBR
800
+ I CAN HAZ IN TEH BEGINNIN CUCUMBRZ
801
+ AN I EAT CUCUMBRZ
802
+ FEATURE
803
+ it "uses actual keyword of the previous passing step for the undefined step" do
804
+ expect(@out.string).to include("ICANHAZ(/^I EAT CUCUMBRZ$/)")
805
+ end
806
+ end
807
+ end
701
808
  end
702
809
  end
703
810
  end
@@ -9,6 +9,26 @@ module Cucumber
9
9
  end
10
10
 
11
11
  describe "#to_s" do
12
+ it "does not touch positive lookahead captures" do
13
+ expect(transform(/^xy(?=z)/).to_s).to eq "xy(?=z)"
14
+ end
15
+
16
+ it "does not touch negative lookahead captures" do
17
+ expect(transform(/^xy(?!z)/).to_s).to eq "xy(?!z)"
18
+ end
19
+
20
+ it "does not touch positive lookbehind captures" do
21
+ expect(transform(/^xy(?<=z)/).to_s).to eq "xy(?<=z)"
22
+ end
23
+
24
+ it "does not touch negative lookbehind captures" do
25
+ expect(transform(/^xy(?<!z)/).to_s).to eq "xy(?<!z)"
26
+ end
27
+
28
+ it "converts named captures" do
29
+ expect(transform(/^(?<str>xyz)/).to_s).to eq "(?:<str>xyz)"
30
+ end
31
+
12
32
  it "converts captures groups to non-capture groups" do
13
33
  expect(transform(/(a|b)bc/).to_s).to eq "(?:a|b)bc"
14
34
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cucumber
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.rc.3
4
+ version: 2.0.0.rc.4
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: 2015-01-23 00:00:00.000000000 Z
11
+ date: 2015-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cucumber-core
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.0.0
19
+ version: 1.1.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.0.0
26
+ version: 1.1.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: builder
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -92,14 +92,14 @@ dependencies:
92
92
  requirements:
93
93
  - - ">="
94
94
  - !ruby/object:Gem::Version
95
- version: 0.1.1
95
+ version: 0.1.2
96
96
  type: :runtime
97
97
  prerelease: false
98
98
  version_requirements: !ruby/object:Gem::Requirement
99
99
  requirements:
100
100
  - - ">="
101
101
  - !ruby/object:Gem::Version
102
- version: 0.1.1
102
+ version: 0.1.2
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: aruba
105
105
  requirement: !ruby/object:Gem::Requirement
@@ -581,6 +581,7 @@ files:
581
581
  - features/docs/exception_in_after_hook.feature
582
582
  - features/docs/exception_in_after_step_hook.feature
583
583
  - features/docs/exception_in_before_hook.feature
584
+ - features/docs/extending_cucumber/custom_filter.feature
584
585
  - features/docs/extending_cucumber/custom_formatter.feature
585
586
  - features/docs/formatters/debug_formatter.feature
586
587
  - features/docs/formatters/formatter_step_file_colon_line.feature
@@ -818,7 +819,7 @@ rubyforge_project:
818
819
  rubygems_version: 2.2.2
819
820
  signing_key:
820
821
  specification_version: 4
821
- summary: cucumber-2.0.0.rc.3
822
+ summary: cucumber-2.0.0.rc.4
822
823
  test_files:
823
824
  - features/docs/api/list_step_defs_as_json.feature
824
825
  - features/docs/api/run_cli_main_with_existing_runtime.feature
@@ -845,6 +846,7 @@ test_files:
845
846
  - features/docs/exception_in_after_hook.feature
846
847
  - features/docs/exception_in_after_step_hook.feature
847
848
  - features/docs/exception_in_before_hook.feature
849
+ - features/docs/extending_cucumber/custom_filter.feature
848
850
  - features/docs/extending_cucumber/custom_formatter.feature
849
851
  - features/docs/formatters/debug_formatter.feature
850
852
  - features/docs/formatters/formatter_step_file_colon_line.feature