aslakhellesoy-cucumber 0.1.16.4 → 0.1.16.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (186) hide show
  1. data/History.txt +75 -1
  2. data/Manifest.txt +58 -65
  3. data/examples/cs/features/step_definitons/calculator_steps.rb +1 -1
  4. data/examples/i18n/Rakefile +3 -3
  5. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +1 -6
  6. data/examples/i18n/da/features/step_definitons/kalkulator_steps.rb +1 -1
  7. data/examples/i18n/de/features/addition.feature +6 -6
  8. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +2 -2
  9. data/examples/i18n/en/features/addition.feature +6 -6
  10. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +2 -2
  11. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +1 -1
  12. data/examples/i18n/et/features/liitmine.feature +7 -6
  13. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +1 -1
  14. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +1 -1
  15. data/examples/i18n/fi/features/yhteenlasku.feature +2 -2
  16. data/examples/i18n/fr/features/addition.feature +2 -2
  17. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +1 -1
  18. data/examples/i18n/id/features/addition.feature +6 -6
  19. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +2 -2
  20. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +1 -1
  21. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +2 -3
  22. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +1 -1
  23. data/examples/i18n/lt/features/addition.feature +7 -6
  24. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +2 -2
  25. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +7 -7
  26. data/examples/i18n/no/features/summering.feature +1 -0
  27. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +1 -1
  28. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +1 -1
  29. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +1 -1
  30. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +2 -2
  31. data/examples/jbehave/README.textile +17 -0
  32. data/examples/jbehave/features/support/env.rb +7 -0
  33. data/examples/jbehave/features/trading.feature +24 -0
  34. data/examples/jbehave/pom.xml +48 -0
  35. data/examples/self_test/README.textile +4 -1
  36. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  37. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  38. data/examples/self_test/features/outline_sample.feature +8 -5
  39. data/examples/self_test/features/sample.feature +5 -3
  40. data/examples/self_test/features/step_definitions/sample_steps.rb +15 -3
  41. data/features/cucumber_cli.feature +199 -97
  42. data/features/cucumber_cli_outlines.feature +46 -38
  43. data/features/report_called_undefined_steps.feature +31 -0
  44. data/features/step_definitions/cucumber_steps.rb +7 -3
  45. data/features/step_definitions/extra_steps.rb +1 -1
  46. data/features/support/env.rb +1 -1
  47. data/gem_tasks/features.rake +1 -1
  48. data/gem_tasks/flog.rake +1 -1
  49. data/lib/autotest/cucumber_mixin.rb +16 -23
  50. data/lib/cucumber/ast/comment.rb +26 -0
  51. data/lib/cucumber/ast/examples.rb +22 -0
  52. data/lib/cucumber/ast/feature.rb +60 -0
  53. data/lib/cucumber/ast/features.rb +39 -0
  54. data/lib/cucumber/ast/filter.rb +22 -0
  55. data/lib/cucumber/ast/outline_table.rb +49 -0
  56. data/lib/cucumber/ast/py_string.rb +52 -0
  57. data/lib/cucumber/ast/scenario.rb +91 -0
  58. data/lib/cucumber/ast/scenario_outline.rb +83 -0
  59. data/lib/cucumber/ast/step.rb +130 -0
  60. data/lib/cucumber/ast/table.rb +214 -0
  61. data/lib/cucumber/ast/tags.rb +33 -0
  62. data/lib/cucumber/ast/visitor.rb +93 -0
  63. data/lib/cucumber/ast.rb +27 -0
  64. data/lib/cucumber/broadcaster.rb +1 -6
  65. data/lib/cucumber/cli.rb +178 -128
  66. data/lib/cucumber/core_ext/exception.rb +41 -8
  67. data/lib/cucumber/core_ext/instance_exec.rb +54 -0
  68. data/lib/cucumber/core_ext/proc.rb +29 -65
  69. data/lib/cucumber/core_ext/string.rb +19 -0
  70. data/lib/cucumber/{formatters → formatter}/ansicolor.rb +11 -10
  71. data/lib/cucumber/formatter/console.rb +116 -0
  72. data/lib/cucumber/formatter/pretty.rb +158 -0
  73. data/lib/cucumber/formatter/profile.rb +77 -0
  74. data/lib/cucumber/formatter/progress.rb +68 -0
  75. data/lib/cucumber/formatter.rb +1 -0
  76. data/lib/cucumber/formatters/autotest_formatter.rb +0 -2
  77. data/lib/cucumber/formatters/html_formatter.rb +4 -3
  78. data/lib/cucumber/formatters/pretty_formatter.rb +1 -1
  79. data/lib/cucumber/formatters/unicode.rb +3 -3
  80. data/lib/cucumber/jbehave.rb +104 -0
  81. data/lib/cucumber/languages.yml +100 -73
  82. data/lib/cucumber/parser/basic.rb +0 -0
  83. data/lib/cucumber/parser/feature.rb +1694 -0
  84. data/lib/cucumber/parser/feature.tt +206 -0
  85. data/lib/cucumber/parser/file_parser.rb +50 -0
  86. data/lib/cucumber/parser/i18n.tt +26 -0
  87. data/lib/cucumber/parser/treetop_ext.rb +9 -0
  88. data/lib/cucumber/parser.rb +27 -0
  89. data/lib/cucumber/platform.rb +3 -17
  90. data/lib/cucumber/step_definition.rb +83 -0
  91. data/lib/cucumber/step_mother.rb +128 -72
  92. data/lib/cucumber/version.rb +1 -1
  93. data/lib/cucumber.rb +56 -9
  94. data/spec/cucumber/ast/feature_factory.rb +54 -0
  95. data/spec/cucumber/ast/feature_spec.rb +60 -0
  96. data/spec/cucumber/ast/py_string_spec.rb +40 -0
  97. data/spec/cucumber/ast/scenario_outline_spec.rb +64 -0
  98. data/spec/cucumber/ast/scenario_spec.rb +82 -0
  99. data/spec/cucumber/ast/step_spec.rb +45 -0
  100. data/spec/cucumber/ast/table_spec.rb +81 -0
  101. data/spec/cucumber/broadcaster_spec.rb +4 -17
  102. data/spec/cucumber/cli_spec.rb +43 -148
  103. data/spec/cucumber/core_ext/proc_spec.rb +27 -35
  104. data/spec/cucumber/core_ext/string_spec.rb +8 -0
  105. data/spec/cucumber/{formatters → formatter}/ansicolor_spec.rb +2 -2
  106. data/spec/cucumber/formatter/html/cucumber.css +37 -0
  107. data/spec/cucumber/formatter/html/cucumber.js +11 -0
  108. data/spec/cucumber/formatter/html/index.html +45 -0
  109. data/spec/cucumber/formatter/html/jquery-1.3.min.js +19 -0
  110. data/spec/cucumber/formatter/html/jquery.uitableedit.js +100 -0
  111. data/spec/cucumber/formatters/autotest_formatter_spec.rb +1 -0
  112. data/spec/cucumber/formatters/profile_formatter_spec.rb +17 -16
  113. data/spec/cucumber/parser/feature_parser_spec.rb +247 -0
  114. data/spec/cucumber/parser/table_parser_spec.rb +48 -0
  115. data/spec/cucumber/step_definition_spec.rb +62 -0
  116. data/spec/cucumber/step_mom_spec.rb +49 -0
  117. data/spec/cucumber/treetop_parser/empty_feature.feature +1 -1
  118. data/spec/cucumber/treetop_parser/spaces.feature +3 -1
  119. data/spec/cucumber/treetop_parser/with_comments.feature +1 -1
  120. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  121. data/spec/cucumber/world/pending_spec.rb +13 -12
  122. data/spec/spec_helper.rb +1 -1
  123. metadata +59 -67
  124. data/examples/calculator_ruby_features/Rakefile +0 -6
  125. data/examples/calculator_ruby_features/features/addition.rb +0 -39
  126. data/examples/calculator_ruby_features/features/step_definitons/calculator_steps.rb +0 -43
  127. data/gem_tasks/treetop.rake +0 -41
  128. data/lib/cucumber/executor.rb +0 -205
  129. data/lib/cucumber/formatters/profile_formatter.rb +0 -92
  130. data/lib/cucumber/formatters/progress_formatter.rb +0 -61
  131. data/lib/cucumber/formatters.rb +0 -1
  132. data/lib/cucumber/model/table.rb +0 -32
  133. data/lib/cucumber/model.rb +0 -1
  134. data/lib/cucumber/step_methods.rb +0 -49
  135. data/lib/cucumber/tree/feature.rb +0 -105
  136. data/lib/cucumber/tree/features.rb +0 -21
  137. data/lib/cucumber/tree/given_scenario.rb +0 -13
  138. data/lib/cucumber/tree/scenario.rb +0 -240
  139. data/lib/cucumber/tree/step.rb +0 -173
  140. data/lib/cucumber/tree/table.rb +0 -26
  141. data/lib/cucumber/tree/top_down_visitor.rb +0 -23
  142. data/lib/cucumber/tree.rb +0 -16
  143. data/lib/cucumber/treetop_parser/feature.treetop.erb +0 -254
  144. data/lib/cucumber/treetop_parser/feature_ar.rb +0 -1951
  145. data/lib/cucumber/treetop_parser/feature_cy.rb +0 -1951
  146. data/lib/cucumber/treetop_parser/feature_da.rb +0 -1951
  147. data/lib/cucumber/treetop_parser/feature_de.rb +0 -1951
  148. data/lib/cucumber/treetop_parser/feature_en-lol.rb +0 -1951
  149. data/lib/cucumber/treetop_parser/feature_en-tx.rb +0 -1951
  150. data/lib/cucumber/treetop_parser/feature_en.rb +0 -1951
  151. data/lib/cucumber/treetop_parser/feature_es.rb +0 -1951
  152. data/lib/cucumber/treetop_parser/feature_et.rb +0 -1951
  153. data/lib/cucumber/treetop_parser/feature_fr.rb +0 -1951
  154. data/lib/cucumber/treetop_parser/feature_id.rb +0 -1951
  155. data/lib/cucumber/treetop_parser/feature_it.rb +0 -1951
  156. data/lib/cucumber/treetop_parser/feature_ja.rb +0 -1951
  157. data/lib/cucumber/treetop_parser/feature_ko.rb +0 -1951
  158. data/lib/cucumber/treetop_parser/feature_lt.rb +0 -1951
  159. data/lib/cucumber/treetop_parser/feature_nl.rb +0 -1951
  160. data/lib/cucumber/treetop_parser/feature_no.rb +0 -1951
  161. data/lib/cucumber/treetop_parser/feature_parser.rb +0 -36
  162. data/lib/cucumber/treetop_parser/feature_pl.rb +0 -1951
  163. data/lib/cucumber/treetop_parser/feature_pt.rb +0 -1951
  164. data/lib/cucumber/treetop_parser/feature_ro.rb +0 -1951
  165. data/lib/cucumber/treetop_parser/feature_ro2.rb +0 -1951
  166. data/lib/cucumber/treetop_parser/feature_ru.rb +0 -1951
  167. data/lib/cucumber/treetop_parser/feature_se.rb +0 -1951
  168. data/lib/cucumber/treetop_parser/feature_zh-CN.rb +0 -1951
  169. data/lib/cucumber/world/pending.rb +0 -22
  170. data/lib/cucumber/world.rb +0 -1
  171. data/setup.rb +0 -1585
  172. data/spec/cucumber/executor_spec.rb +0 -382
  173. data/spec/cucumber/formatters/html_formatter_spec.rb +0 -104
  174. data/spec/cucumber/formatters/pretty_formatter_spec.rb +0 -410
  175. data/spec/cucumber/formatters/progress_formatter_spec.rb +0 -81
  176. data/spec/cucumber/model/table_spec.rb +0 -32
  177. data/spec/cucumber/step_mother_spec.rb +0 -74
  178. data/spec/cucumber/tree/feature_spec.rb +0 -122
  179. data/spec/cucumber/tree/row_scenario_outline_spec.rb +0 -73
  180. data/spec/cucumber/tree/row_scenario_spec.rb +0 -55
  181. data/spec/cucumber/tree/row_step_outline_spec.rb +0 -38
  182. data/spec/cucumber/tree/scenario_outline_spec.rb +0 -50
  183. data/spec/cucumber/tree/scenario_spec.rb +0 -134
  184. data/spec/cucumber/tree/step_outline_spec.rb +0 -17
  185. data/spec/cucumber/tree/step_spec.rb +0 -59
  186. data/spec/cucumber/treetop_parser/feature_parser_spec.rb +0 -120
@@ -1,382 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'stringio'
3
-
4
- module Cucumber
5
- describe Executor do
6
-
7
- def mock_scenario(stubs = {})
8
- @scenario ||= stub("scenario", {
9
- :row? => false,
10
- :name => 'test',
11
- :accept => nil,
12
- :steps => [],
13
- :pending? => true,
14
- :outline? => false,
15
- }.merge(stubs))
16
- end
17
-
18
- def parse_features(feature_file)
19
- parser = TreetopParser::FeatureParser.new
20
- feature = parser.parse_feature(feature_file)
21
- end
22
-
23
- before do
24
- ::Term::ANSIColor.coloring = false
25
- end
26
-
27
- after do
28
- ::Term::ANSIColor.coloring = true
29
- end
30
-
31
- before do # TODO: Way more setup and duplication of lib code. Use lib code!
32
- @io = StringIO.new
33
- @step_mother = StepMother.new
34
- @executor = Executor.new(@step_mother)
35
- @formatters = Broadcaster.new [Formatters::ProgressFormatter.new(@io)]
36
- @executor.formatters = @formatters
37
- @feature_file = File.dirname(__FILE__) + '/sell_cucumbers.feature'
38
- @features = features = Tree::Features.new
39
- @feature = parse_features(@feature_file)
40
- @features << @feature
41
- end
42
-
43
- it "should pass when blocks are ok" do
44
- @step_mother.register_step_proc(/there are (\d*) cucumbers/) { |n| @n = n.to_i }
45
- @step_mother.register_step_proc(/I sell (\d*) cucumbers/) { |n| @n -= n.to_i }
46
- @step_mother.register_step_proc(/I should owe (\d*) cucumbers/) { |n| @n.should == -n.to_i }
47
- @executor.visit_features(@features)
48
- @formatters.dump
49
-
50
- @io.string.should =~ (/\.+\n+/)
51
- end
52
-
53
- it "should print filtered backtrace with feature line" do
54
- @step_mother.register_step_proc(/there are (\d*) cucumbers/) { |n| @n = n }
55
- @step_mother.register_step_proc(/I sell (\d*) cucumbers/) { |n| @n = n }
56
- @step_mother.register_step_proc(/I should owe (\d*) cucumbers/) { |n| raise "dang" }
57
- @executor.visit_features(@features)
58
- @io.string.should include(%{Failed:
59
-
60
- 1)
61
- dang
62
- #{__FILE__}:56:in `Then /I should owe (\\d*) cucumbers/'
63
- #{@feature_file}:9:in `Then I should owe 7 cucumbers'
64
- })
65
- end
66
-
67
- describe "creating a world" do
68
- module DoitExtension
69
- def doit
70
- "dunit"
71
- end
72
- end
73
-
74
- module BeatitExtension
75
- def beatit
76
- "beatenit"
77
- end
78
- end
79
-
80
- it "should yield an Object to the world proc" do
81
- @executor.register_world_proc do |world|
82
- world.extend(DoitExtension)
83
- end
84
- @executor.register_world_proc do |world|
85
- world.extend(BeatitExtension)
86
- end
87
- world = @executor.create_world
88
- world.doit.should == "dunit"
89
- world.beatit.should == "beatenit"
90
- end
91
-
92
- it "should add support for calling 'pending' from world" do
93
- world = @executor.create_world
94
-
95
- world.should respond_to(:pending)
96
- end
97
-
98
- end
99
-
100
- describe "visiting feature" do
101
-
102
- it "should set the feature file being visited" do
103
- mock_feature = mock('feature', :file => 'womble.feature', :scenarios => [])
104
- @executor.visit_feature(mock_feature)
105
-
106
- @executor.instance_variable_get('@feature_file').should == 'womble.feature'
107
- end
108
-
109
- end
110
-
111
- describe "visiting steps" do
112
- def make_regex(a,b,c)
113
- exp = "#{a}.*#{b}.*#{c}"
114
- Regexp.compile(exp)
115
- end
116
-
117
- it "should report multiple definitions as an error" do
118
- @step_mother.register_step_proc(/there are (\d*) cucumbers/) {|n|}
119
- @step_mother.register_step_proc(/there (.*) (\d*) cucumbers/) {|n|}
120
- @step_mother.register_step_proc(/I sell (\d*) cucumbers/) {|n|}
121
- @executor.visit_features(@features)
122
- @io.string.should =~ make_regex('F','_','P')
123
- end
124
-
125
- it "should report subsequent multiple definitions as an skipped" do
126
- @step_mother.register_step_proc(/there are (\d*) cucumbers/) {|n|}
127
- @step_mother.register_step_proc(/there (.*) (\d*) cucumbers/) {|n|}
128
- @step_mother.register_step_proc(/I sell (\d*) cucumbers/) {|n|}
129
- @step_mother.register_step_proc(/I sell (\d*) (.*)/) {|n|}
130
- @executor.visit_features(@features)
131
- @io.string.should =~ make_regex('F','_','P')
132
- end
133
-
134
- it "should report pending steps after failures" do
135
- @step_mother.register_step_proc(/there are (\d*) cucumbers/) {|n|}
136
- @step_mother.register_step_proc(/I sell (\d*) cucumbers/) {|n| raise "oops"}
137
- @executor.visit_features(@features)
138
- @io.string.should =~ make_regex('\.','F','P')
139
- end
140
-
141
- it "should skip passing steps after failures" do
142
- @step_mother.register_step_proc(/there are (\d*) cucumbers/) {|n|}
143
- @step_mother.register_step_proc(/I sell (\d*) cucumbers/) {|n| raise "oops"}
144
- @step_mother.register_step_proc(/I should owe (\d*) cucumbers/) {|n|}
145
- @executor.visit_features(@features)
146
- @io.string.should =~ make_regex('\.','F','_')
147
- end
148
-
149
- it "should skip failing steps after failures" do
150
- @step_mother.register_step_proc(/there are (\d*) cucumbers/) {|n|}
151
- @step_mother.register_step_proc(/I sell (\d*) cucumbers/) {|n| raise "oops"}
152
- @step_mother.register_step_proc(/I should owe (\d*) cucumbers/) {|n| raise "oops again"}
153
- @executor.visit_features(@features)
154
- @io.string.should =~ make_regex('\.','F','_')
155
- end
156
-
157
-
158
- it "should report pending steps after pending" do
159
- @step_mother.register_step_proc(/I sell (\d*) cucumbers/) {|n|}
160
- @executor.visit_features(@features)
161
- @io.string.should =~ make_regex('P','_','P')
162
- end
163
-
164
- it "should skip passing steps after pending" do
165
- @step_mother.register_step_proc(/I sell (\d*) cucumbers/) {|n|}
166
- @step_mother.register_step_proc(/I should owe (\d*) cucumbers/) {|n|}
167
- @executor.visit_features(@features)
168
- @io.string.should =~ make_regex('P','_','_')
169
- end
170
-
171
- it "should skip failing steps after pending" do
172
- @step_mother.register_step_proc(/I sell (\d*) cucumbers/) {|n| raise "oops"}
173
- @step_mother.register_step_proc(/I should owe (\d*) cucumbers/) {|n| raise "oops again"}
174
- @executor.visit_features(@features)
175
- @io.string.should =~ make_regex('P','_','_')
176
- end
177
-
178
- it "should report an ArityMismatchError" do
179
- @step_mother.register_step_proc(/there are (\d*) cucumbers/) {}
180
- @executor.visit_features(@features)
181
- @io.string.should =~ /expected 0 block argument\(s\), got 1/m
182
- end
183
-
184
- it "should fake a pass during a dry run" do
185
- steps_run = []
186
- @step_mother.register_step_proc(/there are (\d*) cucumbers/) {|n| steps_run << :g}
187
- @step_mother.register_step_proc(/I sell (\d*) cucumbers/) {|n| steps_run << :w}
188
- @step_mother.register_step_proc(/I should owe (\d*) cucumbers/) {|n| steps_run << :t}
189
- @executor.dry_run = true
190
- @executor.visit_features(@features)
191
- @io.string.should =~ (/\.+\n+/)
192
- steps_run.should be_empty
193
- end
194
- end
195
-
196
- describe "visiting step outline" do
197
-
198
- it "should trace step" do
199
- mock_formatter = mock('formatter')
200
- @executor.formatters = mock_formatter
201
- mock_step_outline = mock('step outline', :regexp_args_proc => [])
202
-
203
- mock_formatter.should_receive(:step_traced)
204
-
205
- @executor.visit_step_outline(mock_step_outline)
206
- end
207
-
208
- end
209
-
210
- describe "visit forced pending step" do
211
-
212
- before(:each) do
213
- @executor.formatters = mock('formatter', :null_object => true)
214
- end
215
-
216
- it "should store the pending exception with the step" do
217
- mock_step = mock("mock step", :regexp_args_proc => nil)
218
- pending_exception = ForcedPending.new("implement me")
219
- mock_step.stub!(:execute_in).and_raise(pending_exception)
220
-
221
- mock_step.should_receive(:'error=').with(pending_exception)
222
-
223
- @executor.visit_step(mock_step)
224
- end
225
-
226
- describe "after failed/pending step" do
227
-
228
- it "should store the pending exception with the step" do
229
- mock_step_1 = mock("mock step", :null_object => true)
230
- mock_step_2 = mock("mock step", :regexp_args_proc => nil)
231
- pending_exception = ForcedPending.new("implement me")
232
- mock_step_1.stub!(:execute_in).and_raise(StandardError)
233
- mock_step_2.stub!(:execute_in).and_raise(pending_exception)
234
-
235
- mock_step_2.should_receive(:'error=').with(pending_exception)
236
-
237
- @executor.visit_step(mock_step_1)
238
- @executor.visit_step(mock_step_2)
239
- end
240
-
241
- end
242
- end
243
-
244
- describe "visiting row scenarios" do
245
-
246
- def mock_row_scenario(stubs = {})
247
- @row_scenario ||= stub("row scenario", {
248
- :row? => true,
249
- :name => 'test',
250
- :update_table_column_widths => nil,
251
- :steps => [],
252
- :pending? => true
253
- }.merge(stubs))
254
- end
255
-
256
- %w{regular_scenario scenario_outline}.each do |regular_or_outline|
257
-
258
- before(:each) do
259
- @scenario = mock("#{regular_or_outline} scenario", :name => 'test', :at_line? => true, :pending? => false, :accept => nil)
260
-
261
- @executor.lines_for_features = Hash.new([5])
262
- @executor.send("visit_#{regular_or_outline}".to_sym, @scenario)
263
- end
264
-
265
- describe "without having first run the matching #{regular_or_outline}" do
266
-
267
- it "should run the #{regular_or_outline} before the row scenario" do
268
- pending "I really don't understand this spec. Too fancy!"
269
- @scenario.should_receive(:accept)
270
- row_scenario = mock_row_scenario(:name => 'test', :at_line? => true)
271
- row_scenario.should_receive(:accept)
272
-
273
- @executor.visit_row_scenario(row_scenario)
274
- end
275
-
276
- it "should run the row scenario after running the #{regular_or_outline}" do
277
- pending "I really don't understand this spec. Too fancy!"
278
- row_scenario = mock_row_scenario(:at_line? => true)
279
- row_scenario.should_receive(:accept)
280
- @scenario.stub!(:accept)
281
-
282
- @executor.visit_row_scenario(row_scenario)
283
- end
284
-
285
- end
286
-
287
- describe "having run matching #{regular_or_outline}" do
288
-
289
- it "should not run the regular scenario if it has already run" do
290
- @scenario.should_not_receive(:accept)
291
-
292
- @executor.visit_row_scenario(mock_row_scenario(:name => 'test', :at_line? => true, :accept => nil))
293
- end
294
-
295
- end
296
- end
297
- end
298
-
299
- describe "visiting scenarios" do
300
-
301
- it "should check if a scenario is at the specified line number" do
302
- mock_scenario = mock('scenario', :null_object => true)
303
- @executor.lines_for_features = Hash.new([1])
304
-
305
- mock_scenario.should_receive(:at_line?).with(1)
306
-
307
- @executor.visit_scenario(mock_scenario)
308
- end
309
-
310
- describe "with specific features and lines" do
311
-
312
- it "should check if a scenario is at the specified feature line number" do
313
- @executor.instance_variable_set('@feature_file', 'sell_cucumbers.feature')
314
- @executor.lines_for_features = {'sell_cucumbers.feature' => [11]}
315
-
316
- mock_scenario.should_receive(:at_line?).with(11).and_return(false)
317
-
318
- @executor.visit_scenario(mock_scenario)
319
- end
320
-
321
- it "should not check feature line numbers if --line is already set" do
322
- @executor.instance_variable_set('@feature_file', 'sell_cucumbers.feature')
323
- @executor.lines_for_features = {'sell_cucumbers.feature' => [11]}
324
- @executor.lines_for_features = Hash.new([5])
325
-
326
- mock_scenario.should_not_receive(:at_line?).with(11).and_return(false)
327
-
328
- @executor.visit_scenario(mock_scenario)
329
- end
330
-
331
- it "should not check feature line numbers if the current feature file does not have lines specified" do
332
- @executor.instance_variable_set('@feature_file', 'beetlejuice.feature')
333
- @executor.lines_for_features = {'sell_cucumbers.feature' => [11]}
334
-
335
- mock_scenario.should_not_receive(:at_line?).with(11).and_return(false)
336
-
337
- @executor.visit_scenario(mock_scenario)
338
- end
339
-
340
- end
341
-
342
- end
343
-
344
- describe "caching visited scenarios" do
345
-
346
- it "should reset cache after each feature visit" do
347
- Tree::Scenario.stub!(:new).and_return(mock_scenario)
348
-
349
- feature = Tree::Feature.new(nil)
350
- feature.add_scenario(nil, nil)
351
-
352
- @executor.visit_feature(feature)
353
-
354
- @executor.instance_variable_get("@regular_scenario_cache").should == {}
355
- @executor.instance_variable_get("@executed_scenarios").should == {}
356
- end
357
-
358
- end
359
-
360
- describe "with specified scenarios" do
361
- it "should only visit the specified scenarios" do
362
- $amounts_sold = []
363
-
364
- @step_mother.register_step_proc(/there are (\d*) cucumbers/) { |n| }
365
- @step_mother.register_step_proc(/I should owe (\d*) cucumbers/) { |n| }
366
- @step_mother.register_step_proc(/I sell (\d*) cucumbers/) { |n| $amounts_sold << n.to_i }
367
-
368
- @executor.scenario_names = ["Sell a dozen", "Sell fifty"]
369
- @executor.visit_features(@features)
370
-
371
- $amounts_sold.should == [12, 50]
372
- end
373
-
374
- it "should only visit features with specified scenarios" do
375
- @executor.scenario_names = ["Jump up and down"]
376
- @feature.should_not_receive(:accept).with(@executor)
377
- @executor.visit_features(@features)
378
- end
379
- end
380
-
381
- end
382
- end
@@ -1,104 +0,0 @@
1
- require File.dirname(__FILE__) + '/../../spec_helper'
2
- require 'stringio'
3
- require 'cucumber/tree/top_down_visitor'
4
-
5
- module Cucumber
6
- module Formatters
7
- class MiniExecutor < Cucumber::Tree::TopDownVisitor
8
- def initialize(f)
9
- @f = f
10
- end
11
-
12
- def visit_step(step)
13
- if step.regexp == //
14
- # Just make sure there are some params so we can get <span>s
15
- proc = lambda do |_|
16
- case(step.id % 3)
17
- when 0
18
- raise Pending
19
- when 1
20
- raise "This one failed"
21
- end
22
- end
23
- proc.extend(CoreExt::CallIn)
24
- proc.name = "WHATEVER"
25
- step.attach(/(\w+).*/, proc, ['xxx'])
26
- o = Object.new
27
- step.execute_in(o) rescue nil
28
- else
29
- @f.step_executed(step)
30
- end
31
- end
32
- end
33
-
34
- describe HtmlFormatter do
35
- SIMPLE_DIR = File.dirname(__FILE__) + '/../../../examples/simple'
36
-
37
- def mock_row_step(stubs = {})
38
- mock('row step', {:id => 1, :outline? => true, :regexp_args_proc => [nil, nil, nil], :visible_args => []}.merge(stubs))
39
- end
40
-
41
- def mock_step(stubs = {})
42
- mock('step', {:id => 1, :keyword => 'Given', :format => '', :regexp_args_proc => [nil, nil, nil]}.merge(stubs))
43
- end
44
-
45
- def mock_scenario_outline(stubs = {})
46
- mock('scenario outline', {:table_header => nil, :accept => nil}.merge(stubs))
47
- end
48
-
49
- before do
50
- p = Cucumber::TreetopParser::FeatureParser.new
51
- @features = Tree::Features.new
52
- Dir["#{SIMPLE_DIR}/*.feature"].each do |f|
53
- @features << p.parse_feature(f)
54
- end
55
- @io = StringIO.new
56
- step_mother = mock('step mother')
57
- @formatter = HtmlFormatter.new(@io, step_mother)
58
- @me = MiniExecutor.new(@formatter)
59
- end
60
-
61
- xit "should render HTML" do
62
- @me.visit_features(@features) # set regexp+proc+args and execute
63
- @formatter.visit_features(@features)
64
- @me.visit_features(@features) # output result of execution
65
- @formatter.dump
66
- expected_html = File.dirname(__FILE__) + '/features.html'
67
- #File.open(expected_html, 'w') {|io| io.write(@io.string)}
68
- @io.string.should eql(IO.read(expected_html))
69
- end
70
-
71
- it "should render FIT table headers" do
72
- scenario = mock('scenario', :name => 'test', :accept => nil)
73
- row_scenario = mock('row scenario', :name => 'test', :accept => nil)
74
- scenario.stub!(:table_header).and_return(['test', 'fit', 'headers'])
75
-
76
- @formatter.visit_regular_scenario(scenario)
77
- @formatter.visit_row_scenario(row_scenario)
78
-
79
- ['test', 'fit' ,'headers'].each do |column_header|
80
- @io.string.should include(column_header)
81
- end
82
- end
83
-
84
- it "should only show arguments in a row step outline that are visible" do
85
- @formatter.visit_row_step(mock_row_step(:outline? => true, :regexp_args_proc => [nil, ['mouse', 'monkey'], nil], :visible_args => ['mouse']))
86
-
87
- @io.string.should_not =~ /monkey/
88
- end
89
-
90
- it "should escape placeholders in step outline" do
91
- CGI.should_receive(:escapeHTML).with("I'm a <placeholder>")
92
-
93
- @formatter.visit_step_outline(mock_step(:format => "I'm a <placeholder>"))
94
- end
95
-
96
- it "should show Scenario Outline keyword for scenario outline" do
97
- @formatter.visit_scenario_outline(mock_scenario_outline(:name => "outline", :accept => nil))
98
-
99
- @io.string.should =~ /Scenario Outline/
100
- end
101
-
102
- end
103
- end
104
- end