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
@@ -0,0 +1,219 @@
1
+ require File.dirname(__FILE__) + '/../story_helper'
2
+
3
+ module Spec
4
+ module Story
5
+ module Runner
6
+ describe StoryRunner do
7
+ it 'should collect all the stories' do
8
+ # given
9
+ story_runner = StoryRunner.new(stub('scenario_runner'))
10
+
11
+ # when
12
+ story_runner.Story 'title1', 'narrative1' do end
13
+ story_runner.Story 'title2', 'narrative2' do end
14
+ stories = story_runner.stories
15
+
16
+ # then
17
+ story_runner.should have(2).stories
18
+ stories.first.title.should == 'title1'
19
+ stories.first.narrative.should == 'narrative1'
20
+ stories.last.title.should == 'title2'
21
+ stories.last.narrative.should == 'narrative2'
22
+ end
23
+
24
+ it 'should gather all the scenarios in the stories' do
25
+ # given
26
+ story_runner = StoryRunner.new(stub('scenario_runner'))
27
+
28
+ # when
29
+ story_runner.Story "story1", "narrative1" do
30
+ Scenario "scenario1" do end
31
+ Scenario "scenario2" do end
32
+ end
33
+ story_runner.Story "story2", "narrative2" do
34
+ Scenario "scenario3" do end
35
+ end
36
+ scenarios = story_runner.scenarios
37
+
38
+ # then
39
+ story_runner.should have(3).scenarios
40
+ scenarios[0].name.should == 'scenario1'
41
+ scenarios[1].name.should == 'scenario2'
42
+ scenarios[2].name.should == 'scenario3'
43
+ end
44
+
45
+ # captures worlds passed into a ScenarioRunner
46
+ class ScenarioWorldCatcher
47
+ attr_accessor :worlds
48
+ def run(scenario, world)
49
+ (@worlds ||= []) << world
50
+ end
51
+ end
52
+
53
+ it 'should run each scenario in a separate object' do
54
+ # given
55
+ scenario_world_catcher = ScenarioWorldCatcher.new
56
+ story_runner = StoryRunner.new(scenario_world_catcher)
57
+ story_runner.Story 'story', 'narrative' do
58
+ Scenario 'scenario1' do end
59
+ Scenario 'scenario2' do end
60
+ end
61
+
62
+ # when
63
+ story_runner.run_stories
64
+
65
+ # then
66
+ worlds = scenario_world_catcher.worlds
67
+ scenario_world_catcher.should have(2).worlds
68
+ worlds[0].should_not == worlds[1]
69
+ end
70
+
71
+ it 'should use the provided world creator to create worlds' do
72
+ # given
73
+ stub_scenario_runner = stub_everything
74
+ mock_world_creator = mock('world creator')
75
+ story_runner = StoryRunner.new(stub_scenario_runner, mock_world_creator)
76
+ story_runner.Story 'story', 'narrative' do
77
+ Scenario 'scenario1' do end
78
+ Scenario 'scenario2' do end
79
+ end
80
+
81
+ # expect
82
+ mock_world_creator.should_receive(:create).twice
83
+
84
+ # when
85
+ story_runner.run_stories
86
+
87
+ # then
88
+ end
89
+
90
+ it 'should notify listeners of the scenario count when the run starts' do
91
+ # given
92
+ story_runner = StoryRunner.new(stub_everything)
93
+ mock_listener1 = stub_everything('listener1')
94
+ mock_listener2 = stub_everything('listener2')
95
+ story_runner.add_listener(mock_listener1)
96
+ story_runner.add_listener(mock_listener2)
97
+
98
+ story_runner.Story 'story1', 'narrative1' do
99
+ Scenario 'scenario1' do end
100
+ end
101
+ story_runner.Story 'story2', 'narrative2' do
102
+ Scenario 'scenario2' do end
103
+ Scenario 'scenario3' do end
104
+ end
105
+
106
+ # expect
107
+ mock_listener1.should_receive(:run_started).with(3)
108
+ mock_listener2.should_receive(:run_started).with(3)
109
+
110
+ # when
111
+ story_runner.run_stories
112
+
113
+ # then
114
+ end
115
+
116
+ it 'should notify listeners when a story starts' do
117
+ # given
118
+ story_runner = StoryRunner.new(stub_everything)
119
+ mock_listener1 = stub_everything('listener1')
120
+ mock_listener2 = stub_everything('listener2')
121
+ story_runner.add_listener(mock_listener1)
122
+ story_runner.add_listener(mock_listener2)
123
+
124
+ story_runner.Story 'story1', 'narrative1' do
125
+ Scenario 'scenario1' do end
126
+ end
127
+ story_runner.Story 'story2', 'narrative2' do
128
+ Scenario 'scenario2' do end
129
+ Scenario 'scenario3' do end
130
+ end
131
+
132
+ # expect
133
+ mock_listener1.should_receive(:story_started).with('story1', 'narrative1')
134
+ mock_listener1.should_receive(:story_ended).with('story1', 'narrative1')
135
+ mock_listener2.should_receive(:story_started).with('story2', 'narrative2')
136
+ mock_listener2.should_receive(:story_ended).with('story2', 'narrative2')
137
+
138
+ # when
139
+ story_runner.run_stories
140
+
141
+ # then
142
+ end
143
+
144
+ it 'should notify listeners when the run ends' do
145
+ # given
146
+ story_runner = StoryRunner.new(stub_everything)
147
+ mock_listener1 = stub_everything('listener1')
148
+ mock_listener2 = stub_everything('listener2')
149
+ story_runner.add_listener mock_listener1
150
+ story_runner.add_listener mock_listener2
151
+ story_runner.Story 'story1', 'narrative1' do
152
+ Scenario 'scenario1' do end
153
+ end
154
+
155
+ # expect
156
+ mock_listener1.should_receive(:run_ended)
157
+ mock_listener2.should_receive(:run_ended)
158
+
159
+ # when
160
+ story_runner.run_stories
161
+
162
+ # then
163
+ end
164
+
165
+ it 'should run a story in an instance of a specified class' do
166
+ # given
167
+ scenario_world_catcher = ScenarioWorldCatcher.new
168
+ story_runner = StoryRunner.new(scenario_world_catcher)
169
+ story_runner.Story 'title', 'narrative', :type => String do
170
+ Scenario 'scenario' do end
171
+ end
172
+
173
+ # when
174
+ story_runner.run_stories
175
+
176
+ # then
177
+ scenario_world_catcher.worlds[0].should be_kind_of(String)
178
+ scenario_world_catcher.worlds[0].should be_kind_of(World)
179
+ end
180
+
181
+ it 'should pass initialization params through to the constructed instance' do
182
+ # given
183
+ scenario_world_catcher = ScenarioWorldCatcher.new
184
+ story_runner = StoryRunner.new(scenario_world_catcher)
185
+ story_runner.Story 'title', 'narrative', :type => Array, :args => [3] do
186
+ Scenario 'scenario' do end
187
+ end
188
+
189
+ # when
190
+ story_runner.run_stories
191
+
192
+ # then
193
+ scenario_world_catcher.worlds[0].should be_kind_of(Array)
194
+ scenario_world_catcher.worlds[0].size.should == 3
195
+ end
196
+
197
+ it 'should find a scenario in the current story by name' do
198
+ # given
199
+ story_runner = StoryRunner.new(ScenarioRunner.new)
200
+ $scenario = nil
201
+
202
+ story_runner.Story 'title', 'narrative' do
203
+ Scenario 'first scenario' do
204
+ end
205
+ Scenario 'second scenario' do
206
+ $scenario = StoryRunner.scenario_from_current_story 'first scenario'
207
+ end
208
+ end
209
+
210
+ # when
211
+ story_runner.run_stories
212
+
213
+ # then
214
+ $scenario.name.should == 'first scenario'
215
+ end
216
+ end
217
+ end
218
+ end
219
+ end
@@ -0,0 +1,106 @@
1
+ require File.dirname(__FILE__) + '/story_helper'
2
+
3
+ module Spec
4
+ module Story
5
+ describe Runner, "module" do
6
+ def dev_null
7
+ io = StringIO.new
8
+ def io.write(str)
9
+ str.to_s.size
10
+ end
11
+ return io
12
+ end
13
+
14
+ before :each do
15
+ Kernel.stub!(:at_exit)
16
+ @stdout, $stdout = $stdout, dev_null
17
+ @argv = Array.new(ARGV)
18
+ @runner_module = Runner.dup
19
+ @world_creator = World.dup
20
+ @runner_module.module_eval { @run_options = @story_runner = @scenario_runner = @world_creator = nil }
21
+ end
22
+
23
+ after :each do
24
+ $stdout = @stdout
25
+ ARGV.replace @argv
26
+ @runner_module.module_eval { @run_options = @story_runner = @scenario_runner = @world_creator = nil }
27
+ end
28
+
29
+ it 'should wire up a singleton StoryRunner' do
30
+ @runner_module.story_runner.should_not be_nil
31
+ end
32
+
33
+ it 'should set its options based on ARGV' do
34
+ # given
35
+ ARGV << '--dry-run'
36
+
37
+ # when
38
+ options = @runner_module.run_options
39
+
40
+ # then
41
+ options.dry_run.should be_true
42
+ end
43
+
44
+ it 'should add a reporter to the runner classes' do
45
+ # given
46
+ story_runner = mock('story runner', :null_object => true)
47
+ scenario_runner = mock('scenario runner', :null_object => true)
48
+ world_creator = mock('world', :null_object => true)
49
+
50
+ @runner_module::class_eval { @world_creator = world_creator }
51
+ @runner_module::StoryRunner.stub!(:new).and_return(story_runner)
52
+ @runner_module::ScenarioRunner.stub!(:new).and_return(scenario_runner)
53
+
54
+ # expect
55
+ world_creator.should_receive(:add_listener).with(an_instance_of(Spec::Runner::Formatter::Story::PlainTextFormatter))
56
+ story_runner.should_receive(:add_listener).with(an_instance_of(Spec::Runner::Formatter::Story::PlainTextFormatter))
57
+ scenario_runner.should_receive(:add_listener).with(an_instance_of(Spec::Runner::Formatter::Story::PlainTextFormatter))
58
+
59
+ # when
60
+ @runner_module.story_runner
61
+ end
62
+
63
+ it 'should add a documenter to the runner classes if one is specified' do
64
+ # given
65
+ ARGV << "--format" << "html"
66
+ story_runner = mock('story runner', :null_object => true)
67
+ scenario_runner = mock('scenario runner', :null_object => true)
68
+ world_creator = mock('world', :null_object => true)
69
+
70
+ @runner_module::class_eval { @world_creator = world_creator }
71
+ @runner_module::StoryRunner.stub!(:new).and_return(story_runner)
72
+ @runner_module::ScenarioRunner.stub!(:new).and_return(scenario_runner)
73
+
74
+ # expect
75
+ world_creator.should_receive(:add_listener).with(an_instance_of(Spec::Runner::Formatter::Story::HtmlFormatter))
76
+ story_runner.should_receive(:add_listener).with(an_instance_of(Spec::Runner::Formatter::Story::HtmlFormatter))
77
+ scenario_runner.should_receive(:add_listener).with(an_instance_of(Spec::Runner::Formatter::Story::HtmlFormatter))
78
+
79
+ # when
80
+ @runner_module.story_runner
81
+ end
82
+
83
+ it 'should add any registered listener to the runner classes' do
84
+ # given
85
+ ARGV << "--format" << "html"
86
+ story_runner = mock('story runner', :null_object => true)
87
+ scenario_runner = mock('scenario runner', :null_object => true)
88
+ world_creator = mock('world', :null_object => true)
89
+
90
+ @runner_module::class_eval { @world_creator = world_creator }
91
+ @runner_module::StoryRunner.stub!(:new).and_return(story_runner)
92
+ @runner_module::ScenarioRunner.stub!(:new).and_return(scenario_runner)
93
+
94
+ listener = Object.new
95
+
96
+ # expect
97
+ world_creator.should_receive(:add_listener).with(listener)
98
+ story_runner.should_receive(:add_listener).with(listener)
99
+ scenario_runner.should_receive(:add_listener).with(listener)
100
+
101
+ # when
102
+ @runner_module.register_listener listener
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,20 @@
1
+ require File.dirname(__FILE__) + '/story_helper'
2
+
3
+ module Spec
4
+ module Story
5
+ describe Scenario do
6
+ it 'should not raise an error if no body is supplied' do
7
+ # given
8
+ story = StoryBuilder.new.to_story
9
+
10
+ # when
11
+ error = exception_from do
12
+ Scenario.new story, 'name'
13
+ end
14
+
15
+ # then
16
+ error.should be_nil
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,157 @@
1
+ require File.dirname(__FILE__) + '/story_helper'
2
+
3
+ module Spec
4
+ module Story
5
+ describe StepGroup do
6
+ before(:each) do
7
+ @step_group = StepGroup.new
8
+ end
9
+
10
+ it "should not find a matcher if empty" do
11
+ @step_group.find(:given, "this and that").should be_nil
12
+ end
13
+
14
+ it "should create a given_scenario matcher" do
15
+ step = @step_group.given_scenario("this and that") {}
16
+ @step_group.find(:given_scenario, "this and that").should_not be_nil
17
+ @step_group.find(:given_scenario, "this and that").should equal(step)
18
+ end
19
+
20
+ it "should create a given matcher" do
21
+ step = @step_group.given("this and that") {}
22
+ @step_group.find(:given, "this and that").should equal(step)
23
+ end
24
+
25
+ it "should create a when matcher" do
26
+ step = @step_group.when("this and that") {}
27
+ @step_group.find(:when, "this and that").should equal(step)
28
+ end
29
+
30
+ it "should create a them matcher" do
31
+ step = @step_group.then("this and that") {}
32
+ @step_group.find(:then, "this and that").should equal(step)
33
+ end
34
+
35
+ it "should add a matcher object" do
36
+ step = Step.new("this and that") {}
37
+ @step_group.add(:given, step)
38
+ @step_group.find(:given, "this and that").should equal(step)
39
+ end
40
+
41
+ it "should add it matchers to another StepGroup (with one given)" do
42
+ source = StepGroup.new
43
+ target = StepGroup.new
44
+ step = source.given("this and that") {}
45
+ source.add_to target
46
+ target.find(:given, "this and that").should equal(step)
47
+ end
48
+
49
+ it "should add it matchers to another StepGroup (with some of each type)" do
50
+ source = StepGroup.new
51
+ target = StepGroup.new
52
+ given_scenario = source.given_scenario("1") {}
53
+ given = source.given("1") {}
54
+ when1 = source.when("1") {}
55
+ when2 = source.when("2") {}
56
+ then1 = source.then("1") {}
57
+ then2 = source.then("2") {}
58
+ then3 = source.then("3") {}
59
+ source.add_to target
60
+ target.find(:given_scenario, "1").should equal(given_scenario)
61
+ target.find(:given, "1").should equal(given)
62
+ target.find(:when, "1").should equal(when1)
63
+ target.find(:when, "2").should equal(when2)
64
+ target.find(:then, "1").should equal(then1)
65
+ target.find(:then, "2").should equal(then2)
66
+ target.find(:then, "3").should equal(then3)
67
+ end
68
+
69
+ it "should append another collection" do
70
+ matchers_to_append = StepGroup.new
71
+ step = matchers_to_append.given("this and that") {}
72
+ @step_group << matchers_to_append
73
+ @step_group.find(:given, "this and that").should equal(step)
74
+ end
75
+
76
+ it "should append several other collections" do
77
+ matchers_to_append = StepGroup.new
78
+ more_matchers_to_append = StepGroup.new
79
+ first_matcher = matchers_to_append.given("this and that") {}
80
+ second_matcher = more_matchers_to_append.given("and the other") {}
81
+ @step_group << matchers_to_append
82
+ @step_group << more_matchers_to_append
83
+ @step_group.find(:given, "this and that").should equal(first_matcher)
84
+ @step_group.find(:given, "and the other").should equal(second_matcher)
85
+ end
86
+
87
+ it "should yield itself on initialization" do
88
+ begin
89
+ $step_group_spec_step = nil
90
+ matchers = StepGroup.new do |matchers|
91
+ $step_group_spec_step = matchers.given("foo") {}
92
+ end
93
+ $step_group_spec_step.matches?("foo").should be_true
94
+ ensure
95
+ $step_group_spec_step = nil
96
+ end
97
+ end
98
+
99
+ it "should support defaults" do
100
+ class StepGroupSubclass < StepGroup
101
+ steps do |add|
102
+ add.given("foo") {}
103
+ end
104
+ end
105
+ StepGroupSubclass.new.find(:given, "foo").should_not be_nil
106
+ end
107
+
108
+ it "should create a Given" do
109
+ sub = Class.new(StepGroup).new
110
+ step = sub.Given("foo") {}
111
+ sub.find(:given, "foo").should == step
112
+ end
113
+
114
+ it "should create a When" do
115
+ sub = Class.new(StepGroup).new
116
+ step = sub.When("foo") {}
117
+ sub.find(:when, "foo").should == step
118
+ end
119
+
120
+ it "should create a Then" do
121
+ sub = Class.new(StepGroup).new
122
+ step = sub.Then("foo") {}
123
+ sub.find(:then, "foo").should == step
124
+ end
125
+
126
+ it "should create steps in a block" do
127
+ sub = Class.new(StepGroup).new do
128
+ Given("a given") {}
129
+ When("a when") {}
130
+ Then("a then") {}
131
+ end
132
+ sub.find(:given, "a given").should_not be_nil
133
+ sub.find(:when, "a when").should_not be_nil
134
+ sub.find(:then, "a then").should_not be_nil
135
+ end
136
+
137
+ it "should clear itself" do
138
+ step = @step_group.given("this and that") {}
139
+ @step_group.clear
140
+ @step_group.find(:given, "this and that").should be_nil
141
+ end
142
+
143
+ it "should tell you when it is empty" do
144
+ @step_group.should be_empty
145
+ end
146
+
147
+ it "should tell you when it is not empty" do
148
+ @step_group.given("this and that") {}
149
+ @step_group.should_not be_empty
150
+ end
151
+
152
+ it "should handle << nil" do
153
+ @step_group << nil
154
+ end
155
+ end
156
+ end
157
+ end