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
@@ -1,13 +1,37 @@
1
- require 'spec/extensions'
2
1
  require 'spec/version'
3
2
  require 'spec/matchers'
4
3
  require 'spec/expectations'
5
- require 'spec/translator'
6
- require 'spec/dsl'
4
+ require 'spec/example'
5
+ require 'spec/extensions'
7
6
  require 'spec/runner'
8
7
 
9
- class Object
10
- def metaclass
11
- class << self; self; end
8
+ if Object.const_defined?(:Test); \
9
+ require 'spec/interop/test'; \
10
+ end
11
+
12
+ module Spec
13
+ class << self
14
+ def run?
15
+ @run || rspec_options.examples_run?
16
+ end
17
+
18
+ def run; \
19
+ return true if run?; \
20
+ result = rspec_options.run_examples; \
21
+ @run = true; \
22
+ result; \
23
+ end
24
+ attr_writer :run
25
+
26
+ def exit?; \
27
+ !Object.const_defined?(:Test) || Test::Unit.run?; \
28
+ end
12
29
  end
13
30
  end
31
+
32
+ at_exit do \
33
+ unless $! || Spec.run?; \
34
+ success = Spec.run; \
35
+ exit success if Spec.exit?; \
36
+ end \
37
+ end
@@ -0,0 +1,12 @@
1
+ require 'timeout'
2
+ require 'forwardable'
3
+ require 'spec/example/pending'
4
+ require 'spec/example/module_reopening_fix'
5
+ require 'spec/example/example_group_methods'
6
+ require 'spec/example/example_methods'
7
+ require 'spec/example/example_group'
8
+ require 'spec/example/shared_example_group'
9
+ require 'spec/example/example_group_factory'
10
+ require 'spec/example/errors'
11
+ require 'spec/example/configuration'
12
+ require 'spec/example/example_matcher'
@@ -1,7 +1,6 @@
1
1
  module Spec
2
- module DSL
2
+ module Example
3
3
  class Configuration
4
-
5
4
  # Chooses what mock framework to use. Example:
6
5
  #
7
6
  # Spec::Runner.configure do |config|
@@ -36,49 +35,35 @@ module Spec
36
35
  @mock_framework ||= mock_framework_path("rspec")
37
36
  end
38
37
 
39
- # Declares modules to be included in all behaviours (<tt>describe</tt> blocks).
38
+ # Declares modules to be included in all example groups (<tt>describe</tt> blocks).
40
39
  #
41
40
  # config.include(My::Bottle, My::Cup)
42
41
  #
43
- # If you want to restrict the inclusion to a subset of all the behaviours then
42
+ # If you want to restrict the inclusion to a subset of all the example groups then
44
43
  # specify this in a Hash as the last argument:
45
44
  #
46
- # config.include(My::Pony, My::Horse, :behaviour_type => :farm)
45
+ # config.include(My::Pony, My::Horse, :type => :farm)
47
46
  #
48
- # Only behaviours that have that type will get the modules included:
47
+ # Only example groups that have that type will get the modules included:
49
48
  #
50
- # describe "Downtown", :behaviour_type => :city do
49
+ # describe "Downtown", :type => :city do
51
50
  # # Will *not* get My::Pony and My::Horse included
52
51
  # end
53
52
  #
54
- # describe "Old Mac Donald", :behaviour_type => :farm do
53
+ # describe "Old Mac Donald", :type => :farm do
55
54
  # # *Will* get My::Pony and My::Horse included
56
55
  # end
57
56
  #
58
57
  def include(*args)
59
58
  args << {} unless Hash === args.last
60
59
  modules, options = args_and_options(*args)
61
- required_behaviour_type = options[:behaviour_type]
62
- required_behaviour_type = required_behaviour_type.to_sym unless required_behaviour_type.nil?
63
- @modules ||= {}
64
- @modules[required_behaviour_type] ||= []
65
- @modules[required_behaviour_type] += modules
66
- end
67
-
68
- def modules_for(required_behaviour_type) #:nodoc:
69
- @modules ||= {}
70
- modules = @modules[nil] || [] # general ones
71
- modules << @modules[required_behaviour_type.to_sym] unless required_behaviour_type.nil?
72
- modules.uniq.compact
73
- end
74
-
75
- # This is just for cleanup in RSpec's own examples
76
- def exclude(*modules) #:nodoc:
77
- @modules.each do |behaviour_type, mods|
78
- modules.each{|m| mods.delete(m)}
60
+ required_example_group = get_type_from_options(options)
61
+ required_example_group = required_example_group.to_sym if required_example_group
62
+ modules.each do |mod|
63
+ ExampleGroupFactory.get(required_example_group).send(:include, mod)
79
64
  end
80
65
  end
81
-
66
+
82
67
  # Defines global predicate matchers. Example:
83
68
  #
84
69
  # config.predicate_matchers[:swim] = :can_swim?
@@ -91,45 +76,69 @@ module Spec
91
76
  @predicate_matchers ||= {}
92
77
  end
93
78
 
94
- # Prepends a global <tt>before</tt> block to all behaviours.
79
+ # Prepends a global <tt>before</tt> block to all example groups.
95
80
  # See #append_before for filtering semantics.
96
81
  def prepend_before(*args, &proc)
97
- Behaviour.prepend_before(*args, &proc)
82
+ scope, options = scope_and_options(*args)
83
+ example_group = ExampleGroupFactory.get(
84
+ get_type_from_options(options)
85
+ )
86
+ example_group.prepend_before(scope, &proc)
98
87
  end
99
- # Appends a global <tt>before</tt> block to all behaviours.
88
+ # Appends a global <tt>before</tt> block to all example groups.
100
89
  #
101
- # If you want to restrict the block to a subset of all the behaviours then
90
+ # If you want to restrict the block to a subset of all the example groups then
102
91
  # specify this in a Hash as the last argument:
103
92
  #
104
- # config.prepend_before(:all, :behaviour_type => :farm)
93
+ # config.prepend_before(:all, :type => :farm)
105
94
  #
106
95
  # or
107
96
  #
108
- # config.prepend_before(:behaviour_type => :farm)
97
+ # config.prepend_before(:type => :farm)
109
98
  #
110
99
  def append_before(*args, &proc)
111
- Behaviour.append_before(*args, &proc)
100
+ scope, options = scope_and_options(*args)
101
+ example_group = ExampleGroupFactory.get(
102
+ get_type_from_options(options)
103
+ )
104
+ example_group.append_before(scope, &proc)
112
105
  end
113
106
  alias_method :before, :append_before
114
107
 
115
- # Prepends a global <tt>after</tt> block to all behaviours.
108
+ # Prepends a global <tt>after</tt> block to all example groups.
116
109
  # See #append_before for filtering semantics.
117
110
  def prepend_after(*args, &proc)
118
- Behaviour.prepend_after(*args, &proc)
111
+ scope, options = scope_and_options(*args)
112
+ example_group = ExampleGroupFactory.get(
113
+ get_type_from_options(options)
114
+ )
115
+ example_group.prepend_after(scope, &proc)
119
116
  end
120
117
  alias_method :after, :prepend_after
121
- # Appends a global <tt>after</tt> block to all behaviours.
118
+ # Appends a global <tt>after</tt> block to all example groups.
122
119
  # See #append_before for filtering semantics.
123
120
  def append_after(*args, &proc)
124
- Behaviour.append_after(*args, &proc)
121
+ scope, options = scope_and_options(*args)
122
+ example_group = ExampleGroupFactory.get(
123
+ get_type_from_options(options)
124
+ )
125
+ example_group.append_after(scope, &proc)
125
126
  end
126
127
 
127
128
  private
129
+
130
+ def scope_and_options(*args)
131
+ args, options = args_and_options(*args)
132
+ scope = (args[0] || :each), options
133
+ end
134
+
135
+ def get_type_from_options(options)
136
+ options[:type] || options[:behaviour_type]
137
+ end
128
138
 
129
139
  def mock_framework_path(framework_name)
130
140
  File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "plugins", "mock_frameworks", framework_name))
131
141
  end
132
-
133
142
  end
134
143
  end
135
144
  end
@@ -1,9 +1,9 @@
1
1
  module Spec
2
- module DSL
2
+ module Example
3
3
  class ExamplePendingError < StandardError
4
4
  end
5
5
 
6
- class PendingFixedError < StandardError
6
+ class PendingExampleFixedError < StandardError
7
7
  end
8
8
  end
9
9
  end
@@ -0,0 +1,16 @@
1
+ module Spec
2
+ module Example
3
+ # The superclass for all regular RSpec examples.
4
+ class ExampleGroup
5
+ extend Spec::Example::ExampleGroupMethods
6
+ include Spec::Example::ExampleMethods
7
+
8
+ def initialize(defined_description, &implementation)
9
+ @_defined_description = defined_description
10
+ @_implementation = implementation
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+ Spec::ExampleGroup = Spec::Example::ExampleGroup
@@ -0,0 +1,62 @@
1
+ module Spec
2
+ module Example
3
+ class ExampleGroupFactory
4
+ class << self
5
+ def reset
6
+ @example_group_types = nil
7
+ default(ExampleGroup)
8
+ end
9
+
10
+ # Registers an example group class +klass+ with the symbol
11
+ # +type+. For example:
12
+ #
13
+ # Spec::Example::ExampleGroupFactory.register(:farm, Spec::Farm::Example::FarmExampleGroup)
14
+ #
15
+ # This will cause Main#describe from a file living in
16
+ # <tt>spec/farm</tt> to create example group instances of type
17
+ # Spec::Farm::Example::FarmExampleGroup.
18
+ def register(id, example_group_class)
19
+ @example_group_types[id] = example_group_class
20
+ end
21
+
22
+ # Sets the default ExampleGroup class
23
+ def default(example_group_class)
24
+ old = @example_group_types
25
+ @example_group_types = Hash.new(example_group_class)
26
+ @example_group_types.merge(old) if old
27
+ end
28
+
29
+ def get(id=nil)
30
+ if @example_group_types.values.include?(id)
31
+ id
32
+ else
33
+ @example_group_types[id]
34
+ end
35
+ end
36
+
37
+ def create_example_group(*args, &block)
38
+ opts = Hash === args.last ? args.last : {}
39
+ if opts[:shared]
40
+ SharedExampleGroup.new(*args, &block)
41
+ else
42
+ superclass = determine_superclass(opts)
43
+ superclass.describe(*args, &block)
44
+ end
45
+ end
46
+
47
+ protected
48
+
49
+ def determine_superclass(opts)
50
+ id = if opts[:type]
51
+ opts[:type]
52
+ elsif opts[:spec_path] =~ /spec(\\|\/)(#{@example_group_types.keys.join('|')})/
53
+ $2 == '' ? nil : $2.to_sym
54
+ end
55
+ get(id)
56
+ end
57
+
58
+ end
59
+ self.reset
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,412 @@
1
+ module Spec
2
+ module Example
3
+
4
+ module ExampleGroupMethods
5
+ class << self
6
+ def description_text(*args)
7
+ args.inject("") do |result, arg|
8
+ result << " " unless (result == "" || arg.to_s =~ /^(\s|\.|#)/)
9
+ result << arg.to_s
10
+ end
11
+ end
12
+ end
13
+
14
+ attr_reader :description_text, :description_args, :spec_path
15
+
16
+ def inherited(klass)
17
+ super
18
+ klass.register
19
+ end
20
+
21
+ # Makes the describe/it syntax available from a class. For example:
22
+ #
23
+ # class StackSpec < Spec::ExampleGroup
24
+ # describe Stack, "with no elements"
25
+ #
26
+ # before
27
+ # @stack = Stack.new
28
+ # end
29
+ #
30
+ # it "should raise on pop" do
31
+ # lambda{ @stack.pop }.should raise_error
32
+ # end
33
+ # end
34
+ #
35
+ def describe(*args, &example_group_block)
36
+ if example_group_block
37
+ self.subclass("Subclass") do
38
+ describe(*args)
39
+ module_eval(&example_group_block)
40
+ end
41
+ else
42
+ set_description(*args)
43
+ before_eval
44
+ self
45
+ end
46
+ end
47
+
48
+ # Use this to pull in examples from shared example groups.
49
+ # See Spec::Runner for information about shared example groups.
50
+ def it_should_behave_like(shared_example_group)
51
+ case shared_example_group
52
+ when SharedExampleGroup
53
+ include shared_example_group
54
+ else
55
+ example_group = SharedExampleGroup.find_shared_example_group(shared_example_group)
56
+ unless example_group
57
+ raise RuntimeError.new("Shared Example Group '#{shared_example_group}' can not be found")
58
+ end
59
+ include(example_group)
60
+ end
61
+ end
62
+
63
+ # :call-seq:
64
+ # predicate_matchers[matcher_name] = method_on_object
65
+ # predicate_matchers[matcher_name] = [method1_on_object, method2_on_object]
66
+ #
67
+ # Dynamically generates a custom matcher that will match
68
+ # a predicate on your class. RSpec provides a couple of these
69
+ # out of the box:
70
+ #
71
+ # exist (or state expectations)
72
+ # File.should exist("path/to/file")
73
+ #
74
+ # an_instance_of (for mock argument constraints)
75
+ # mock.should_receive(:message).with(an_instance_of(String))
76
+ #
77
+ # == Examples
78
+ #
79
+ # class Fish
80
+ # def can_swim?
81
+ # true
82
+ # end
83
+ # end
84
+ #
85
+ # describe Fish do
86
+ # predicate_matchers[:swim] = :can_swim?
87
+ # it "should swim" do
88
+ # Fish.new.should swim
89
+ # end
90
+ # end
91
+ def predicate_matchers
92
+ @predicate_matchers ||= {:an_instance_of => :is_a?}
93
+ end
94
+
95
+ # Creates an instance of Spec::Example::Example and adds
96
+ # it to a collection of examples of the current example group.
97
+ def it(description=nil, &implementation)
98
+ e = new(description, &implementation)
99
+ example_objects << e
100
+ e
101
+ end
102
+
103
+ alias_method :specify, :it
104
+
105
+ # Use this to temporarily disable an example.
106
+ def xit(description=nil, opts={}, &block)
107
+ Kernel.warn("Example disabled: #{description}")
108
+ end
109
+
110
+ def run
111
+ examples = examples_to_run
112
+ return true if examples.empty?
113
+ reporter.add_example_group(self)
114
+ return dry_run(examples) if dry_run?
115
+
116
+ plugin_mock_framework
117
+ define_methods_from_predicate_matchers
118
+
119
+ success, before_all_instance_variables = run_before_all
120
+ success, after_all_instance_variables = execute_examples(success, before_all_instance_variables, examples)
121
+ success = run_after_all(success, after_all_instance_variables)
122
+ end
123
+
124
+ def description
125
+ ExampleGroupMethods.description_text(*description_parts)
126
+ end
127
+
128
+ def described_type
129
+ description_parts.find {|part| part.is_a?(Module)}
130
+ end
131
+
132
+ def description_parts #:nodoc:
133
+ parts = []
134
+ execute_in_class_hierarchy do |example_group|
135
+ parts << example_group.description_args
136
+ end
137
+ parts.flatten.compact
138
+ end
139
+
140
+ def set_description(*args)
141
+ args, options = args_and_options(*args)
142
+ @description_args = args
143
+ @description_text = ExampleGroupMethods.description_text(*args)
144
+ @spec_path = File.expand_path(options[:spec_path]) if options[:spec_path]
145
+ if described_type.class == Module
146
+ include described_type
147
+ end
148
+ self
149
+ end
150
+
151
+ def examples #:nodoc:
152
+ examples = example_objects.dup
153
+ add_method_examples(examples)
154
+ rspec_options.reverse ? examples.reverse : examples
155
+ end
156
+
157
+ def number_of_examples #:nodoc:
158
+ examples.length
159
+ end
160
+
161
+ # Registers a block to be executed before each example.
162
+ # This method prepends +block+ to existing before blocks.
163
+ def prepend_before(*args, &block)
164
+ scope, options = scope_and_options(*args)
165
+ parts = before_parts_from_scope(scope)
166
+ parts.unshift(block)
167
+ end
168
+
169
+ # Registers a block to be executed before each example.
170
+ # This method appends +block+ to existing before blocks.
171
+ def append_before(*args, &block)
172
+ scope, options = scope_and_options(*args)
173
+ parts = before_parts_from_scope(scope)
174
+ parts << block
175
+ end
176
+ alias_method :before, :append_before
177
+
178
+ # Registers a block to be executed after each example.
179
+ # This method prepends +block+ to existing after blocks.
180
+ def prepend_after(*args, &block)
181
+ scope, options = scope_and_options(*args)
182
+ parts = after_parts_from_scope(scope)
183
+ parts.unshift(block)
184
+ end
185
+ alias_method :after, :prepend_after
186
+
187
+ # Registers a block to be executed after each example.
188
+ # This method appends +block+ to existing after blocks.
189
+ def append_after(*args, &block)
190
+ scope, options = scope_and_options(*args)
191
+ parts = after_parts_from_scope(scope)
192
+ parts << block
193
+ end
194
+
195
+ def remove_after(scope, &block)
196
+ after_each_parts.delete(block)
197
+ end
198
+
199
+ # Deprecated. Use before(:each)
200
+ def setup(&block)
201
+ before(:each, &block)
202
+ end
203
+
204
+ # Deprecated. Use after(:each)
205
+ def teardown(&block)
206
+ after(:each, &block)
207
+ end
208
+
209
+ def before_all_parts # :nodoc:
210
+ @before_all_parts ||= []
211
+ end
212
+
213
+ def after_all_parts # :nodoc:
214
+ @after_all_parts ||= []
215
+ end
216
+
217
+ def before_each_parts # :nodoc:
218
+ @before_each_parts ||= []
219
+ end
220
+
221
+ def after_each_parts # :nodoc:
222
+ @after_each_parts ||= []
223
+ end
224
+
225
+ # Only used from RSpec's own examples
226
+ def reset # :nodoc:
227
+ @before_all_parts = nil
228
+ @after_all_parts = nil
229
+ @before_each_parts = nil
230
+ @after_each_parts = nil
231
+ end
232
+
233
+ def register
234
+ rspec_options.add_example_group self
235
+ end
236
+
237
+ def unregister #:nodoc:
238
+ rspec_options.remove_example_group self
239
+ end
240
+
241
+ def run_before_each(example)
242
+ execute_in_class_hierarchy do |example_group|
243
+ example.eval_each_fail_fast(example_group.before_each_parts)
244
+ end
245
+ end
246
+
247
+ def run_after_each(example)
248
+ execute_in_class_hierarchy(:superclass_first) do |example_group|
249
+ example.eval_each_fail_slow(example_group.after_each_parts)
250
+ end
251
+ end
252
+
253
+ private
254
+ def dry_run(examples)
255
+ examples.each do |example|
256
+ rspec_options.reporter.example_started(example)
257
+ rspec_options.reporter.example_finished(example)
258
+ end
259
+ return true
260
+ end
261
+
262
+ def run_before_all
263
+ before_all = new("before(:all)")
264
+ begin
265
+ execute_in_class_hierarchy do |example_group|
266
+ before_all.eval_each_fail_fast(example_group.before_all_parts)
267
+ end
268
+ return [true, before_all.instance_variable_hash]
269
+ rescue Exception => e
270
+ reporter.failure(before_all, e)
271
+ return [false, before_all.instance_variable_hash]
272
+ end
273
+ end
274
+
275
+ def execute_examples(success, instance_variables, examples)
276
+ return [success, instance_variables] unless success
277
+
278
+ after_all_instance_variables = instance_variables
279
+ examples.each do |example_group_instance|
280
+ success &= example_group_instance.execute(rspec_options, instance_variables)
281
+ after_all_instance_variables = example_group_instance.instance_variable_hash
282
+ end
283
+ return [success, after_all_instance_variables]
284
+ end
285
+
286
+ def run_after_all(success, instance_variables)
287
+ after_all = new("after(:all)")
288
+ after_all.set_instance_variables_from_hash(instance_variables)
289
+ execute_in_class_hierarchy(:superclass_first) do |example_group|
290
+ after_all.eval_each_fail_slow(example_group.after_all_parts)
291
+ end
292
+ return success
293
+ rescue Exception => e
294
+ reporter.failure(after_all, e)
295
+ return false
296
+ end
297
+
298
+ def examples_to_run
299
+ all_examples = examples
300
+ return all_examples unless specified_examples?
301
+ all_examples.reject do |example|
302
+ matcher = ExampleMatcher.new(description.to_s, example.description)
303
+ !matcher.matches?(specified_examples)
304
+ end
305
+ end
306
+
307
+ def specified_examples?
308
+ specified_examples && !specified_examples.empty?
309
+ end
310
+
311
+ def specified_examples
312
+ rspec_options.examples
313
+ end
314
+
315
+ def reporter
316
+ rspec_options.reporter
317
+ end
318
+
319
+ def dry_run?
320
+ rspec_options.dry_run
321
+ end
322
+
323
+ def example_objects
324
+ @example_objects ||= []
325
+ end
326
+
327
+ def execute_in_class_hierarchy(superclass_last=false)
328
+ classes = []
329
+ current_class = self
330
+ while is_example_group?(current_class)
331
+ superclass_last ? classes << current_class : classes.unshift(current_class)
332
+ current_class = current_class.superclass
333
+ end
334
+ superclass_last ? classes << ExampleMethods : classes.unshift(ExampleMethods)
335
+
336
+ classes.each do |example_group|
337
+ yield example_group
338
+ end
339
+ end
340
+
341
+ def is_example_group?(klass)
342
+ Module === klass && klass.kind_of?(ExampleGroupMethods)
343
+ end
344
+
345
+ def plugin_mock_framework
346
+ case mock_framework = Spec::Runner.configuration.mock_framework
347
+ when Module
348
+ include mock_framework
349
+ else
350
+ require Spec::Runner.configuration.mock_framework
351
+ include Spec::Plugins::MockFramework
352
+ end
353
+ end
354
+
355
+ def define_methods_from_predicate_matchers # :nodoc:
356
+ all_predicate_matchers = predicate_matchers.merge(
357
+ Spec::Runner.configuration.predicate_matchers
358
+ )
359
+ all_predicate_matchers.each_pair do |matcher_method, method_on_object|
360
+ define_method matcher_method do |*args|
361
+ eval("be_#{method_on_object.to_s.gsub('?','')}(*args)")
362
+ end
363
+ end
364
+ end
365
+
366
+ def scope_and_options(*args)
367
+ args, options = args_and_options(*args)
368
+ scope = (args[0] || :each), options
369
+ end
370
+
371
+ def before_parts_from_scope(scope)
372
+ case scope
373
+ when :each; before_each_parts
374
+ when :all; before_all_parts
375
+ end
376
+ end
377
+
378
+ def after_parts_from_scope(scope)
379
+ case scope
380
+ when :each; after_each_parts
381
+ when :all; after_all_parts
382
+ end
383
+ end
384
+
385
+ def before_eval
386
+ end
387
+
388
+ def add_method_examples(examples)
389
+ instance_methods.sort.each do |method_name|
390
+ if example_method?(method_name)
391
+ examples << new(method_name) do
392
+ __send__(method_name)
393
+ end
394
+ end
395
+ end
396
+ end
397
+
398
+ def example_method?(method_name)
399
+ should_method?(method_name)
400
+ end
401
+
402
+ def should_method?(method_name)
403
+ !(method_name =~ /^should(_not)?$/) &&
404
+ method_name =~ /^should/ && (
405
+ instance_method(method_name).arity == 0 ||
406
+ instance_method(method_name).arity == -1
407
+ )
408
+ end
409
+ end
410
+
411
+ end
412
+ end