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,11 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper.rb'
2
+
3
+ module Spec
4
+ describe Runner, ".configure" do
5
+ it "should yield global configuration" do
6
+ Spec::Runner.configure do |config|
7
+ config.should equal(Spec::Runner.configuration)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -96,10 +96,12 @@ module Spec
96
96
  end
97
97
 
98
98
  module Custom
99
+ require 'spec/runner/formatter/base_text_formatter'
99
100
  class Formatter < Spec::Runner::Formatter::BaseTextFormatter
100
- attr_reader :where
101
+ attr_reader :options, :where
101
102
 
102
- def initialize(where)
103
+ def initialize(options, where)
104
+ @options = options
103
105
  @where = where
104
106
  end
105
107
  end
@@ -107,13 +109,18 @@ module Custom
107
109
  class BadFormatter < Spec::Runner::Formatter::BaseTextFormatter
108
110
  attr_reader :where
109
111
 
110
- def initialize(where)
112
+ def initialize(options, where)
111
113
  bad_method
112
114
  end
113
115
  end
114
116
 
115
- class BehaviourRunner
116
- def initialize(options, arg=nil); end
117
+ class Differ
118
+ attr_reader :options
119
+ def initialize(options)
120
+ @options = options
121
+ end
117
122
  end
118
123
  end
119
124
 
125
+ class FakeReporter < Spec::Runner::Reporter
126
+ end
@@ -0,0 +1,46 @@
1
+ module Spec
2
+ module Story
3
+ class StoryBuilder
4
+ def initialize
5
+ @title = 'a story'
6
+ @narrative = 'narrative'
7
+ end
8
+
9
+ def title(value)
10
+ @title = value
11
+ self
12
+ end
13
+
14
+ def narrative(value)
15
+ @narrative = value
16
+ self
17
+ end
18
+
19
+ def to_story(&block)
20
+ block = lambda {} unless block_given?
21
+ Story.new @title, @narrative, &block
22
+ end
23
+ end
24
+
25
+ class ScenarioBuilder
26
+ def initialize
27
+ @name = 'a scenario'
28
+ @story = StoryBuilder.new.to_story
29
+ end
30
+
31
+ def name(value)
32
+ @name = value
33
+ self
34
+ end
35
+
36
+ def story(value)
37
+ @story = value
38
+ self
39
+ end
40
+
41
+ def to_scenario(&block)
42
+ Scenario.new @story, @name, &block
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,161 @@
1
+ require File.dirname(__FILE__) + '/../../../spec_helper'
2
+
3
+ module Spec
4
+ module Story
5
+ module Extensions
6
+ describe "the main object extended with Main", :shared => true do
7
+ before(:each) do
8
+ @main = Class.new do; include Main; end
9
+ @original_rspec_story_steps, $rspec_story_steps = $rspec_story_steps, nil
10
+ end
11
+
12
+ after(:each) do
13
+ $rspec_story_steps = @original_rspec_story_steps
14
+ end
15
+
16
+ def have_step(type, name)
17
+ return simple_matcher(%[step group containing a #{type} named #{name.inspect}]) do |actual|
18
+ Spec::Story::Step === actual.find(type, name)
19
+ end
20
+ end
21
+ end
22
+
23
+ describe Main, "#run_story" do
24
+ it_should_behave_like "the main object extended with Main"
25
+
26
+ it "should create a PlainTextStoryRunner with run_story" do
27
+ Spec::Story::Runner::PlainTextStoryRunner.should_receive(:new).and_return(mock("runner", :null_object => true))
28
+ @main.run_story
29
+ end
30
+
31
+ it "should yield the runner if arity == 1" do
32
+ File.should_receive(:read).with("some/path").and_return("Story: foo")
33
+ $main_spec_runner = nil
34
+ @main.run_story("some/path") do |runner|
35
+ $main_spec_runner = runner
36
+ end
37
+ $main_spec_runner.should be_an_instance_of(Spec::Story::Runner::PlainTextStoryRunner)
38
+ end
39
+
40
+ it "should run in the runner if arity == 0" do
41
+ File.should_receive(:read).with("some/path").and_return("Story: foo")
42
+ $main_spec_runner = nil
43
+ @main.run_story("some/path") do
44
+ $main_spec_runner = self
45
+ end
46
+ $main_spec_runner.should be_an_instance_of(Spec::Story::Runner::PlainTextStoryRunner)
47
+ end
48
+
49
+ it "should tell the PlainTextStoryRunner to run with run_story" do
50
+ runner = mock("runner")
51
+ Spec::Story::Runner::PlainTextStoryRunner.should_receive(:new).and_return(runner)
52
+ runner.should_receive(:run)
53
+ @main.run_story
54
+ end
55
+ end
56
+
57
+ describe Main, "#steps_for" do
58
+ it_should_behave_like "the main object extended with Main"
59
+
60
+ it "should have no steps for a non existent key" do
61
+ @main.steps_for(:key).find(:given, "foo").should be_nil
62
+ end
63
+
64
+ it "should create steps for a key" do
65
+ $main_spec_invoked = false
66
+ @main.steps_for(:key) do
67
+ Given("foo") {
68
+ $main_spec_invoked = true
69
+ }
70
+ end
71
+ @main.steps_for(:key).find(:given, "foo").perform(Object.new, "foo")
72
+ $main_spec_invoked.should be_true
73
+ end
74
+
75
+ it "should append steps to steps_for a given key" do
76
+ @main.steps_for(:key) do
77
+ Given("first") {}
78
+ end
79
+ @main.steps_for(:key) do
80
+ Given("second") {}
81
+ end
82
+ @main.steps_for(:key).should have_step(:given, "first")
83
+ @main.steps_for(:key).should have_step(:given, "second")
84
+ end
85
+ end
86
+
87
+ describe Main, "#with_steps_for adding new steps" do
88
+ it_should_behave_like "the main object extended with Main"
89
+
90
+ it "should result in a group containing pre-existing steps and newly defined steps" do
91
+ first_group = @main.steps_for(:key) do
92
+ Given("first") {}
93
+ end
94
+ second_group = @main.with_steps_for(:key) do
95
+ Given("second") {}
96
+ end
97
+
98
+ second_group.should have_step(:given, "first")
99
+ second_group.should have_step(:given, "second")
100
+ end
101
+
102
+ it "should not add its steps to the existing group" do
103
+ first_group = @main.steps_for(:key) do
104
+ Given("first") {}
105
+ end
106
+ second_group = @main.with_steps_for(:key) do
107
+ Given("second") {}
108
+ end
109
+
110
+ first_group.should have_step(:given, "first")
111
+ first_group.should_not have_step(:given, "second")
112
+ end
113
+ end
114
+
115
+ describe Main, "#with_steps_for running a story" do
116
+ it_should_behave_like "the main object extended with Main"
117
+
118
+ before(:each) do
119
+ @runner = mock("runner")
120
+ @runner_step_group = StepGroup.new
121
+ @runner.stub!(:steps).and_return(@runner_step_group)
122
+ @runner.stub!(:run)
123
+ Spec::Story::Runner::PlainTextStoryRunner.stub!(:new).and_return(@runner)
124
+ end
125
+
126
+ it "should create a PlainTextStoryRunner with a path" do
127
+ Spec::Story::Runner::PlainTextStoryRunner.should_receive(:new).with('path/to/file',{}).and_return(@runner)
128
+ @main.with_steps_for(:foo) do
129
+ run 'path/to/file'
130
+ end
131
+ end
132
+
133
+ it "should create a PlainTextStoryRunner with a path and options" do
134
+ Spec::Story::Runner::PlainTextStoryRunner.should_receive(:new).with(anything,{:bar => :baz}).and_return(@runner)
135
+ @main.with_steps_for(:foo) do
136
+ run 'path/to/file', :bar => :baz
137
+ end
138
+ end
139
+
140
+ it "should pass the group it creates to the runner's steps" do
141
+ steps = @main.steps_for(:ice_cream) do
142
+ Given("vanilla") {}
143
+ end
144
+ @main.with_steps_for(:ice_cream) do
145
+ run 'foo'
146
+ end
147
+ @runner_step_group.should have_step(:given, "vanilla")
148
+ end
149
+
150
+ it "should run a story" do
151
+ @runner.should_receive(:run)
152
+ Spec::Story::Runner::PlainTextStoryRunner.should_receive(:new).and_return(@runner)
153
+ @main.with_steps_for(:foo) do
154
+ run 'path/to/file'
155
+ end
156
+ end
157
+
158
+ end
159
+ end
160
+ end
161
+ end
@@ -0,0 +1,14 @@
1
+ require File.dirname(__FILE__) + '/story_helper'
2
+
3
+ require 'spec/story'
4
+
5
+ describe Kernel, "#Story" do
6
+ before(:each) do
7
+ Kernel.stub!(:at_exit)
8
+ end
9
+
10
+ it "should delegate to ::Spec::Story::Runner.story_runner" do
11
+ ::Spec::Story::Runner.story_runner.should_receive(:Story)
12
+ story = Story("title","narrative"){}
13
+ end
14
+ end
@@ -0,0 +1,27 @@
1
+ require File.dirname(__FILE__) + '/story_helper'
2
+
3
+ module Spec
4
+ module Story
5
+ describe GivenScenario do
6
+ it 'should execute a scenario from the current story in its world' do
7
+ # given
8
+ class MyWorld
9
+ attr :scenario_ran
10
+ end
11
+ instance = World.create(MyWorld)
12
+ scenario = ScenarioBuilder.new.to_scenario do
13
+ @scenario_ran = true
14
+ end
15
+ Runner::StoryRunner.should_receive(:scenario_from_current_story).with('scenario name').and_return(scenario)
16
+
17
+ step = GivenScenario.new 'scenario name'
18
+
19
+ # when
20
+ step.perform(instance, nil)
21
+
22
+ # then
23
+ instance.scenario_ran.should be_true
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,92 @@
1
+ require File.dirname(__FILE__) + '/../story_helper'
2
+
3
+ module Spec
4
+ module Story
5
+ module Runner
6
+ describe PlainTextStoryRunner do
7
+ before(:each) do
8
+ StoryParser.stub!(:new).and_return(@parser = mock("parser"))
9
+ @parser.stub!(:parse).and_return([])
10
+ File.stub!(:read).with("path").and_return("this\nand that")
11
+ end
12
+
13
+ it "should provide access to steps" do
14
+ runner = PlainTextStoryRunner.new("path")
15
+
16
+ runner.steps do |add|
17
+ add.given("baz") {}
18
+ end
19
+
20
+ runner.steps.find(:given, "baz").should_not be_nil
21
+ end
22
+
23
+ it "should parse a story file" do
24
+ runner = PlainTextStoryRunner.new("path")
25
+
26
+ during {
27
+ runner.run
28
+ }.expect {
29
+ @parser.should_receive(:parse).with(["this", "and that"])
30
+ }
31
+ end
32
+
33
+ it "should build up a mediator with its own steps and the singleton story_runner" do
34
+ runner = PlainTextStoryRunner.new("path")
35
+ Spec::Story::Runner.should_receive(:story_runner).and_return(story_runner = mock("story runner"))
36
+ Spec::Story::Runner::StoryMediator.should_receive(:new).with(runner.steps, story_runner, {}).
37
+ and_return(mediator = stub("mediator", :run_stories => nil))
38
+ runner.run
39
+ end
40
+
41
+ it "should build up a parser with the mediator" do
42
+ runner = PlainTextStoryRunner.new("path")
43
+ Spec::Story::Runner.should_receive(:story_runner).and_return(story_runner = mock("story runner"))
44
+ Spec::Story::Runner::StoryMediator.should_receive(:new).and_return(mediator = stub("mediator", :run_stories => nil))
45
+ Spec::Story::Runner::StoryParser.should_receive(:new).with(mediator).and_return(@parser)
46
+ runner.run
47
+ end
48
+
49
+ it "should tell the mediator to run the stories" do
50
+ runner = PlainTextStoryRunner.new("path")
51
+ mediator = mock("mediator")
52
+ Spec::Story::Runner::StoryMediator.should_receive(:new).and_return(mediator)
53
+ mediator.should_receive(:run_stories)
54
+ runner.run
55
+ end
56
+
57
+ it "should accept a block instead of a path" do
58
+ runner = PlainTextStoryRunner.new do |runner|
59
+ runner.load("path/to/story")
60
+ end
61
+ File.should_receive(:read).with("path/to/story").and_return("this\nand that")
62
+ runner.run
63
+ end
64
+
65
+ it "should tell you if you try to run with no path set" do
66
+ runner = PlainTextStoryRunner.new
67
+ lambda {
68
+ runner.run
69
+ }.should raise_error(RuntimeError, "You must set a path to the file with the story. See the RDoc.")
70
+ end
71
+
72
+ it "should pass options to the mediator" do
73
+ runner = PlainTextStoryRunner.new("path", :foo => :bar)
74
+ Spec::Story::Runner::StoryMediator.should_receive(:new).
75
+ with(anything, anything, :foo => :bar).
76
+ and_return(mediator = stub("mediator", :run_stories => nil))
77
+ runner.run
78
+ end
79
+
80
+ it "should provide access to its options" do
81
+ runner = PlainTextStoryRunner.new("path")
82
+ runner[:foo] = :bar
83
+ Spec::Story::Runner::StoryMediator.should_receive(:new).
84
+ with(anything, anything, :foo => :bar).
85
+ and_return(mediator = stub("mediator", :run_stories => nil))
86
+ runner.run
87
+ end
88
+
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,27 @@
1
+ require File.dirname(__FILE__) + '/../story_helper'
2
+
3
+ module Spec
4
+ module Story
5
+ module Runner
6
+ describe ScenarioCollector do
7
+ it 'should construct scenarios with the supplied story' do
8
+ # given
9
+ story = stub_everything('story')
10
+ scenario_collector = ScenarioCollector.new(story)
11
+
12
+ # when
13
+ scenario_collector.Scenario 'scenario1' do end
14
+ scenario_collector.Scenario 'scenario2' do end
15
+ scenarios = scenario_collector.scenarios
16
+
17
+ # then
18
+ scenario_collector.should have(2).scenarios
19
+ scenarios.first.name.should == 'scenario1'
20
+ scenarios.first.story.should equal(story)
21
+ scenarios.last.name.should == 'scenario2'
22
+ scenarios.last.story.should equal(story)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,142 @@
1
+ require File.dirname(__FILE__) + '/../story_helper'
2
+
3
+ module Spec
4
+ module Story
5
+ module Runner
6
+ describe ScenarioRunner do
7
+ it 'should run a scenario in its story' do
8
+ # given
9
+ world = stub_everything
10
+ scenario_runner = ScenarioRunner.new
11
+ $answer = nil
12
+ story = Story.new 'story', 'narrative' do
13
+ @answer = 42 # this should be available to the scenario
14
+ end
15
+ scenario = Scenario.new story, 'scenario' do
16
+ $answer = @answer
17
+ end
18
+
19
+ # when
20
+ scenario_runner.run(scenario, world)
21
+
22
+ # then
23
+ $answer.should == 42
24
+ end
25
+
26
+ it 'should allow scenarios to share methods' do
27
+ # given
28
+ world = stub_everything
29
+ $shared_invoked = 0
30
+ story = Story.new 'story', 'narrative' do
31
+ def shared
32
+ $shared_invoked += 1
33
+ end
34
+ end
35
+ scenario1 = Scenario.new story, 'scenario1' do
36
+ shared()
37
+ end
38
+ scenario2 = Scenario.new story, 'scenario2' do
39
+ shared()
40
+ end
41
+ scenario_runner = ScenarioRunner.new
42
+
43
+ # when
44
+ scenario_runner.run(scenario1, world)
45
+ scenario_runner.run(scenario2, world)
46
+
47
+ # then
48
+ $shared_invoked.should == 2
49
+ end
50
+
51
+ it 'should notify listeners when a scenario starts' do
52
+ # given
53
+ world = stub_everything
54
+ story = Story.new 'story', 'narrative' do end
55
+ scenario = Scenario.new story, 'scenario1' do
56
+ # succeeds
57
+ end
58
+ scenario_runner = ScenarioRunner.new
59
+ mock_listener1 = stub_everything('listener1')
60
+ mock_listener2 = stub_everything('listener2')
61
+ scenario_runner.add_listener(mock_listener1)
62
+ scenario_runner.add_listener(mock_listener2)
63
+
64
+ # expect
65
+ mock_listener1.should_receive(:scenario_started).with('story', 'scenario1')
66
+ mock_listener2.should_receive(:scenario_started).with('story', 'scenario1')
67
+
68
+ # when
69
+ scenario_runner.run(scenario, world)
70
+
71
+ # then
72
+ end
73
+
74
+ it 'should notify listeners when a scenario succeeds' do
75
+ # given
76
+ world = stub_everything('world')
77
+ story = Story.new 'story', 'narrative' do end
78
+ scenario = Scenario.new story, 'scenario1' do
79
+ # succeeds
80
+ end
81
+ scenario_runner = ScenarioRunner.new
82
+ mock_listener1 = stub_everything('listener1')
83
+ mock_listener2 = stub_everything('listener2')
84
+ scenario_runner.add_listener(mock_listener1)
85
+ scenario_runner.add_listener(mock_listener2)
86
+
87
+ # expect
88
+ mock_listener1.should_receive(:scenario_succeeded).with('story', 'scenario1')
89
+ mock_listener2.should_receive(:scenario_succeeded).with('story', 'scenario1')
90
+
91
+ # when
92
+ scenario_runner.run(scenario, world)
93
+
94
+ # then
95
+ end
96
+
97
+ it 'should notify listeners ONCE when a scenario raises an error' do
98
+ # given
99
+ error = RuntimeError.new('oops')
100
+ story = Story.new 'title', 'narrative' do end
101
+ scenario = Scenario.new story, 'scenario1' do
102
+ end
103
+ scenario_runner = ScenarioRunner.new
104
+ mock_listener = stub_everything('listener')
105
+ scenario_runner.add_listener(mock_listener)
106
+ world = stub_everything
107
+
108
+ # expect
109
+ world.should_receive(:errors).twice.and_return([error, error])
110
+ mock_listener.should_receive(:scenario_failed).with('title', 'scenario1', error).once
111
+
112
+ # when
113
+ scenario_runner.run scenario, world
114
+
115
+ # then
116
+ end
117
+
118
+ it 'should notify listeners when a scenario is pending' do
119
+ # given
120
+ pending_error = Spec::Example::ExamplePendingError.new('todo')
121
+ story = Story.new 'title', 'narrative' do end
122
+ scenario = Scenario.new story, 'scenario1' do
123
+ end
124
+ scenario_runner = ScenarioRunner.new
125
+ mock_listener = mock('listener')
126
+ scenario_runner.add_listener(mock_listener)
127
+ world = stub_everything
128
+
129
+ # expect
130
+ world.should_receive(:errors).twice.and_return([pending_error, pending_error])
131
+ mock_listener.should_receive(:scenario_started).with('title', 'scenario1')
132
+ mock_listener.should_receive(:scenario_pending).with('title', 'scenario1', 'todo').once
133
+
134
+ # when
135
+ scenario_runner.run scenario, world
136
+
137
+ # then
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end