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,42 @@
1
+ module Spec
2
+ module Example
3
+ class ExampleMatcher
4
+ def initialize(example_group_description, example_name)
5
+ @example_group_description = example_group_description
6
+ @example_name = example_name
7
+ end
8
+
9
+ def matches?(specified_examples)
10
+ specified_examples.each do |specified_example|
11
+ return true if matches_literal_example?(specified_example) || matches_example_not_considering_modules?(specified_example)
12
+ end
13
+ false
14
+ end
15
+
16
+ protected
17
+ def matches_literal_example?(specified_example)
18
+ specified_example =~ /(^#{example_group_regex} #{example_regexp}$|^#{example_group_regex}$|^#{example_group_with_before_all_regexp}$|^#{example_regexp}$)/
19
+ end
20
+
21
+ def matches_example_not_considering_modules?(specified_example)
22
+ specified_example =~ /(^#{example_group_regex_not_considering_modules} #{example_regexp}$|^#{example_group_regex_not_considering_modules}$|^#{example_regexp}$)/
23
+ end
24
+
25
+ def example_group_regex
26
+ Regexp.escape(@example_group_description)
27
+ end
28
+
29
+ def example_group_with_before_all_regexp
30
+ Regexp.escape("#{@example_group_description} before(:all)")
31
+ end
32
+
33
+ def example_group_regex_not_considering_modules
34
+ Regexp.escape(@example_group_description.split('::').last)
35
+ end
36
+
37
+ def example_regexp
38
+ Regexp.escape(@example_name)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,101 @@
1
+ module Spec
2
+ module Example
3
+ module ExampleMethods
4
+ extend ExampleGroupMethods
5
+ extend ModuleReopeningFix
6
+
7
+ PENDING_EXAMPLE_BLOCK = lambda {
8
+ raise Spec::Example::ExamplePendingError.new("Not Yet Implemented")
9
+ }
10
+
11
+ def execute(options, instance_variables)
12
+ options.reporter.example_started(self)
13
+ set_instance_variables_from_hash(instance_variables)
14
+
15
+ execution_error = nil
16
+ Timeout.timeout(options.timeout) do
17
+ begin
18
+ before_example
19
+ run_with_description_capturing
20
+ rescue Exception => e
21
+ execution_error ||= e
22
+ end
23
+ begin
24
+ after_example
25
+ rescue Exception => e
26
+ execution_error ||= e
27
+ end
28
+ end
29
+
30
+ options.reporter.example_finished(self, execution_error)
31
+ success = execution_error.nil? || ExamplePendingError === execution_error
32
+ end
33
+
34
+ def instance_variable_hash
35
+ instance_variables.inject({}) do |variable_hash, variable_name|
36
+ variable_hash[variable_name] = instance_variable_get(variable_name)
37
+ variable_hash
38
+ end
39
+ end
40
+
41
+ def violated(message="")
42
+ raise Spec::Expectations::ExpectationNotMetError.new(message)
43
+ end
44
+
45
+ def eval_each_fail_fast(procs) #:nodoc:
46
+ procs.each do |proc|
47
+ instance_eval(&proc)
48
+ end
49
+ end
50
+
51
+ def eval_each_fail_slow(procs) #:nodoc:
52
+ first_exception = nil
53
+ procs.each do |proc|
54
+ begin
55
+ instance_eval(&proc)
56
+ rescue Exception => e
57
+ first_exception ||= e
58
+ end
59
+ end
60
+ raise first_exception if first_exception
61
+ end
62
+
63
+ def description
64
+ @_defined_description || @_matcher_description || "NO NAME"
65
+ end
66
+
67
+ def set_instance_variables_from_hash(instance_variables)
68
+ instance_variables.each do |variable_name, value|
69
+ unless ['@_implementation', '@_defined_description', '@_matcher_description', '@method_name'].index(variable_name)
70
+ instance_variable_set variable_name, value
71
+ end
72
+ end
73
+ end
74
+
75
+ def run_with_description_capturing
76
+ return_value = nil
77
+
78
+ @_matcher_description = Matchers.capture_generated_description do
79
+ return_value = instance_eval(&(@_implementation || PENDING_EXAMPLE_BLOCK))
80
+ end
81
+ return_value
82
+ end
83
+
84
+ protected
85
+ include Matchers
86
+ include Pending
87
+
88
+ def before_example
89
+ setup_mocks_for_rspec
90
+ self.class.run_before_each(self)
91
+ end
92
+
93
+ def after_example
94
+ self.class.run_after_each(self)
95
+ verify_mocks_for_rspec
96
+ ensure
97
+ teardown_mocks_for_rspec
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,21 @@
1
+ module Spec
2
+ module Example
3
+ # This is a fix for ...Something in Ruby 1.8.6??... (Someone fill in here please - Aslak)
4
+ module ModuleReopeningFix
5
+ def child_modules
6
+ @child_modules ||= []
7
+ end
8
+
9
+ def included(mod)
10
+ child_modules << mod
11
+ end
12
+
13
+ def include(mod)
14
+ super
15
+ child_modules.each do |child_module|
16
+ child_module.__send__(:include, mod)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,18 @@
1
+ module Spec
2
+ module Example
3
+ module Pending
4
+ def pending(message = "TODO")
5
+ if block_given?
6
+ begin
7
+ yield
8
+ rescue Exception => e
9
+ raise Spec::Example::ExamplePendingError.new(message)
10
+ end
11
+ raise Spec::Example::PendingExampleFixedError.new("Expected pending '#{message}' to fail. No Error was raised.")
12
+ else
13
+ raise Spec::Example::ExamplePendingError.new(message)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,58 @@
1
+ module Spec
2
+ module Example
3
+ class SharedExampleGroup < Module
4
+ class << self
5
+ def add_shared_example_group(new_example_group)
6
+ guard_against_redefining_existing_example_group(new_example_group)
7
+ shared_example_groups << new_example_group
8
+ end
9
+
10
+ def find_shared_example_group(example_group_description)
11
+ shared_example_groups.find do |b|
12
+ b.description == example_group_description
13
+ end
14
+ end
15
+
16
+ def shared_example_groups
17
+ # TODO - this needs to be global, or at least accessible from
18
+ # from subclasses of Example in a centralized place. I'm not loving
19
+ # this as a solution, but it works for now.
20
+ $shared_example_groups ||= []
21
+ end
22
+
23
+ private
24
+ def guard_against_redefining_existing_example_group(new_example_group)
25
+ existing_example_group = find_shared_example_group(new_example_group.description)
26
+ return unless existing_example_group
27
+ return if new_example_group.equal?(existing_example_group)
28
+ return if spec_path(new_example_group) == spec_path(existing_example_group)
29
+ raise ArgumentError.new("Shared Example '#{existing_example_group.description}' already exists")
30
+ end
31
+
32
+ def spec_path(example_group)
33
+ File.expand_path(example_group.spec_path)
34
+ end
35
+ end
36
+ include ExampleGroupMethods
37
+ public :include
38
+
39
+ def initialize(*args, &example_group_block)
40
+ describe(*args)
41
+ @example_group_block = example_group_block
42
+ self.class.add_shared_example_group(self)
43
+ end
44
+
45
+ def included(mod) # :nodoc:
46
+ mod.module_eval(&@example_group_block)
47
+ end
48
+
49
+ def execute_in_class_hierarchy(superclass_last=false)
50
+ classes = [self]
51
+ superclass_last ? classes << ExampleMethods : classes.unshift(ExampleMethods)
52
+ classes.each do |example_group|
53
+ yield example_group
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -12,12 +12,8 @@ module Spec
12
12
 
13
13
  # TODO add some rdoc
14
14
  class Default
15
- def initialize(format=:unified,context_lines=nil,colour=nil)
16
-
17
- context_lines ||= 3
18
- colour ||= false
19
-
20
- @format,@context_lines,@colour = format,context_lines,colour
15
+ def initialize(options)
16
+ @options = options
21
17
  end
22
18
 
23
19
  # This is snagged from diff/lcs/ldiff.rb (which is a commandline tool)
@@ -31,17 +27,17 @@ module Spec
31
27
  file_length_difference = 0
32
28
  diffs.each do |piece|
33
29
  begin
34
- hunk = Diff::LCS::Hunk.new(data_old, data_new, piece, @context_lines,
30
+ hunk = Diff::LCS::Hunk.new(data_old, data_new, piece, context_lines,
35
31
  file_length_difference)
36
32
  file_length_difference = hunk.file_length_difference
37
33
  next unless oldhunk
38
34
  # Hunks may overlap, which is why we need to be careful when our
39
35
  # diff includes lines of context. Otherwise, we might print
40
36
  # redundant lines.
41
- if (@context_lines > 0) and hunk.overlaps?(oldhunk)
37
+ if (context_lines > 0) and hunk.overlaps?(oldhunk)
42
38
  hunk.unshift(oldhunk)
43
39
  else
44
- output << oldhunk.diff(@format)
40
+ output << oldhunk.diff(format)
45
41
  end
46
42
  ensure
47
43
  oldhunk = hunk
@@ -49,12 +45,21 @@ module Spec
49
45
  end
50
46
  end
51
47
  #Handle the last remaining hunk
52
- output << oldhunk.diff(@format) << "\n"
48
+ output << oldhunk.diff(format) << "\n"
53
49
  end
54
50
 
55
51
  def diff_as_object(target,expected)
56
52
  diff_as_string(PP.pp(target,""), PP.pp(expected,""))
57
53
  end
54
+
55
+ protected
56
+ def format
57
+ @options.diff_format
58
+ end
59
+
60
+ def context_lines
61
+ @options.context_lines
62
+ end
58
63
  end
59
64
  end
60
65
  end
@@ -1,6 +1,12 @@
1
1
  module Spec
2
2
  module Expectations
3
- class ExpectationNotMetError < StandardError
3
+ # If Test::Unit is loaed, we'll use its error as baseclass, so that Test::Unit
4
+ # will report unmet RSpec expectations as failures rather than errors.
5
+ superclass = ['Test::Unit::AssertionFailedError', '::StandardError'].map do |c|
6
+ eval(c) rescue nil
7
+ end.compact.first
8
+
9
+ class ExpectationNotMetError < superclass
4
10
  end
5
11
  end
6
12
  end
@@ -3,7 +3,6 @@ module Spec
3
3
  # rspec adds #should and #should_not to every Object (and,
4
4
  # implicitly, every Class).
5
5
  module ObjectExpectations
6
-
7
6
  # :call-seq:
8
7
  # should(matcher)
9
8
  # should == expected
@@ -28,9 +27,12 @@ module Spec
28
27
  #
29
28
  # NOTE that this does NOT support receiver.should != expected.
30
29
  # Instead, use receiver.should_not == expected
31
- def should(matcher=nil, &block)
32
- return ExpectationMatcherHandler.handle_matcher(self, matcher, &block) if matcher
33
- Spec::Matchers::PositiveOperatorMatcher.new(self)
30
+ def should(matcher = :default_parameter, &block)
31
+ if :default_parameter == matcher
32
+ Spec::Matchers::PositiveOperatorMatcher.new(self)
33
+ else
34
+ ExpectationMatcherHandler.handle_matcher(self, matcher, &block)
35
+ end
34
36
  end
35
37
 
36
38
  # :call-seq:
@@ -52,9 +54,12 @@ module Spec
52
54
  # => Passes unless (receiver =~ regexp)
53
55
  #
54
56
  # See Spec::Matchers for more information about matchers
55
- def should_not(matcher=nil, &block)
56
- return NegativeExpectationMatcherHandler.handle_matcher(self, matcher, &block) if matcher
57
- Spec::Matchers::NegativeOperatorMatcher.new(self)
57
+ def should_not(matcher = :default_parameter, &block)
58
+ if :default_parameter == matcher
59
+ Spec::Matchers::NegativeOperatorMatcher.new(self)
60
+ else
61
+ NegativeExpectationMatcherHandler.handle_matcher(self, matcher, &block)
62
+ end
58
63
  end
59
64
 
60
65
  end
@@ -1,18 +1,23 @@
1
1
  module Spec
2
2
  module Expectations
3
+ class InvalidMatcherError < ArgumentError; end
3
4
 
4
5
  module MatcherHandlerHelper
5
- def describe(matcher)
6
+ def describe_matcher(matcher)
6
7
  matcher.respond_to?(:description) ? matcher.description : "[#{matcher.class.name} does not provide a description]"
7
8
  end
8
9
  end
9
10
 
10
- class ExpectationMatcherHandler
11
+ class ExpectationMatcherHandler
11
12
  class << self
12
13
  include MatcherHandlerHelper
13
14
  def handle_matcher(actual, matcher, &block)
15
+ unless matcher.respond_to?(:matches?)
16
+ raise InvalidMatcherError, "Expected a matcher, got #{matcher.inspect}."
17
+ end
18
+
14
19
  match = matcher.matches?(actual, &block)
15
- ::Spec::Matchers.generated_description = "should #{describe(matcher)}"
20
+ ::Spec::Matchers.generated_description = "should #{describe_matcher(matcher)}"
16
21
  Spec::Expectations.fail_with(matcher.failure_message) unless match
17
22
  end
18
23
  end
@@ -22,6 +27,10 @@ module Spec
22
27
  class << self
23
28
  include MatcherHandlerHelper
24
29
  def handle_matcher(actual, matcher, &block)
30
+ unless matcher.respond_to?(:matches?)
31
+ raise InvalidMatcherError, "Expected a matcher, got #{matcher.inspect}."
32
+ end
33
+
25
34
  unless matcher.respond_to?(:negative_failure_message)
26
35
  Spec::Expectations.fail_with(
27
36
  <<-EOF
@@ -32,7 +41,7 @@ EOF
32
41
  )
33
42
  end
34
43
  match = matcher.matches?(actual, &block)
35
- ::Spec::Matchers.generated_description = "should not #{describe(matcher)}"
44
+ ::Spec::Matchers.generated_description = "should not #{describe_matcher(matcher)}"
36
45
  Spec::Expectations.fail_with(matcher.negative_failure_message) if match
37
46
  end
38
47
  end
@@ -1 +1,3 @@
1
1
  require 'spec/extensions/object'
2
+ require 'spec/extensions/class'
3
+ require 'spec/extensions/main'
@@ -0,0 +1,24 @@
1
+ class Class
2
+ # Creates a new subclass of self, with a name "under" our own name.
3
+ # Example:
4
+ #
5
+ # x = Foo::Bar.subclass('Zap'){}
6
+ # x.name # => Foo::Bar::Zap_1
7
+ # x.superclass.name # => Foo::Bar
8
+ def subclass(base_name, &body)
9
+ klass = Class.new(self)
10
+ class_name = "#{base_name}_#{class_count!}"
11
+ instance_eval do
12
+ const_set(class_name, klass)
13
+ end
14
+ klass.instance_eval(&body)
15
+ klass
16
+ end
17
+
18
+ private
19
+ def class_count!
20
+ @class_count ||= 0
21
+ @class_count += 1
22
+ @class_count
23
+ end
24
+ end
@@ -0,0 +1,54 @@
1
+ module Spec
2
+ module Extensions
3
+ module Main
4
+ # Creates and returns a class that includes the ExampleGroupMethods
5
+ # module. The ExampleGroup sub-class depends on the directory of the file
6
+ # calling this method. For example, Spec::Rails will use different
7
+ # classes for specs living in <tt>spec/models</tt>,
8
+ # <tt>spec/helpers</tt>, <tt>spec/views</tt> and
9
+ # <tt>spec/controllers</tt>.
10
+ #
11
+ # It is also possible to override autodiscovery of the example group
12
+ # type with an options Hash as the last argument:
13
+ #
14
+ # describe "name", :type => :something_special do ...
15
+ #
16
+ # The reason for using different behaviour classes is to have different
17
+ # matcher methods available from within the <tt>describe</tt> block.
18
+ #
19
+ # See Spec::Example::ExampleFactory#register for details about how to
20
+ # register special implementations.
21
+ #
22
+ def describe(*args, &block)
23
+ raise ArgumentError if args.empty?
24
+ raise ArgumentError unless block
25
+ args << {} unless Hash === args.last
26
+ args.last[:spec_path] = caller(0)[1]
27
+ Spec::Example::ExampleGroupFactory.create_example_group(*args, &block)
28
+ end
29
+ alias :context :describe
30
+
31
+ # Shortcut for creating a shared example group
32
+ def shared_examples_for(name, &block)
33
+ describe(name, :shared => true, &block)
34
+ end
35
+
36
+ private
37
+
38
+ def rspec_options
39
+ $rspec_options ||= begin; \
40
+ parser = ::Spec::Runner::OptionParser.new(STDERR, STDOUT); \
41
+ parser.order!(ARGV); \
42
+ $rspec_options = parser.options; \
43
+ end
44
+ $rspec_options
45
+ end
46
+
47
+ def init_rspec_options(options)
48
+ $rspec_options = options if $rspec_options.nil?
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ include Spec::Extensions::Main