rspec 1.0.8 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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