kosmas58-cucumber 0.1.16.6 → 0.1.99.21

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 (248) hide show
  1. data/History.txt +126 -2
  2. data/License.txt +1 -1
  3. data/Manifest.txt +0 -270
  4. data/Rakefile +1 -1
  5. data/bin/cucumber +2 -2
  6. data/config/hoe.rb +7 -2
  7. data/examples/cs/features/step_definitons/calculator_steps.rb +1 -1
  8. data/examples/i18n/README.textile +1 -1
  9. data/examples/i18n/Rakefile +3 -3
  10. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +1 -6
  11. data/examples/i18n/da/features/step_definitons/kalkulator_steps.rb +1 -1
  12. data/examples/i18n/de/features/addition.feature +6 -6
  13. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +2 -2
  14. data/examples/i18n/en/features/addition.feature +6 -6
  15. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +2 -2
  16. data/examples/i18n/es/features/adicion.feature +11 -12
  17. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +7 -10
  18. data/examples/i18n/es/lib/calculador.rb +4 -1
  19. data/examples/i18n/et/features/liitmine.feature +7 -6
  20. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +1 -1
  21. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +1 -1
  22. data/examples/i18n/fi/features/yhteenlasku.feature +2 -2
  23. data/examples/i18n/fr/features/addition.feature +2 -2
  24. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +1 -1
  25. data/examples/i18n/id/features/addition.feature +6 -6
  26. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +2 -2
  27. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +1 -1
  28. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +2 -3
  29. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +1 -1
  30. data/examples/i18n/lt/features/addition.feature +7 -6
  31. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +2 -2
  32. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +7 -7
  33. data/examples/i18n/no/features/summering.feature +1 -0
  34. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +1 -1
  35. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +1 -1
  36. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +1 -1
  37. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +2 -2
  38. data/examples/java/src/cucumber/demo/Hello.java +16 -0
  39. data/examples/jbehave/README.textile +17 -0
  40. data/examples/jbehave/features/support/env.rb +7 -0
  41. data/examples/jbehave/features/trading.feature +24 -0
  42. data/examples/jbehave/pom.xml +48 -0
  43. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/converters/TraderConverter.java +32 -0
  44. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/model/Stock.java +42 -0
  45. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/model/Trader.java +29 -0
  46. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/persistence/TraderPersister.java +22 -0
  47. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/scenarios/TraderSteps.java +65 -0
  48. data/examples/self_test/README.textile +4 -1
  49. data/examples/{calculator_ruby_features → self_test}/Rakefile +3 -3
  50. data/examples/self_test/features/background/failing_background.feature +10 -0
  51. data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
  52. data/examples/self_test/features/background/multiline_args_background.feature +32 -0
  53. data/examples/self_test/features/background/passing_background.feature +10 -0
  54. data/examples/self_test/features/background/pending_background.feature +10 -0
  55. data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
  56. data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
  57. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  58. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  59. data/examples/self_test/features/outline_sample.feature +11 -5
  60. data/examples/self_test/features/sample.feature +8 -3
  61. data/examples/self_test/features/step_definitions/sample_steps.rb +53 -4
  62. data/examples/self_test/features/support/env.rb +1 -0
  63. data/examples/self_test/features/support/tag_count_formatter.rb +25 -0
  64. data/examples/tickets/features/172.feature +28 -0
  65. data/examples/tickets/features/177/1.feature +29 -0
  66. data/examples/tickets/features/177/2.feature +21 -0
  67. data/examples/tickets/features/177/3.feature +18 -0
  68. data/examples/tickets/features/180.feature +7 -0
  69. data/examples/tickets/features/scenario_outline.feature +6 -1
  70. data/examples/tickets/features/step_definitons/tickets_steps.rb +27 -3
  71. data/examples/tickets/features/tickets.feature +4 -0
  72. data/features/background.feature +223 -0
  73. data/features/cucumber_cli.feature +218 -98
  74. data/features/cucumber_cli_outlines.feature +54 -37
  75. data/features/custom_formatter.feature +11 -0
  76. data/features/report_called_undefined_steps.feature +32 -0
  77. data/features/step_definitions/cucumber_steps.rb +7 -3
  78. data/features/step_definitions/extra_steps.rb +1 -1
  79. data/features/support/env.rb +2 -1
  80. data/gem_tasks/flog.rake +1 -1
  81. data/gem_tasks/gemspec.rake +2 -2
  82. data/gem_tasks/jar.rake +67 -0
  83. data/lib/autotest/cucumber_mixin.rb +17 -23
  84. data/lib/cucumber.rb +63 -11
  85. data/lib/cucumber/ast.rb +29 -0
  86. data/lib/cucumber/ast/background.rb +88 -0
  87. data/lib/cucumber/ast/comment.rb +26 -0
  88. data/lib/cucumber/ast/examples.rb +26 -0
  89. data/lib/cucumber/ast/feature.rb +66 -0
  90. data/lib/cucumber/ast/features.rb +39 -0
  91. data/lib/cucumber/ast/filter.rb +22 -0
  92. data/lib/cucumber/ast/outline_table.rb +49 -0
  93. data/lib/cucumber/ast/py_string.rb +52 -0
  94. data/lib/cucumber/ast/scenario.rb +103 -0
  95. data/lib/cucumber/ast/scenario_outline.rb +92 -0
  96. data/lib/cucumber/ast/step.rb +161 -0
  97. data/lib/cucumber/ast/steps.rb +13 -0
  98. data/lib/cucumber/ast/table.rb +218 -0
  99. data/lib/cucumber/ast/tags.rb +40 -0
  100. data/lib/cucumber/ast/visitor.rb +109 -0
  101. data/lib/cucumber/broadcaster.rb +1 -6
  102. data/lib/cucumber/cli/configuration.rb +339 -0
  103. data/lib/cucumber/cli/language_help_formatter.rb +59 -0
  104. data/lib/cucumber/cli/main.rb +100 -0
  105. data/lib/cucumber/core_ext/exception.rb +41 -8
  106. data/lib/cucumber/core_ext/instance_exec.rb +54 -0
  107. data/lib/cucumber/core_ext/proc.rb +29 -65
  108. data/lib/cucumber/core_ext/string.rb +19 -0
  109. data/lib/cucumber/formatter.rb +1 -0
  110. data/lib/cucumber/{formatters → formatter}/ansicolor.rb +14 -16
  111. data/lib/cucumber/formatter/color_io.rb +17 -0
  112. data/lib/cucumber/formatter/console.rb +119 -0
  113. data/lib/cucumber/formatter/cucumber.css +55 -0
  114. data/lib/cucumber/formatter/cucumber.sass +49 -0
  115. data/lib/cucumber/formatter/html.rb +121 -0
  116. data/lib/cucumber/formatter/pretty.rb +167 -0
  117. data/lib/cucumber/formatter/profile.rb +77 -0
  118. data/lib/cucumber/formatter/progress.rb +68 -0
  119. data/lib/cucumber/formatter/rerun.rb +35 -0
  120. data/lib/cucumber/formatter/unicode.rb +35 -0
  121. data/lib/cucumber/formatters/unicode.rb +2 -35
  122. data/lib/cucumber/jbehave.rb +102 -0
  123. data/lib/cucumber/languages.yml +128 -75
  124. data/lib/cucumber/parser.rb +43 -0
  125. data/lib/cucumber/parser/basic.rb +0 -0
  126. data/lib/cucumber/parser/feature.rb +1490 -0
  127. data/lib/cucumber/parser/feature.tt +188 -0
  128. data/lib/cucumber/parser/i18n.tt +31 -0
  129. data/lib/cucumber/parser/table.rb +402 -0
  130. data/lib/cucumber/parser/table.tt +59 -0
  131. data/lib/cucumber/parser/treetop_ext.rb +75 -0
  132. data/lib/cucumber/platform.rb +3 -17
  133. data/lib/cucumber/rails/rspec.rb +5 -2
  134. data/lib/cucumber/step_definition.rb +87 -0
  135. data/lib/cucumber/step_mother.rb +151 -66
  136. data/lib/cucumber/version.rb +2 -2
  137. data/rails_generators/cucumber/USAGE +3 -2
  138. data/rails_generators/cucumber/cucumber_generator.rb +33 -23
  139. data/rails_generators/cucumber/templates/cucumber +2 -1
  140. data/rails_generators/cucumber/templates/cucumber.rake +6 -1
  141. data/rails_generators/cucumber/templates/env.rb +1 -1
  142. data/rails_generators/feature/USAGE +3 -0
  143. data/rails_generators/feature/feature_generator.rb +30 -6
  144. data/spec/cucumber/ast/background_spec.rb +58 -0
  145. data/spec/cucumber/ast/feature_factory.rb +54 -0
  146. data/spec/cucumber/ast/feature_spec.rb +60 -0
  147. data/spec/cucumber/ast/py_string_spec.rb +40 -0
  148. data/spec/cucumber/ast/scenario_outline_spec.rb +64 -0
  149. data/spec/cucumber/ast/scenario_spec.rb +82 -0
  150. data/spec/cucumber/ast/step_spec.rb +45 -0
  151. data/spec/cucumber/ast/table_spec.rb +81 -0
  152. data/spec/cucumber/ast/tags_spec.rb +23 -0
  153. data/spec/cucumber/broadcaster_spec.rb +4 -17
  154. data/spec/cucumber/cli/configuration_spec.rb +239 -0
  155. data/spec/cucumber/cli/main_spec.rb +164 -0
  156. data/spec/cucumber/core_ext/proc_spec.rb +27 -35
  157. data/spec/cucumber/core_ext/string_spec.rb +8 -0
  158. data/spec/cucumber/{formatters → formatter}/ansicolor_spec.rb +2 -2
  159. data/spec/cucumber/formatter/html/cucumber.css +37 -0
  160. data/spec/cucumber/formatter/html/cucumber.js +13 -0
  161. data/spec/cucumber/formatter/html/index.html +45 -0
  162. data/spec/cucumber/formatter/html/jquery-1.3.min.js +19 -0
  163. data/spec/cucumber/formatter/html/jquery.uitableedit.js +100 -0
  164. data/spec/cucumber/formatters/profile_formatter_spec.rb +17 -16
  165. data/spec/cucumber/parser/feature_parser_spec.rb +281 -0
  166. data/spec/cucumber/parser/table_parser_spec.rb +48 -0
  167. data/spec/cucumber/step_definition_spec.rb +62 -0
  168. data/spec/cucumber/step_mother_spec.rb +50 -51
  169. data/spec/cucumber/treetop_parser/empty_feature.feature +1 -1
  170. data/spec/cucumber/treetop_parser/scenario_outline.feature +1 -1
  171. data/spec/cucumber/treetop_parser/spaces.feature +3 -1
  172. data/spec/cucumber/treetop_parser/with_comments.feature +1 -1
  173. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  174. data/spec/cucumber/world/pending_spec.rb +13 -12
  175. data/spec/spec_helper.rb +1 -1
  176. metadata +107 -79
  177. data/examples/calculator_ruby_features/features/addition.rb +0 -39
  178. data/examples/calculator_ruby_features/features/step_definitons/calculator_steps.rb +0 -43
  179. data/gem_tasks/treetop.rake +0 -41
  180. data/lib/cucumber/cli.rb +0 -355
  181. data/lib/cucumber/executor.rb +0 -205
  182. data/lib/cucumber/formatters.rb +0 -1
  183. data/lib/cucumber/formatters/autotest_formatter.rb +0 -23
  184. data/lib/cucumber/formatters/cucumber.css +0 -132
  185. data/lib/cucumber/formatters/cucumber.js +0 -11
  186. data/lib/cucumber/formatters/html_formatter.rb +0 -152
  187. data/lib/cucumber/formatters/jquery.js +0 -32
  188. data/lib/cucumber/formatters/pretty_formatter.rb +0 -285
  189. data/lib/cucumber/formatters/profile_formatter.rb +0 -92
  190. data/lib/cucumber/formatters/progress_formatter.rb +0 -61
  191. data/lib/cucumber/model.rb +0 -1
  192. data/lib/cucumber/model/table.rb +0 -32
  193. data/lib/cucumber/step_methods.rb +0 -49
  194. data/lib/cucumber/tree.rb +0 -16
  195. data/lib/cucumber/tree/feature.rb +0 -105
  196. data/lib/cucumber/tree/features.rb +0 -21
  197. data/lib/cucumber/tree/given_scenario.rb +0 -13
  198. data/lib/cucumber/tree/scenario.rb +0 -240
  199. data/lib/cucumber/tree/step.rb +0 -173
  200. data/lib/cucumber/tree/table.rb +0 -26
  201. data/lib/cucumber/tree/top_down_visitor.rb +0 -23
  202. data/lib/cucumber/treetop_parser/feature.treetop.erb +0 -254
  203. data/lib/cucumber/treetop_parser/feature_ar.rb +0 -1951
  204. data/lib/cucumber/treetop_parser/feature_cy.rb +0 -1951
  205. data/lib/cucumber/treetop_parser/feature_da.rb +0 -1951
  206. data/lib/cucumber/treetop_parser/feature_de.rb +0 -1951
  207. data/lib/cucumber/treetop_parser/feature_en-lol.rb +0 -1951
  208. data/lib/cucumber/treetop_parser/feature_en-tx.rb +0 -1951
  209. data/lib/cucumber/treetop_parser/feature_en.rb +0 -1951
  210. data/lib/cucumber/treetop_parser/feature_es.rb +0 -1951
  211. data/lib/cucumber/treetop_parser/feature_et.rb +0 -1951
  212. data/lib/cucumber/treetop_parser/feature_fi.rb +0 -1951
  213. data/lib/cucumber/treetop_parser/feature_fr.rb +0 -1951
  214. data/lib/cucumber/treetop_parser/feature_id.rb +0 -1951
  215. data/lib/cucumber/treetop_parser/feature_it.rb +0 -1951
  216. data/lib/cucumber/treetop_parser/feature_ja.rb +0 -1951
  217. data/lib/cucumber/treetop_parser/feature_ko.rb +0 -1951
  218. data/lib/cucumber/treetop_parser/feature_lt.rb +0 -1951
  219. data/lib/cucumber/treetop_parser/feature_nl.rb +0 -1951
  220. data/lib/cucumber/treetop_parser/feature_no.rb +0 -1951
  221. data/lib/cucumber/treetop_parser/feature_parser.rb +0 -36
  222. data/lib/cucumber/treetop_parser/feature_pl.rb +0 -1951
  223. data/lib/cucumber/treetop_parser/feature_pt.rb +0 -1951
  224. data/lib/cucumber/treetop_parser/feature_ro.rb +0 -1951
  225. data/lib/cucumber/treetop_parser/feature_ro2.rb +0 -1951
  226. data/lib/cucumber/treetop_parser/feature_ru.rb +0 -1951
  227. data/lib/cucumber/treetop_parser/feature_se.rb +0 -1951
  228. data/lib/cucumber/treetop_parser/feature_zh-CN.rb +0 -1951
  229. data/lib/cucumber/world.rb +0 -1
  230. data/lib/cucumber/world/pending.rb +0 -22
  231. data/setup.rb +0 -1585
  232. data/spec/cucumber/cli_spec.rb +0 -521
  233. data/spec/cucumber/executor_spec.rb +0 -382
  234. data/spec/cucumber/formatters/autotest_formatter_spec.rb +0 -26
  235. data/spec/cucumber/formatters/features.html +0 -269
  236. data/spec/cucumber/formatters/html_formatter_spec.rb +0 -110
  237. data/spec/cucumber/formatters/pretty_formatter_spec.rb +0 -410
  238. data/spec/cucumber/formatters/progress_formatter_spec.rb +0 -81
  239. data/spec/cucumber/model/table_spec.rb +0 -32
  240. data/spec/cucumber/tree/feature_spec.rb +0 -122
  241. data/spec/cucumber/tree/row_scenario_outline_spec.rb +0 -73
  242. data/spec/cucumber/tree/row_scenario_spec.rb +0 -55
  243. data/spec/cucumber/tree/row_step_outline_spec.rb +0 -38
  244. data/spec/cucumber/tree/scenario_outline_spec.rb +0 -50
  245. data/spec/cucumber/tree/scenario_spec.rb +0 -134
  246. data/spec/cucumber/tree/step_outline_spec.rb +0 -17
  247. data/spec/cucumber/tree/step_spec.rb +0 -59
  248. data/spec/cucumber/treetop_parser/feature_parser_spec.rb +0 -120
@@ -1,521 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'yaml'
3
-
4
- module Cucumber
5
- describe CLI do
6
-
7
- def mock_executor(stubs = {})
8
- stub('executor', {:visit_features => nil, :lines_for_features= => nil, :failed => false, :formatters= => nil}.merge(stubs))
9
- end
10
-
11
- def mock_broadcaster(stubs = {})
12
- stub(Broadcaster, {:register => nil}.merge(stubs))
13
- end
14
-
15
- def mock_features(stubs ={})
16
- stub('features', {:<< => nil}.merge(stubs))
17
- end
18
-
19
- before(:each) do
20
- Kernel.stub!(:exit).and_return(nil)
21
- end
22
-
23
- def given_cucumber_yml_defined_as(hash_or_string)
24
- File.stub!(:exist?).and_return(true)
25
- cucumber_yml = hash_or_string.is_a?(Hash) ? hash_or_string.to_yaml : hash_or_string
26
- IO.stub!(:read).with('cucumber.yml').and_return(cucumber_yml)
27
- end
28
-
29
- it "should expand args from YAML file" do
30
- cli = CLI.new
31
-
32
- given_cucumber_yml_defined_as({'bongo' => '--require from/yml'})
33
-
34
- cli.parse_options!(%w{--format progress --profile bongo})
35
- cli.options[:formats].should == {'progress' => [STDOUT]}
36
- cli.options[:require].should == ['from/yml']
37
- end
38
-
39
- it "should expand args from YAML file's default if there are no args" do
40
- cli = CLI.new
41
-
42
- given_cucumber_yml_defined_as({'default' => '--require from/yml'})
43
-
44
- cli.parse_options!([])
45
- cli.options[:require].should == ['from/yml']
46
- end
47
-
48
- it "should provide a helpful error message when a specified profile does not exists in YAML file" do
49
- cli = CLI.new(StringIO.new, error = StringIO.new)
50
-
51
- given_cucumber_yml_defined_as({'default' => '--require from/yml', 'html_report' => '--format html'})
52
-
53
- cli.parse_options!(%w{--profile i_do_not_exist})
54
-
55
- expected_message = <<-END_OF_MESSAGE
56
- Could not find profile: 'i_do_not_exist'
57
-
58
- Defined profiles in cucumber.yml:
59
- * default
60
- * html_report
61
- END_OF_MESSAGE
62
-
63
- error.string.should == expected_message
64
- end
65
-
66
- it "should provide a helpful error message when a specified profile is not a String" do
67
- cli = CLI.new(StringIO.new, error = StringIO.new)
68
-
69
- given_cucumber_yml_defined_as({'foo' => [1,2,3]})
70
-
71
- cli.parse_options!(%w{--profile foo})
72
-
73
- error.string.should == "Profiles must be defined as a String. The 'foo' profile was [1, 2, 3] (Array).\n"
74
- end
75
-
76
- it "should provide a helpful error message when a specified profile exists but is nil or blank" do
77
- [nil, ' '].each do |bad_input|
78
- cli = CLI.new(StringIO.new, error = StringIO.new)
79
-
80
- given_cucumber_yml_defined_as({'foo' => bad_input})
81
-
82
- cli.parse_options!(%w{--profile foo})
83
-
84
- error.string.should match(/The 'foo' profile in cucumber.yml was blank. Please define the command line arguments for the 'foo' profile in cucumber.yml./)
85
- end
86
- end
87
-
88
- it "should provide a helpful error message when no YAML file exists and a profile is specified" do
89
- cli = CLI.new(StringIO.new, error = StringIO.new)
90
-
91
- File.should_receive(:exist?).with('cucumber.yml').and_return(false)
92
-
93
- cli.parse_options!(%w{--profile i_do_not_exist})
94
-
95
- error.string.should match(/cucumber.yml was not found. Please refer to cucumber's documentaion on defining profiles in cucumber.yml./)
96
- end
97
-
98
- it "should provide a helpful error message when cucumber.yml is blank or malformed" do
99
- expected_error_message = /cucumber.yml was found, but was blank or malformed. Please refer to cucumber's documentaion on correct profile usage./
100
-
101
- ['', 'sfsadfs', "--- \n- an\n- array\n", "---dddfd"].each do |bad_input|
102
- cli = CLI.new(StringIO.new, error = StringIO.new)
103
-
104
- given_cucumber_yml_defined_as(bad_input)
105
- cli.parse_options!([])
106
-
107
- error.string.should match(expected_error_message)
108
- end
109
- end
110
-
111
- it "should procide a helpful error message when the YAML can not be parsed" do
112
- expected_error_message = /cucumber.yml was found, but could not be parsed. Please refer to cucumber's documentaion on correct profile usage./
113
- cli = CLI.new(StringIO.new, error = StringIO.new)
114
-
115
- given_cucumber_yml_defined_as("input that causes an exception in YAML loading")
116
- YAML.should_receive(:load).and_raise Exception
117
-
118
- cli.parse_options!([])
119
-
120
- error.string.should match(expected_error_message)
121
- end
122
-
123
- it "should accept --dry-run option" do
124
- cli = CLI.new
125
- cli.parse_options!(%w{--dry-run})
126
- cli.options[:dry_run].should be_true
127
- mock_executor = mock_executor()
128
- mock_executor.should_receive(:dry_run=).with(true)
129
- cli.execute!(stub('step mother'), mock_executor, mock_features)
130
- end
131
-
132
- it "should accept --no-source option" do
133
- cli = CLI.new
134
- cli.parse_options!(%w{--no-source})
135
-
136
- cli.options[:source].should be_false
137
- end
138
-
139
- it "should accept --no-snippets option" do
140
- cli = CLI.new
141
- cli.parse_options!(%w{--no-snippets})
142
-
143
- cli.options[:snippets].should be_false
144
- end
145
-
146
- it "should accept --quiet option" do
147
- cli = CLI.new
148
- cli.parse_options!(%w{--quiet})
149
-
150
- cli.options[:snippets].should be_false
151
- cli.options[:source].should be_false
152
- end
153
-
154
- it "should accept --verbose option" do
155
- cli = CLI.new
156
- cli.parse_options!(%w{--verbose})
157
-
158
- cli.options[:verbose].should be_true
159
- end
160
-
161
- it "should require files in support paths first" do
162
- File.stub!(:directory?).and_return(true)
163
- Dir.stub!(:[]).and_return(["/features/step_definitions/foo.rb","/features/support/env.rb"])
164
-
165
- cli = CLI.new(StringIO.new)
166
- cli.parse_options!(%w{--require /features})
167
-
168
- cli.should_receive(:require).twice.with(/treetop_parser/).ordered
169
- cli.should_receive(:require).with("/features/support/env.rb").ordered
170
- cli.should_receive(:require).with("/features/step_definitions/foo.rb").ordered
171
- cli.should_receive(:require).with("spec/expectations/differs/default").ordered
172
-
173
- cli.execute!(stub('step mother'), mock_executor, mock_features)
174
- end
175
-
176
- describe "verbose mode" do
177
-
178
- before(:each) do
179
- @out = StringIO.new
180
- @cli = CLI.new(@out)
181
- @cli.stub!(:require)
182
- Dir.stub!(:[])
183
- end
184
-
185
- it "should show ruby files required" do
186
- @cli.parse_options!(%w{--verbose --require example.rb})
187
- @cli.execute!(stub('step mother'), mock_executor, mock_features)
188
-
189
- @out.string.should include('example.rb')
190
- end
191
-
192
- it "should show feature files parsed" do
193
- TreetopParser::FeatureParser.stub!(:new).and_return(mock("feature parser", :parse_feature => nil))
194
-
195
- @cli.parse_options!(%w{--verbose example.feature})
196
- @cli.execute!(stub('step mother'), mock_executor, mock_features)
197
-
198
- @out.string.should include('example.feature')
199
- end
200
-
201
- end
202
-
203
- it "should accept --out option" do
204
- cli = CLI.new
205
- File.should_receive(:open).with('jalla.txt', 'w')
206
- cli.parse_options!(%w{--out jalla.txt})
207
- end
208
-
209
- it "should accept multiple --out options" do
210
- cli = CLI.new
211
- mock_file1 = stub(File, :open => nil)
212
- mock_file2 = stub(File, :open => nil)
213
- File.stub!(:open).and_return(mock_file1, mock_file2)
214
-
215
- cli.parse_options!(%w{--format progress --out file1 --out file2})
216
- cli.options[:formats].should == {'progress' => [mock_file1, mock_file2]}
217
- end
218
-
219
- it "should accept multiple --format options" do
220
- cli = CLI.new
221
- cli.parse_options!(%w{--format pretty --format progress})
222
- cli.options[:formats].should have_key('pretty')
223
- cli.options[:formats].should have_key('progress')
224
- end
225
-
226
- it "should associate --out to previous --format" do
227
- cli = CLI.new
228
- mock_file1 = stub(File, :open => nil)
229
- mock_file2 = stub(File, :open => nil)
230
- File.stub!(:open).and_return(mock_file1, mock_file2)
231
-
232
- cli.parse_options!(%w{--format progress --out file1 --format profile --out file2})
233
- cli.options[:formats].should == {'progress' => [mock_file1], 'profile' => [mock_file2]}
234
- end
235
-
236
- it "should allow a single formatter to have STDOUT and a file" do
237
- cli = CLI.new
238
- mock_file = stub(File, :open => nil)
239
- File.stub!(:open).and_return(mock_file)
240
-
241
- cli.parse_options!(%w{--format progress --format progress --out file})
242
- cli.options[:formats].should == {'progress' => [STDOUT, mock_file]}
243
- end
244
-
245
- it "should register --out files with an output broadcaster" do
246
- cli = CLI.new
247
- mock_file = stub(File)
248
- File.stub!(:open).and_return(mock_file)
249
- mock_output_broadcaster = mock_broadcaster
250
- Broadcaster.stub!(:new).and_return(mock_broadcaster, mock_output_broadcaster)
251
-
252
- mock_output_broadcaster.should_receive(:register).with(mock_file)
253
- cli.parse_options!(%w{--out test.file})
254
-
255
- cli.execute!(stub('step mother'), mock_executor, stub('features'))
256
- end
257
-
258
- it "should register --formatters with the formatter broadcaster" do
259
- cli = CLI.new
260
- mock_progress_formatter = stub(Formatters::ProgressFormatter)
261
- Formatters::ProgressFormatter.stub!(:new).and_return(mock_progress_formatter)
262
- mock_formatter_broadcaster = mock_broadcaster
263
- Broadcaster.stub!(:new).and_return(mock_formatter_broadcaster, mock_broadcaster)
264
-
265
- mock_formatter_broadcaster.should_receive(:register).with(mock_progress_formatter)
266
- cli.parse_options!(%w{--format progress})
267
-
268
- cli.execute!(stub('step mother'), mock_executor, stub('features'))
269
- end
270
-
271
- it "should setup the executor with the formatter broadcaster" do
272
- cli = CLI.new
273
- broadcaster = Broadcaster.new
274
- Broadcaster.stub!(:new).and_return(broadcaster)
275
- mock_executor = mock_executor()
276
- mock_executor.should_receive(:formatters=).with(broadcaster)
277
- cli.parse_options!(%w{--format progress})
278
-
279
- cli.execute!(stub('step mother'), mock_executor, stub('features'))
280
- end
281
-
282
- describe "--format with class" do
283
-
284
- describe "in module" do
285
-
286
- it "should resolve each module until it gets Formatter class" do
287
- cli = CLI.new
288
- mock_module = mock('module')
289
- cli.parse_options!(%w{--format ZooModule::MonkeyFormatterClass})
290
- Object.stub!(:const_defined?).and_return(true)
291
- mock_module.stub!(:const_defined?).and_return(true)
292
-
293
- Object.should_receive(:const_get).with('ZooModule').and_return(mock_module)
294
- mock_module.should_receive(:const_get).with('MonkeyFormatterClass').and_return(mock('formatter class', :new => nil))
295
-
296
- cli.execute!(stub('step mother'), mock_executor, stub('features'))
297
- end
298
-
299
- end
300
-
301
- describe "exists and valid constructor" do
302
-
303
- before(:each) do
304
- @mock_formatter_class = mock('formatter class')
305
- Object.stub!(:const_get).and_return(@mock_formatter_class)
306
- Object.stub!(:const_defined?).with('magical').and_return(true)
307
- end
308
-
309
- it "should create the formatter" do
310
- cli = CLI.new
311
- mock_formatter = mock('magical formatter')
312
- cli.parse_options!(%w{--format magical})
313
-
314
- @mock_formatter_class.should_receive(:new)
315
-
316
- cli.execute!(stub('step mother'), mock_executor, stub('features'))
317
- end
318
-
319
- it "should register the formatter with broadcaster" do
320
- cli = CLI.new
321
- broadcaster = Broadcaster.new
322
- mock_formatter = mock('magical formatter')
323
- Broadcaster.stub!(:new).and_return(broadcaster, stub("output broadcaster", :register => nil))
324
- @mock_formatter_class.stub!(:new).and_return(mock_formatter)
325
- cli.parse_options!(%w{--format magical})
326
-
327
- broadcaster.should_receive(:register).with(mock_formatter)
328
-
329
- cli.execute!(stub('step mother'), mock_executor, stub('features'))
330
- end
331
-
332
- end
333
-
334
- describe "exists but invalid constructor" do
335
-
336
- before(:each) do
337
- @out = StringIO.new
338
- @error = StringIO.new
339
- @cli = CLI.new(@out, @error)
340
-
341
- mock_formatter_class = stub('formatter class')
342
- mock_formatter_class.stub!(:new).and_raise("No such method")
343
- Object.stub!(:const_get).and_return(mock_formatter_class)
344
- Object.stub!(:const_defined?).with('exists_but_evil').and_return(true)
345
-
346
- @cli.parse_options!(%w{--format exists_but_evil})
347
- end
348
-
349
- it "should show exception" do
350
- Kernel.stub!(:exit)
351
-
352
- @cli.execute!(stub('step mother'), mock_executor, stub('features'))
353
-
354
- @error.string.should include("No such method")
355
- end
356
-
357
- it "should exit" do
358
- Kernel.should_receive(:exit)
359
-
360
- @cli.execute!(stub('step mother'), mock_executor, stub('features'))
361
- end
362
-
363
- end
364
-
365
- describe "non-existent" do
366
-
367
- before(:each) do
368
- @out = StringIO.new
369
- @error = StringIO.new
370
- @cli = CLI.new(@out, @error)
371
-
372
- @cli.parse_options!(%w{--format invalid})
373
- end
374
-
375
- it "should display a format error" do
376
- Kernel.stub!(:exit)
377
-
378
- @cli.execute!(stub('step mother'), mock_executor, stub('features'))
379
-
380
- @error.string.should include("Invalid format: invalid\n")
381
- end
382
-
383
- it "should display --help" do
384
- Kernel.stub!(:exit)
385
-
386
- @cli.execute!(stub('step mother'), mock_executor, stub('features'))
387
-
388
- @out.string.should include("Usage: cucumber")
389
- end
390
-
391
- it "should exit" do
392
- Kernel.should_receive(:exit)
393
-
394
- @cli.execute!(stub('step mother'), mock_executor, stub('features'))
395
- end
396
-
397
- end
398
-
399
- end
400
-
401
- it "should accept multiple --scenario options" do
402
- cli = CLI.new
403
- cli.parse_options!(['--scenario', "User logs in", '--scenario', "User signs up"])
404
- cli.options[:scenario_names].should include("User logs in")
405
- cli.options[:scenario_names].should include("User signs up")
406
- end
407
-
408
- it "should register --scenario options with the executor" do
409
- cli = CLI.new
410
- cli.parse_options!(['--scenario', "User logs in", '--scenario', "User signs up"])
411
- executor = mock_executor
412
- executor.should_receive(:scenario_names=).with(["User logs in", "User signs up"])
413
- cli.execute!(stub('step mother'), executor, stub('features'))
414
- end
415
-
416
- it "should accept --color option" do
417
- cli = CLI.new
418
- cli.parse_options!(['--color'])
419
- cli.options[:color].should == true
420
- Term::ANSIColor.should_receive(:coloring=).with(true)
421
- cli.execute!(stub('step mother'), mock_executor, stub('features'))
422
- end
423
-
424
- it "should accept --no-color option" do
425
- cli = CLI.new
426
- cli.parse_options!(['--no-color'])
427
- cli.options[:color].should == false
428
- Term::ANSIColor.should_receive(:coloring=).with(false)
429
- cli.execute!(stub('step mother'), mock_executor, stub('features'))
430
- end
431
-
432
- it "should accept --color and --no-color and use the last one" do
433
- cli = CLI.new
434
- cli.parse_options!(['--color', '--no-color'])
435
- cli.options[:color].should == false
436
- Term::ANSIColor.should_receive(:coloring=).with(false)
437
- cli.execute!(stub('step mother'), mock_executor, stub('features'))
438
- end
439
-
440
- it "should use a default color setting if no option is given" do
441
- cli = CLI.new
442
- cli.parse_options!(['--'])
443
- cli.options[:color].should == nil
444
- Term::ANSIColor.should_not_receive(:coloring=)
445
- cli.execute!(stub('step mother'), mock_executor, stub('features'))
446
- end
447
-
448
- describe "--backtrace" do
449
- before do
450
- Exception.cucumber_full_backtrace = false
451
- end
452
-
453
- it "should show full backtrace when --backtrace is present" do
454
- cli = CLI.new
455
- cli.parse_options!(['--backtrace'])
456
- begin
457
- "x".should == "y"
458
- rescue => e
459
- e.cucumber_backtrace[0].should_not == "#{__FILE__}:#{__LINE__ - 2}"
460
- end
461
- end
462
-
463
- it "should strip gems when --backtrace is absent" do
464
- cli = CLI.new
465
- cli.parse_options!(['--'])
466
- begin
467
- "x".should == "y"
468
- rescue => e
469
- e.cucumber_backtrace[0].should == "#{__FILE__}:#{__LINE__ - 2}"
470
- end
471
- end
472
-
473
- after do
474
- Exception.cucumber_full_backtrace = false
475
- end
476
- end
477
-
478
- describe "example.feature:line file arguments" do
479
-
480
- it "should extract line numbers" do
481
- cli = CLI.new
482
- cli.parse_options!(%w{example.feature:10})
483
-
484
- cli.options[:lines_for_features]['example.feature'].should == [10]
485
- end
486
-
487
- it "should remove line numbers" do
488
- cli = CLI.new
489
- cli.parse_options!(%w{example.feature:10})
490
-
491
- cli.paths.should == ["example.feature"]
492
- end
493
-
494
- it "should support multiple feature:line numbers" do
495
- cli = CLI.new
496
- cli.parse_options!(%w{example.feature:11 another_example.feature:12})
497
-
498
- cli.options[:lines_for_features].should == {'another_example.feature' => [12], 'example.feature' => [11]}
499
- end
500
-
501
- it "should accept multiple line numbers for a single feature" do
502
- cli = CLI.new
503
- cli.parse_options!(%w{example.feature:11:12})
504
-
505
- cli.options[:lines_for_features].should == {'example.feature' => [11, 12]}
506
- end
507
- end
508
-
509
- it "should search for all features in the specified directory" do
510
- cli = CLI.new
511
-
512
- cli.parse_options!(%w{feature_directory/})
513
- File.stub!(:directory?).and_return(true)
514
-
515
- Dir.should_receive(:[]).with("feature_directory/**/*.feature").any_number_of_times.and_return([])
516
-
517
- cli.execute!(stub('step mother'), mock_executor, mock_features)
518
- end
519
-
520
- end
521
- end