rspec 1.0.8 → 1.1.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 (301) hide show
  1. data/CHANGES +122 -2
  2. data/README +10 -9
  3. data/Rakefile +22 -49
  4. data/TODO +2 -0
  5. data/bin/spec +1 -1
  6. data/bin/spec_translator +8 -8
  7. data/examples/{auto_spec_description_example.rb → pure/autogenerated_docstrings_example.rb} +0 -0
  8. data/examples/{before_and_after_example.rb → pure/before_and_after_example.rb} +1 -0
  9. data/examples/{behave_as_example.rb → pure/behave_as_example.rb} +0 -0
  10. data/examples/{custom_expectation_matchers.rb → pure/custom_expectation_matchers.rb} +0 -0
  11. data/examples/{custom_formatter.rb → pure/custom_formatter.rb} +1 -0
  12. data/examples/{dynamic_spec.rb → pure/dynamic_spec.rb} +0 -0
  13. data/examples/{file_accessor.rb → pure/file_accessor.rb} +1 -0
  14. data/examples/{file_accessor_spec.rb → pure/file_accessor_spec.rb} +0 -0
  15. data/examples/{greeter_spec.rb → pure/greeter_spec.rb} +1 -0
  16. data/examples/{helper_method_example.rb → pure/helper_method_example.rb} +0 -0
  17. data/examples/{io_processor.rb → pure/io_processor.rb} +0 -0
  18. data/examples/{io_processor_spec.rb → pure/io_processor_spec.rb} +0 -0
  19. data/examples/{legacy_spec.rb → pure/legacy_spec.rb} +1 -0
  20. data/examples/{mocking_example.rb → pure/mocking_example.rb} +0 -0
  21. data/examples/pure/multi_threaded_behaviour_runner.rb +28 -0
  22. data/examples/pure/nested_classes_example.rb +36 -0
  23. data/examples/{partial_mock_example.rb → pure/partial_mock_example.rb} +0 -0
  24. data/examples/{pending_example.rb → pure/pending_example.rb} +0 -0
  25. data/examples/{predicate_example.rb → pure/predicate_example.rb} +0 -0
  26. data/examples/{priority.txt → pure/priority.txt} +0 -0
  27. data/examples/pure/shared_example_group_example.rb +66 -0
  28. data/examples/pure/shared_stack_examples.rb +38 -0
  29. data/examples/pure/spec_helper.rb +3 -0
  30. data/examples/{stack.rb → pure/stack.rb} +0 -0
  31. data/examples/{stack_spec.rb → pure/stack_spec.rb} +1 -35
  32. data/examples/pure/stack_spec_with_nested_example_groups.rb +67 -0
  33. data/examples/{stubbing_example.rb → pure/stubbing_example.rb} +0 -0
  34. data/examples/stories/adder.rb +13 -0
  35. data/examples/stories/addition +34 -0
  36. data/examples/stories/addition.rb +9 -0
  37. data/examples/stories/calculator.rb +65 -0
  38. data/examples/stories/game-of-life/README.txt +21 -0
  39. data/examples/stories/game-of-life/behaviour/everything.rb +6 -0
  40. data/examples/stories/game-of-life/behaviour/examples/examples.rb +3 -0
  41. data/examples/stories/game-of-life/behaviour/examples/game_behaviour.rb +35 -0
  42. data/examples/stories/game-of-life/behaviour/examples/grid_behaviour.rb +66 -0
  43. data/examples/stories/game-of-life/behaviour/stories/CellsWithLessThanTwoNeighboursDie.story +21 -0
  44. data/examples/stories/game-of-life/behaviour/stories/CellsWithMoreThanThreeNeighboursDie.story +21 -0
  45. data/examples/stories/game-of-life/behaviour/stories/EmptySpacesWithThreeNeighboursCreateACell.story +42 -0
  46. data/examples/stories/game-of-life/behaviour/stories/ICanCreateACell.story +42 -0
  47. data/examples/stories/game-of-life/behaviour/stories/ICanKillACell.story +17 -0
  48. data/examples/stories/game-of-life/behaviour/stories/TheGridWraps.story +53 -0
  49. data/examples/stories/game-of-life/behaviour/stories/create_a_cell.rb +52 -0
  50. data/examples/stories/game-of-life/behaviour/stories/helper.rb +6 -0
  51. data/examples/stories/game-of-life/behaviour/stories/kill_a_cell.rb +26 -0
  52. data/examples/stories/game-of-life/behaviour/stories/steps.rb +5 -0
  53. data/examples/stories/game-of-life/behaviour/stories/stories.rb +3 -0
  54. data/examples/stories/game-of-life/behaviour/stories/stories.txt +22 -0
  55. data/examples/stories/game-of-life/life.rb +3 -0
  56. data/examples/stories/game-of-life/life/game.rb +23 -0
  57. data/examples/stories/game-of-life/life/grid.rb +43 -0
  58. data/examples/stories/helper.rb +9 -0
  59. data/examples/stories/steps/addition_steps.rb +18 -0
  60. data/lib/autotest/rspec.rb +1 -2
  61. data/lib/spec.rb +30 -6
  62. data/lib/spec/example.rb +12 -0
  63. data/lib/spec/{dsl → example}/configuration.rb +48 -39
  64. data/lib/spec/{dsl → example}/errors.rb +2 -2
  65. data/lib/spec/example/example_group.rb +16 -0
  66. data/lib/spec/example/example_group_factory.rb +62 -0
  67. data/lib/spec/example/example_group_methods.rb +412 -0
  68. data/lib/spec/example/example_matcher.rb +42 -0
  69. data/lib/spec/example/example_methods.rb +101 -0
  70. data/lib/spec/example/module_reopening_fix.rb +21 -0
  71. data/lib/spec/example/pending.rb +18 -0
  72. data/lib/spec/example/shared_example_group.rb +58 -0
  73. data/lib/spec/expectations/differs/default.rb +15 -10
  74. data/lib/spec/expectations/errors.rb +7 -1
  75. data/lib/spec/expectations/extensions/object.rb +12 -7
  76. data/lib/spec/expectations/handler.rb +13 -4
  77. data/lib/spec/extensions.rb +2 -0
  78. data/lib/spec/extensions/class.rb +24 -0
  79. data/lib/spec/extensions/main.rb +54 -0
  80. data/lib/spec/extensions/object.rb +5 -1
  81. data/lib/spec/interop/test.rb +10 -0
  82. data/lib/spec/interop/test/unit/autorunner.rb +6 -0
  83. data/lib/spec/interop/test/unit/testcase.rb +61 -0
  84. data/lib/spec/interop/test/unit/testresult.rb +6 -0
  85. data/lib/spec/interop/test/unit/testsuite_adapter.rb +34 -0
  86. data/lib/spec/interop/test/unit/ui/console/testrunner.rb +60 -0
  87. data/lib/spec/matchers.rb +11 -15
  88. data/lib/spec/matchers/be.rb +23 -6
  89. data/lib/spec/matchers/change.rb +25 -1
  90. data/lib/spec/matchers/exist.rb +17 -0
  91. data/lib/spec/matchers/operator_matcher.rb +1 -0
  92. data/lib/spec/matchers/simple_matcher.rb +29 -0
  93. data/lib/spec/matchers/throw_symbol.rb +2 -0
  94. data/lib/spec/mocks.rb +5 -2
  95. data/lib/spec/mocks/argument_expectation.rb +1 -1
  96. data/lib/spec/mocks/message_expectation.rb +62 -44
  97. data/lib/spec/mocks/methods.rb +2 -2
  98. data/lib/spec/mocks/mock.rb +24 -3
  99. data/lib/spec/mocks/proxy.rb +26 -23
  100. data/lib/spec/mocks/space.rb +1 -1
  101. data/lib/spec/mocks/spec_methods.rb +20 -12
  102. data/lib/spec/rake/spectask.rb +19 -1
  103. data/lib/spec/rake/verify_rcov.rb +1 -1
  104. data/lib/spec/runner.rb +33 -10
  105. data/lib/spec/runner/backtrace_tweaker.rb +3 -3
  106. data/lib/spec/runner/class_and_arguments_parser.rb +16 -0
  107. data/lib/spec/runner/command_line.rb +18 -12
  108. data/lib/spec/runner/drb_command_line.rb +4 -5
  109. data/lib/spec/runner/example_group_runner.rb +59 -0
  110. data/lib/spec/runner/formatter/base_formatter.rb +10 -8
  111. data/lib/spec/runner/formatter/base_text_formatter.rb +18 -18
  112. data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +31 -0
  113. data/lib/spec/runner/formatter/failing_examples_formatter.rb +3 -5
  114. data/lib/spec/runner/formatter/html_formatter.rb +37 -27
  115. data/lib/spec/runner/formatter/profile_formatter.rb +47 -0
  116. data/lib/spec/runner/formatter/progress_bar_formatter.rb +3 -4
  117. data/lib/spec/runner/formatter/specdoc_formatter.rb +27 -13
  118. data/lib/spec/runner/formatter/story/html_formatter.rb +124 -0
  119. data/lib/spec/runner/formatter/story/plain_text_formatter.rb +123 -0
  120. data/lib/spec/runner/formatter/text_mate_formatter.rb +16 -0
  121. data/lib/spec/runner/heckle_runner.rb +9 -9
  122. data/lib/spec/runner/option_parser.rb +140 -138
  123. data/lib/spec/runner/options.rb +168 -90
  124. data/lib/spec/runner/reporter.rb +58 -40
  125. data/lib/spec/runner/spec_parser.rb +11 -8
  126. data/lib/spec/story.rb +10 -0
  127. data/lib/spec/story/extensions.rb +1 -0
  128. data/lib/spec/story/extensions/main.rb +86 -0
  129. data/lib/spec/story/given_scenario.rb +14 -0
  130. data/lib/spec/story/runner.rb +58 -0
  131. data/lib/spec/story/runner/plain_text_story_runner.rb +48 -0
  132. data/lib/spec/story/runner/scenario_collector.rb +18 -0
  133. data/lib/spec/story/runner/scenario_runner.rb +46 -0
  134. data/lib/spec/story/runner/story_mediator.rb +123 -0
  135. data/lib/spec/story/runner/story_parser.rb +227 -0
  136. data/lib/spec/story/runner/story_runner.rb +67 -0
  137. data/lib/spec/story/scenario.rb +14 -0
  138. data/lib/spec/story/step.rb +48 -0
  139. data/lib/spec/story/step_group.rb +89 -0
  140. data/lib/spec/story/step_mother.rb +37 -0
  141. data/lib/spec/story/story.rb +42 -0
  142. data/lib/spec/story/world.rb +124 -0
  143. data/lib/spec/version.rb +4 -5
  144. data/plugins/mock_frameworks/rspec.rb +1 -1
  145. data/spec/autotest/rspec_spec.rb +13 -7
  146. data/spec/autotest_helper.rb +4 -3
  147. data/spec/rspec_suite.rb +7 -0
  148. data/spec/ruby_forker.rb +13 -0
  149. data/spec/spec/example/configuration_spec.rb +290 -0
  150. data/spec/spec/example/example_group_class_definition_spec.rb +48 -0
  151. data/spec/spec/example/example_group_factory_spec.rb +129 -0
  152. data/spec/spec/example/example_group_methods_spec.rb +465 -0
  153. data/spec/spec/example/example_group_spec.rb +711 -0
  154. data/spec/spec/{dsl → example}/example_matcher_spec.rb +23 -18
  155. data/spec/spec/example/example_methods_spec.rb +75 -0
  156. data/spec/spec/example/example_runner_spec.rb +194 -0
  157. data/spec/spec/example/example_spec.rb +53 -0
  158. data/spec/spec/example/nested_example_group_spec.rb +59 -0
  159. data/spec/spec/example/pending_module_spec.rb +31 -0
  160. data/spec/spec/{dsl → example}/predicate_matcher_spec.rb +1 -1
  161. data/spec/spec/example/shared_example_group_spec.rb +265 -0
  162. data/spec/spec/example/subclassing_example_group_spec.rb +25 -0
  163. data/spec/spec/expectations/differs/default_spec.rb +5 -3
  164. data/spec/spec/expectations/extensions/object_spec.rb +63 -2
  165. data/spec/spec/extensions/main_spec.rb +50 -0
  166. data/spec/spec/interop/test/unit/test_unit_spec_helper.rb +14 -0
  167. data/spec/spec/interop/test/unit/testcase_spec.rb +10 -0
  168. data/spec/spec/interop/test/unit/testcase_spec_with_test_unit.rb +20 -0
  169. data/spec/spec/interop/test/unit/testsuite_adapter_spec.rb +9 -0
  170. data/spec/spec/interop/test/unit/testsuite_adapter_spec_with_test_unit.rb +34 -0
  171. data/spec/spec/matchers/be_spec.rb +15 -0
  172. data/spec/spec/matchers/change_spec.rb +87 -0
  173. data/spec/spec/matchers/description_generation_spec.rb +31 -37
  174. data/spec/spec/matchers/exist_spec.rb +31 -22
  175. data/spec/spec/matchers/handler_spec.rb +42 -1
  176. data/spec/spec/matchers/have_spec.rb +1 -1
  177. data/spec/spec/matchers/mock_constraint_matchers_spec.rb +1 -1
  178. data/spec/spec/matchers/operator_matcher_spec.rb +1 -1
  179. data/spec/spec/matchers/simple_matcher_spec.rb +31 -0
  180. data/spec/spec/matchers/throw_symbol_spec.rb +4 -1
  181. data/spec/spec/mocks/bug_report_10263.rb +24 -0
  182. data/spec/spec/mocks/bug_report_15719_spec.rb +30 -0
  183. data/spec/spec/mocks/bug_report_8165_spec.rb +2 -2
  184. data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +1 -0
  185. data/spec/spec/mocks/mock_spec.rb +200 -102
  186. data/spec/spec/mocks/multiple_return_value_spec.rb +1 -1
  187. data/spec/spec/mocks/options_hash_spec.rb +19 -7
  188. data/spec/spec/mocks/partial_mock_spec.rb +31 -9
  189. data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +6 -0
  190. data/spec/spec/mocks/stub_spec.rb +120 -98
  191. data/spec/spec/package/bin_spec_spec.rb +7 -5
  192. data/spec/spec/runner/class_and_argument_parser_spec.rb +23 -0
  193. data/spec/spec/runner/command_line_spec.rb +140 -27
  194. data/spec/spec/runner/drb_command_line_spec.rb +39 -31
  195. data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +44 -0
  196. data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +16 -11
  197. data/spec/spec/runner/formatter/html_formatter_spec.rb +60 -50
  198. data/spec/spec/runner/formatter/profile_formatter_spec.rb +65 -0
  199. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +29 -13
  200. data/spec/spec/runner/formatter/snippet_extractor_spec.rb +14 -7
  201. data/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +103 -0
  202. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +103 -39
  203. data/spec/spec/runner/formatter/story/html_formatter_spec.rb +56 -0
  204. data/spec/spec/runner/formatter/story/plain_text_formatter_spec.rb +289 -0
  205. data/spec/spec/runner/heckle_runner_spec.rb +29 -14
  206. data/spec/spec/runner/heckler_spec.rb +4 -5
  207. data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +5 -5
  208. data/spec/spec/runner/option_parser_spec.rb +86 -58
  209. data/spec/spec/runner/options_spec.rb +239 -120
  210. data/spec/spec/runner/output_one_time_fixture.rb +7 -0
  211. data/spec/spec/runner/output_one_time_fixture_runner.rb +8 -0
  212. data/spec/spec/runner/output_one_time_spec.rb +16 -0
  213. data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +6 -6
  214. data/spec/spec/runner/reporter_spec.rb +147 -163
  215. data/spec/spec/runner/spec_parser_spec.rb +31 -0
  216. data/spec/spec/runner_spec.rb +11 -0
  217. data/spec/spec/spec_classes.rb +12 -5
  218. data/spec/spec/story/builders.rb +46 -0
  219. data/spec/spec/story/extensions/main_spec.rb +161 -0
  220. data/spec/spec/story/extensions_spec.rb +14 -0
  221. data/spec/spec/story/given_scenario_spec.rb +27 -0
  222. data/spec/spec/story/runner/plain_text_story_runner_spec.rb +92 -0
  223. data/spec/spec/story/runner/scenario_collector_spec.rb +27 -0
  224. data/spec/spec/story/runner/scenario_runner_spec.rb +142 -0
  225. data/spec/spec/story/runner/story_mediator_spec.rb +133 -0
  226. data/spec/spec/story/runner/story_parser_spec.rb +384 -0
  227. data/spec/spec/story/runner/story_runner_spec.rb +219 -0
  228. data/spec/spec/story/runner_spec.rb +106 -0
  229. data/spec/spec/story/scenario_spec.rb +20 -0
  230. data/spec/spec/story/step_group_spec.rb +157 -0
  231. data/spec/spec/story/step_mother_spec.rb +72 -0
  232. data/spec/spec/story/step_spec.rb +147 -0
  233. data/spec/spec/story/story_helper.rb +2 -0
  234. data/spec/spec/story/story_spec.rb +86 -0
  235. data/spec/spec/story/world_spec.rb +416 -0
  236. data/spec/spec/translator_spec.rb +2 -1
  237. data/spec/spec_helper.rb +59 -2
  238. data/stories/all.rb +5 -0
  239. data/stories/example_groups/autogenerated_docstrings +26 -0
  240. data/stories/example_groups/example_group_with_should_methods +17 -0
  241. data/stories/example_groups/nested_groups +17 -0
  242. data/stories/example_groups/output +20 -0
  243. data/stories/example_groups/stories.rb +7 -0
  244. data/stories/helper.rb +6 -0
  245. data/stories/interop/examples_and_tests_together +30 -0
  246. data/stories/interop/stories.rb +7 -0
  247. data/stories/interop/test_case_with_should_methods +17 -0
  248. data/stories/pending_stories/README +3 -0
  249. data/stories/resources/helpers/cmdline.rb +9 -0
  250. data/stories/resources/helpers/story_helper.rb +16 -0
  251. data/stories/resources/matchers/smart_match.rb +37 -0
  252. data/stories/resources/spec/example_group_with_should_methods.rb +12 -0
  253. data/stories/resources/spec/simple_spec.rb +8 -0
  254. data/stories/resources/steps/running_rspec.rb +50 -0
  255. data/stories/resources/test/spec_and_test_together.rb +57 -0
  256. data/stories/resources/test/test_case_with_should_methods.rb +30 -0
  257. metadata +232 -106
  258. data/EXAMPLES.rd +0 -111
  259. data/examples/multi_threaded_behaviour_runner.rb +0 -25
  260. data/examples/shared_behaviours_example.rb +0 -39
  261. data/examples/spec_helper.rb +0 -1
  262. data/examples/test_case_adapter_example.rb +0 -26
  263. data/examples/test_case_spec.rb +0 -65
  264. data/lib/spec/dsl.rb +0 -11
  265. data/lib/spec/dsl/behaviour.rb +0 -220
  266. data/lib/spec/dsl/behaviour_callbacks.rb +0 -82
  267. data/lib/spec/dsl/behaviour_eval.rb +0 -231
  268. data/lib/spec/dsl/behaviour_factory.rb +0 -42
  269. data/lib/spec/dsl/composite_proc_builder.rb +0 -33
  270. data/lib/spec/dsl/description.rb +0 -76
  271. data/lib/spec/dsl/example.rb +0 -135
  272. data/lib/spec/dsl/example_matcher.rb +0 -40
  273. data/lib/spec/dsl/example_should_raise_handler.rb +0 -74
  274. data/lib/spec/runner/behaviour_runner.rb +0 -123
  275. data/lib/spec/runner/extensions/kernel.rb +0 -50
  276. data/lib/spec/runner/extensions/object.rb +0 -32
  277. data/lib/spec/runner/formatter.rb +0 -9
  278. data/lib/spec/runner/formatter/failing_behaviours_formatter.rb +0 -29
  279. data/lib/spec/runner/formatter/rdoc_formatter.rb +0 -24
  280. data/lib/spec/test_case_adapter.rb +0 -10
  281. data/spec/spec/dsl/behaviour_eval_spec.rb +0 -79
  282. data/spec/spec/dsl/behaviour_factory_spec.rb +0 -48
  283. data/spec/spec/dsl/behaviour_spec.rb +0 -661
  284. data/spec/spec/dsl/composite_proc_builder_spec.rb +0 -44
  285. data/spec/spec/dsl/configuration_spec.rb +0 -55
  286. data/spec/spec/dsl/description_spec.rb +0 -89
  287. data/spec/spec/dsl/example_class_spec.rb +0 -24
  288. data/spec/spec/dsl/example_instance_spec.rb +0 -160
  289. data/spec/spec/dsl/example_should_raise_spec.rb +0 -137
  290. data/spec/spec/dsl/shared_behaviour_spec.rb +0 -252
  291. data/spec/spec/runner/behaviour_runner_spec.rb +0 -229
  292. data/spec/spec/runner/context_matching_spec.rb +0 -27
  293. data/spec/spec/runner/extensions/bug_report_10577_spec.rb +0 -35
  294. data/spec/spec/runner/extensions/kernel_spec.rb +0 -36
  295. data/spec/spec/runner/formatter/failing_behaviours_formatter_spec.rb +0 -40
  296. data/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb +0 -20
  297. data/spec/spec/runner/formatter/progress_bar_formatter_failure_dump_spec.rb +0 -36
  298. data/spec/spec/runner/formatter/rdoc_formatter_dry_run_spec.rb +0 -19
  299. data/spec/spec/runner/formatter/rdoc_formatter_spec.rb +0 -46
  300. data/spec/spec/runner/formatter/specdoc_formatter_dry_run_spec.rb +0 -21
  301. data/spec/spec/runner/object_ext_spec.rb +0 -11
@@ -1,13 +1,11 @@
1
+ require 'spec/runner/formatter/base_text_formatter'
2
+
1
3
  module Spec
2
4
  module Runner
3
5
  module Formatter
4
6
  class FailingExamplesFormatter < BaseTextFormatter
5
- def add_behaviour(behaviour_name)
6
- @behaviour_name = behaviour_name
7
- end
8
-
9
7
  def example_failed(example, counter, failure)
10
- @output.puts "#{@behaviour_name} #{example.description}"
8
+ @output.puts "#{example_group.description} #{example.description}"
11
9
  @output.flush
12
10
  end
13
11
 
@@ -1,4 +1,5 @@
1
1
  require 'erb'
2
+ require 'spec/runner/formatter/base_text_formatter'
2
3
 
3
4
  module Spec
4
5
  module Runner
@@ -6,15 +7,15 @@ module Spec
6
7
  class HtmlFormatter < BaseTextFormatter
7
8
  include ERB::Util # for the #h method
8
9
 
9
- def initialize(output)
10
+ def initialize(options, output)
10
11
  super
11
- @current_behaviour_number = 0
12
+ @current_example_group_number = 0
12
13
  @current_example_number = 0
13
14
  end
14
15
 
15
- # The number of the currently running behaviour
16
- def current_behaviour_number
17
- @current_behaviour_number
16
+ # The number of the currently running example_group
17
+ def current_example_group_number
18
+ @current_example_group_number
18
19
  end
19
20
 
20
21
  # The number of the currently running example (a global counter)
@@ -30,17 +31,18 @@ module Spec
30
31
  @output.flush
31
32
  end
32
33
 
33
- def add_behaviour(name)
34
- @behaviour_red = false
35
- @behaviour_red = false
36
- @current_behaviour_number += 1
37
- unless current_behaviour_number == 1
34
+ def add_example_group(example_group)
35
+ super
36
+ @example_group_red = false
37
+ @example_group_red = false
38
+ @current_example_group_number += 1
39
+ unless current_example_group_number == 1
38
40
  @output.puts " </dl>"
39
41
  @output.puts "</div>"
40
42
  end
41
- @output.puts "<div class=\"behaviour\">"
43
+ @output.puts "<div class=\"example_group\">"
42
44
  @output.puts " <dl>"
43
- @output.puts " <dt id=\"behaviour_#{current_behaviour_number}\">#{h(name)}</dt>"
45
+ @output.puts " <dt id=\"example_group_#{current_example_group_number}\">#{h(example_group.description)}</dt>"
44
46
  @output.flush
45
47
  end
46
48
 
@@ -51,7 +53,7 @@ module Spec
51
53
  end
52
54
 
53
55
  def example_started(example)
54
- @current_example_number = example.number
56
+ @current_example_number += 1
55
57
  end
56
58
 
57
59
  def example_passed(example)
@@ -65,8 +67,8 @@ module Spec
65
67
  failure_style = failure.pending_fixed? ? 'pending_fixed' : 'failed'
66
68
  @output.puts " <script type=\"text/javascript\">makeRed('rspec-header');</script>" unless @header_red
67
69
  @header_red = true
68
- @output.puts " <script type=\"text/javascript\">makeRed('behaviour_#{current_behaviour_number}');</script>" unless @behaviour_red
69
- @behaviour_red = true
70
+ @output.puts " <script type=\"text/javascript\">makeRed('example_group_#{current_example_group_number}');</script>" unless @example_group_red
71
+ @example_group_red = true
70
72
  move_progress
71
73
  @output.puts " <dd class=\"spec #{failure_style}\">"
72
74
  @output.puts " <span class=\"failed_spec_name\">#{h(example.description)}</span>"
@@ -79,11 +81,11 @@ module Spec
79
81
  @output.flush
80
82
  end
81
83
 
82
- def example_pending(behaviour_name, example_name, message)
84
+ def example_pending(example_group_description, example, message)
83
85
  @output.puts " <script type=\"text/javascript\">makeYellow('rspec-header');</script>" unless @header_red
84
- @output.puts " <script type=\"text/javascript\">makeYellow('behaviour_#{current_behaviour_number}');</script>" unless @behaviour_red
86
+ @output.puts " <script type=\"text/javascript\">makeYellow('example_group_#{current_example_group_number}');</script>" unless @example_group_red
85
87
  move_progress
86
- @output.puts " <dd class=\"spec not_implemented\"><span class=\"not_implemented_spec_name\">#{h(example_name)}</span></dd>"
88
+ @output.puts " <dd class=\"spec not_implemented\"><span class=\"not_implemented_spec_name\">#{h(example.description)} (PENDING: #{h(message)})</span></dd>"
87
89
  @output.flush
88
90
  end
89
91
 
@@ -91,20 +93,29 @@ module Spec
91
93
  # could output links to images or other files produced during the specs.
92
94
  #
93
95
  def extra_failure_content(failure)
96
+ require 'spec/runner/formatter/snippet_extractor'
97
+ @snippet_extractor ||= SnippetExtractor.new
94
98
  " <pre class=\"ruby\"><code>#{@snippet_extractor.snippet(failure.exception)}</code></pre>"
95
99
  end
96
100
 
97
101
  def move_progress
98
- percent_done = @example_count == 0 ? 100.0 : ((current_example_number + 1).to_f / @example_count.to_f * 1000).to_i / 10.0
99
102
  @output.puts " <script type=\"text/javascript\">moveProgressBar('#{percent_done}');</script>"
100
103
  @output.flush
101
104
  end
102
105
 
106
+ def percent_done
107
+ result = 100.0
108
+ if @example_count != 0
109
+ result = ((current_example_number).to_f / @example_count.to_f * 1000).to_i / 10.0
110
+ end
111
+ result
112
+ end
113
+
103
114
  def dump_failure(counter, failure)
104
115
  end
105
116
 
106
117
  def dump_summary(duration, example_count, failure_count, pending_count)
107
- if @dry_run
118
+ if dry_run?
108
119
  totals = "This was a dry-run"
109
120
  else
110
121
  totals = "#{example_count} example#{'s' unless example_count == 1}, #{failure_count} failure#{'s' unless failure_count == 1}"
@@ -121,15 +132,14 @@ module Spec
121
132
 
122
133
  def html_header
123
134
  <<-EOF
124
- <?xml version="1.0" encoding="iso-8859-1"?>
125
- <!DOCTYPE html
126
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
127
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
128
-
135
+ <?xml version="1.0" encoding="UTF-8"?>
136
+ <!DOCTYPE html
137
+ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
138
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
129
139
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
130
140
  <head>
131
141
  <title>RSpec results</title>
132
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
142
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
133
143
  <meta http-equiv="Expires" content="-1" />
134
144
  <meta http-equiv="Pragma" content="no-cache" />
135
145
  <style type="text/css">
@@ -225,7 +235,7 @@ EOF
225
235
  font-size: 1.2em;
226
236
  }
227
237
 
228
- .behaviour {
238
+ .example_group {
229
239
  margin: 0 10px 5px;
230
240
  background: #fff;
231
241
  }
@@ -0,0 +1,47 @@
1
+ require 'spec/runner/formatter/progress_bar_formatter'
2
+
3
+ module Spec
4
+ module Runner
5
+ module Formatter
6
+ class ProfileFormatter < ProgressBarFormatter
7
+
8
+ def initialize(options, where)
9
+ super
10
+ @example_times = []
11
+ end
12
+
13
+ def start(count)
14
+ @output.puts "Profiling enabled."
15
+ end
16
+
17
+ def example_started(example)
18
+ @time = Time.now
19
+ end
20
+
21
+ def example_passed(example)
22
+ super
23
+ @example_times << [
24
+ example_group.description,
25
+ example.description,
26
+ Time.now - @time
27
+ ]
28
+ end
29
+
30
+ def start_dump
31
+ super
32
+ @output.puts "\n\nTop 10 slowest examples:\n"
33
+
34
+ @example_times = @example_times.sort_by do |description, example, time|
35
+ time
36
+ end.reverse
37
+
38
+ @example_times[0..9].each do |description, example, time|
39
+ @output.print red(sprintf("%.7f", time))
40
+ @output.puts " #{description} #{example}"
41
+ end
42
+ @output.flush
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -1,10 +1,9 @@
1
+ require 'spec/runner/formatter/base_text_formatter'
2
+
1
3
  module Spec
2
4
  module Runner
3
5
  module Formatter
4
6
  class ProgressBarFormatter < BaseTextFormatter
5
- def add_behaviour(name)
6
- end
7
-
8
7
  def example_failed(example, counter, failure)
9
8
  @output.print colourise('F', failure)
10
9
  @output.flush
@@ -15,7 +14,7 @@ module Spec
15
14
  @output.flush
16
15
  end
17
16
 
18
- def example_pending(behaviour_name, example_name, message)
17
+ def example_pending(example_group_description, example, message)
19
18
  super
20
19
  @output.print yellow('P')
21
20
  @output.flush
@@ -1,27 +1,41 @@
1
+ require 'spec/runner/formatter/base_text_formatter'
2
+
1
3
  module Spec
2
4
  module Runner
3
5
  module Formatter
4
- class SpecdocFormatter < BaseTextFormatter
5
- def add_behaviour(name)
6
- @output.puts
7
- @output.puts name
8
- @output.flush
6
+ class SpecdocFormatter < BaseTextFormatter
7
+ def add_example_group(example_group)
8
+ super
9
+ output.puts
10
+ if example_group.description.nil? || example_group.description == ""
11
+ output.puts example_group.to_s
12
+ else
13
+ output.puts example_group.description
14
+ end
15
+ output.flush
9
16
  end
10
17
 
11
18
  def example_failed(example, counter, failure)
12
- @output.puts failure.expectation_not_met? ? red("- #{example.description} (FAILED - #{counter})") : magenta("- #{example.description} (ERROR - #{counter})")
13
- @output.flush
19
+ message = if failure.expectation_not_met?
20
+ "- #{example.description} (FAILED - #{counter})"
21
+ else
22
+ "- #{example.description} (ERROR - #{counter})"
23
+ end
24
+
25
+ output.puts(failure.expectation_not_met? ? red(message) : magenta(message))
26
+ output.flush
14
27
  end
15
-
28
+
16
29
  def example_passed(example)
17
- @output.puts green("- #{example.description}")
18
- @output.flush
30
+ message = "- #{example.description}"
31
+ output.puts green(message)
32
+ output.flush
19
33
  end
20
34
 
21
- def example_pending(behaviour_name, example_name, message)
35
+ def example_pending(example_group_description, example, message)
22
36
  super
23
- @output.puts yellow("- #{example_name} (PENDING: #{message})")
24
- @output.flush
37
+ output.puts yellow("- #{example.description} (PENDING: #{message})")
38
+ output.flush
25
39
  end
26
40
  end
27
41
  end
@@ -0,0 +1,124 @@
1
+ require 'erb'
2
+ require 'spec/runner/formatter/base_text_formatter'
3
+
4
+ module Spec
5
+ module Runner
6
+ module Formatter
7
+ module Story
8
+ class HtmlFormatter < BaseTextFormatter
9
+ include ERB::Util
10
+
11
+ def run_started(count)
12
+ @output.puts <<-EOF
13
+ <?xml version="1.0" encoding="UTF-8"?>
14
+ <!DOCTYPE html
15
+ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
16
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
17
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
18
+ <head>
19
+ <title>Stories</title>
20
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
21
+ <meta http-equiv="Expires" content="-1" />
22
+ <meta http-equiv="Pragma" content="no-cache" />
23
+ <script src="javascripts/prototype.js" type="text/javascript"></script>
24
+ <script src="javascripts/scriptaculous.js" type="text/javascript"></script>
25
+ <script src="javascripts/rspec.js" type="text/javascript"></script>
26
+ <link href="stylesheets/rspec.css" rel="stylesheet" type="text/css" />
27
+ </head>
28
+ <body>
29
+ <div id="container">
30
+ EOF
31
+ end
32
+
33
+ def collected_steps(steps)
34
+ unless steps.empty?
35
+ @output.puts " <ul id=\"stock_steps\" style=\"display: none;\">"
36
+ steps.each do |step|
37
+ @output.puts " <li>#{step}</li>"
38
+ end
39
+ @output.puts " </ul>"
40
+ end
41
+ end
42
+
43
+ def run_ended
44
+ @output.puts <<-EOF
45
+ </div>
46
+ </body>
47
+ </head>
48
+ EOF
49
+ end
50
+
51
+ def story_started(title, narrative)
52
+ @output.puts <<-EOF
53
+ <dl class="story passed">
54
+ <dt>Story: #{h title}</dt>
55
+ <dd>
56
+ <p>
57
+ #{h(narrative).split("\n").join("<br />")}
58
+ </p>
59
+ EOF
60
+ end
61
+
62
+ def story_ended(title, narrative)
63
+ @output.puts <<-EOF
64
+ </dd>
65
+ </dl>
66
+ EOF
67
+ end
68
+
69
+ def scenario_started(story_title, scenario_name)
70
+ @output.puts <<-EOF
71
+ <dl class="passed">
72
+ <dt>Scenario: #{h scenario_name}</dt>
73
+ <dd>
74
+ <ul class="steps">
75
+ EOF
76
+ end
77
+
78
+ def scenario_ended
79
+ @output.puts <<-EOF
80
+ </ul>
81
+ </dd>
82
+ </dl>
83
+ EOF
84
+ end
85
+
86
+ def found_scenario(type, description)
87
+ end
88
+
89
+ def scenario_succeeded(story_title, scenario_name)
90
+ scenario_ended
91
+ end
92
+
93
+ def scenario_pending(story_title, scenario_name, reason)
94
+ scenario_ended
95
+ end
96
+
97
+ def scenario_failed(story_title, scenario_name, err)
98
+ scenario_ended
99
+ end
100
+
101
+ def step_succeeded(type, description, *args)
102
+ print_step('passed', type, description, *args) # TODO: uses succeeded CSS class
103
+ end
104
+
105
+ def step_pending(type, description, *args)
106
+ print_step('pending', type, description, *args)
107
+ end
108
+
109
+ def step_failed(type, description, *args)
110
+ print_step('failed', type, description, *args)
111
+ end
112
+
113
+ def print_step(klass, type, description, *args)
114
+ spans = args.map { |arg| "<span class=\"param\">#{arg}</span>" }
115
+ i = -1
116
+ inner = type.to_s.capitalize + ' ' + description.gsub(::Spec::Story::Step::PARAM_PATTERN) { |param| spans[i+=1] }
117
+ @output.puts " <li class=\"#{klass}\">#{inner}</li>"
118
+ end
119
+
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,123 @@
1
+ require 'spec/runner/formatter/base_text_formatter'
2
+
3
+ module Spec
4
+ module Runner
5
+ module Formatter
6
+ module Story
7
+ class PlainTextFormatter < BaseTextFormatter
8
+ def initialize(options, where)
9
+ super
10
+ @successful_scenario_count = 0
11
+ @pending_scenario_count = 0
12
+ @failed_scenarios = []
13
+ @pending_steps = []
14
+ @previous_type = nil
15
+ end
16
+
17
+ def run_started(count)
18
+ @count = count
19
+ @output.puts "Running #@count scenarios\n\n"
20
+ end
21
+
22
+ def story_started(title, narrative)
23
+ @output.puts "Story: #{title}\n\n"
24
+ narrative.each_line do |line|
25
+ @output.print " "
26
+ @output.print line
27
+ end
28
+ end
29
+
30
+ def story_ended(title, narrative)
31
+ @output.puts
32
+ @output.puts
33
+ end
34
+
35
+ def scenario_started(story_title, scenario_name)
36
+ @scenario_already_failed = false
37
+ @output.print "\n\n Scenario: #{scenario_name}"
38
+ @scenario_ok = true
39
+ end
40
+
41
+ def scenario_succeeded(story_title, scenario_name)
42
+ @successful_scenario_count += 1
43
+ end
44
+
45
+ def scenario_failed(story_title, scenario_name, err)
46
+ @failed_scenarios << [story_title, scenario_name, err] unless @scenario_already_failed
47
+ @scenario_already_failed = true
48
+ end
49
+
50
+ def scenario_pending(story_title, scenario_name, msg)
51
+ @pending_steps << [story_title, scenario_name, msg]
52
+ @pending_scenario_count += 1 unless @scenario_already_failed
53
+ @scenario_already_failed = true
54
+ end
55
+
56
+ def run_ended
57
+ @output.puts "#@count scenarios: #@successful_scenario_count succeeded, #{@failed_scenarios.size} failed, #@pending_scenario_count pending"
58
+ unless @pending_steps.empty?
59
+ @output.puts "\nPending Steps:"
60
+ @pending_steps.each_with_index do |pending, i|
61
+ title, scenario_name, msg = pending
62
+ @output.puts "#{i+1}) #{title} (#{scenario_name}): #{msg}"
63
+ end
64
+ end
65
+ unless @failed_scenarios.empty?
66
+ @output.print "\nFAILURES:"
67
+ @failed_scenarios.each_with_index do |failure, i|
68
+ title, scenario_name, err = failure
69
+ @output.print %[
70
+ #{i+1}) #{title} (#{scenario_name}) FAILED
71
+ #{err.class}: #{err.message}
72
+ #{err.backtrace.join("\n")}
73
+ ]
74
+ end
75
+ end
76
+ end
77
+
78
+ def step_succeeded(type, description, *args)
79
+ found_step(type, description, false, *args)
80
+ end
81
+
82
+ def step_pending(type, description, *args)
83
+ found_step(type, description, false, *args)
84
+ @output.print " (PENDING)"
85
+ @scenario_ok = false
86
+ end
87
+
88
+ def step_failed(type, description, *args)
89
+ found_step(type, description, true, *args)
90
+ @output.print red(@scenario_ok ? " (FAILED)" : " (SKIPPED)")
91
+ @scenario_ok = false
92
+ end
93
+
94
+ def collected_steps(steps)
95
+ end
96
+
97
+ def method_missing(sym, *args, &block) #:nodoc:
98
+ # noop - ignore unknown messages
99
+ end
100
+
101
+ private
102
+
103
+ def found_step(type, description, failed, *args)
104
+ text = if(type == @previous_type)
105
+ "\n And "
106
+ else
107
+ "\n\n #{type.to_s.capitalize} "
108
+ end
109
+ i = -1
110
+ text << description.gsub(::Spec::Story::Step::PARAM_PATTERN) { |param| args[i+=1] }
111
+ @output.print(failed ? red(text) : green(text))
112
+
113
+ if type == :'given scenario'
114
+ @previous_type = :given
115
+ else
116
+ @previous_type = type
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end