cucumber-core 0.2.0 → 1.0.0.beta.1

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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/cucumber-core.gemspec +1 -1
  4. data/lib/cucumber/core.rb +6 -6
  5. data/lib/cucumber/core/ast/data_table.rb +8 -0
  6. data/lib/cucumber/core/ast/describes_itself.rb +1 -1
  7. data/lib/cucumber/core/ast/examples_table.rb +8 -2
  8. data/lib/cucumber/core/ast/feature.rb +2 -3
  9. data/lib/cucumber/core/ast/location.rb +11 -6
  10. data/lib/cucumber/core/ast/names.rb +10 -1
  11. data/lib/cucumber/core/ast/outline_step.rb +6 -3
  12. data/lib/cucumber/core/ast/scenario.rb +0 -1
  13. data/lib/cucumber/core/ast/scenario_outline.rb +2 -3
  14. data/lib/cucumber/core/ast/step.rb +2 -2
  15. data/lib/cucumber/core/gherkin/ast_builder.rb +4 -1
  16. data/lib/cucumber/core/test/case.rb +10 -6
  17. data/lib/cucumber/core/test/filters/debug_filter.rb +28 -0
  18. data/lib/cucumber/core/test/filters/tag_filter.rb +1 -1
  19. data/lib/cucumber/core/test/hooks.rb +76 -0
  20. data/lib/cucumber/core/test/mapper.rb +101 -19
  21. data/lib/cucumber/core/test/mapping.rb +15 -4
  22. data/lib/cucumber/core/test/result.rb +39 -27
  23. data/lib/cucumber/core/test/runner.rb +76 -81
  24. data/lib/cucumber/core/test/step.rb +10 -18
  25. data/lib/cucumber/core/version.rb +1 -1
  26. data/spec/cucumber/core/ast/data_table_spec.rb +12 -0
  27. data/spec/cucumber/core/ast/location_spec.rb +8 -1
  28. data/spec/cucumber/core/ast/outline_step_spec.rb +11 -4
  29. data/spec/cucumber/core/ast/step_spec.rb +2 -2
  30. data/spec/cucumber/core/compiler_spec.rb +6 -6
  31. data/spec/cucumber/core/gherkin/parser_spec.rb +31 -18
  32. data/spec/cucumber/core/test/case_spec.rb +24 -24
  33. data/spec/cucumber/core/test/hooks_spec.rb +30 -0
  34. data/spec/cucumber/core/test/mapper_spec.rb +115 -1
  35. data/spec/cucumber/core/test/mapping_spec.rb +22 -6
  36. data/spec/cucumber/core/test/result_spec.rb +0 -8
  37. data/spec/cucumber/core/test/runner_spec.rb +31 -97
  38. data/spec/cucumber/core/test/step_spec.rb +24 -16
  39. data/spec/cucumber/core_spec.rb +109 -16
  40. data/spec/report_api_spy.rb +24 -0
  41. metadata +32 -28
  42. data/lib/cucumber/core/test/hook_compiler.rb +0 -109
  43. data/spec/cucumber/core/test/hook_compiler_spec.rb +0 -78
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4c30d51fa9f12c4fb7b91a14006a9a308b652cf0
4
- data.tar.gz: cb60c3d4d610070a1e8344388900dfb553a10de4
3
+ metadata.gz: 42d388993761b2490490288cb0af4349a6688985
4
+ data.tar.gz: 483157a428ced0dfb4bbb69c31b2dba8247bde19
5
5
  SHA512:
6
- metadata.gz: e34a846062bf14159235cbe27829195e940fc57b465f69b750835fc5b2ffdd41e930e287be8ea2742c300c0ed9ecc093dcb5eca173b1b5da60e1eebd96d21494
7
- data.tar.gz: fd76c152cc8183f86482f41262ef858b4efb3df34b946a179c2de3e157a7bca52020fa5adff880c975fb775356f06203a5204ee410e6e58db68fa487f81984b8
6
+ metadata.gz: 2f676d49732572d9204ee72274dd3d2372a3b4e791281ca83057be310776a9878874d4c7e553ddd472a52c11db93e69eae2b94b87b9fc9a41fb616756ea5f7c5
7
+ data.tar.gz: 1d0948e3b3701c2bffe59253bd8167794700c20907e569e4dd2c2bcbbf8368ec8ba954067563906e81fbdc43ba1da8833826d1c00cfe5f1af6ac505b40f45159
data/.travis.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  rvm:
2
- - 2.1.0
2
+ - 2.1
3
3
  - 2.0.0
4
4
  - 1.9.3
5
5
  - jruby
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
18
18
 
19
19
  s.add_development_dependency 'bundler', '>= 1.3.5'
20
20
  s.add_development_dependency 'rake', '>= 0.9.2'
21
- s.add_development_dependency 'rspec', '>= 2.13'
21
+ s.add_development_dependency 'rspec', '~> 3'
22
22
  s.add_development_dependency 'unindent', '>= 1.0'
23
23
 
24
24
  # For coverage reports
data/lib/cucumber/core.rb CHANGED
@@ -2,7 +2,7 @@ require 'cucumber/core/gherkin/parser'
2
2
  require 'cucumber/core/compiler'
3
3
  require 'cucumber/core/test/runner'
4
4
  require 'cucumber/core/test/mapper'
5
- require 'cucumber/core/test/hook_compiler'
5
+ require 'cucumber/core/test/filters/debug_filter'
6
6
 
7
7
  module Cucumber
8
8
  module Core
@@ -17,7 +17,7 @@ module Cucumber
17
17
  end
18
18
 
19
19
  def compile(gherkin_documents, last_receiver, filters = [])
20
- first_receiver = filters.reduce(last_receiver) do |receiver, (filter_type, args)|
20
+ first_receiver = filters.reverse.reduce(last_receiver) do |receiver, (filter_type, args)|
21
21
  filter_type.new(*args + [receiver])
22
22
  end
23
23
  compiler = Compiler.new(first_receiver)
@@ -25,10 +25,10 @@ module Cucumber
25
25
  self
26
26
  end
27
27
 
28
- def execute(gherkin_documents, mappings, report, filters = [], run_options = {})
29
- receiver = Test::Runner.new(report, run_options)
30
- filters << [Test::HookCompiler, [mappings]]
31
- filters << [Test::Mapper, [mappings]]
28
+ def execute(gherkin_documents, mapping_definition, report, filters = [], run_options = {})
29
+ receiver = Test::Runner.new(report)
30
+ filters << [Test::Mapper, [mapping_definition]]
31
+ filters << [Test::DebugFilter, []] if run_options[:debug]
32
32
  compile gherkin_documents, receiver, filters
33
33
  self
34
34
  end
@@ -204,6 +204,10 @@ module Cucumber
204
204
  columns[col].__send__(:width)
205
205
  end
206
206
 
207
+ def each_cell(&proc)
208
+ cell_matrix.each{ |row| row.each(&proc) }
209
+ end
210
+
207
211
  def ==(other)
208
212
  other.class == self.class && raw == other.raw
209
213
  end
@@ -311,6 +315,10 @@ module Cucumber
311
315
  @value = "(i) #{value.inspect}"
312
316
  end
313
317
 
318
+ def ==(o)
319
+ value == o.value
320
+ end
321
+
314
322
  # For testing only
315
323
  def to_sexp #:nodoc:
316
324
  [:cell, @value]
@@ -3,7 +3,7 @@ module Cucumber
3
3
  module Ast
4
4
  module DescribesItself
5
5
  def describe_to(visitor, *args)
6
- visitor.send(description_for_visitors, self, *args) do |child_visitor=visitor|
6
+ visitor.send(description_for_visitors, self, *args) do |child_visitor|
7
7
  children.each do |child|
8
8
  child.describe_to(child_visitor, *args)
9
9
  end
@@ -1,21 +1,27 @@
1
1
  require 'cucumber/initializer'
2
2
  require 'cucumber/core/ast/describes_itself'
3
3
  require 'cucumber/core/ast/location'
4
+ require 'cucumber/core/ast/names'
4
5
 
5
6
  module Cucumber
6
7
  module Core
7
8
  module Ast
8
9
 
9
10
  class ExamplesTable
11
+ include Names
10
12
  include HasLocation
11
13
  include DescribesItself
12
14
 
13
- attr_reader :header, :keyword, :name, :tags, :comments
15
+ attr_reader :header, :keyword, :tags, :comments, :location
14
16
 
15
17
  include Cucumber.initializer(
16
- :location, :comments, :tags, :keyword, :name, :description, :header, :example_rows
18
+ :location, :comments, :tags, :keyword, :title, :description, :header, :example_rows
17
19
  )
18
20
 
21
+ def gherkin_statement(node=nil)
22
+ @gherkin_statement ||= node
23
+ end
24
+
19
25
  private
20
26
 
21
27
  def description_for_visitors
@@ -19,11 +19,10 @@ module Cucumber
19
19
  include Cucumber.initializer(:location, :background, :comments, :tags, :keyword, :title, :description, :feature_elements)
20
20
  def initialize(*)
21
21
  super
22
- feature_elements.each { |e| e.feature = self }
23
22
  end
24
23
 
25
- def gherkin_statement(statement=nil)
26
- @gherkin_statement ||= statement
24
+ def gherkin_statement(node = nil)
25
+ @gherkin_statement ||= node
27
26
  end
28
27
 
29
28
  def children
@@ -1,4 +1,5 @@
1
1
  require 'forwardable'
2
+ require 'cucumber/core/platform'
2
3
  module Cucumber
3
4
  module Core
4
5
  module Ast
@@ -26,6 +27,10 @@ module Cucumber
26
27
  [filepath.to_s, lines.to_s].reject { |v| v == WILDCARD.to_s }.join(":")
27
28
  end
28
29
 
30
+ def hash
31
+ self.class.hash ^ to_s.hash
32
+ end
33
+
29
34
  def to_str
30
35
  to_s
31
36
  end
@@ -49,14 +54,16 @@ module Cucumber
49
54
  end
50
55
 
51
56
  require 'set'
52
- class Lines
57
+ class Lines < Struct.new(:data)
58
+ protected :data
53
59
  attr_reader :line
60
+
54
61
  def initialize(line)
55
62
  if Cucumber::JRUBY && line.is_a?(::Java::GherkinFormatterModel::Range)
56
63
  line = Range.new(line.first, line.last)
57
64
  end
58
65
  @line = line
59
- @data = Array(line).to_set
66
+ super Array(line).to_set
60
67
  end
61
68
 
62
69
  def include?(other)
@@ -68,14 +75,12 @@ module Cucumber
68
75
  boundary.join('..')
69
76
  end
70
77
 
71
- def ==(other)
72
- other.data == data
78
+ def inspect
79
+ "<#{self.class}: #{to_s}>"
73
80
  end
74
81
 
75
82
  protected
76
83
 
77
- attr_reader :data
78
-
79
84
  def boundary
80
85
  first_and_last(value).uniq
81
86
  end
@@ -2,9 +2,18 @@ module Cucumber
2
2
  module Core
3
3
  module Ast
4
4
  module Names
5
- attr_reader :title, :description
5
+ attr_reader :description
6
6
 
7
7
  def name
8
+ title
9
+ end
10
+
11
+ def title
12
+ warn("deprecated. Use #name")
13
+ @title
14
+ end
15
+
16
+ def legacy_conflated_name_and_description
8
17
  s = @title
9
18
  s += "\n#{@description}" if @description != ""
10
19
  s
@@ -15,14 +15,17 @@ module Cucumber
15
15
  def initialize(language, location, keyword, name, multiline_arg)
16
16
  @language, @location, @keyword, @name, @multiline_arg = language, location, keyword, name, multiline_arg
17
17
  @language || raise("Language is required!")
18
+ @gherkin_statement = nil
18
19
  end
19
20
 
20
- def gherkin_statement(statement=nil)
21
- @gherkin_statement ||= statement
21
+ def gherkin_statement(node = nil)
22
+ @gherkin_statement ||= node
22
23
  end
23
24
 
24
25
  def to_step(row)
25
- Ast::Step.new(language, location, keyword, row.expand(name), replace_multiline_arg(row))
26
+ step = Ast::Step.new(language, location, keyword, row.expand(name), replace_multiline_arg(row))
27
+ step.gherkin_statement(@gherkin_statement)
28
+ step
26
29
  end
27
30
 
28
31
  private
@@ -13,7 +13,6 @@ module Cucumber
13
13
  include DescribesItself
14
14
 
15
15
  attr_reader :feature_tags
16
- attr_accessor :feature
17
16
  attr_reader :comments, :tags, :keyword, :background, :title, :location, :gherkin_statement
18
17
 
19
18
  include Cucumber.initializer(:gherkin_statement, :language, :location, :background, :comments, :tags, :feature_tags, :keyword, :title, :description, :raw_steps)
@@ -13,7 +13,6 @@ module Cucumber
13
13
 
14
14
  MissingExamples = Class.new(StandardError)
15
15
 
16
- attr_accessor :feature
17
16
  attr_reader :feature_tags
18
17
 
19
18
  attr_reader :line
@@ -23,8 +22,8 @@ module Cucumber
23
22
 
24
23
  attr_reader :comments, :tags, :keyword, :background, :location
25
24
 
26
- def gherkin_statement(node)
27
- @gherkin_statement = node
25
+ def gherkin_statement(node = nil)
26
+ @gherkin_statement ||= node
28
27
  end
29
28
 
30
29
  private
@@ -14,8 +14,8 @@ module Cucumber
14
14
  @location, @keyword, @name, @multiline_arg = location, keyword, name, multiline_arg
15
15
  end
16
16
 
17
- def gherkin_statement(statement=nil)
18
- @gherkin_statement ||= statement
17
+ def gherkin_statement(node = nil)
18
+ @gherkin_statement ||= node
19
19
  end
20
20
 
21
21
  def to_sexp
@@ -224,6 +224,7 @@ module Cucumber
224
224
 
225
225
  class ScenarioOutlineBuilder < Builder
226
226
  def result(background, language, feature_tags)
227
+ raise ParseError.new("Missing Examples section for Scenario Outline at #{location}") if examples_tables.empty?
227
228
  scenario_outline = Ast::ScenarioOutline.new(
228
229
  language,
229
230
  location,
@@ -266,7 +267,7 @@ module Cucumber
266
267
  class ExamplesTableBuilder < Builder
267
268
 
268
269
  def result
269
- Ast::ExamplesTable.new(
270
+ examples_table = Ast::ExamplesTable.new(
270
271
  location,
271
272
  comments,
272
273
  tags,
@@ -276,6 +277,8 @@ module Cucumber
276
277
  header,
277
278
  example_rows
278
279
  )
280
+ examples_table.gherkin_statement(node)
281
+ examples_table
279
282
  end
280
283
 
281
284
  private
@@ -12,8 +12,12 @@ module Cucumber
12
12
  super(test_steps, source, around_hooks)
13
13
  end
14
14
 
15
+ def step_count
16
+ test_steps.count
17
+ end
18
+
15
19
  def describe_to(visitor, *args)
16
- visitor.test_case(self, *args) do |child_visitor=visitor|
20
+ visitor.test_case(self, *args) do |child_visitor|
17
21
  compose_around_hooks(child_visitor, *args) do
18
22
  test_steps.each do |test_step|
19
23
  test_step.describe_to(child_visitor, *args)
@@ -24,7 +28,7 @@ module Cucumber
24
28
  end
25
29
 
26
30
  def describe_source_to(visitor, *args)
27
- source.each do |node|
31
+ source.reverse.each do |node|
28
32
  node.describe_to(visitor, *args)
29
33
  end
30
34
  self
@@ -101,19 +105,19 @@ module Cucumber
101
105
  end
102
106
 
103
107
  def scenario_outline(outline)
104
- @result = "#{outline.keyword}: #{outline.name}"
108
+ @result = "#{outline.keyword}: #{outline.name}" + @result
105
109
  self
106
110
  end
107
111
 
108
112
  def examples_table(table)
109
113
  name = table.name.strip
110
114
  name = table.keyword if name.length == 0
111
- @result << ", #{name}"
115
+ @result = ", #{name}" + @result
112
116
  self
113
117
  end
114
118
 
115
119
  def examples_table_row(row)
116
- @result << " (row #{row.number})"
120
+ @result = " (row #{row.number})"
117
121
  self
118
122
  end
119
123
  end
@@ -128,7 +132,7 @@ module Cucumber
128
132
 
129
133
  [:feature, :scenario, :scenario_outline, :examples_table].each do |node_name|
130
134
  define_method(node_name) do |node|
131
- @result += node.tags
135
+ @result = node.tags + @result
132
136
  self
133
137
  end
134
138
  end
@@ -0,0 +1,28 @@
1
+ module Cucumber
2
+ module Core
3
+ module Test
4
+ class DebugFilter
5
+ def initialize(receiver)
6
+ @receiver = receiver
7
+ end
8
+
9
+ def test_case(test_case, &descend)
10
+ p [:test_case, test_case.source.last.class, test_case.location.to_s]
11
+ descend.call(self)
12
+ test_case.describe_to @receiver
13
+ self
14
+ end
15
+
16
+ def test_step(test_step)
17
+ p [:test_step, test_step.source.last.class, test_step.location.to_s]
18
+ self
19
+ end
20
+
21
+ def done
22
+ @receiver.done
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+
@@ -49,7 +49,7 @@ module Cucumber
49
49
  class TagLimits
50
50
  TAG_MATCHER = /^
51
51
  (?:~)? #The tag negation symbol "~". This is optional and not captured.
52
- (?<tag_name>\@[\w\d]+) #Captures the tag name including the "@" symbol.
52
+ (?<tag_name>\@\w+) #Captures the tag name including the "@" symbol.
53
53
  \: #The seperator, ":", between the tag name and the limit.
54
54
  (?<limit>\d+) #Caputres the limit number.
55
55
  $/x
@@ -0,0 +1,76 @@
1
+ require 'cucumber/initializer'
2
+
3
+ module Cucumber
4
+ module Core
5
+ module Test
6
+ module Hooks
7
+
8
+ class BeforeHook
9
+ include Cucumber.initializer(:location)
10
+ public :location
11
+
12
+ def name
13
+ "Before hook"
14
+ end
15
+
16
+ def match_locations?(queried_locations)
17
+ queried_locations.any? { |other_location| other_location.match?(location) }
18
+ end
19
+
20
+ def describe_to(visitor, *args)
21
+ visitor.before_hook(self, *args)
22
+ end
23
+ end
24
+
25
+ class AfterHook
26
+ include Cucumber.initializer(:location)
27
+ public :location
28
+
29
+ def name
30
+ "After hook"
31
+ end
32
+
33
+ def match_locations?(queried_locations)
34
+ queried_locations.any? { |other_location| other_location.match?(location) }
35
+ end
36
+
37
+ def describe_to(visitor, *args)
38
+ visitor.after_hook(self, *args)
39
+ end
40
+ end
41
+
42
+ class AroundHook
43
+ def initialize(&block)
44
+ @block = block
45
+ end
46
+
47
+ def describe_to(visitor, *args, &continue)
48
+ visitor.around_hook(self, *args, &continue)
49
+ end
50
+
51
+ def call(continue)
52
+ @block.call(continue)
53
+ end
54
+ end
55
+
56
+ class AfterStepHook
57
+ include Cucumber.initializer(:location)
58
+ public :location
59
+
60
+ def name
61
+ "AfterStep hook"
62
+ end
63
+
64
+ def match_locations?(queried_locations)
65
+ queried_locations.any? { |other_location| other_location.match?(location) }
66
+ end
67
+
68
+ def describe_to(visitor, *args)
69
+ visitor.after_step_hook(self, *args)
70
+ end
71
+ end
72
+
73
+ end
74
+ end
75
+ end
76
+ end