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,89 @@
1
+ module Spec
2
+ module Story
3
+
4
+ class StepGroupHash < Hash
5
+ def initialize
6
+ super do |h,k|
7
+ h[k] = Spec::Story::StepGroup.new
8
+ end
9
+ end
10
+ end
11
+
12
+ class StepGroup
13
+ def self.steps(&block)
14
+ @step_group ||= StepGroup.new(false)
15
+ @step_group.instance_eval(&block) if block
16
+ @step_group
17
+ end
18
+
19
+ def initialize(init_defaults=true, &block)
20
+ @hash_of_lists_of_steps = Hash.new {|h, k| h[k] = []}
21
+ if init_defaults
22
+ self.class.steps.add_to(self)
23
+ end
24
+ instance_eval(&block) if block
25
+ end
26
+
27
+ def find(type, name)
28
+ @hash_of_lists_of_steps[type].each do |step|
29
+ return step if step.matches?(name)
30
+ end
31
+ return nil
32
+ end
33
+
34
+ def GivenScenario(name, &block)
35
+ create_matcher(:given_scenario, name, &block)
36
+ end
37
+
38
+ def Given(name, &block)
39
+ create_matcher(:given, name, &block)
40
+ end
41
+
42
+ def When(name, &block)
43
+ create_matcher(:when, name, &block)
44
+ end
45
+
46
+ def Then(name, &block)
47
+ create_matcher(:then, name, &block)
48
+ end
49
+
50
+ alias :given_scenario :GivenScenario
51
+ alias :given :Given
52
+ alias :when :When
53
+ alias :then :Then
54
+
55
+ def add(type, steps)
56
+ (@hash_of_lists_of_steps[type] << steps).flatten!
57
+ end
58
+
59
+ def clear
60
+ @hash_of_lists_of_steps.clear
61
+ end
62
+
63
+ def empty?
64
+ [:given_scenario, :given, :when, :then].each do |type|
65
+ return false unless @hash_of_lists_of_steps[type].empty?
66
+ end
67
+ return true
68
+ end
69
+
70
+ def add_to(other_step_matchers)
71
+ [:given_scenario, :given, :when, :then].each do |type|
72
+ other_step_matchers.add(type, @hash_of_lists_of_steps[type])
73
+ end
74
+ end
75
+
76
+ def <<(other_step_matchers)
77
+ other_step_matchers.add_to(self) if other_step_matchers.respond_to?(:add_to)
78
+ end
79
+
80
+ # TODO - make me private
81
+ def create_matcher(type, name, &block)
82
+ matcher = Step.new(name, &block)
83
+ @hash_of_lists_of_steps[type] << matcher
84
+ matcher
85
+ end
86
+
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,37 @@
1
+ module Spec
2
+ module Story
3
+ class StepMother
4
+ def initialize
5
+ @steps = StepGroup.new
6
+ end
7
+
8
+ def use(new_step_group)
9
+ @steps << new_step_group
10
+ end
11
+
12
+ def store(type, step)
13
+ @steps.add(type, step)
14
+ end
15
+
16
+ def find(type, name)
17
+ if @steps.find(type, name).nil?
18
+ @steps.add(type,
19
+ Step.new(name) do
20
+ raise Spec::Example::ExamplePendingError.new("Unimplemented step: #{name}")
21
+ end
22
+ )
23
+ end
24
+ @steps.find(type, name)
25
+ end
26
+
27
+ def clear
28
+ @steps.clear
29
+ end
30
+
31
+ def empty?
32
+ @steps.empty?
33
+ end
34
+
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,42 @@
1
+ module Spec
2
+ module Story
3
+ class Story
4
+ attr_reader :title, :narrative
5
+
6
+ def initialize(title, narrative, params = {}, &body)
7
+ @body = body
8
+ @title = title
9
+ @narrative = narrative
10
+ @params = params
11
+ end
12
+
13
+ def [](key)
14
+ @params[key]
15
+ end
16
+
17
+ def run_in(obj)
18
+ obj.instance_eval(&@body)
19
+ end
20
+
21
+ def assign_steps_to(assignee)
22
+ if @params[:steps]
23
+ assignee.use(@params[:steps])
24
+ else
25
+ case keys = @params[:steps_for]
26
+ when Symbol
27
+ keys = [keys]
28
+ when nil
29
+ keys = []
30
+ end
31
+ keys.each do |key|
32
+ assignee.use(steps_for(key))
33
+ end
34
+ end
35
+ end
36
+
37
+ def steps_for(key)
38
+ $rspec_story_steps[key]
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,124 @@
1
+ require 'rubygems'
2
+ require 'spec/expectations'
3
+ require 'spec/matchers'
4
+ require 'spec/example/pending'
5
+
6
+ module Spec
7
+ module Story
8
+ =begin
9
+ A World represents the actual instance a scenario will run in.
10
+
11
+ The runner ensures any instance variables and methods defined anywhere
12
+ in a story block are available to all the scenarios. This includes
13
+ variables that are created or referenced inside Given, When and Then
14
+ blocks.
15
+ =end
16
+ module World
17
+ include ::Spec::Example::Pending
18
+ include ::Spec::Matchers
19
+ # store steps and listeners in the singleton metaclass.
20
+ # This serves both to keep them out of the way of runtime Worlds
21
+ # and to make them available to all instances.
22
+ class << self
23
+ def create(cls = Object, *args)
24
+ cls.new(*args).extend(World)
25
+ end
26
+
27
+ def listeners
28
+ @listeners ||= []
29
+ end
30
+
31
+ def add_listener(listener)
32
+ listeners() << listener
33
+ end
34
+
35
+ def step_mother
36
+ @step_mother ||= StepMother.new
37
+ end
38
+
39
+ def use(steps)
40
+ step_mother.use(steps)
41
+ end
42
+
43
+ def step_names
44
+ @step_names ||= []
45
+ end
46
+
47
+ def run_given_scenario_with_suspended_listeners(world, type, name, scenario)
48
+ current_listeners = Array.new(listeners)
49
+ begin
50
+ listeners.each { |l| l.found_scenario(type, name) }
51
+ @listeners.clear
52
+ scenario.perform(world, name) unless ::Spec::Story::Runner.dry_run
53
+ ensure
54
+ @listeners.replace(current_listeners)
55
+ end
56
+ end
57
+
58
+ def store_and_call(world, type, name, *args, &block)
59
+ if block_given?
60
+ step_mother.store(type, Step.new(name, &block))
61
+ end
62
+ step = step_mother.find(type, name)
63
+
64
+ step_name = step.name
65
+ step_names << step_name
66
+
67
+ # It's important to have access to the parsed args here, so
68
+ # we can give them to the listeners. The HTML reporter needs
69
+ # the args so it can style them. See the generated output in
70
+ # story_server/prototype/rspec_stories.html (generated by rake stories)
71
+ args = step.parse_args(name) if args.empty?
72
+ begin
73
+ step.perform(world, *args) unless ::Spec::Story::Runner.dry_run
74
+ listeners.each { |l| l.step_succeeded(type, step_name, *args) }
75
+ rescue Exception => e
76
+ case e
77
+ when Spec::Example::ExamplePendingError
78
+ @listeners.each { |l| l.step_pending(type, step_name, *args) }
79
+ else
80
+ @listeners.each { |l| l.step_failed(type, step_name, *args) }
81
+ end
82
+ errors << e
83
+ end
84
+ end
85
+
86
+ def errors
87
+ @errors ||= []
88
+ end
89
+ end # end of class << self
90
+
91
+ def start_collecting_errors
92
+ errors.clear
93
+ end
94
+
95
+ def errors
96
+ World.errors
97
+ end
98
+
99
+ def GivenScenario(name)
100
+ World.run_given_scenario_with_suspended_listeners(self, :'given scenario', name, GivenScenario.new(name))
101
+ @__previous_step = :given
102
+ end
103
+
104
+ def Given(name, *args, &block)
105
+ World.store_and_call self, :given, name, *args, &block
106
+ @__previous_step = :given
107
+ end
108
+
109
+ def When(name, *args, &block)
110
+ World.store_and_call self, :when, name, *args, &block
111
+ @__previous_step = :when
112
+ end
113
+
114
+ def Then(name, *args, &block)
115
+ World.store_and_call self, :then, name, *args, &block
116
+ @__previous_step = :then
117
+ end
118
+
119
+ def And(name, *args, &block)
120
+ World.store_and_call self, @__previous_step, name, *args, &block
121
+ end
122
+ end
123
+ end
124
+ end
@@ -2,16 +2,15 @@ module Spec
2
2
  module VERSION
3
3
  unless defined? MAJOR
4
4
  MAJOR = 1
5
- MINOR = 0
6
- TINY = 8
5
+ MINOR = 1
6
+ TINY = 0
7
7
  RELEASE_CANDIDATE = nil
8
8
 
9
- # RANDOM_TOKEN: 0.510454315029681
10
- REV = "$LastChangedRevision: 2338 $".match(/LastChangedRevision: (\d+)/)[1]
9
+ BUILD_TIME_UTC = 20071214045307
11
10
 
12
11
  STRING = [MAJOR, MINOR, TINY].join('.')
13
12
  TAG = "REL_#{[MAJOR, MINOR, TINY, RELEASE_CANDIDATE].compact.join('_')}".upcase.gsub(/\.|-/, '_')
14
- FULL_VERSION = "#{[MAJOR, MINOR, TINY, RELEASE_CANDIDATE].compact.join('.')} (r#{REV})"
13
+ FULL_VERSION = "#{[MAJOR, MINOR, TINY, RELEASE_CANDIDATE].compact.join('.')} (build #{BUILD_TIME_UTC})"
15
14
 
16
15
  NAME = "RSpec"
17
16
  URL = "http://rspec.rubyforge.org/"
@@ -3,7 +3,7 @@ require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "lib", "s
3
3
  module Spec
4
4
  module Plugins
5
5
  module MockFramework
6
- include Spec::Mocks::SpecMethods
6
+ include Spec::Mocks::ExampleMethods
7
7
  def setup_mocks_for_rspec
8
8
  $rspec_mocks ||= Spec::Mocks::Space.new
9
9
  end
@@ -39,7 +39,10 @@ HERE
39
39
 
40
40
  describe Rspec, "rspec_commands" do
41
41
  it "should contain the various commands, ordered by preference" do
42
- Rspec.new.spec_commands.should == ["bin/spec", "#{Config::CONFIG['bindir']}/spec"]
42
+ Rspec.new.spec_commands.should == [
43
+ File.expand_path("#{File.dirname(__FILE__)}/../../bin/spec"),
44
+ "#{Config::CONFIG['bindir']}/spec"
45
+ ]
43
46
  end
44
47
  end
45
48
 
@@ -54,8 +57,9 @@ HERE
54
57
  it "should try to find the spec command if it exists in ./bin and use it above everything else" do
55
58
  File.stub!(:exists?).and_return true
56
59
 
57
- File.should_receive(:exists?).with("bin/spec").and_return true
58
- @rspec_autotest.spec_command.should == "bin/spec"
60
+ spec_path = File.expand_path("#{File.dirname(__FILE__)}/../../bin/spec")
61
+ File.should_receive(:exists?).with(spec_path).and_return true
62
+ @rspec_autotest.spec_command.should == spec_path
59
63
  end
60
64
 
61
65
  it "should otherwise select the default spec command in gem_dir/bin/spec" do
@@ -85,15 +89,17 @@ HERE
85
89
 
86
90
  it "should use the ALT_SEPARATOR if it is non-nil" do
87
91
  @rspec_autotest = Rspec.new(@kernel, @posix_separator, @windows_alt_separator)
88
- @rspec_autotest.stub!(:spec_commands).and_return [File.join('bin', 'spec')]
89
- @rspec_autotest.spec_command.should == "bin\\spec"
92
+ spec_command = File.expand_path("#{File.dirname(__FILE__)}/../../bin/spec")
93
+ @rspec_autotest.stub!(:spec_commands).and_return [spec_command]
94
+ @rspec_autotest.spec_command.should == spec_command.gsub('/', '\\')
90
95
  end
91
96
 
92
97
  it "should not use the ALT_SEPATOR if it is nil" do
93
98
  @windows_alt_separator = nil
94
99
  @rspec_autotest = Rspec.new(@kernel, @posix_separator, @windows_alt_separator)
95
- @rspec_autotest.stub!(:spec_commands).and_return [File.join('bin', 'spec')]
96
- @rspec_autotest.spec_command.should == "bin/spec"
100
+ spec_command = File.expand_path("#{File.dirname(__FILE__)}/../../bin/spec")
101
+ @rspec_autotest.stub!(:spec_commands).and_return [spec_command]
102
+ @rspec_autotest.spec_command.should == spec_command
97
103
  end
98
104
  end
99
105
 
@@ -1,4 +1,5 @@
1
+ require "rubygems"
1
2
  require 'autotest'
2
- require File.dirname(__FILE__) + "/../lib/autotest/rspec"
3
-
4
-
3
+ dir = File.dirname(__FILE__)
4
+ require "#{dir}/spec_helper"
5
+ require File.expand_path("#{dir}/../lib/autotest/rspec")
@@ -0,0 +1,7 @@
1
+ if __FILE__ == $0
2
+ dir = File.dirname(__FILE__)
3
+ Dir["#{dir}/**/*_spec.rb"].each do |file|
4
+ # puts "require '#{file}'"
5
+ require file
6
+ end
7
+ end
@@ -0,0 +1,13 @@
1
+ require 'rbconfig'
2
+
3
+ module RubyForker
4
+ # Forks a ruby interpreter with same type as ourself.
5
+ # juby will fork jruby, ruby will fork ruby etc.
6
+ def ruby(args, stderr=nil)
7
+ config = ::Config::CONFIG
8
+ interpreter = File::join(config['bindir'], config['ruby_install_name']) + config['EXEEXT']
9
+ cmd = "#{interpreter} #{args}"
10
+ cmd << " 2> #{stderr}" unless stderr.nil?
11
+ `#{cmd}`
12
+ end
13
+ end
@@ -0,0 +1,290 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module Example
5
+ ConfigurationSpec =
6
+ describe Configuration, :shared => true do
7
+ before(:each) do
8
+ @config = Configuration.new
9
+ @example_group = mock("example_group")
10
+ end
11
+ end
12
+
13
+ describe Configuration, "#mock_with" do
14
+ include ConfigurationSpec
15
+ it "should default mock framework to rspec" do
16
+ @config.mock_framework.should =~ /\/plugins\/mock_frameworks\/rspec$/
17
+ end
18
+
19
+ it "should let you set rspec mocking explicitly" do
20
+ @config.mock_with(:rspec)
21
+ @config.mock_framework.should =~ /\/plugins\/mock_frameworks\/rspec$/
22
+ end
23
+
24
+ it "should let you set mocha" do
25
+ @config.mock_with(:mocha)
26
+ @config.mock_framework.should =~ /\/plugins\/mock_frameworks\/mocha$/
27
+ end
28
+
29
+ it "should let you set flexmock" do
30
+ @config.mock_with(:flexmock)
31
+ @config.mock_framework.should =~ /\/plugins\/mock_frameworks\/flexmock$/
32
+ end
33
+
34
+ it "should let you set rr" do
35
+ @config.mock_with(:rr)
36
+ @config.mock_framework.should =~ /\/plugins\/mock_frameworks\/rr$/
37
+ end
38
+
39
+ it "should let you set an arbitrary adapter module" do
40
+ adapter = Module.new
41
+ @config.mock_with(adapter)
42
+ @config.mock_framework.should == adapter
43
+ end
44
+ end
45
+
46
+ describe Configuration, "#include" do
47
+ include ConfigurationSpec
48
+
49
+ before do
50
+ @original_configuration = Spec::Runner.configuration
51
+ spec_configuration = @config
52
+ Spec::Runner.instance_eval {@configuration = spec_configuration}
53
+ @example_group_class = Class.new(ExampleGroup) do
54
+ class << self
55
+ def this_class_has_special_methods
56
+ end
57
+ end
58
+ end
59
+ ExampleGroupFactory.register(:foobar, @example_group_class)
60
+ end
61
+
62
+ after do
63
+ original_configuration = @original_configuration
64
+ Spec::Runner.instance_eval {@configuration = original_configuration}
65
+ ExampleGroupFactory.reset
66
+ end
67
+
68
+ it "should include the submitted module in ExampleGroup subclasses" do
69
+ mod = Module.new
70
+ @config.include mod
71
+ Class.new(@example_group_class).included_modules.should include(mod)
72
+ end
73
+
74
+ it "should let you define modules to be included for a specific type" do
75
+ mod = Module.new
76
+ @config.include mod, :type => :foobar
77
+ Class.new(@example_group_class).included_modules.should include(mod)
78
+ end
79
+
80
+ it "should not include modules in a type they are not intended for" do
81
+ mod = Module.new
82
+ @other_example_group_class = Class.new(ExampleGroup)
83
+ ExampleGroupFactory.register(:baz, @other_example_group_class)
84
+
85
+ @config.include mod, :type => :foobar
86
+
87
+ Class.new(@other_example_group_class).included_modules.should_not include(mod)
88
+ end
89
+
90
+ it "should not extend the ExampleGroup baseclass (to enable the included hook to work properly)" do
91
+ pending("need to figure out how to best express this one")
92
+ end
93
+ end
94
+
95
+ ConfigurationCallbacksSpec =
96
+ describe Configuration, "callbacks", :shared => true do
97
+ before do
98
+ @config = Configuration.new
99
+ @special_example_group = Class.new(ExampleGroup)
100
+ @special_child_example_group = Class.new(@special_example_group)
101
+ @nonspecial_example_group = Class.new(ExampleGroup)
102
+ ExampleGroupFactory.register(:special, @special_example_group)
103
+ ExampleGroupFactory.register(:special_child, @special_child_example_group)
104
+ ExampleGroupFactory.register(:non_special, @nonspecial_example_group)
105
+ @example_group = @special_child_example_group.describe "Special Example Group"
106
+ @unselected_example_group = Class.new(@nonspecial_example_group).describe "Non Special Example Group"
107
+ end
108
+
109
+ after do
110
+ ExampleGroupFactory.reset
111
+ end
112
+ end
113
+
114
+ describe Configuration, "#prepend_before" do
115
+ include ConfigurationCallbacksSpec
116
+
117
+ it "prepends the before block on all instances of the passed in type" do
118
+ order = []
119
+ @config.prepend_before(:all) do
120
+ order << :prepend__before_all
121
+ end
122
+ @config.prepend_before(:all, :type => :special) do
123
+ order << :special_prepend__before_all
124
+ end
125
+ @config.prepend_before(:all, :type => :special_child) do
126
+ order << :special_child_prepend__before_all
127
+ end
128
+ @config.prepend_before(:each) do
129
+ order << :prepend__before_each
130
+ end
131
+ @config.prepend_before(:each, :type => :special) do
132
+ order << :special_prepend__before_each
133
+ end
134
+ @config.prepend_before(:each, :type => :special_child) do
135
+ order << :special_child_prepend__before_each
136
+ end
137
+ @config.prepend_before(:all, :type => :non_special) do
138
+ order << :special_prepend__before_all
139
+ end
140
+ @config.prepend_before(:each, :type => :non_special) do
141
+ order << :special_prepend__before_each
142
+ end
143
+ @example_group.it "calls prepend_before" do
144
+ end
145
+
146
+ @example_group.run
147
+ order.should == [
148
+ :prepend__before_all,
149
+ :special_prepend__before_all,
150
+ :special_child_prepend__before_all,
151
+ :prepend__before_each,
152
+ :special_prepend__before_each,
153
+ :special_child_prepend__before_each
154
+ ]
155
+ end
156
+ end
157
+
158
+ describe Configuration, "#append_before" do
159
+ include ConfigurationCallbacksSpec
160
+
161
+ it "calls append_before on the type" do
162
+ order = []
163
+ @config.append_before(:all) do
164
+ order << :append_before_all
165
+ end
166
+ @config.append_before(:all, :type => :special) do
167
+ order << :special_append_before_all
168
+ end
169
+ @config.append_before(:all, :type => :special_child) do
170
+ order << :special_child_append_before_all
171
+ end
172
+ @config.append_before(:each) do
173
+ order << :append_before_each
174
+ end
175
+ @config.append_before(:each, :type => :special) do
176
+ order << :special_append_before_each
177
+ end
178
+ @config.append_before(:each, :type => :special_child) do
179
+ order << :special_child_append_before_each
180
+ end
181
+ @config.append_before(:all, :type => :non_special) do
182
+ order << :special_append_before_all
183
+ end
184
+ @config.append_before(:each, :type => :non_special) do
185
+ order << :special_append_before_each
186
+ end
187
+ @example_group.it "calls append_before" do
188
+ end
189
+
190
+ @example_group.run
191
+ order.should == [
192
+ :append_before_all,
193
+ :special_append_before_all,
194
+ :special_child_append_before_all,
195
+ :append_before_each,
196
+ :special_append_before_each,
197
+ :special_child_append_before_each
198
+ ]
199
+ end
200
+ end
201
+
202
+ describe Configuration, "#prepend_after" do
203
+ include ConfigurationCallbacksSpec
204
+
205
+ it "prepends the after block on all instances of the passed in type" do
206
+ order = []
207
+ @config.prepend_after(:all) do
208
+ order << :prepend__after_all
209
+ end
210
+ @config.prepend_after(:all, :type => :special) do
211
+ order << :special_prepend__after_all
212
+ end
213
+ @config.prepend_after(:all, :type => :special) do
214
+ order << :special_child_prepend__after_all
215
+ end
216
+ @config.prepend_after(:each) do
217
+ order << :prepend__after_each
218
+ end
219
+ @config.prepend_after(:each, :type => :special) do
220
+ order << :special_prepend__after_each
221
+ end
222
+ @config.prepend_after(:each, :type => :special) do
223
+ order << :special_child_prepend__after_each
224
+ end
225
+ @config.prepend_after(:all, :type => :non_special) do
226
+ order << :special_prepend__after_all
227
+ end
228
+ @config.prepend_after(:each, :type => :non_special) do
229
+ order << :special_prepend__after_each
230
+ end
231
+ @example_group.it "calls prepend_after" do
232
+ end
233
+
234
+ @example_group.run
235
+ order.should == [
236
+ :special_child_prepend__after_each,
237
+ :special_prepend__after_each,
238
+ :prepend__after_each,
239
+ :special_child_prepend__after_all,
240
+ :special_prepend__after_all,
241
+ :prepend__after_all
242
+ ]
243
+ end
244
+ end
245
+
246
+ describe Configuration, "#append_after" do
247
+ include ConfigurationCallbacksSpec
248
+
249
+ it "calls append_after on the type" do
250
+ order = []
251
+ @config.append_after(:all) do
252
+ order << :append__after_all
253
+ end
254
+ @config.append_after(:all, :type => :special) do
255
+ order << :special_append__after_all
256
+ end
257
+ @config.append_after(:all, :type => :special_child) do
258
+ order << :special_child_append__after_all
259
+ end
260
+ @config.append_after(:each) do
261
+ order << :append__after_each
262
+ end
263
+ @config.append_after(:each, :type => :special) do
264
+ order << :special_append__after_each
265
+ end
266
+ @config.append_after(:each, :type => :special_child) do
267
+ order << :special_child_append__after_each
268
+ end
269
+ @config.append_after(:all, :type => :non_special) do
270
+ order << :non_special_append_after_all
271
+ end
272
+ @config.append_after(:each, :type => :non_special) do
273
+ order << :non_special_append_after_each
274
+ end
275
+ @example_group.it "calls append_after" do
276
+ end
277
+
278
+ @example_group.run
279
+ order.should == [
280
+ :special_child_append__after_each,
281
+ :special_append__after_each,
282
+ :append__after_each,
283
+ :special_child_append__after_all,
284
+ :special_append__after_all,
285
+ :append__after_all
286
+ ]
287
+ end
288
+ end
289
+ end
290
+ end