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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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