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,133 @@
1
+ require File.dirname(__FILE__) + '/../story_helper'
2
+
3
+ module Spec
4
+ module Story
5
+ module Runner
6
+
7
+ describe StoryMediator do
8
+ before(:each) do
9
+ $story_mediator_spec_value = nil
10
+ @step_group = StepGroup.new
11
+ @step_group.create_matcher(:given, "given") { $story_mediator_spec_value = "given matched" }
12
+ @step_group.create_matcher(:when, "when") { $story_mediator_spec_value = "when matched" }
13
+ @step_group.create_matcher(:then, "then") { $story_mediator_spec_value = "then matched" }
14
+
15
+ @scenario_runner = ScenarioRunner.new
16
+ @runner = StoryRunner.new @scenario_runner
17
+ @mediator = StoryMediator.new @step_group, @runner
18
+ end
19
+
20
+ def run_stories
21
+ @mediator.run_stories
22
+ @runner.run_stories
23
+ end
24
+
25
+ it "should have no stories" do
26
+ @mediator.stories.should be_empty
27
+ end
28
+
29
+ it "should create two stories" do
30
+ @mediator.create_story "story title", "story narrative"
31
+ @mediator.create_story "story title 2", "story narrative 2"
32
+ run_stories
33
+
34
+ @runner.should have(2).stories
35
+ @runner.stories.first.title.should == "story title"
36
+ @runner.stories.first.narrative.should == "story narrative"
37
+ @runner.stories.last.title.should == "story title 2"
38
+ @runner.stories.last.narrative.should == "story narrative 2"
39
+ end
40
+
41
+ it "should create a scenario" do
42
+ @mediator.create_story "title", "narrative"
43
+ @mediator.create_scenario "scenario name"
44
+ run_stories
45
+
46
+ @runner.should have(1).scenarios
47
+ @runner.scenarios.first.name.should == "scenario name"
48
+ @runner.scenarios.first.story.should == @runner.stories.first
49
+ end
50
+
51
+ it "should create a given scenario step if one matches" do
52
+ pending("need to untangle the dark mysteries of the story runner - something needs to get stubbed here") do
53
+ story = @mediator.create_story "title", "narrative"
54
+ @mediator.create_scenario "previous scenario"
55
+ @mediator.create_scenario "current scenario"
56
+ @mediator.create_given_scenario "previous scenario"
57
+ run_stories
58
+
59
+ $story_mediator_spec_value.should == "previous scenario matched"
60
+ end
61
+ end
62
+
63
+ it "should create a given step if one matches" do
64
+ @mediator.create_story "title", "narrative"
65
+ @mediator.create_scenario "scenario"
66
+ @mediator.create_given "given"
67
+ run_stories
68
+
69
+ $story_mediator_spec_value.should == "given matched"
70
+ end
71
+
72
+ it "should create a pending step if no given step matches" do
73
+ @mediator.create_story "title", "narrative"
74
+ @mediator.create_scenario "scenario"
75
+ @mediator.create_given "no match"
76
+ mock_listener = stub_everything("listener")
77
+ mock_listener.should_receive(:scenario_pending).with("title", "scenario", "Unimplemented step: no match")
78
+ @scenario_runner.add_listener mock_listener
79
+ run_stories
80
+ end
81
+
82
+ it "should create a when step if one matches" do
83
+ @mediator.create_story "title", "narrative"
84
+ @mediator.create_scenario "scenario"
85
+ @mediator.create_when "when"
86
+ run_stories
87
+
88
+ $story_mediator_spec_value.should == "when matched"
89
+ end
90
+
91
+ it "should create a pending step if no when step matches" do
92
+ @mediator.create_story "title", "narrative"
93
+ @mediator.create_scenario "scenario"
94
+ @mediator.create_when "no match"
95
+ mock_listener = stub_everything("listener")
96
+ mock_listener.should_receive(:scenario_pending).with("title", "scenario", "Unimplemented step: no match")
97
+ @scenario_runner.add_listener mock_listener
98
+ run_stories
99
+ end
100
+
101
+ it "should create a then step if one matches" do
102
+ @mediator.create_story "title", "narrative"
103
+ @mediator.create_scenario "scenario"
104
+ @mediator.create_then "then"
105
+ run_stories
106
+
107
+ $story_mediator_spec_value.should == "then matched"
108
+ end
109
+
110
+ it "should create a pending step if no 'then' step matches" do
111
+ @mediator.create_story "title", "narrative"
112
+ @mediator.create_scenario "scenario"
113
+ @mediator.create_then "no match"
114
+ mock_listener = stub_everything("listener")
115
+ mock_listener.should_receive(:scenario_pending).with("title", "scenario", "Unimplemented step: no match")
116
+ @scenario_runner.add_listener mock_listener
117
+ run_stories
118
+ end
119
+
120
+ it "should pass options to the stories it creates" do
121
+ @mediator = StoryMediator.new @step_group, @runner, :foo => :bar
122
+ @mediator.create_story "story title", "story narrative"
123
+
124
+ run_stories
125
+
126
+ @runner.stories.first[:foo].should == :bar
127
+ end
128
+
129
+ end
130
+
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,384 @@
1
+ require File.dirname(__FILE__) + '/../story_helper'
2
+
3
+ module Spec
4
+ module Story
5
+ module Runner
6
+
7
+ describe StoryParser do
8
+ before(:each) do
9
+ @story_mediator = mock("story_mediator")
10
+ @parser = StoryParser.new(@story_mediator)
11
+ end
12
+
13
+ it "should parse no lines" do
14
+ @parser.parse([])
15
+ end
16
+
17
+ it "should ignore text before the first Story: begins" do
18
+ @story_mediator.should_not_receive(:create_scenario)
19
+ @story_mediator.should_not_receive(:create_given)
20
+ @story_mediator.should_not_receive(:create_when)
21
+ @story_mediator.should_not_receive(:create_then)
22
+ @story_mediator.should_receive(:create_story).with("simple addition", "")
23
+ @parser.parse(["Here is a bunch of text", "about a calculator and all the things", "that it will do", "Story: simple addition"])
24
+ end
25
+
26
+ it "should create a story" do
27
+ @story_mediator.should_receive(:create_story).with("simple addition", "")
28
+ @parser.parse(["Story: simple addition"])
29
+ end
30
+
31
+ it "should create a story when line has leading spaces" do
32
+ @story_mediator.should_receive(:create_story).with("simple addition", "")
33
+ @parser.parse([" Story: simple addition"])
34
+ end
35
+
36
+ it "should add a one line narrative to the story" do
37
+ @story_mediator.should_receive(:create_story).with("simple addition","narrative")
38
+ @parser.parse(["Story: simple addition","narrative"])
39
+ end
40
+
41
+ it "should add a multi line narrative to the story" do
42
+ @story_mediator.should_receive(:create_story).with("simple addition","narrative line 1\nline 2\nline 3")
43
+ @parser.parse(["Story: simple addition","narrative line 1", "line 2", "line 3"])
44
+ end
45
+
46
+ it "should exclude blank lines from the narrative" do
47
+ @story_mediator.should_receive(:create_story).with("simple addition","narrative line 1\nline 2")
48
+ @parser.parse(["Story: simple addition","narrative line 1", "", "line 2"])
49
+ end
50
+
51
+ it "should exclude Scenario from the narrative" do
52
+ @story_mediator.should_receive(:create_story).with("simple addition","narrative line 1\nline 2")
53
+ @story_mediator.should_receive(:create_scenario)
54
+ @parser.parse(["Story: simple addition","narrative line 1", "line 2", "Scenario: add one plus one"])
55
+ end
56
+
57
+ end
58
+
59
+ describe StoryParser, "in Story state" do
60
+ before(:each) do
61
+ @story_mediator = mock("story_mediator")
62
+ @parser = StoryParser.new(@story_mediator)
63
+ @story_mediator.stub!(:create_story)
64
+ end
65
+
66
+ it "should create a second Story for Story" do
67
+ @story_mediator.should_receive(:create_story).with("number two","")
68
+ @parser.parse(["Story: s", "Story: number two"])
69
+ end
70
+
71
+ it "should include And in the narrative" do
72
+ @story_mediator.should_receive(:create_story).with("s","And foo")
73
+ @story_mediator.should_receive(:create_scenario).with("bar")
74
+ @parser.parse(["Story: s", "And foo", "Scenario: bar"])
75
+ end
76
+
77
+ it "should create a Scenario for Scenario" do
78
+ @story_mediator.should_receive(:create_scenario).with("number two")
79
+ @parser.parse(["Story: s", "Scenario: number two"])
80
+ end
81
+
82
+ it "should include Given in the narrative" do
83
+ @story_mediator.should_receive(:create_story).with("s","Given foo")
84
+ @story_mediator.should_receive(:create_scenario).with("bar")
85
+ @parser.parse(["Story: s", "Given foo", "Scenario: bar"])
86
+ end
87
+
88
+ it "should include Given: in the narrative" do
89
+ @story_mediator.should_receive(:create_story).with("s","Given: foo")
90
+ @story_mediator.should_receive(:create_scenario).with("bar")
91
+ @parser.parse(["Story: s", "Given: foo", "Scenario: bar"])
92
+ end
93
+
94
+ it "should include When in the narrative" do
95
+ @story_mediator.should_receive(:create_story).with("s","When foo")
96
+ @story_mediator.should_receive(:create_scenario).with("bar")
97
+ @parser.parse(["Story: s", "When foo", "Scenario: bar"])
98
+ end
99
+
100
+ it "should include Then in the narrative" do
101
+ @story_mediator.should_receive(:create_story).with("s","Then foo")
102
+ @story_mediator.should_receive(:create_scenario).with("bar")
103
+ @parser.parse(["Story: s", "Then foo", "Scenario: bar"])
104
+ end
105
+
106
+ it "should include other in the story" do
107
+ @story_mediator.should_receive(:create_story).with("s","narrative")
108
+ @parser.parse(["Story: s", "narrative"])
109
+ end
110
+ end
111
+
112
+ describe StoryParser, "in Scenario state" do
113
+ before(:each) do
114
+ @story_mediator = mock("story_mediator")
115
+ @parser = StoryParser.new(@story_mediator)
116
+ @story_mediator.stub!(:create_story)
117
+ @story_mediator.stub!(:create_scenario)
118
+ end
119
+
120
+ it "should create a Story for Story" do
121
+ @story_mediator.should_receive(:create_story).with("number two","")
122
+ @parser.parse(["Story: s", "Scenario: s", "Story: number two"])
123
+ end
124
+
125
+ it "should create a Scenario for Scenario" do
126
+ @story_mediator.should_receive(:create_scenario).with("number two")
127
+ @parser.parse(["Story: s", "Scenario: s", "Scenario: number two"])
128
+ end
129
+
130
+ it "should raise for And" do
131
+ lambda {
132
+ @parser.parse(["Story: s", "Scenario: s", "And second"])
133
+ }.should raise_error(IllegalStepError, /^Illegal attempt to create a And after a Scenario/)
134
+ end
135
+
136
+ it "should create a Given for Given" do
137
+ @story_mediator.should_receive(:create_given).with("gift")
138
+ @parser.parse(["Story: s", "Scenario: s", "Given gift"])
139
+ end
140
+
141
+ it "should create a Given for Given:" do
142
+ @story_mediator.should_receive(:create_given).with("gift")
143
+ @parser.parse(["Story: s", "Scenario: s", "Given: gift"])
144
+ end
145
+
146
+ it "should create a GivenScenario for GivenScenario" do
147
+ @story_mediator.should_receive(:create_given_scenario).with("previous")
148
+ @parser.parse(["Story: s", "Scenario: s", "GivenScenario previous"])
149
+ end
150
+
151
+ it "should create a GivenScenario for GivenScenario:" do
152
+ @story_mediator.should_receive(:create_given_scenario).with("previous")
153
+ @parser.parse(["Story: s", "Scenario: s", "GivenScenario: previous"])
154
+ end
155
+
156
+ it "should transition to Given state after GivenScenario" do
157
+ @story_mediator.stub!(:create_given_scenario)
158
+ @parser.parse(["Story: s", "Scenario: s", "GivenScenario previous"])
159
+ @parser.instance_eval{@state}.should be_an_instance_of(StoryParser::GivenState)
160
+ end
161
+
162
+ it "should transition to Given state after GivenScenario:" do
163
+ @story_mediator.stub!(:create_given_scenario)
164
+ @parser.parse(["Story: s", "Scenario: s", "GivenScenario: previous"])
165
+ @parser.instance_eval{@state}.should be_an_instance_of(StoryParser::GivenState)
166
+ end
167
+
168
+ it "should create a When for When" do
169
+ @story_mediator.should_receive(:create_when).with("ever")
170
+ @parser.parse(["Story: s", "Scenario: s", "When ever"])
171
+ end
172
+
173
+ it "should create a When for When:" do
174
+ @story_mediator.should_receive(:create_when).with("ever")
175
+ @parser.parse(["Story: s", "Scenario: s", "When: ever"])
176
+ end
177
+
178
+ it "should create a Then for Then" do
179
+ @story_mediator.should_receive(:create_then).with("and there")
180
+ @parser.parse(["Story: s", "Scenario: s", "Then and there"])
181
+ end
182
+
183
+ it "should create a Then for Then:" do
184
+ @story_mediator.should_receive(:create_then).with("and there")
185
+ @parser.parse(["Story: s", "Scenario: s", "Then: and there"])
186
+ end
187
+
188
+ it "should ignore other" do
189
+ @parser.parse(["Story: s", "Scenario: s", "this is ignored"])
190
+ end
191
+ end
192
+
193
+ describe StoryParser, "in Given state" do
194
+ before(:each) do
195
+ @story_mediator = mock("story_mediator")
196
+ @parser = StoryParser.new(@story_mediator)
197
+ @story_mediator.stub!(:create_story)
198
+ @story_mediator.stub!(:create_scenario)
199
+ @story_mediator.should_receive(:create_given).with("first")
200
+ end
201
+
202
+ it "should create a Story for Story" do
203
+ @story_mediator.should_receive(:create_story).with("number two","")
204
+ @parser.parse(["Story: s", "Scenario: s", "Given first", "Story: number two"])
205
+ end
206
+
207
+ it "should create a Scenario for Scenario" do
208
+ @story_mediator.should_receive(:create_scenario).with("number two")
209
+ @parser.parse(["Story: s", "Scenario: s", "Given first", "Scenario: number two"])
210
+ end
211
+
212
+ it "should create a second Given for Given" do
213
+ @story_mediator.should_receive(:create_given).with("second")
214
+ @parser.parse(["Story: s", "Scenario: s", "Given first", "Given second"])
215
+ end
216
+
217
+ it "should create a second Given for And" do
218
+ @story_mediator.should_receive(:create_given).with("second")
219
+ @parser.parse(["Story: s", "Scenario: s", "Given: first", "And second"])
220
+ end
221
+
222
+ it "should create a second Given for And:" do
223
+ @story_mediator.should_receive(:create_given).with("second")
224
+ @parser.parse(["Story: s", "Scenario: s", "Given first", "And: second"])
225
+ end
226
+
227
+ it "should create a When for When" do
228
+ @story_mediator.should_receive(:create_when).with("ever")
229
+ @parser.parse(["Story: s", "Scenario: s", "Given first", "When ever"])
230
+ end
231
+
232
+ it "should create a When for When:" do
233
+ @story_mediator.should_receive(:create_when).with("ever")
234
+ @parser.parse(["Story: s", "Scenario: s", "Given first", "When: ever"])
235
+ end
236
+
237
+ it "should create a Then for Then" do
238
+ @story_mediator.should_receive(:create_then).with("and there")
239
+ @parser.parse(["Story: s", "Scenario: s", "Given first", "Then and there"])
240
+ end
241
+
242
+ it "should create a Then for Then:" do
243
+ @story_mediator.should_receive(:create_then).with("and there")
244
+ @parser.parse(["Story: s", "Scenario: s", "Given first", "Then: and there"])
245
+ end
246
+
247
+ it "should ignore other" do
248
+ @parser.parse(["Story: s", "Scenario: s", "Given first", "this is ignored"])
249
+ end
250
+ end
251
+
252
+ describe StoryParser, "in When state" do
253
+ before(:each) do
254
+ @story_mediator = mock("story_mediator")
255
+ @parser = StoryParser.new(@story_mediator)
256
+ @story_mediator.stub!(:create_story)
257
+ @story_mediator.stub!(:create_scenario)
258
+ @story_mediator.should_receive(:create_given).with("first")
259
+ @story_mediator.should_receive(:create_when).with("else")
260
+ end
261
+
262
+ it "should create a Story for Story" do
263
+ @story_mediator.should_receive(:create_story).with("number two","")
264
+ @parser.parse(["Story: s", "Scenario: s", "Given first", "When: else", "Story: number two"])
265
+ end
266
+
267
+ it "should create a Scenario for Scenario" do
268
+ @story_mediator.should_receive(:create_scenario).with("number two")
269
+ @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Scenario: number two"])
270
+ end
271
+
272
+ it "should create Given for Given" do
273
+ @story_mediator.should_receive(:create_given).with("second")
274
+ @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Given second"])
275
+ end
276
+
277
+ it "should create Given for Given:" do
278
+ @story_mediator.should_receive(:create_given).with("second")
279
+ @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Given: second"])
280
+ end
281
+
282
+ it "should create a second When for When" do
283
+ @story_mediator.should_receive(:create_when).with("ever")
284
+ @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "When ever"])
285
+ end
286
+
287
+ it "should create a second When for When:" do
288
+ @story_mediator.should_receive(:create_when).with("ever")
289
+ @parser.parse(["Story: s", "Scenario: s", "Given: first", "When: else", "When: ever"])
290
+ end
291
+
292
+ it "should create a second When for And" do
293
+ @story_mediator.should_receive(:create_when).with("ever")
294
+ @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "And ever"])
295
+ end
296
+
297
+ it "should create a second When for And:" do
298
+ @story_mediator.should_receive(:create_when).with("ever")
299
+ @parser.parse(["Story: s", "Scenario: s", "Given: first", "When: else", "And: ever"])
300
+ end
301
+
302
+ it "should create a Then for Then" do
303
+ @story_mediator.should_receive(:create_then).with("and there")
304
+ @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then and there"])
305
+ end
306
+
307
+ it "should create a Then for Then:" do
308
+ @story_mediator.should_receive(:create_then).with("and there")
309
+ @parser.parse(["Story: s", "Scenario: s", "Given: first", "When: else", "Then: and there"])
310
+ end
311
+
312
+ it "should ignore other" do
313
+ @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "this is ignored"])
314
+ end
315
+ end
316
+
317
+ describe StoryParser, "in Then state" do
318
+ before(:each) do
319
+ @story_mediator = mock("story_mediator")
320
+ @parser = StoryParser.new(@story_mediator)
321
+ @story_mediator.stub!(:create_story)
322
+ @story_mediator.stub!(:create_scenario)
323
+ @story_mediator.should_receive(:create_given).with("first")
324
+ @story_mediator.should_receive(:create_when).with("else")
325
+ @story_mediator.should_receive(:create_then).with("what")
326
+ end
327
+
328
+ it "should create a Story for Story" do
329
+ @story_mediator.should_receive(:create_story).with("number two","")
330
+ @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then what", "Story: number two"])
331
+ end
332
+
333
+ it "should create a Scenario for Scenario" do
334
+ @story_mediator.should_receive(:create_scenario).with("number two")
335
+ @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then what", "Scenario: number two"])
336
+ end
337
+
338
+ it "should create Given for Given" do
339
+ @story_mediator.should_receive(:create_given).with("second")
340
+ @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then what", "Given second"])
341
+ end
342
+
343
+ it "should create Given for Given:" do
344
+ @story_mediator.should_receive(:create_given).with("second")
345
+ @parser.parse(["Story: s", "Scenario: s", "Given: first", "When: else", "Then: what", "Given: second"])
346
+ end
347
+
348
+ it "should create When for When" do
349
+ @story_mediator.should_receive(:create_when).with("ever")
350
+ @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then what", "When ever"])
351
+ end
352
+
353
+ it "should create When for When:" do
354
+ @story_mediator.should_receive(:create_when).with("ever")
355
+ @parser.parse(["Story: s", "Scenario: s", "Given: first", "When: else", "Then: what", "When: ever"])
356
+ end
357
+
358
+ it "should create a Then for Then" do
359
+ @story_mediator.should_receive(:create_then).with("and there")
360
+ @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then what", "Then and there"])
361
+ end
362
+
363
+ it "should create a Then for Then:" do
364
+ @story_mediator.should_receive(:create_then).with("and there")
365
+ @parser.parse(["Story: s", "Scenario: s", "Given: first", "When: else", "Then: what", "Then: and there"])
366
+ end
367
+
368
+ it "should create a second Then for And" do
369
+ @story_mediator.should_receive(:create_then).with("ever")
370
+ @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then what", "And ever"])
371
+ end
372
+
373
+ it "should create a second Then for And:" do
374
+ @story_mediator.should_receive(:create_then).with("ever")
375
+ @parser.parse(["Story: s", "Scenario: s", "Given: first", "When: else", "Then: what", "And: ever"])
376
+ end
377
+
378
+ it "should ignore other" do
379
+ @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then what", "this is ignored"])
380
+ end
381
+ end
382
+ end
383
+ end
384
+ end