cucumber 1.3.10 → 2.0.0

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 (465) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.rspec +1 -1
  4. data/.travis.yml +4 -3
  5. data/CONTRIBUTING.md +9 -0
  6. data/Gemfile +9 -2
  7. data/History.md +212 -22
  8. data/LICENSE +2 -2
  9. data/README.md +4 -4
  10. data/Rakefile +10 -1
  11. data/bin/cucumber +1 -5
  12. data/cucumber.gemspec +10 -13
  13. data/cucumber.yml +14 -24
  14. data/examples/{ramaze → i18n/el}/Rakefile +1 -1
  15. data/examples/i18n/el/features/addition.feature +17 -0
  16. data/examples/i18n/el/features/division.feature +10 -0
  17. data/examples/i18n/el/features/step_definitions/calculator_steps.rb +24 -0
  18. data/examples/i18n/el/lib/calculator.rb +14 -0
  19. data/examples/i18n/fr/Rakefile +3 -1
  20. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +2 -2
  21. data/examples/i18n/ht/Rakefile +6 -0
  22. data/examples/i18n/ht/features/adisyon.feature +17 -0
  23. data/examples/i18n/ht/features/divizyon.feature +10 -0
  24. data/examples/i18n/ht/features/step_definitions/kalkilatris_steps.rb +25 -0
  25. data/examples/i18n/ht/lib/kalkilatris.rb +14 -0
  26. data/examples/i18n/zh-CN/features/{step_definitons → step_definitions}/calculator_steps.rb +4 -4
  27. data/examples/tcl/features/step_definitions/fib_steps.rb +1 -1
  28. data/{legacy_features → features/docs}/api/list_step_defs_as_json.feature +14 -14
  29. data/{legacy_features → features/docs}/api/run_cli_main_with_existing_runtime.feature +5 -10
  30. data/features/{backtraces.feature → docs/cli/backtraces.feature} +2 -2
  31. data/features/docs/cli/dry_run.feature +73 -0
  32. data/features/docs/cli/exclude_files.feature +18 -0
  33. data/features/docs/cli/execute_with_tag_filter.feature +117 -0
  34. data/features/docs/cli/randomize.feature +46 -0
  35. data/features/docs/cli/require.feature +27 -0
  36. data/features/docs/cli/run_scenarios_matching_name.feature +104 -0
  37. data/features/docs/cli/run_specific_scenarios.feature +75 -0
  38. data/features/docs/cli/showing_differences.feature +43 -0
  39. data/features/docs/cli/specifying_multiple_formatters.feature +44 -0
  40. data/features/docs/cli/strict_mode.feature +64 -0
  41. data/features/{nested_steps.feature → docs/defining_steps/nested_steps.feature} +52 -6
  42. data/features/{nested_steps_i18n.feature → docs/defining_steps/nested_steps_i18n.feature} +0 -2
  43. data/features/{step_definitions.feature → docs/defining_steps/one_line_step_definitions.feature} +3 -3
  44. data/features/docs/defining_steps/printing_messages.feature +148 -0
  45. data/features/docs/defining_steps/skip_scenario.feature +62 -0
  46. data/features/docs/defining_steps/snippets.feature +56 -0
  47. data/{legacy_features → features/docs/defining_steps}/table_diffing.feature +21 -16
  48. data/features/{transforms.feature → docs/defining_steps/transforms.feature} +2 -2
  49. data/{legacy_features/exception_in_after_block.feature → features/docs/exception_in_after_hook.feature} +25 -26
  50. data/{legacy_features/exception_in_after_step_block.feature → features/docs/exception_in_after_step_hook.feature} +22 -24
  51. data/features/docs/exception_in_around_hook.feature +80 -0
  52. data/{legacy_features/exception_in_before_block.feature → features/docs/exception_in_before_hook.feature} +18 -20
  53. data/features/docs/extending_cucumber/custom_filter.feature +29 -0
  54. data/features/docs/extending_cucumber/custom_formatter.feature +94 -0
  55. data/features/docs/formatters/debug_formatter.feature +47 -0
  56. data/features/{formatter_step_file_colon_line.feature → docs/formatters/formatter_step_file_colon_line.feature} +2 -4
  57. data/features/{html_formatter.feature → docs/formatters/html_formatter.feature} +10 -14
  58. data/features/docs/formatters/json_formatter.feature +760 -0
  59. data/features/docs/formatters/junit_formatter.feature +316 -0
  60. data/features/docs/formatters/pretty_formatter.feature +73 -0
  61. data/features/{progress_formatter.feature → docs/formatters/progress_formatter.feature} +1 -1
  62. data/features/docs/formatters/rerun_formatter.feature +136 -0
  63. data/features/docs/formatters/usage_formatter.feature +102 -0
  64. data/features/docs/getting_started.feature +27 -0
  65. data/features/{background.feature → docs/gherkin/background.feature} +149 -91
  66. data/features/{doc_strings.feature → docs/gherkin/doc_strings.feature} +1 -0
  67. data/features/docs/gherkin/expand_option_for_outlines.feature +46 -0
  68. data/features/docs/gherkin/language_from_header.feature +32 -0
  69. data/features/docs/gherkin/outlines.feature +158 -0
  70. data/features/docs/gherkin/unicode_table.feature +32 -0
  71. data/features/docs/gherkin/using_descriptions.feature +88 -0
  72. data/features/docs/gherkin/using_star_notation.feature +37 -0
  73. data/{legacy_features → features/docs}/post_configuration_hook.feature +17 -18
  74. data/{legacy_features → features/docs}/profiles.feature +30 -36
  75. data/{legacy_features → features/docs}/rake_task.feature +30 -41
  76. data/features/{raketask.feature → docs/raketask.feature} +6 -13
  77. data/{legacy_features/wire_protocol_erb.feature → features/docs/wire_protocol/erb_configuration.feature} +7 -8
  78. data/features/docs/wire_protocol/handle_unexpected_response.feature +30 -0
  79. data/features/docs/wire_protocol/invoke_message.feature +216 -0
  80. data/features/docs/wire_protocol/readme.md +26 -0
  81. data/features/docs/wire_protocol/snippets_message.feature +51 -0
  82. data/features/docs/wire_protocol/step_matches_message.feature +81 -0
  83. data/{legacy_features/wire_protocol_table_diffing.feature → features/docs/wire_protocol/table_diffing.feature} +19 -12
  84. data/{legacy_features/wire_protocol_tags.feature → features/docs/wire_protocol/tags.feature} +7 -7
  85. data/{legacy_features/wire_protocol_timeouts.feature → features/docs/wire_protocol/timeouts.feature} +7 -6
  86. data/{legacy_features → features/docs}/work_in_progress.feature +52 -54
  87. data/features/docs/writing_support_code/after_hooks.feature +80 -0
  88. data/{legacy_features → features/docs/writing_support_code}/around_hooks.feature +56 -28
  89. data/features/docs/writing_support_code/before_hook.feature +65 -0
  90. data/features/docs/writing_support_code/hook_order.feature +61 -0
  91. data/features/{load_path.feature → docs/writing_support_code/load_path.feature} +3 -0
  92. data/features/docs/writing_support_code/state.feature +32 -0
  93. data/features/docs/writing_support_code/tagged_hooks.feature +95 -0
  94. data/features/lib/step_definitions/aruba_steps.rb +22 -0
  95. data/features/lib/step_definitions/cucumber_steps.rb +50 -0
  96. data/features/{step_definitions → lib/step_definitions}/iso-8859-1_steps.rb +3 -15
  97. data/features/lib/step_definitions/json_steps.rb +7 -0
  98. data/features/lib/step_definitions/junit_steps.rb +13 -0
  99. data/features/lib/step_definitions/language_steps.rb +4 -5
  100. data/features/lib/step_definitions/profile_steps.rb +15 -0
  101. data/features/lib/step_definitions/ruby_steps.rb +3 -0
  102. data/features/lib/step_definitions/wire_steps.rb +58 -0
  103. data/features/lib/support/env.rb +21 -0
  104. data/{legacy_features → features/lib}/support/fake_wire_server.rb +10 -7
  105. data/features/{support → lib/support}/feature_factory.rb +1 -1
  106. data/features/lib/support/normalise_output.rb +33 -0
  107. data/gem_tasks/cov.rake +5 -0
  108. data/gem_tasks/cucumber.rake +3 -8
  109. data/gem_tasks/rspec.rake +0 -2
  110. data/lib/cucumber/ast.rb +8 -25
  111. data/lib/cucumber/cli/configuration.rb +33 -37
  112. data/lib/cucumber/cli/main.rb +14 -27
  113. data/lib/cucumber/cli/options.rb +22 -60
  114. data/lib/cucumber/cli/profile_loader.rb +1 -1
  115. data/lib/cucumber/configuration.rb +4 -0
  116. data/lib/cucumber/constantize.rb +7 -6
  117. data/lib/cucumber/core_ext/instance_exec.rb +7 -38
  118. data/lib/cucumber/core_ext/proc.rb +1 -1
  119. data/lib/cucumber/encoding.rb +5 -0
  120. data/lib/cucumber/errors.rb +21 -10
  121. data/lib/cucumber/file_specs.rb +37 -0
  122. data/lib/cucumber/filters/activate_steps.rb +33 -0
  123. data/lib/cucumber/filters/apply_after_hooks.rb +9 -0
  124. data/lib/cucumber/filters/apply_after_step_hooks.rb +12 -0
  125. data/lib/cucumber/filters/apply_around_hooks.rb +12 -0
  126. data/lib/cucumber/filters/apply_before_hooks.rb +9 -0
  127. data/lib/cucumber/filters/gated_receiver.rb +25 -0
  128. data/lib/cucumber/filters/prepare_world.rb +45 -0
  129. data/lib/cucumber/filters/quit.rb +28 -0
  130. data/lib/cucumber/filters/randomizer.rb +40 -0
  131. data/lib/cucumber/filters/tag_limits/test_case_index.rb +31 -0
  132. data/lib/cucumber/filters/tag_limits/verifier.rb +59 -0
  133. data/lib/cucumber/filters/tag_limits.rb +45 -0
  134. data/lib/cucumber/filters.rb +9 -0
  135. data/lib/cucumber/formatter/ansicolor.rb +0 -8
  136. data/lib/cucumber/formatter/console.rb +66 -36
  137. data/lib/cucumber/formatter/debug.rb +10 -8
  138. data/lib/cucumber/formatter/fanout.rb +27 -0
  139. data/lib/cucumber/formatter/gherkin_formatter_adapter.rb +122 -12
  140. data/lib/cucumber/formatter/html.rb +67 -18
  141. data/lib/cucumber/formatter/ignore_missing_messages.rb +20 -0
  142. data/lib/cucumber/formatter/interceptor.rb +17 -3
  143. data/lib/cucumber/formatter/json.rb +1 -1
  144. data/lib/cucumber/formatter/junit.rb +105 -5
  145. data/lib/cucumber/formatter/legacy_api/adapter.rb +1060 -0
  146. data/lib/cucumber/formatter/legacy_api/ast.rb +376 -0
  147. data/lib/cucumber/formatter/legacy_api/results.rb +51 -0
  148. data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +30 -0
  149. data/lib/cucumber/formatter/pretty.rb +16 -8
  150. data/lib/cucumber/formatter/progress.rb +10 -0
  151. data/lib/cucumber/formatter/rerun.rb +14 -71
  152. data/lib/cucumber/formatter/unicode.rb +8 -21
  153. data/lib/cucumber/formatter/usage.rb +7 -1
  154. data/lib/cucumber/hooks.rb +97 -0
  155. data/lib/cucumber/language_support/language_methods.rb +0 -54
  156. data/lib/cucumber/{ast/table.rb → multiline_argument/data_table.rb} +77 -84
  157. data/lib/cucumber/multiline_argument/doc_string.rb +10 -0
  158. data/lib/cucumber/multiline_argument.rb +74 -0
  159. data/lib/cucumber/platform.rb +21 -20
  160. data/lib/cucumber/project_initializer.rb +43 -0
  161. data/lib/cucumber/rake/task.rb +3 -54
  162. data/lib/cucumber/rb_support/rb_hook.rb +2 -2
  163. data/lib/cucumber/rb_support/rb_language.rb +4 -34
  164. data/lib/cucumber/rb_support/rb_step_definition.rb +11 -2
  165. data/lib/cucumber/rb_support/rb_transform.rb +3 -1
  166. data/lib/cucumber/rb_support/rb_world.rb +13 -20
  167. data/lib/cucumber/rb_support/snippet.rb +61 -20
  168. data/lib/cucumber/rspec/doubles.rb +9 -6
  169. data/lib/cucumber/running_test_case.rb +115 -0
  170. data/lib/cucumber/runtime/after_hooks.rb +24 -0
  171. data/lib/cucumber/runtime/before_hooks.rb +23 -0
  172. data/lib/cucumber/runtime/for_programming_languages.rb +14 -10
  173. data/lib/cucumber/runtime/step_hooks.rb +22 -0
  174. data/lib/cucumber/runtime/support_code.rb +78 -21
  175. data/lib/cucumber/runtime/user_interface.rb +4 -0
  176. data/lib/cucumber/runtime.rb +153 -98
  177. data/lib/cucumber/step_match.rb +27 -3
  178. data/lib/cucumber/term/ansicolor.rb +1 -9
  179. data/lib/cucumber/wire_support/wire_language.rb +23 -9
  180. data/lib/cucumber/wire_support/wire_packet.rb +1 -1
  181. data/lib/cucumber/wire_support/wire_protocol/requests.rb +13 -5
  182. data/lib/cucumber/wire_support/wire_step_definition.rb +1 -8
  183. data/lib/cucumber.rb +8 -6
  184. data/spec/cucumber/cli/configuration_spec.rb +165 -134
  185. data/spec/cucumber/cli/main_spec.rb +36 -99
  186. data/spec/cucumber/cli/options_spec.rb +238 -272
  187. data/spec/cucumber/cli/profile_loader_spec.rb +18 -7
  188. data/spec/cucumber/configuration_spec.rb +3 -3
  189. data/spec/cucumber/constantize_spec.rb +2 -1
  190. data/spec/cucumber/core_ext/instance_exec_spec.rb +4 -0
  191. data/spec/cucumber/core_ext/proc_spec.rb +32 -43
  192. data/spec/cucumber/file_specs_spec.rb +60 -0
  193. data/spec/cucumber/filters/activate_steps_spec.rb +57 -0
  194. data/spec/cucumber/filters/gated_receiver_spec.rb +47 -0
  195. data/spec/cucumber/filters/tag_limits/test_case_index_spec.rb +38 -0
  196. data/spec/cucumber/filters/tag_limits/verifier_spec.rb +57 -0
  197. data/spec/cucumber/filters/tag_limits_spec.rb +59 -0
  198. data/spec/cucumber/formatter/ansicolor_spec.rb +11 -10
  199. data/spec/cucumber/formatter/debug_spec.rb +64 -0
  200. data/spec/cucumber/formatter/duration_spec.rb +6 -6
  201. data/spec/cucumber/formatter/html_spec.rb +233 -39
  202. data/spec/cucumber/formatter/interceptor_spec.rb +38 -31
  203. data/spec/cucumber/formatter/junit_spec.rb +213 -151
  204. data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +2090 -0
  205. data/spec/cucumber/formatter/pretty_spec.rb +481 -49
  206. data/spec/cucumber/formatter/progress_spec.rb +63 -16
  207. data/spec/cucumber/formatter/rerun_spec.rb +107 -0
  208. data/spec/cucumber/formatter/spec_helper.rb +32 -17
  209. data/spec/cucumber/hooks_spec.rb +30 -0
  210. data/spec/cucumber/{ast/table_spec.rb → multiline_argument/data_table_spec.rb} +128 -208
  211. data/spec/cucumber/project_initializer_spec.rb +87 -0
  212. data/spec/cucumber/rake/forked_spec.rb +13 -22
  213. data/spec/cucumber/rb_support/rb_language_spec.rb +78 -69
  214. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +90 -44
  215. data/spec/cucumber/rb_support/rb_transform_spec.rb +24 -3
  216. data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +6 -4
  217. data/spec/cucumber/rb_support/snippet_spec.rb +47 -38
  218. data/spec/cucumber/running_test_case_spec.rb +83 -0
  219. data/spec/cucumber/runtime/for_programming_languages_spec.rb +18 -13
  220. data/spec/cucumber/runtime/support_code_spec.rb +29 -29
  221. data/spec/cucumber/runtime_spec.rb +35 -34
  222. data/spec/cucumber/step_match_spec.rb +30 -20
  223. data/spec/cucumber/wire_support/configuration_spec.rb +8 -5
  224. data/spec/cucumber/wire_support/connection_spec.rb +12 -8
  225. data/spec/cucumber/wire_support/wire_exception_spec.rb +14 -8
  226. data/spec/cucumber/wire_support/wire_language_spec.rb +8 -9
  227. data/spec/cucumber/wire_support/wire_packet_spec.rb +17 -13
  228. data/spec/cucumber/world/pending_spec.rb +36 -36
  229. data/spec/simplecov_setup.rb +18 -0
  230. data/spec/spec_helper.rb +6 -13
  231. metadata +348 -350
  232. data/.gitattributes +0 -1
  233. data/.ruby-version +0 -1
  234. data/examples/python/README.textile +0 -8
  235. data/examples/python/Rakefile +0 -4
  236. data/examples/python/features/fibonacci.feature +0 -19
  237. data/examples/python/features/step_definitions/fib_steps.py +0 -11
  238. data/examples/python/lib/fib.py +0 -7
  239. data/examples/ramaze/README.textile +0 -7
  240. data/examples/ramaze/app.rb +0 -21
  241. data/examples/ramaze/features/add.feature +0 -11
  242. data/examples/ramaze/features/step_definitions/add_steps.rb +0 -15
  243. data/examples/ramaze/features/support/env.rb +0 -32
  244. data/examples/ramaze/layout/default.html.erb +0 -8
  245. data/examples/ramaze/view/index.html.erb +0 -5
  246. data/examples/ruby2python/README.textile +0 -8
  247. data/examples/ruby2python/Rakefile +0 -4
  248. data/examples/ruby2python/features/fibonacci.feature +0 -19
  249. data/examples/ruby2python/features/step_definitions/fib_steps.rb +0 -7
  250. data/examples/ruby2python/features/support/env.rb +0 -21
  251. data/examples/ruby2python/lib/fib.py +0 -7
  252. data/examples/v8/Rakefile +0 -6
  253. data/examples/v8/features/fibonacci.feature +0 -43
  254. data/examples/v8/features/step_definitions/fib_steps.js +0 -49
  255. data/examples/v8/features/support/env.js +0 -14
  256. data/examples/v8/lib/fibonacci.js +0 -19
  257. data/features/.cucumber/stepdefs.json +0 -627
  258. data/features/assertions.feature +0 -73
  259. data/features/autoformat_profile_output.feature +0 -23
  260. data/features/before_hook.feature +0 -43
  261. data/features/bootstrap.feature +0 -27
  262. data/features/custom_formatter.feature +0 -41
  263. data/features/drb_server_integration.feature +0 -63
  264. data/features/execute_with_tag_filter.feature +0 -63
  265. data/features/formatter_callbacks.feature +0 -189
  266. data/features/json_formatter.feature +0 -338
  267. data/features/parsing.feature +0 -18
  268. data/features/pretty_formatter.feature +0 -31
  269. data/features/rerun_formatter.feature +0 -35
  270. data/features/run_specific_scenarios.feature +0 -47
  271. data/features/stats_formatters.feature +0 -73
  272. data/features/step_definitions/cucumber-features/cucumber_ruby_mappings.rb +0 -197
  273. data/features/step_definitions/cucumber_steps.rb +0 -55
  274. data/features/step_definitions/drb_steps.rb +0 -3
  275. data/features/support/env.rb +0 -57
  276. data/features/tagged_hooks.feature +0 -59
  277. data/fixtures/json/features/background.feature +0 -7
  278. data/fixtures/json/features/embed.feature +0 -4
  279. data/fixtures/json/features/one_passing_one_failing.feature +0 -11
  280. data/fixtures/json/features/step_definitions/steps.rb +0 -32
  281. data/fixtures/json/features/tables.feature +0 -13
  282. data/fixtures/junit/features/one_passing_one_failing.feature +0 -8
  283. data/fixtures/junit/features/pending.feature +0 -7
  284. data/fixtures/junit/features/scenario_outline.feature +0 -9
  285. data/fixtures/junit/features/some_subdirectory/one_passing_one_failing.feature +0 -8
  286. data/fixtures/junit/features/step_definitions/steps.rb +0 -11
  287. data/fixtures/self_test/README.textile +0 -6
  288. data/fixtures/self_test/Rakefile +0 -6
  289. data/fixtures/self_test/features/call_undefined_step_from_step_def.feature +0 -7
  290. data/fixtures/self_test/features/failing_expectation.feature +0 -4
  291. data/fixtures/self_test/features/lots_of_undefined.feature +0 -8
  292. data/fixtures/self_test/features/multiline_name.feature +0 -27
  293. data/fixtures/self_test/features/outline_sample.feature +0 -15
  294. data/fixtures/self_test/features/sample.feature +0 -21
  295. data/fixtures/self_test/features/search_sample.feature +0 -32
  296. data/fixtures/self_test/features/step_definitions/sample_steps.rb +0 -84
  297. data/fixtures/self_test/features/support/bubble_256x256.png +0 -0
  298. data/fixtures/self_test/features/support/env.rb +0 -26
  299. data/fixtures/self_test/features/tags_sample.feature +0 -17
  300. data/fixtures/self_test/features/tons_of_cukes.feature +0 -52
  301. data/fixtures/self_test/features/undefined_multiline_args.feature +0 -12
  302. data/fixtures/self_test/list-of-features.txt +0 -1
  303. data/fixtures/steps_library/features/step_definitions/steps_lib1.rb +0 -8
  304. data/fixtures/steps_library/features/step_definitions/steps_lib2.rb +0 -8
  305. data/fixtures/tickets/Rakefile +0 -20
  306. data/fixtures/tickets/features/172.feature +0 -28
  307. data/fixtures/tickets/features/177/1.feature +0 -28
  308. data/fixtures/tickets/features/177/2.feature +0 -20
  309. data/fixtures/tickets/features/177/3.feature +0 -18
  310. data/fixtures/tickets/features/180.feature +0 -7
  311. data/fixtures/tickets/features/229/tagged_hooks.feature +0 -8
  312. data/fixtures/tickets/features/229/tagged_hooks.rb +0 -14
  313. data/fixtures/tickets/features/236.feature +0 -13
  314. data/fixtures/tickets/features/241.feature +0 -12
  315. data/fixtures/tickets/features/246.feature +0 -4
  316. data/fixtures/tickets/features/248.feature +0 -11
  317. data/fixtures/tickets/features/270/back.feature +0 -14
  318. data/fixtures/tickets/features/270/back.steps.rb +0 -14
  319. data/fixtures/tickets/features/272/hooks.feature +0 -26
  320. data/fixtures/tickets/features/272/hooks_steps.rb +0 -53
  321. data/fixtures/tickets/features/279/py_string_indent.feature +0 -25
  322. data/fixtures/tickets/features/279/py_string_indent.steps.rb +0 -12
  323. data/fixtures/tickets/features/279/wrong.feature_ +0 -11
  324. data/fixtures/tickets/features/301/filter_background_tagged_hooks.feature +0 -6
  325. data/fixtures/tickets/features/301/filter_background_tagged_hooks_steps.rb +0 -12
  326. data/fixtures/tickets/features/306/only_background.feature +0 -4
  327. data/fixtures/tickets/features/around_timeout.feature +0 -6
  328. data/fixtures/tickets/features/gherkin_67.feature +0 -12
  329. data/fixtures/tickets/features/gherkin_68.feature +0 -4
  330. data/fixtures/tickets/features/half_manual.feature +0 -11
  331. data/fixtures/tickets/features/lib/eatting_machine.rb +0 -18
  332. data/fixtures/tickets/features/lib/pantry.rb +0 -20
  333. data/fixtures/tickets/features/scenario_outline.feature +0 -95
  334. data/fixtures/tickets/features/step_definitons/246_steps.rb +0 -3
  335. data/fixtures/tickets/features/step_definitons/248_steps.rb +0 -15
  336. data/fixtures/tickets/features/step_definitons/around_timeout_steps.rb +0 -9
  337. data/fixtures/tickets/features/step_definitons/half_manual_steps.rb +0 -11
  338. data/fixtures/tickets/features/step_definitons/scenario_outline_steps.rb +0 -42
  339. data/fixtures/tickets/features/step_definitons/tickets_steps.rb +0 -88
  340. data/fixtures/tickets/features/table_diffing.feature +0 -13
  341. data/fixtures/tickets/features/tickets.feature +0 -28
  342. data/fixtures/tickets/features.html +0 -138
  343. data/gem_tasks/yard/default/layout/html/bubble_32x32.png +0 -0
  344. data/gem_tasks/yard/default/layout/html/footer.erb +0 -5
  345. data/gem_tasks/yard/default/layout/html/index.erb +0 -1
  346. data/gem_tasks/yard/default/layout/html/layout.erb +0 -25
  347. data/gem_tasks/yard/default/layout/html/logo.erb +0 -1
  348. data/gem_tasks/yard/default/layout/html/setup.rb +0 -4
  349. data/gem_tasks/yard.rake +0 -40
  350. data/legacy_features/README.md +0 -14
  351. data/legacy_features/announce.feature +0 -152
  352. data/legacy_features/bug_371.feature +0 -32
  353. data/legacy_features/bug_464.feature +0 -16
  354. data/legacy_features/bug_475.feature +0 -42
  355. data/legacy_features/bug_585_tab_indentation.feature +0 -22
  356. data/legacy_features/bug_600.feature +0 -73
  357. data/legacy_features/cucumber_cli.feature +0 -584
  358. data/legacy_features/cucumber_cli_outlines.feature +0 -117
  359. data/legacy_features/default_snippets.feature +0 -43
  360. data/legacy_features/diffing.feature +0 -25
  361. data/legacy_features/drb_server_integration.feature +0 -174
  362. data/legacy_features/exclude_files.feature +0 -20
  363. data/legacy_features/expand.feature +0 -60
  364. data/legacy_features/junit_formatter.feature +0 -214
  365. data/legacy_features/language_from_header.feature +0 -30
  366. data/legacy_features/listener_debugger_formatter.feature +0 -42
  367. data/legacy_features/multiline_names.feature +0 -44
  368. data/legacy_features/report_called_undefined_steps.feature +0 -35
  369. data/legacy_features/rerun_formatter.feature +0 -52
  370. data/legacy_features/simplest.feature +0 -11
  371. data/legacy_features/snippet.feature +0 -23
  372. data/legacy_features/snippets_when_using_star_keyword.feature +0 -38
  373. data/legacy_features/step_definitions/cucumber_steps.rb +0 -179
  374. data/legacy_features/step_definitions/extra_steps.rb +0 -2
  375. data/legacy_features/step_definitions/simplest_steps.rb +0 -3
  376. data/legacy_features/step_definitions/wire_steps.rb +0 -34
  377. data/legacy_features/support/env.rb +0 -161
  378. data/legacy_features/support/env.rb.simplest +0 -7
  379. data/legacy_features/table_mapping.feature +0 -34
  380. data/legacy_features/transform.feature +0 -245
  381. data/legacy_features/unicode_table.feature +0 -35
  382. data/legacy_features/wire_protocol.feature +0 -332
  383. data/lib/README.rdoc +0 -12
  384. data/lib/cucumber/ast/background.rb +0 -116
  385. data/lib/cucumber/ast/comment.rb +0 -31
  386. data/lib/cucumber/ast/doc_string.rb +0 -61
  387. data/lib/cucumber/ast/empty_background.rb +0 -33
  388. data/lib/cucumber/ast/examples.rb +0 -49
  389. data/lib/cucumber/ast/feature.rb +0 -99
  390. data/lib/cucumber/ast/features.rb +0 -38
  391. data/lib/cucumber/ast/has_steps.rb +0 -74
  392. data/lib/cucumber/ast/location.rb +0 -41
  393. data/lib/cucumber/ast/multiline_argument.rb +0 -30
  394. data/lib/cucumber/ast/names.rb +0 -13
  395. data/lib/cucumber/ast/outline_table.rb +0 -194
  396. data/lib/cucumber/ast/scenario.rb +0 -103
  397. data/lib/cucumber/ast/scenario_outline.rb +0 -146
  398. data/lib/cucumber/ast/step.rb +0 -122
  399. data/lib/cucumber/ast/step_collection.rb +0 -92
  400. data/lib/cucumber/ast/step_invocation.rb +0 -196
  401. data/lib/cucumber/ast/tags.rb +0 -28
  402. data/lib/cucumber/ast/tree_walker.rb +0 -191
  403. data/lib/cucumber/ast/visitor.rb +0 -11
  404. data/lib/cucumber/broadcaster.rb +0 -13
  405. data/lib/cucumber/cli/drb_client.rb +0 -43
  406. data/lib/cucumber/feature_file.rb +0 -94
  407. data/lib/cucumber/formatter/ordered_xml_markup.rb +0 -24
  408. data/lib/cucumber/js_support/js_dsl.js +0 -57
  409. data/lib/cucumber/js_support/js_language.rb +0 -185
  410. data/lib/cucumber/js_support/js_snippets.rb +0 -27
  411. data/lib/cucumber/parser/gherkin_builder.rb +0 -284
  412. data/lib/cucumber/parser.rb +0 -2
  413. data/lib/cucumber/py_support/py_dsl.py +0 -10
  414. data/lib/cucumber/py_support/py_language.py +0 -10
  415. data/lib/cucumber/py_support/py_language.rb +0 -80
  416. data/lib/cucumber/runtime/features_loader.rb +0 -62
  417. data/lib/cucumber/runtime/results.rb +0 -64
  418. data/lib/cucumber/step_mother.rb +0 -10
  419. data/spec/cucumber/ast/background_spec.rb +0 -122
  420. data/spec/cucumber/ast/doc_string_spec.rb +0 -40
  421. data/spec/cucumber/ast/feature_factory.rb +0 -72
  422. data/spec/cucumber/ast/feature_spec.rb +0 -63
  423. data/spec/cucumber/ast/features_spec.rb +0 -51
  424. data/spec/cucumber/ast/outline_table_spec.rb +0 -21
  425. data/spec/cucumber/ast/scenario_outline_spec.rb +0 -74
  426. data/spec/cucumber/ast/step_spec.rb +0 -68
  427. data/spec/cucumber/ast/tree_walker_spec.rb +0 -19
  428. data/spec/cucumber/broadcaster_spec.rb +0 -15
  429. data/spec/cucumber/cli/drb_client_spec.rb +0 -76
  430. data/spec/cucumber/rake/rcov_spec.rb +0 -71
  431. data/spec/cucumber/runtime/results_spec.rb +0 -81
  432. data/spec/cucumber/wire_support/wire_step_definition_spec.rb +0 -20
  433. /data/examples/i18n/ar/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  434. /data/examples/i18n/bg/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  435. /data/examples/i18n/ca/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  436. /data/examples/i18n/cs/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  437. /data/examples/i18n/da/features/{step_definitons → step_definitions}/lommeregner_steps.rb +0 -0
  438. /data/examples/i18n/de/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  439. /data/examples/i18n/en/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  440. /data/examples/i18n/eo/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  441. /data/examples/i18n/es/features/{step_definitons → step_definitions}/calculador_steps.rb +0 -0
  442. /data/examples/i18n/fi/features/{step_definitons → step_definitions}/laskin_steps.rb +0 -0
  443. /data/examples/i18n/he/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  444. /data/examples/i18n/hi/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  445. /data/examples/i18n/hu/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  446. /data/examples/i18n/id/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  447. /data/examples/i18n/it/features/{step_definitons → step_definitions}/calcolatrice_steps.rb +0 -0
  448. /data/examples/i18n/ja/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  449. /data/examples/i18n/ko/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  450. /data/examples/i18n/lt/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  451. /data/examples/i18n/lv/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  452. /data/examples/i18n/no/features/{step_definitons → step_definitions}/kalkulator_steps.rb +0 -0
  453. /data/examples/i18n/pl/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  454. /data/examples/i18n/ro/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  455. /data/examples/i18n/ru/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  456. /data/examples/i18n/sk/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  457. /data/examples/i18n/sr-Cyrl/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  458. /data/examples/i18n/sr-Latn/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  459. /data/examples/i18n/sv/features/{step_definitons → step_definitions}/kalkulator_steps.rb +0 -0
  460. /data/examples/i18n/tr/features/{step_definitons → step_definitions}/hesap_makinesi_adimlari.rb +0 -0
  461. /data/examples/i18n/uk/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  462. /data/examples/i18n/uz/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  463. /data/examples/i18n/zh-TW/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  464. /data/features/{nested_steps_with_second_arg.feature → docs/defining_steps/nested_steps_with_second_arg.feature} +0 -0
  465. /data/features/{iso-8859-1.feature → docs/iso-8859-1.feature} +0 -0
@@ -1,11 +1,20 @@
1
1
  require 'erb'
2
- require 'cucumber/formatter/ordered_xml_markup'
2
+ require 'builder'
3
3
  require 'cucumber/formatter/duration'
4
4
  require 'cucumber/formatter/io'
5
+ require 'pathname'
5
6
 
6
7
  module Cucumber
7
8
  module Formatter
8
9
  class Html
10
+
11
+ # TODO: remove coupling to types
12
+ AST_CLASSES = {
13
+ Cucumber::Core::Ast::Scenario => 'scenario',
14
+ Cucumber::Core::Ast::ScenarioOutline => 'scenario outline'
15
+ }
16
+ AST_DATA_TABLE = LegacyApi::Ast::MultilineArg::DataTable
17
+
9
18
  include ERB::Util # for the #h method
10
19
  include Duration
11
20
  include Io
@@ -22,28 +31,48 @@ module Cucumber
22
31
  @header_red = nil
23
32
  @delayed_messages = []
24
33
  @img_id = 0
34
+ @text_id = 0
25
35
  @inside_outline = false
36
+ @previous_step_keyword = nil
26
37
  end
27
38
 
28
39
  def embed(src, mime_type, label)
29
40
  case(mime_type)
30
41
  when /^image\/(png|gif|jpg|jpeg)/
42
+ unless File.file?(src) or src =~ /^data:image\/(png|gif|jpg|jpeg);base64,/
43
+ type = mime_type =~ /;base[0-9]+$/ ? mime_type : mime_type + ";base64"
44
+ src = "data:" + type + "," + src
45
+ end
31
46
  embed_image(src, label)
47
+ when /^text\/plain/
48
+ embed_text(src, label)
32
49
  end
33
50
  end
34
51
 
35
52
  def embed_image(src, label)
36
53
  id = "img_#{@img_id}"
37
54
  @img_id += 1
55
+ if @io.respond_to?(:path) and File.file?(src)
56
+ out_dir = Pathname.new(File.dirname(File.absolute_path(@io.path)))
57
+ src = Pathname.new(File.absolute_path(src)).relative_path_from(out_dir)
58
+ end
38
59
  @builder.span(:class => 'embed') do |pre|
39
60
  pre << %{<a href="" onclick="img=document.getElementById('#{id}'); img.style.display = (img.style.display == 'none' ? 'block' : 'none');return false">#{label}</a><br>&nbsp;
40
61
  <img id="#{id}" style="display: none" src="#{src}"/>}
41
62
  end
42
63
  end
43
64
 
65
+ def embed_text(src, label)
66
+ id = "text_#{@text_id}"
67
+ @text_id += 1
68
+ @builder.span(:class => 'embed') do |pre|
69
+ pre << %{<a id="#{id}" href="#{src}" title="#{label}">#{label}</a>}
70
+ end
71
+ end
72
+
44
73
 
45
74
  def before_features(features)
46
- @step_count = features.step_count
75
+ @step_count = features && features.step_count || 0 #TODO: Make this work with core!
47
76
 
48
77
  # <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
49
78
  @builder.declare!(
@@ -132,6 +161,10 @@ module Cucumber
132
161
  end
133
162
  end
134
163
 
164
+ def before_test_case(test_case)
165
+ @previous_step_keyword = nil
166
+ end
167
+
135
168
  def before_background(background)
136
169
  @in_background = true
137
170
  @builder << '<div class="background">'
@@ -154,16 +187,18 @@ module Cucumber
154
187
  def before_feature_element(feature_element)
155
188
  @scenario_number+=1
156
189
  @scenario_red = false
157
- css_class = {
158
- Ast::Scenario => 'scenario',
159
- Ast::ScenarioOutline => 'scenario outline'
160
- }[feature_element.class]
190
+ css_class = AST_CLASSES[feature_element.class]
161
191
  @builder << "<div class='#{css_class}'>"
192
+ @in_scenario_outline = feature_element.class == Cucumber::Core::Ast::ScenarioOutline
162
193
  end
163
194
 
164
195
  def after_feature_element(feature_element)
196
+ unless @in_scenario_outline
197
+ print_messages
198
+ @builder << '</ol>'
199
+ end
165
200
  @builder << '</div>'
166
- @open_step_list = true
201
+ @in_scenario_outline = nil
167
202
  end
168
203
 
169
204
  def scenario_name(keyword, name, file_colon_line, source_indent)
@@ -191,7 +226,7 @@ module Cucumber
191
226
  end
192
227
 
193
228
  def before_examples(examples)
194
- @builder << '<div class="examples">'
229
+ @builder << '<div class="examples">'
195
230
  end
196
231
 
197
232
  def after_examples(examples)
@@ -211,10 +246,12 @@ module Cucumber
211
246
  end
212
247
 
213
248
  def after_steps(steps)
214
- @builder << '</ol>'
249
+ print_messages
250
+ @builder << '</ol>' if @in_background or @in_scenario_outline
215
251
  end
216
252
 
217
253
  def before_step(step)
254
+ print_messages
218
255
  @step_id = step.dom_id
219
256
  @step_number += 1
220
257
  @step = step
@@ -247,11 +284,15 @@ module Cucumber
247
284
  def after_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background, file_colon_line)
248
285
  return if @hide_this_step
249
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
250
291
  if status == :undefined
251
- keyword = @step.actual_keyword if @step.respond_to?(:actual_keyword)
252
- step_multiline_class = @step.multiline_arg ? @step.multiline_arg.class : nil
253
292
  @builder.pre do |pre|
254
- pre << @runtime.snippet_text(keyword,step_match.instance_variable_get("@name") || '',step_multiline_class)
293
+ # TODO: snippet text should be an event sent to the formatter so we don't
294
+ # have this couping to the runtime.
295
+ pre << @runtime.snippet_text(keyword,step_match.instance_variable_get("@name") || '', @step.multiline_arg)
255
296
  end
256
297
  end
257
298
  @builder << '</li>'
@@ -269,6 +310,7 @@ module Cucumber
269
310
 
270
311
  def exception(exception, status)
271
312
  return if @hide_this_step
313
+ print_messages
272
314
  build_exception_detail(exception)
273
315
  end
274
316
 
@@ -279,14 +321,14 @@ module Cucumber
279
321
 
280
322
  def before_multiline_arg(multiline_arg)
281
323
  return if @hide_this_step || @skip_step
282
- if Ast::Table === multiline_arg
324
+ if AST_DATA_TABLE === multiline_arg
283
325
  @builder << '<table>'
284
326
  end
285
327
  end
286
328
 
287
329
  def after_multiline_arg(multiline_arg)
288
330
  return if @hide_this_step || @skip_step
289
- if Ast::Table === multiline_arg
331
+ if AST_DATA_TABLE === multiline_arg
290
332
  @builder << '</table>'
291
333
  end
292
334
  end
@@ -298,7 +340,6 @@ module Cucumber
298
340
  end
299
341
  end
300
342
 
301
-
302
343
  def before_table_row(table_row)
303
344
  @row_id = table_row.dom_id
304
345
  @col_index = 0
@@ -534,7 +575,7 @@ module Cucumber
534
575
  end
535
576
 
536
577
  def backtrace_line(line)
537
- line.gsub(/\A([^:]*\.(?:rb|feature|haml)):(\d*).*\z/) do
578
+ line.gsub(/^([^:]*\.(?:rb|feature|haml)):(\d*).*$/) do
538
579
  if ENV['TM_PROJECT_DIRECTORY']
539
580
  "<a href=\"txmt://open?url=file://#{File.expand_path($1)}&line=#{$2}\">#{$1}:#{$2}</a> "
540
581
  else
@@ -572,7 +613,11 @@ module Cucumber
572
613
  end
573
614
 
574
615
  def create_builder(io)
575
- OrderedXmlMarkup.new(:target => io, :indent => 0)
616
+ Builder::XmlMarkup.new(:target => io, :indent => 0)
617
+ end
618
+
619
+ def outline_step?(step)
620
+ not @step.step.respond_to?(:actual_keyword)
576
621
  end
577
622
 
578
623
  class SnippetExtractor #:nodoc:
@@ -598,8 +643,12 @@ module Cucumber
598
643
 
599
644
  def lines_around(file, line)
600
645
  if File.file?(file)
646
+ begin
601
647
  lines = File.open(file).read.split("\n")
602
- min = [0, line-3].max
648
+ rescue ArgumentError
649
+ return "# Couldn't get snippet for #{file}"
650
+ end
651
+ min = [0, line-3].max
603
652
  max = [line+1, lines.length-1].min
604
653
  selected_lines = []
605
654
  selected_lines.join("\n")
@@ -0,0 +1,20 @@
1
+ module Cucumber
2
+ module Formatter
3
+
4
+ class IgnoreMissingMessages < BasicObject
5
+ def initialize(receiver)
6
+ @receiver = receiver
7
+ end
8
+
9
+ def method_missing(message, *args)
10
+ @receiver.send(message, *args) if @receiver.respond_to?(message)
11
+ end
12
+
13
+ def respond_to_missing?(name, include_private = false)
14
+ @receiver.respond_to?(name, include_private)
15
+ end
16
+ end
17
+
18
+ end
19
+ end
20
+
@@ -1,9 +1,10 @@
1
+ require 'thread'
1
2
 
2
3
  module Cucumber
3
4
  module Formatter
4
5
  module Interceptor
5
6
  class Pipe
6
- attr_reader :pipe, :buffer
7
+ attr_reader :pipe
7
8
  def initialize(pipe)
8
9
  @pipe = pipe
9
10
  @buffer = []
@@ -11,8 +12,16 @@ module Cucumber
11
12
  end
12
13
 
13
14
  def write(str)
14
- @buffer << str if @wrapped
15
- return @pipe.write(str)
15
+ lock.synchronize do
16
+ @buffer << str if @wrapped
17
+ return @pipe.write(str)
18
+ end
19
+ end
20
+
21
+ def buffer
22
+ lock.synchronize do
23
+ return @buffer.dup
24
+ end
16
25
  end
17
26
 
18
27
  def unwrap!
@@ -60,6 +69,11 @@ module Cucumber
60
69
  return $stdout
61
70
  end
62
71
  end
72
+
73
+ private
74
+ def lock
75
+ @lock||=Mutex.new
76
+ end
63
77
  end
64
78
  end
65
79
  end
@@ -11,7 +11,7 @@ module Cucumber
11
11
 
12
12
  def initialize(runtime, io, options)
13
13
  @io = ensure_io(io, "json")
14
- super(Gherkin::Formatter::JSONFormatter.new(@io), false)
14
+ super(Gherkin::Formatter::JSONFormatter.new(@io), false, options)
15
15
  end
16
16
  end
17
17
  end
@@ -1,4 +1,4 @@
1
- require 'cucumber/formatter/ordered_xml_markup'
1
+ require 'builder'
2
2
  require 'cucumber/formatter/io'
3
3
  require 'cucumber/formatter/interceptor'
4
4
  require 'fileutils'
@@ -7,6 +7,11 @@ module Cucumber
7
7
  module Formatter
8
8
  # The formatter used for <tt>--format junit</tt>
9
9
  class Junit
10
+
11
+ # TODO: remove coupling to types
12
+ AST_SCENARIO_OUTLINE = Core::Ast::ScenarioOutline
13
+ AST_EXAMPLE_ROW = LegacyApi::Ast::ExampleTableRow
14
+
10
15
  include Io
11
16
 
12
17
  class UnNamedFeatureError < StandardError
@@ -23,7 +28,7 @@ module Cucumber
23
28
  def before_feature(feature)
24
29
  @current_feature = feature
25
30
  @failures = @errors = @tests = @skipped = 0
26
- @builder = OrderedXmlMarkup.new( :indent => 2 )
31
+ @builder = Builder::XmlMarkup.new( :indent => 2 )
27
32
  @time = 0
28
33
  # In order to fill out <system-err/> and <system-out/>, we need to
29
34
  # intercept the $stderr and $stdout
@@ -32,12 +37,12 @@ module Cucumber
32
37
  end
33
38
 
34
39
  def before_feature_element(feature_element)
35
- @in_examples = Ast::ScenarioOutline === feature_element
40
+ @in_examples = AST_SCENARIO_OUTLINE === feature_element
36
41
  @steps_start = Time.now
37
42
  end
38
43
 
39
44
  def after_feature(feature)
40
- @testsuite = OrderedXmlMarkup.new( :indent => 2 )
45
+ @testsuite = Builder::XmlMarkup.new( :indent => 2 )
41
46
  @testsuite.instruct!
42
47
  @testsuite.testsuite(
43
48
  :failures => @failures,
@@ -110,7 +115,7 @@ module Cucumber
110
115
  end
111
116
 
112
117
  def after_table_row(table_row)
113
- return unless @in_examples and Cucumber::Ast::OutlineTable::ExampleRow === table_row
118
+ return unless @in_examples and AST_EXAMPLE_ROW === table_row
114
119
  duration = Time.now - @table_start
115
120
  unless @header_row
116
121
  name_suffix = " (outline example : #{table_row.name})"
@@ -124,6 +129,34 @@ module Cucumber
124
129
  @header_row = false if @header_row
125
130
  end
126
131
 
132
+ def before_test_case(test_case)
133
+ if @options[:expand] and test_case.keyword == "Scenario Outline"
134
+ @exception = nil
135
+ end
136
+ end
137
+
138
+ def after_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background, file_colon_line)
139
+ if @options[:expand] and @in_examples
140
+ if not @exception and exception
141
+ @exception = exception
142
+ end
143
+ end
144
+ end
145
+
146
+ def after_test_case(test_case, result)
147
+ if @options[:expand] and test_case.keyword == "Scenario Outline"
148
+ test_case_name = NameBuilder.new(test_case)
149
+ @scenario = test_case_name.outline_name
150
+ @output = "#{test_case.keyword}: #{@scenario}\n\n"
151
+ if result.failed?
152
+ @output += "Example row: #{test_case_name.row_name}\n"
153
+ @output += "\nMessage:\n"
154
+ end
155
+ test_case_result = ResultBuilder.new(result)
156
+ build_testcase(test_case_result.test_case_duration, test_case_result.status, @exception, test_case_name.name_suffix)
157
+ end
158
+ end
159
+
127
160
  private
128
161
 
129
162
  def build_testcase(duration, status, exception = nil, suffix = "")
@@ -171,5 +204,72 @@ module Cucumber
171
204
  end
172
205
 
173
206
  end
207
+
208
+ class NameBuilder
209
+ attr_reader :outline_name, :name_suffix, :row_name
210
+
211
+ def initialize(test_case)
212
+ test_case.describe_source_to self
213
+ end
214
+
215
+ def feature(*)
216
+ self
217
+ end
218
+
219
+ def scenario(*)
220
+ self
221
+ end
222
+
223
+ def scenario_outline(outline)
224
+ @outline_name = outline.name
225
+ self
226
+ end
227
+
228
+ def examples_table(*)
229
+ self
230
+ end
231
+
232
+ def examples_table_row(row)
233
+ @row_name = '| ' + row.values.join(' | ') + ' |'
234
+ @name_suffix = " (outline example : #{@row_name})"
235
+ self
236
+ end
237
+ end
238
+
239
+ class ResultBuilder
240
+ attr_reader :status, :test_case_duration
241
+ def initialize(result)
242
+ @test_case_duration = 0
243
+ result.describe_to(self)
244
+ end
245
+
246
+ def passed
247
+ @status = :passed
248
+ end
249
+
250
+ def failed
251
+ @status = :failed
252
+ end
253
+
254
+ def undefined
255
+ @status = :undefined
256
+ end
257
+
258
+ def skipped
259
+ @status = :skipped
260
+ end
261
+
262
+ def pending(*)
263
+ @status = :pending
264
+ end
265
+
266
+ def exception(*)
267
+ end
268
+
269
+ def duration(duration, *)
270
+ duration.tap { |duration| @test_case_duration = duration.nanoseconds / 10 ** 9.0 }
271
+ end
272
+ end
273
+
174
274
  end
175
275
  end