rspec 1.0.0 → 1.3.1

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 (456) hide show
  1. data/.document +7 -0
  2. data/History.rdoc +1546 -0
  3. data/{MIT-LICENSE → License.txt} +3 -1
  4. data/Manifest.txt +384 -0
  5. data/README.rdoc +41 -0
  6. data/Rakefile +94 -229
  7. data/Ruby1.9.rdoc +31 -0
  8. data/TODO.txt +17 -0
  9. data/Upgrade.rdoc +260 -0
  10. data/bin/autospec +4 -0
  11. data/bin/spec +5 -3
  12. data/cucumber.yml +5 -0
  13. data/examples/failing/README.txt +11 -0
  14. data/examples/failing/diffing_spec.rb +36 -0
  15. data/examples/failing/failing_implicit_docstrings_example.rb +17 -0
  16. data/examples/failing/failure_in_after.rb +10 -0
  17. data/examples/failing/failure_in_before.rb +10 -0
  18. data/examples/failing/mocking_example.rb +38 -0
  19. data/examples/failing/mocking_with_flexmock.rb +26 -0
  20. data/examples/failing/mocking_with_mocha.rb +25 -0
  21. data/examples/failing/mocking_with_rr.rb +27 -0
  22. data/examples/failing/partial_mock_example.rb +18 -0
  23. data/examples/failing/pending_example.rb +7 -0
  24. data/examples/failing/predicate_example.rb +32 -0
  25. data/examples/failing/raising_example.rb +47 -0
  26. data/examples/failing/syntax_error_example.rb +7 -0
  27. data/examples/failing/team_spec.rb +41 -0
  28. data/examples/failing/timeout_behaviour.rb +5 -0
  29. data/examples/{custom_formatter.rb → passing/custom_formatter.rb} +1 -1
  30. data/examples/passing/dynamic_spec.rb +7 -0
  31. data/examples/{file_accessor.rb → passing/file_accessor.rb} +18 -18
  32. data/examples/{file_accessor_spec.rb → passing/file_accessor_spec.rb} +37 -38
  33. data/examples/passing/filtered_formatter.rb +17 -0
  34. data/examples/passing/filtered_formatter_example.rb +31 -0
  35. data/examples/{greeter_spec.rb → passing/greeter_spec.rb} +1 -1
  36. data/examples/passing/helper_method_example.rb +12 -0
  37. data/examples/passing/implicit_docstrings_example.rb +16 -0
  38. data/examples/{io_processor.rb → passing/io_processor.rb} +8 -8
  39. data/examples/{io_processor_spec.rb → passing/io_processor_spec.rb} +2 -3
  40. data/examples/{mocking_example.rb → passing/mocking_example.rb} +0 -2
  41. data/examples/{multi_threaded_behaviour_runner.rb → passing/multi_threaded_example_group_runner.rb} +10 -9
  42. data/examples/passing/nested_classes_example.rb +35 -0
  43. data/examples/passing/options_example.rb +29 -0
  44. data/examples/passing/options_formatter.rb +20 -0
  45. data/examples/{partial_mock_example.rb → passing/partial_mock_example.rb} +2 -3
  46. data/examples/passing/pending_example.rb +18 -0
  47. data/examples/{predicate_example.rb → passing/predicate_example.rb} +1 -3
  48. data/examples/{shared_behaviours_example.rb → passing/shared_example_group_example.rb} +15 -11
  49. data/examples/passing/shared_stack_examples.rb +36 -0
  50. data/examples/passing/simple_matcher_example.rb +29 -0
  51. data/examples/{stack.rb → passing/stack.rb} +1 -1
  52. data/examples/{stack_spec.rb → passing/stack_spec.rb} +6 -40
  53. data/examples/passing/stack_spec_with_nested_example_groups.rb +66 -0
  54. data/examples/{stubbing_example.rb → passing/stubbing_example.rb} +1 -3
  55. data/examples/passing/yielding_example.rb +31 -0
  56. data/examples/ruby1.9.compatibility/access_to_constants_spec.rb +85 -0
  57. data/features/before_and_after_blocks/before_and_after_blocks.feature +167 -0
  58. data/features/command_line/line_number_option.feature +56 -0
  59. data/features/command_line/line_number_option_with_example_with_no_name.feature +22 -0
  60. data/features/example_groups/define_example_attribute.feature +41 -0
  61. data/features/example_groups/example_group_with_should_methods.feature +29 -0
  62. data/features/example_groups/implicit_docstrings.feature +59 -0
  63. data/features/example_groups/nested_groups.feature +32 -0
  64. data/features/expectations/customized_message.feature +54 -0
  65. data/features/expectations/expect_change.feature +65 -0
  66. data/features/expectations/expect_error.feature +44 -0
  67. data/features/extensions/custom_example_group.feature +19 -0
  68. data/features/formatters/custom_formatter.feature +30 -0
  69. data/features/formatters/nested_formatter.feature +32 -0
  70. data/features/interop/cucumber_stubs_dont_leak.feature +11 -0
  71. data/features/interop/examples_and_tests_together.feature +84 -0
  72. data/features/interop/rspec_output.feature +25 -0
  73. data/features/interop/test_but_not_test_unit.feature +26 -0
  74. data/features/interop/test_case_with_should_methods.feature +46 -0
  75. data/features/load_paths/add_lib_to_load_path.feature +20 -0
  76. data/features/load_paths/add_spec_to_load_path.feature +20 -0
  77. data/features/matchers/define_diffable_matcher.feature +26 -0
  78. data/features/matchers/define_matcher.feature +179 -0
  79. data/features/matchers/define_matcher_outside_rspec.feature +38 -0
  80. data/features/matchers/define_matcher_with_fluent_interface.feature +48 -0
  81. data/features/matchers/define_wrapped_matcher.feature +56 -0
  82. data/features/matchers/match_unless_raises.feature +60 -0
  83. data/features/matchers/match_unless_raises_unexpected_error.feature +39 -0
  84. data/features/mock_framework_integration/use_flexmock.feature +27 -0
  85. data/features/mock_framework_integration/use_mocha.feature +27 -0
  86. data/features/mock_framework_integration/use_rr.feature +27 -0
  87. data/features/mocks/block_local_expectations.feature +62 -0
  88. data/features/mocks/mix_stubs_and_mocks.feature +22 -0
  89. data/features/mocks/stub_implementation.feature +26 -0
  90. data/features/pending/pending_examples.feature +81 -0
  91. data/features/runner/specify_line_number.feature +32 -0
  92. data/features/spec_helper/spec_helper.feature +25 -0
  93. data/features/step_definitions/running_rspec_steps.rb +52 -0
  94. data/features/step_definitions/stubbing_steps.rb +16 -0
  95. data/features/subject/explicit_subject.feature +31 -0
  96. data/features/subject/implicit_subject.feature +43 -0
  97. data/features/support/env.rb +83 -0
  98. data/features/support/matchers/smart_match.rb +31 -0
  99. data/geminstaller.yml +29 -0
  100. data/init.rb +9 -0
  101. data/lib/autotest/discover.rb +3 -0
  102. data/lib/autotest/rspec.rb +54 -0
  103. data/lib/spec/adapters/mock_frameworks/flexmock.rb +24 -0
  104. data/{plugins → lib/spec/adapters}/mock_frameworks/mocha.rb +8 -4
  105. data/lib/spec/adapters/mock_frameworks/rr.rb +22 -0
  106. data/lib/spec/adapters/mock_frameworks/rspec.rb +21 -0
  107. data/lib/spec/autorun.rb +3 -0
  108. data/lib/spec/deprecation.rb +41 -0
  109. data/lib/spec/dsl/main.rb +93 -0
  110. data/lib/spec/dsl.rb +1 -10
  111. data/lib/spec/example/args_and_options.rb +27 -0
  112. data/lib/spec/example/before_and_after_hooks.rb +93 -0
  113. data/lib/spec/example/errors.rb +25 -0
  114. data/lib/spec/example/example_group.rb +10 -0
  115. data/lib/spec/example/example_group_factory.rb +82 -0
  116. data/lib/spec/example/example_group_hierarchy.rb +53 -0
  117. data/lib/spec/example/example_group_methods.rb +287 -0
  118. data/lib/spec/example/example_group_proxy.rb +61 -0
  119. data/lib/spec/example/example_matcher.rb +43 -0
  120. data/lib/spec/example/example_methods.rb +152 -0
  121. data/lib/spec/example/example_proxy.rb +41 -0
  122. data/lib/spec/example/module_reopening_fix.rb +43 -0
  123. data/lib/spec/example/pending.rb +18 -0
  124. data/lib/spec/example/predicate_matchers.rb +46 -0
  125. data/lib/spec/example/shared_example_group.rb +59 -0
  126. data/lib/spec/example/subject.rb +114 -0
  127. data/lib/spec/example.rb +164 -0
  128. data/lib/spec/expectations/errors.rb +7 -1
  129. data/lib/spec/expectations/extensions/kernel.rb +52 -0
  130. data/lib/spec/expectations/extensions.rb +1 -2
  131. data/lib/spec/expectations/fail_with.rb +45 -0
  132. data/lib/spec/expectations/handler.rb +37 -30
  133. data/lib/spec/expectations.rb +2 -23
  134. data/lib/spec/extensions/instance_exec.rb +31 -0
  135. data/lib/spec/interop/test/unit/autorunner.rb +6 -0
  136. data/lib/spec/interop/test/unit/testcase.rb +56 -0
  137. data/lib/spec/interop/test/unit/testresult.rb +6 -0
  138. data/lib/spec/interop/test/unit/testsuite_adapter.rb +36 -0
  139. data/lib/spec/interop/test/unit/ui/console/testrunner.rb +61 -0
  140. data/lib/spec/interop/test.rb +44 -0
  141. data/lib/spec/matchers/be.rb +183 -140
  142. data/lib/spec/matchers/be_close.rb +18 -23
  143. data/lib/spec/matchers/be_instance_of.rb +26 -0
  144. data/lib/spec/matchers/be_kind_of.rb +26 -0
  145. data/lib/spec/matchers/change.rb +72 -41
  146. data/lib/spec/matchers/compatibility.rb +14 -0
  147. data/lib/spec/matchers/dsl.rb +20 -0
  148. data/lib/spec/matchers/eql.rb +25 -26
  149. data/lib/spec/matchers/equal.rb +35 -25
  150. data/lib/spec/matchers/errors.rb +5 -0
  151. data/lib/spec/matchers/exist.rb +16 -0
  152. data/lib/spec/matchers/generated_descriptions.rb +36 -0
  153. data/lib/spec/matchers/has.rb +17 -26
  154. data/lib/spec/matchers/have.rb +36 -24
  155. data/lib/spec/matchers/include.rb +22 -48
  156. data/lib/spec/matchers/match.rb +11 -31
  157. data/lib/spec/matchers/match_array.rb +71 -0
  158. data/lib/spec/matchers/matcher.rb +132 -0
  159. data/lib/spec/matchers/method_missing.rb +9 -0
  160. data/lib/spec/matchers/operator_matcher.rb +55 -44
  161. data/lib/spec/matchers/pretty.rb +37 -0
  162. data/lib/spec/matchers/raise_exception.rb +131 -0
  163. data/lib/spec/matchers/respond_to.rb +35 -9
  164. data/lib/spec/matchers/satisfy.rb +2 -2
  165. data/lib/spec/matchers/simple_matcher.rb +134 -0
  166. data/lib/spec/matchers/throw_symbol.rb +56 -31
  167. data/lib/spec/matchers/wrap_expectation.rb +55 -0
  168. data/lib/spec/matchers.rb +104 -48
  169. data/lib/spec/mocks/argument_expectation.rb +28 -112
  170. data/lib/spec/mocks/argument_matchers.rb +237 -0
  171. data/lib/spec/mocks/error_generator.rb +20 -13
  172. data/lib/spec/mocks/errors.rb +1 -1
  173. data/lib/spec/mocks/example_methods.rb +69 -0
  174. data/lib/spec/mocks/extensions.rb +1 -0
  175. data/lib/spec/mocks/framework.rb +15 -0
  176. data/lib/spec/mocks/message_expectation.rb +206 -93
  177. data/lib/spec/mocks/methods.rb +66 -7
  178. data/lib/spec/mocks/mock.rb +53 -11
  179. data/lib/spec/mocks/proxy.rb +160 -55
  180. data/lib/spec/mocks/space.rb +2 -2
  181. data/lib/spec/mocks.rb +14 -23
  182. data/lib/spec/rake/spectask.rb +108 -53
  183. data/lib/spec/rake/verify_rcov.rb +4 -4
  184. data/lib/spec/ruby.rb +9 -0
  185. data/lib/spec/runner/backtrace_tweaker.rb +45 -23
  186. data/lib/spec/runner/class_and_arguments_parser.rb +14 -0
  187. data/lib/spec/runner/command_line.rb +7 -14
  188. data/lib/spec/runner/configuration.rb +202 -0
  189. data/lib/spec/runner/differs/default.rb +93 -0
  190. data/lib/spec/runner/differs/load-diff-lcs.rb +12 -0
  191. data/lib/spec/runner/drb_command_line.rb +18 -7
  192. data/lib/spec/runner/example_group_runner.rb +58 -0
  193. data/lib/spec/runner/extensions/kernel.rb +5 -46
  194. data/lib/spec/runner/formatter/base_formatter.rb +97 -26
  195. data/lib/spec/runner/formatter/base_text_formatter.rb +79 -39
  196. data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +25 -0
  197. data/lib/spec/runner/formatter/failing_examples_formatter.rb +6 -8
  198. data/lib/spec/runner/formatter/html_formatter.rb +101 -75
  199. data/lib/spec/runner/formatter/nested_text_formatter.rb +50 -0
  200. data/lib/spec/runner/formatter/no_op_method_missing.rb +21 -0
  201. data/lib/spec/runner/formatter/profile_formatter.rb +47 -0
  202. data/lib/spec/runner/formatter/progress_bar_formatter.rb +11 -8
  203. data/lib/spec/runner/formatter/silent_formatter.rb +10 -0
  204. data/lib/spec/runner/formatter/snippet_extractor.rb +2 -2
  205. data/lib/spec/runner/formatter/specdoc_formatter.rb +20 -15
  206. data/lib/spec/runner/formatter/text_mate_formatter.rb +16 -0
  207. data/lib/spec/runner/heckle_runner.rb +56 -56
  208. data/lib/spec/runner/{heckle_runner_win.rb → heckle_runner_unsupported.rb} +10 -10
  209. data/lib/spec/runner/line_number_query.rb +78 -0
  210. data/lib/spec/runner/option_parser.rb +147 -148
  211. data/lib/spec/runner/options.rb +343 -95
  212. data/lib/spec/runner/reporter.rb +117 -60
  213. data/lib/spec/runner.rb +39 -138
  214. data/lib/spec/stubs/cucumber.rb +5 -0
  215. data/lib/spec/test/unit.rb +10 -0
  216. data/lib/spec/version.rb +14 -22
  217. data/lib/spec.rb +5 -10
  218. data/resources/helpers/cmdline.rb +8 -0
  219. data/resources/rake/examples.rake +7 -0
  220. data/resources/rake/examples_with_rcov.rake +9 -0
  221. data/resources/rake/failing_examples_with_html.rake +9 -0
  222. data/resources/rake/verify_rcov.rake +7 -0
  223. data/spec/README.jruby +15 -0
  224. data/spec/autotest/autotest_helper.rb +8 -0
  225. data/spec/autotest/autotest_matchers.rb +38 -0
  226. data/spec/autotest/discover_spec.rb +8 -0
  227. data/spec/autotest/failed_results_re_spec.rb +31 -0
  228. data/spec/autotest/rspec_spec.rb +126 -0
  229. data/spec/ruby_forker.rb +13 -0
  230. data/spec/spec/dsl/main_spec.rb +103 -0
  231. data/spec/spec/example/example_group_class_definition_spec.rb +51 -0
  232. data/spec/spec/example/example_group_factory_spec.rb +180 -0
  233. data/spec/spec/example/example_group_methods_spec.rb +778 -0
  234. data/spec/spec/example/example_group_proxy_spec.rb +107 -0
  235. data/spec/spec/example/example_group_spec.rb +632 -0
  236. data/spec/spec/example/example_matcher_spec.rb +85 -0
  237. data/spec/spec/example/example_methods_spec.rb +162 -0
  238. data/spec/spec/example/example_proxy_spec.rb +57 -0
  239. data/spec/spec/example/helper_method_spec.rb +24 -0
  240. data/spec/spec/{dsl/behaviour_eval_spec.rb → example/nested_example_group_spec.rb} +25 -3
  241. data/spec/spec/example/pending_module_spec.rb +58 -0
  242. data/spec/spec/example/predicate_matcher_spec.rb +41 -0
  243. data/spec/spec/example/shared_example_group_spec.rb +257 -0
  244. data/spec/spec/example/subclassing_example_group_spec.rb +25 -0
  245. data/spec/spec/example/subject_spec.rb +110 -0
  246. data/spec/spec/expectations/differs/default_spec.rb +100 -13
  247. data/spec/spec/expectations/extensions/{object_spec.rb → kernel_spec.rb} +13 -14
  248. data/spec/spec/expectations/fail_with_spec.rb +42 -17
  249. data/spec/spec/expectations/handler_spec.rb +206 -0
  250. data/spec/spec/expectations/wrap_expectation_spec.rb +31 -0
  251. data/spec/spec/interop/test/unit/resources/spec_that_fails.rb +10 -0
  252. data/spec/spec/interop/test/unit/resources/spec_that_passes.rb +10 -0
  253. data/spec/spec/interop/test/unit/resources/spec_with_errors.rb +10 -0
  254. data/spec/spec/interop/test/unit/resources/spec_with_options_hash.rb +13 -0
  255. data/spec/spec/interop/test/unit/resources/test_case_that_fails.rb +10 -0
  256. data/spec/spec/interop/test/unit/resources/test_case_that_passes.rb +10 -0
  257. data/spec/spec/interop/test/unit/resources/test_case_with_errors.rb +10 -0
  258. data/spec/spec/interop/test/unit/resources/test_case_with_various_names.rb +22 -0
  259. data/spec/spec/interop/test/unit/resources/testsuite_adapter_spec_with_test_unit.rb +38 -0
  260. data/spec/spec/interop/test/unit/spec_spec.rb +48 -0
  261. data/spec/spec/interop/test/unit/test_unit_spec_helper.rb +18 -0
  262. data/spec/spec/interop/test/unit/testcase_spec.rb +50 -0
  263. data/spec/spec/interop/test/unit/testsuite_adapter_spec.rb +9 -0
  264. data/spec/spec/matchers/be_close_spec.rb +32 -21
  265. data/spec/spec/matchers/be_instance_of_spec.rb +36 -0
  266. data/spec/spec/matchers/be_kind_of_spec.rb +33 -0
  267. data/spec/spec/matchers/be_spec.rb +261 -10
  268. data/spec/spec/matchers/change_spec.rb +178 -61
  269. data/spec/spec/matchers/compatibility_spec.rb +28 -0
  270. data/spec/spec/matchers/description_generation_spec.rb +47 -46
  271. data/spec/spec/matchers/dsl_spec.rb +34 -0
  272. data/spec/spec/matchers/eql_spec.rb +14 -9
  273. data/spec/spec/matchers/equal_spec.rb +43 -14
  274. data/spec/spec/matchers/exist_spec.rb +41 -24
  275. data/spec/spec/matchers/has_spec.rb +154 -1
  276. data/spec/spec/matchers/have_spec.rb +311 -189
  277. data/spec/spec/matchers/include_spec.rb +45 -2
  278. data/spec/spec/matchers/match_array_spec.rb +115 -0
  279. data/spec/spec/matchers/match_spec.rb +25 -5
  280. data/spec/spec/matchers/matcher_spec.rb +289 -0
  281. data/spec/spec/matchers/matchers_spec.rb +2 -0
  282. data/spec/spec/matchers/operator_matcher_spec.rb +48 -15
  283. data/spec/spec/matchers/raise_exception_spec.rb +345 -0
  284. data/spec/spec/matchers/respond_to_spec.rb +78 -16
  285. data/spec/spec/matchers/satisfy_spec.rb +1 -1
  286. data/spec/spec/matchers/simple_matcher_spec.rb +100 -0
  287. data/spec/spec/matchers/throw_symbol_spec.rb +111 -41
  288. data/spec/spec/mocks/and_yield_spec.rb +117 -0
  289. data/spec/spec/mocks/any_number_of_times_spec.rb +9 -2
  290. data/spec/spec/mocks/argument_expectation_spec.rb +19 -15
  291. data/spec/spec/mocks/argument_matchers_spec.rb +19 -0
  292. data/spec/spec/mocks/at_least_spec.rb +2 -2
  293. data/spec/spec/mocks/at_most_spec.rb +3 -3
  294. data/spec/spec/mocks/bug_report_10260_spec.rb +1 -1
  295. data/spec/spec/mocks/bug_report_10263_spec.rb +27 -0
  296. data/spec/spec/mocks/bug_report_11545_spec.rb +32 -0
  297. data/spec/spec/mocks/bug_report_15719_spec.rb +30 -0
  298. data/spec/spec/mocks/bug_report_496_spec.rb +17 -0
  299. data/spec/spec/mocks/bug_report_600_spec.rb +22 -0
  300. data/spec/spec/mocks/bug_report_7611_spec.rb +2 -2
  301. data/spec/spec/mocks/bug_report_7805_spec.rb +2 -2
  302. data/spec/spec/mocks/bug_report_8165_spec.rb +4 -4
  303. data/spec/spec/mocks/bug_report_8302_spec.rb +2 -2
  304. data/spec/spec/mocks/bug_report_830_spec.rb +21 -0
  305. data/spec/spec/mocks/double_spec.rb +12 -0
  306. data/spec/spec/mocks/failing_argument_matchers_spec.rb +95 -0
  307. data/spec/spec/mocks/hash_including_matcher_spec.rb +90 -0
  308. data/spec/spec/mocks/hash_not_including_matcher_spec.rb +67 -0
  309. data/spec/spec/mocks/mock_ordering_spec.rb +15 -5
  310. data/spec/spec/mocks/mock_space_spec.rb +1 -1
  311. data/spec/spec/mocks/mock_spec.rb +346 -129
  312. data/spec/spec/mocks/multiple_return_value_spec.rb +9 -9
  313. data/spec/spec/mocks/nil_expectation_warning_spec.rb +53 -0
  314. data/spec/spec/mocks/null_object_mock_spec.rb +15 -1
  315. data/spec/spec/mocks/once_counts_spec.rb +2 -2
  316. data/spec/spec/mocks/options_hash_spec.rb +19 -17
  317. data/spec/spec/mocks/partial_mock_spec.rb +124 -12
  318. data/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +2 -2
  319. data/spec/spec/mocks/passing_argument_matchers_spec.rb +145 -0
  320. data/spec/spec/mocks/precise_counts_spec.rb +2 -2
  321. data/spec/spec/mocks/record_messages_spec.rb +2 -2
  322. data/spec/spec/mocks/stub_chain_spec.rb +42 -0
  323. data/spec/spec/mocks/stub_implementation_spec.rb +31 -0
  324. data/spec/spec/mocks/stub_spec.rb +147 -103
  325. data/spec/spec/mocks/stubbed_message_expectations_spec.rb +26 -0
  326. data/spec/spec/mocks/twice_counts_spec.rb +2 -2
  327. data/spec/spec/mocks/unstub_spec.rb +127 -0
  328. data/spec/spec/package/bin_spec_spec.rb +11 -7
  329. data/spec/spec/rake/spectask_spec.rb +150 -0
  330. data/spec/spec/runner/class_and_argument_parser_spec.rb +23 -0
  331. data/spec/spec/runner/command_line_spec.rb +158 -29
  332. data/spec/spec/runner/configuration_spec.rb +320 -0
  333. data/spec/spec/runner/drb_command_line_spec.rb +137 -72
  334. data/spec/spec/runner/empty_file.txt +0 -0
  335. data/spec/spec/runner/example_group_runner_spec.rb +26 -0
  336. data/spec/spec/runner/examples.txt +2 -0
  337. data/spec/spec/runner/failed.txt +3 -0
  338. data/spec/spec/runner/formatter/base_formatter_spec.rb +30 -0
  339. data/spec/spec/runner/formatter/base_text_formatter_spec.rb +113 -0
  340. data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +45 -0
  341. data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +17 -12
  342. data/spec/spec/runner/formatter/html_formatted-1.8.6-jruby.html +377 -0
  343. data/spec/spec/runner/formatter/html_formatted-1.8.6.html +377 -0
  344. data/spec/spec/runner/formatter/html_formatted-1.8.7.html +377 -0
  345. data/spec/spec/runner/formatter/html_formatted-1.9.1.html +377 -0
  346. data/spec/spec/runner/formatter/html_formatter_spec.rb +112 -52
  347. data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +329 -0
  348. data/spec/spec/runner/formatter/profile_formatter_spec.rb +70 -0
  349. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +87 -16
  350. data/spec/spec/runner/formatter/snippet_extractor_spec.rb +14 -7
  351. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +153 -50
  352. data/spec/spec/runner/formatter/text_mate_formatted-1.8.6-jruby.html +371 -0
  353. data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +371 -0
  354. data/spec/spec/runner/formatter/text_mate_formatted-1.8.7.html +371 -0
  355. data/spec/spec/runner/formatter/text_mate_formatted-1.9.1.html +371 -0
  356. data/spec/spec/runner/formatter/text_mate_formatter_spec.rb +106 -0
  357. data/spec/spec/runner/heckle_runner_spec.rb +32 -17
  358. data/spec/spec/runner/heckler_spec.rb +17 -11
  359. data/spec/spec/runner/line_number_query/line_number_query_fixture.rb +70 -0
  360. data/spec/spec/runner/line_number_query_spec.rb +129 -0
  361. data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +27 -21
  362. data/spec/spec/runner/option_parser_spec.rb +367 -164
  363. data/spec/spec/runner/options_spec.rb +506 -94
  364. data/spec/spec/runner/output_one_time_fixture.rb +7 -0
  365. data/spec/spec/runner/output_one_time_fixture_runner.rb +7 -0
  366. data/spec/spec/runner/output_one_time_spec.rb +15 -0
  367. data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +94 -27
  368. data/spec/spec/runner/reporter_spec.rb +212 -121
  369. data/spec/spec/runner/resources/a_bar.rb +0 -0
  370. data/spec/spec/runner/resources/a_foo.rb +0 -0
  371. data/spec/spec/runner/resources/a_spec.rb +1 -0
  372. data/spec/spec/runner/resources/custom_example_group_runner.rb +14 -0
  373. data/spec/spec/runner/resources/utf8_encoded.rb +8 -0
  374. data/spec/spec/runner/spec.opts +2 -0
  375. data/spec/spec/runner/spec_drb.opts +2 -0
  376. data/spec/spec/runner/spec_spaced.opts +2 -0
  377. data/spec/spec/runner_spec.rb +13 -0
  378. data/spec/spec.opts +6 -0
  379. data/spec/spec_helper.rb +87 -45
  380. data/spec/support/macros.rb +29 -0
  381. data/spec/{spec → support}/spec_classes.rb +26 -4
  382. metadata +461 -141
  383. data/CHANGES +0 -748
  384. data/EXAMPLES.rd +0 -108
  385. data/README +0 -70
  386. data/UPGRADE +0 -31
  387. data/bin/spec_translator +0 -8
  388. data/examples/auto_spec_description_example.rb +0 -19
  389. data/examples/before_and_after_example.rb +0 -39
  390. data/examples/behave_as_example.rb +0 -45
  391. data/examples/dynamic_spec.rb +0 -9
  392. data/examples/helper_method_example.rb +0 -11
  393. data/examples/legacy_spec.rb +0 -10
  394. data/examples/not_yet_implemented_spec.rb +0 -12
  395. data/examples/priority.txt +0 -1
  396. data/examples/spec_helper.rb +0 -1
  397. data/examples/test_case_adapter_example.rb +0 -26
  398. data/examples/test_case_spec.rb +0 -65
  399. data/lib/spec/dsl/behaviour.rb +0 -204
  400. data/lib/spec/dsl/behaviour_callbacks.rb +0 -77
  401. data/lib/spec/dsl/behaviour_eval.rb +0 -177
  402. data/lib/spec/dsl/behaviour_factory.rb +0 -42
  403. data/lib/spec/dsl/composite_proc_builder.rb +0 -28
  404. data/lib/spec/dsl/configuration.rb +0 -119
  405. data/lib/spec/dsl/description.rb +0 -46
  406. data/lib/spec/dsl/example.rb +0 -127
  407. data/lib/spec/dsl/example_matcher.rb +0 -28
  408. data/lib/spec/dsl/example_should_raise_handler.rb +0 -74
  409. data/lib/spec/expectations/differs/default.rb +0 -61
  410. data/lib/spec/expectations/extensions/object.rb +0 -66
  411. data/lib/spec/expectations/extensions/string_and_symbol.rb +0 -17
  412. data/lib/spec/extensions/object.rb +0 -6
  413. data/lib/spec/extensions.rb +0 -1
  414. data/lib/spec/matchers/raise_error.rb +0 -100
  415. data/lib/spec/mocks/argument_constraint_matchers.rb +0 -12
  416. data/lib/spec/mocks/spec_methods.rb +0 -30
  417. data/lib/spec/runner/behaviour_runner.rb +0 -102
  418. data/lib/spec/runner/extensions/object.rb +0 -32
  419. data/lib/spec/runner/formatter/failing_behaviours_formatter.rb +0 -25
  420. data/lib/spec/runner/formatter/rdoc_formatter.rb +0 -24
  421. data/lib/spec/runner/formatter.rb +0 -9
  422. data/lib/spec/runner/spec_parser.rb +0 -50
  423. data/lib/spec/test_case_adapter.rb +0 -10
  424. data/lib/spec/translator.rb +0 -106
  425. data/plugins/mock_frameworks/flexmock.rb +0 -27
  426. data/plugins/mock_frameworks/rspec.rb +0 -18
  427. data/spec/spec/dsl/behaviour_factory_spec.rb +0 -30
  428. data/spec/spec/dsl/behaviour_spec.rb +0 -604
  429. data/spec/spec/dsl/composite_proc_builder_spec.rb +0 -57
  430. data/spec/spec/dsl/configuration_spec.rb +0 -50
  431. data/spec/spec/dsl/description_spec.rb +0 -81
  432. data/spec/spec/dsl/example_class_spec.rb +0 -24
  433. data/spec/spec/dsl/example_instance_spec.rb +0 -162
  434. data/spec/spec/dsl/example_should_raise_spec.rb +0 -137
  435. data/spec/spec/dsl/predicate_matcher_spec.rb +0 -21
  436. data/spec/spec/dsl/shared_behaviour_spec.rb +0 -208
  437. data/spec/spec/matchers/handler_spec.rb +0 -88
  438. data/spec/spec/matchers/matcher_methods_spec.rb +0 -78
  439. data/spec/spec/matchers/raise_error_spec.rb +0 -147
  440. data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +0 -73
  441. data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +0 -92
  442. data/spec/spec/runner/behaviour_runner_spec.rb +0 -118
  443. data/spec/spec/runner/context_matching_spec.rb +0 -27
  444. data/spec/spec/runner/execution_context_spec.rb +0 -31
  445. data/spec/spec/runner/extensions/kernel_spec.rb +0 -36
  446. data/spec/spec/runner/formatter/failing_behaviours_formatter_spec.rb +0 -27
  447. data/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb +0 -21
  448. data/spec/spec/runner/formatter/progress_bar_formatter_failure_dump_spec.rb +0 -36
  449. data/spec/spec/runner/formatter/rdoc_formatter_dry_run_spec.rb +0 -19
  450. data/spec/spec/runner/formatter/rdoc_formatter_spec.rb +0 -46
  451. data/spec/spec/runner/formatter/specdoc_formatter_dry_run_spec.rb +0 -21
  452. data/spec/spec/runner/object_ext_spec.rb +0 -11
  453. data/spec/spec/runner/spec_matcher_spec.rb +0 -102
  454. data/spec/spec/runner/spec_parser_spec.rb +0 -93
  455. data/spec/spec/translator_spec.rb +0 -216
  456. /data/examples/{custom_expectation_matchers.rb → passing/custom_matchers.rb} +0 -0
@@ -4,77 +4,142 @@ module Spec
4
4
  DEFAULT_OPTIONS = {
5
5
  :null_object => false,
6
6
  }
7
+
8
+ @@warn_about_expectations_on_nil = true
9
+
10
+ def self.allow_message_expectations_on_nil
11
+ @@warn_about_expectations_on_nil = false
12
+
13
+ # ensure nil.rspec_verify is called even if an expectation is not set in the example
14
+ # otherwise the allowance would effect subsequent examples
15
+ $rspec_mocks.add(nil) unless $rspec_mocks.nil?
16
+ end
7
17
 
8
- def initialize(target, name, options={})
18
+ def initialize(target, name=nil, options={})
9
19
  @target = target
10
20
  @name = name
11
- @error_generator = ErrorGenerator.new target, name
21
+ @error_generator = ErrorGenerator.new target, name, options
12
22
  @expectation_ordering = OrderGroup.new @error_generator
13
23
  @expectations = []
14
24
  @messages_received = []
15
25
  @stubs = []
16
26
  @proxied_methods = []
17
27
  @options = options ? DEFAULT_OPTIONS.dup.merge(options) : DEFAULT_OPTIONS
28
+ @already_proxied_respond_to = false
18
29
  end
19
30
 
20
31
  def null_object?
21
32
  @options[:null_object]
22
33
  end
34
+
35
+ def as_null_object
36
+ @options[:null_object] = true
37
+ @target
38
+ end
23
39
 
24
- def add_message_expectation(expected_from, sym, opts={}, &block)
25
- __add expected_from, sym, block
26
- @expectations << MessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, block_given? ? block : nil, 1, opts)
40
+ def add_message_expectation(expected_from, sym, opts={}, &block)
41
+ __add sym
42
+ warn_if_nil_class sym
43
+ @expectations << build_expectation(expected_from, sym, opts, &block)
27
44
  @expectations.last
28
45
  end
29
46
 
47
+ def build_expectation(expected_from, sym, opts, &block)
48
+ if stub = find_matching_method_stub(sym)
49
+ stub.build_child(expected_from, block_given?? block : nil, 1, opts)
50
+ else
51
+ MessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, block_given? ? block : nil, 1, opts)
52
+ end
53
+ end
54
+
30
55
  def add_negative_message_expectation(expected_from, sym, &block)
31
- __add expected_from, sym, block
56
+ __add sym
57
+ warn_if_nil_class sym
32
58
  @expectations << NegativeMessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, block_given? ? block : nil)
33
59
  @expectations.last
34
60
  end
35
61
 
36
- def add_stub(expected_from, sym)
37
- __add expected_from, sym, nil
38
- @stubs.unshift MethodStub.new(@error_generator, @expectation_ordering, expected_from, sym, nil)
62
+ def add_stub(expected_from, sym, opts={}, &implementation)
63
+ __add sym
64
+ @stubs.unshift MessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, nil, :any, opts, &implementation)
39
65
  @stubs.first
40
66
  end
41
67
 
42
- def verify #:nodoc:
43
- begin
44
- verify_expectations
45
- ensure
46
- reset
68
+ def remove_stub(message)
69
+ message = message.to_sym
70
+ if stub_to_remove = @stubs.detect { |s| s.matches_name?(message) }
71
+ reset_proxied_method(message)
72
+ @stubs.delete(stub_to_remove)
73
+ else
74
+ raise MockExpectationError, "The method `#{message}` was not stubbed or was already unstubbed"
47
75
  end
48
76
  end
77
+
78
+ def verify #:nodoc:
79
+ verify_expectations
80
+ ensure
81
+ reset
82
+ end
49
83
 
50
84
  def reset
51
85
  clear_expectations
52
86
  clear_stubs
53
87
  reset_proxied_methods
54
88
  clear_proxied_methods
89
+ reset_nil_expectations_warning
55
90
  end
56
91
 
57
92
  def received_message?(sym, *args, &block)
58
- return true if @messages_received.find {|array| array == [sym, args, block]}
59
- return false
93
+ @messages_received.any? {|array| array == [sym, args, block]}
60
94
  end
61
95
 
62
96
  def has_negative_expectation?(sym)
63
- @expectations.detect {|expectation| expectation.negative_expectation_for?(sym)}
97
+ @expectations.any? {|expectation| expectation.negative_expectation_for?(sym)}
98
+ end
99
+
100
+ def record_message_received(sym, args, block)
101
+ @messages_received << [sym, args, block]
64
102
  end
65
103
 
66
104
  def message_received(sym, *args, &block)
67
- if expectation = find_matching_expectation(sym, *args)
68
- expectation.invoke(args, block)
69
- elsif stub = find_matching_method_stub(sym)
70
- stub.invoke([], block)
105
+ expectation = find_matching_expectation(sym, *args)
106
+ stub = find_matching_method_stub(sym, *args)
107
+
108
+ if ok_to_invoke_stub?(stub, expectation)
109
+ record_stub(stub, sym, args, &block)
110
+ elsif expectation
111
+ invoke_expectation(expectation, *args, &block)
71
112
  elsif expectation = find_almost_matching_expectation(sym, *args)
72
- raise_unexpected_message_args_error(expectation, *args) unless has_negative_expectation?(sym) unless null_object?
113
+ record_almost_matching_expectation(expectation, sym, *args, &block)
114
+ elsif @target.is_a?(Class)
115
+ @target.superclass.send(sym, *args, &block)
73
116
  else
74
- @target.send :method_missing, sym, *args, &block
117
+ @target.__send__ :method_missing, sym, *args, &block
118
+ end
119
+ end
120
+
121
+ def record_stub(stub, sym, args, &block)
122
+ almost_matching_expectation(sym, *args) do |e|
123
+ e.advise(args, block)
124
+ end
125
+ stub.invoke(*args, &block)
126
+ end
127
+
128
+ def invoke_expectation(expectation, *args, &block)
129
+ expectation.invoke(*args, &block)
130
+ end
131
+
132
+ def record_almost_matching_expectation(expectation, sym, *args, &block)
133
+ expectation.advise(args, block)
134
+ unless (null_object? or has_negative_expectation?(sym))
135
+ raise_unexpected_message_args_error(expectation, *args)
75
136
  end
76
137
  end
77
138
 
139
+ def ok_to_invoke_stub?(stub, expectation)
140
+ stub && (!expectation || expectation.called_max_times?)
141
+ end
142
+
78
143
  def raise_unexpected_message_args_error(expectation, *args)
79
144
  @error_generator.raise_unexpected_message_args_error expectation, *args
80
145
  end
@@ -83,34 +148,62 @@ module Spec
83
148
  @error_generator.raise_unexpected_message_error sym, *args
84
149
  end
85
150
 
151
+ def find_matching_method_stub(sym, *args)
152
+ @stubs.find {|stub| stub.matches(sym, args)}
153
+ end
154
+
86
155
  private
87
156
 
88
- def __add(expected_from, sym, block)
89
- $rspec_mocks.add(@target)
157
+ def __add(sym)
158
+ $rspec_mocks.add(@target) unless $rspec_mocks.nil?
90
159
  define_expected_method(sym)
91
160
  end
92
161
 
93
- def define_expected_method(sym)
94
- if target_responds_to?(sym) && !@proxied_methods.include?(sym)
95
- @proxied_methods << sym
96
- metaclass.__send__(:alias_method, munge(sym), sym)
162
+ def warn_if_nil_class(sym)
163
+ if proxy_for_nil_class? & @@warn_about_expectations_on_nil
164
+ Kernel.warn("An expectation of :#{sym} was set on nil. Called from #{caller[2]}. Use allow_message_expectations_on_nil to disable warnings.")
97
165
  end
98
-
99
- metaclass_eval(<<-EOF, __FILE__, __LINE__)
100
- def #{sym}(*args, &block)
101
- __mock_proxy.message_received :#{sym}, *args, &block
166
+ end
167
+
168
+ def define_expected_method(sym)
169
+ unless @proxied_methods.include?(sym)
170
+ visibility_string = "#{visibility(sym)} :#{sym}"
171
+ if target_responds_to?(sym)
172
+ munged_sym = munge(sym)
173
+ target_metaclass.instance_eval do
174
+ alias_method munged_sym, sym if method_defined?(sym)
175
+ end
176
+ @proxied_methods << sym
102
177
  end
103
- EOF
178
+ target_metaclass.class_eval(<<-EOF, __FILE__, __LINE__)
179
+ def #{sym}(*args, &block)
180
+ __mock_proxy.message_received :#{sym}, *args, &block
181
+ end
182
+ #{visibility_string}
183
+ EOF
184
+ end
104
185
  end
105
186
 
106
187
  def target_responds_to?(sym)
107
- return @target.send(munge(:respond_to?),sym) if @already_proxied_respond_to
188
+ return @target.__send__(munge(:respond_to?),sym) if @already_proxied_respond_to
108
189
  return @already_proxied_respond_to = true if sym == :respond_to?
109
- return @target.respond_to?(sym)
190
+ return @target.respond_to?(sym, true)
191
+ end
192
+
193
+ def visibility(sym)
194
+ if Mock === @target
195
+ 'public'
196
+ elsif target_metaclass.private_method_defined?(sym)
197
+ 'private'
198
+ elsif target_metaclass.protected_method_defined?(sym)
199
+ 'protected'
200
+ else
201
+ 'public'
202
+ end
110
203
  end
111
204
 
112
205
  def munge(sym)
113
- "proxied_by_rspec__#{sym.to_s}".to_sym
206
+ "proxied_by_rspec__#{sym}"
114
207
  end
115
208
 
116
209
  def clear_expectations
@@ -125,39 +218,51 @@ module Spec
125
218
  @proxied_methods.clear
126
219
  end
127
220
 
128
- def metaclass_eval(str, filename, lineno)
129
- metaclass.class_eval(str, filename, lineno)
130
- end
131
-
132
- def metaclass
133
- (class << @target; self; end)
221
+ def target_metaclass
222
+ class << @target; self; end
134
223
  end
135
224
 
136
225
  def verify_expectations
137
- @expectations.each do |expectation|
138
- expectation.verify_messages_received
139
- end
226
+ @expectations.map {|e| e.verify_messages_received}
140
227
  end
141
228
 
142
229
  def reset_proxied_methods
143
- @proxied_methods.each do |sym|
144
- metaclass.__send__(:alias_method, sym, munge(sym))
145
- metaclass.__send__(:undef_method, munge(sym))
230
+ @proxied_methods.map {|sym| reset_proxied_method(sym)}
231
+ end
232
+
233
+ def reset_proxied_method(sym)
234
+ munged_sym = munge(sym)
235
+ target_metaclass.instance_eval do
236
+ remove_method sym
237
+ if method_defined?(munged_sym)
238
+ alias_method sym, munged_sym
239
+ remove_method munged_sym
240
+ end
146
241
  end
147
242
  end
243
+
244
+ def proxy_for_nil_class?
245
+ @target.nil?
246
+ end
247
+
248
+ def reset_nil_expectations_warning
249
+ @@warn_about_expectations_on_nil = true if proxy_for_nil_class?
250
+ end
148
251
 
149
252
  def find_matching_expectation(sym, *args)
253
+ @expectations.find {|expectation| expectation.matches(sym, args) && !expectation.called_max_times?} ||
150
254
  @expectations.find {|expectation| expectation.matches(sym, args)}
151
255
  end
152
256
 
153
- def find_almost_matching_expectation(sym, *args)
154
- @expectations.find {|expectation| expectation.matches_name_but_not_args(sym, args)}
257
+ def almost_matching_expectation(sym, *args, &block)
258
+ if e = find_almost_matching_expectation(sym, *args)
259
+ yield e
260
+ end
155
261
  end
156
262
 
157
- def find_matching_method_stub(sym)
158
- @stubs.find {|stub| stub.matches(sym, [])}
263
+ def find_almost_matching_expectation(sym, *args)
264
+ @expectations.find {|expectation| expectation.matches_name_but_not_args(sym, args)}
159
265
  end
160
-
161
266
  end
162
267
  end
163
- end
268
+ end
@@ -2,7 +2,7 @@ module Spec
2
2
  module Mocks
3
3
  class Space
4
4
  def add(obj)
5
- mocks << obj unless mocks.include?(obj)
5
+ mocks << obj unless mocks.detect {|m| m.equal? obj}
6
6
  end
7
7
 
8
8
  def verify_all
@@ -25,4 +25,4 @@ module Spec
25
25
  end
26
26
  end
27
27
  end
28
- end
28
+ end
data/lib/spec/mocks.rb CHANGED
@@ -1,16 +1,5 @@
1
- require 'spec/mocks/methods'
2
- require 'spec/mocks/argument_constraint_matchers'
3
- require 'spec/mocks/spec_methods'
4
- require 'spec/mocks/proxy'
5
- require 'spec/mocks/mock'
6
- require 'spec/mocks/argument_expectation'
7
- require 'spec/mocks/message_expectation'
8
- require 'spec/mocks/order_group'
9
- require 'spec/mocks/errors'
10
- require 'spec/mocks/error_generator'
1
+ require 'spec/mocks/framework'
11
2
  require 'spec/mocks/extensions/object'
12
- require 'spec/mocks/space'
13
-
14
3
 
15
4
  module Spec
16
5
  # == Mocks and Stubs
@@ -116,11 +105,11 @@ module Spec
116
105
  # my_mock.should_receive(:sym).with(*args)
117
106
  # my_mock.should_not_receive(:sym).with(*args)
118
107
  #
119
- # == Argument Constraints using Expression Matchers
108
+ # == Argument Matchers
120
109
  #
121
110
  # Arguments that are passed to #with are compared with actual arguments received
122
111
  # using == by default. In cases in which you want to specify things about the arguments
123
- # rather than the arguments themselves, you can use any of the Expression Matchers.
112
+ # rather than the arguments themselves, you can use any of RSpec's Expression Matchers.
124
113
  # They don't all make syntactic sense (they were primarily designed for use with
125
114
  # Spec::Expectations), but you are free to create your own custom Spec::Matchers.
126
115
  #
@@ -129,13 +118,12 @@ module Spec
129
118
  # In addition, Spec::Mocks adds some keyword Symbols that you can use to
130
119
  # specify certain kinds of arguments:
131
120
  #
132
- # my_mock.should_receive(:sym).with(:no_args)
133
- # my_mock.should_receive(:sym).with(:any_args)
134
- # my_mock.should_receive(:sym).with(1, :numeric, "b") #2nd argument can any type of Numeric
135
- # my_mock.should_receive(:sym).with(1, :boolean, "b") #2nd argument can true or false
136
- # my_mock.should_receive(:sym).with(1, :string, "b") #2nd argument can be any String
121
+ # my_mock.should_receive(:sym).with(no_args())
122
+ # my_mock.should_receive(:sym).with(any_args())
123
+ # my_mock.should_receive(:sym).with(1, kind_of(Numeric), "b") #2nd argument can any kind of Numeric
124
+ # my_mock.should_receive(:sym).with(1, boolean(), "b") #2nd argument can true or false
137
125
  # my_mock.should_receive(:sym).with(1, /abc/, "b") #2nd argument can be any String matching the submitted Regexp
138
- # my_mock.should_receive(:sym).with(1, :anything, "b") #2nd argument can be anything at all
126
+ # my_mock.should_receive(:sym).with(1, anything(), "b") #2nd argument can be anything at all
139
127
  # my_mock.should_receive(:sym).with(1, ducktype(:abs, :div), "b")
140
128
  # #2nd argument can be object that responds to #abs and #div
141
129
  #
@@ -171,7 +159,9 @@ module Spec
171
159
  # #error can be an instantiated object or a class
172
160
  # #if it is a class, it must be instantiable with no args
173
161
  # my_mock.should_receive(:sym).and_throw(:sym)
174
- # my_mock.should_receive(:sym).and_yield([array,of,values,to,yield])
162
+ # my_mock.should_receive(:sym).and_yield(values,to,yield)
163
+ # my_mock.should_receive(:sym).and_yield(values,to,yield).and_yield(some,other,values,this,time)
164
+ # # for methods that yield to a block multiple times
175
165
  #
176
166
  # Any of these responses can be applied to a stub as well, but stubs do
177
167
  # not support any qualifiers about the message received (i.e. you can't specify arguments
@@ -181,7 +171,8 @@ module Spec
181
171
  # my_mock.stub!(:sym).and_return(value1, value2, value3)
182
172
  # my_mock.stub!(:sym).and_raise(error)
183
173
  # my_mock.stub!(:sym).and_throw(:sym)
184
- # my_mock.stub!(:sym).and_yield([array,of,values,to,yield])
174
+ # my_mock.stub!(:sym).and_yield(values,to,yield)
175
+ # my_mock.stub!(:sym).and_yield(values,to,yield).and_yield(some,other,values,this,time)
185
176
  #
186
177
  # == Arbitrary Handling
187
178
  #
@@ -206,4 +197,4 @@ module Spec
206
197
  # my_mock.should_receive(:<<).with("illegal value").once.and_raise(ArgumentError)
207
198
  module Mocks
208
199
  end
209
- end
200
+ end
@@ -8,10 +8,10 @@ require 'rake/tasklib'
8
8
  module Spec
9
9
  module Rake
10
10
 
11
- # A Rake task that runs a set of RSpec contexts.
11
+ # A Rake task that runs a set of specs.
12
12
  #
13
13
  # Example:
14
- #
14
+ #
15
15
  # Spec::Rake::SpecTask.new do |t|
16
16
  # t.warning = true
17
17
  # t.rcov = true
@@ -21,7 +21,46 @@ module Spec
21
21
  #
22
22
  # rake spec
23
23
  #
24
+ # If rake is invoked with a "SPEC=filename" command line option,
25
+ # then the list of spec files will be overridden to include only the
26
+ # filename specified on the command line. This provides an easy way
27
+ # to run just one spec.
28
+ #
29
+ # If rake is invoked with a "SPEC_OPTS=options" command line option,
30
+ # then the given options will override the value of the +spec_opts+
31
+ # attribute.
32
+ #
33
+ # If rake is invoked with a "RCOV_OPTS=options" command line option,
34
+ # then the given options will override the value of the +rcov_opts+
35
+ # attribute.
36
+ #
37
+ # Examples:
38
+ #
39
+ # rake spec # run specs normally
40
+ # rake spec SPEC=just_one_file.rb # run just one spec file.
41
+ # rake spec SPEC_OPTS="--diff" # enable diffing
42
+ # rake spec RCOV_OPTS="--aggregate myfile.txt" # see rcov --help for details
43
+ #
44
+ # Each attribute of this task may be a proc. This allows for lazy evaluation,
45
+ # which is sometimes handy if you want to defer the evaluation of an attribute value
46
+ # until the task is run (as opposed to when it is defined).
47
+ #
48
+ # This task can also be used to run existing Test::Unit tests and get RSpec
49
+ # output, for example like this:
50
+ #
51
+ # require 'spec/rake/spectask'
52
+ # Spec::Rake::SpecTask.new do |t|
53
+ # t.ruby_opts = ['-rtest/unit']
54
+ # t.spec_files = FileList['test/**/*_test.rb']
55
+ # end
56
+ #
24
57
  class SpecTask < ::Rake::TaskLib
58
+ def self.attr_accessor(*names)
59
+ super(*names)
60
+ names.each do |name|
61
+ module_eval "def #{name}() evaluate(@#{name}) end" # Allows use of procs
62
+ end
63
+ end
25
64
 
26
65
  # Name of spec task. (default is :spec)
27
66
  attr_accessor :name
@@ -35,21 +74,20 @@ module Spec
35
74
  attr_accessor :warning
36
75
 
37
76
  # Glob pattern to match spec files. (default is 'spec/**/*_spec.rb')
77
+ # Setting the SPEC environment variable overrides this.
38
78
  attr_accessor :pattern
39
79
 
40
80
  # Array of commandline options to pass to RSpec. Defaults to [].
81
+ # Setting the SPEC_OPTS environment variable overrides this.
41
82
  attr_accessor :spec_opts
42
83
 
43
- # Where RSpec's output is written. Defaults to STDOUT.
44
- # DEPRECATED. Use --format FORMAT:WHERE in spec_opts.
45
- attr_accessor :out
46
-
47
84
  # Whether or not to use RCov (default is false)
48
85
  # See http://eigenclass.org/hiki.rb?rcov
49
86
  attr_accessor :rcov
50
-
87
+
51
88
  # Array of commandline options to pass to RCov. Defaults to ['--exclude', 'lib\/spec,bin\/spec'].
52
89
  # Ignored if rcov=false
90
+ # Setting the RCOV_OPTS environment variable overrides this.
53
91
  attr_accessor :rcov_opts
54
92
 
55
93
  # Directory where the RCov report is written. Defaults to "coverage"
@@ -63,82 +101,89 @@ module Spec
63
101
  # Defaults to true.
64
102
  attr_accessor :fail_on_error
65
103
 
66
- # A message to print to stdout when there are failures.
104
+ # A message to print to stderr when there are failures.
67
105
  attr_accessor :failure_message
68
106
 
107
+ # Where RSpec's output is written. Defaults to $stdout.
108
+ # DEPRECATED. Use --format FORMAT:WHERE in spec_opts.
109
+ attr_accessor :out
110
+
69
111
  # Explicitly define the list of spec files to be included in a
70
- # spec. +list+ is expected to be an array of file names (a
112
+ # spec. +spec_files+ is expected to be an array of file names (a
71
113
  # FileList is acceptable). If both +pattern+ and +spec_files+ are
72
114
  # used, then the list of spec files is the union of the two.
73
- def spec_files=(list)
74
- @spec_files = list
75
- end
115
+ # Setting the SPEC environment variable overrides this.
116
+ attr_accessor :spec_files
117
+
118
+ # Use verbose output. If this is set to true, the task will print
119
+ # the executed spec command to stdout. Defaults to false.
120
+ attr_accessor :verbose
76
121
 
77
- # Create a specing task.
122
+ # Explicitly define the path to the ruby binary, or its proxy (e.g. multiruby)
123
+ attr_accessor :ruby_cmd
124
+
125
+ # Defines a new task, using the name +name+.
78
126
  def initialize(name=:spec)
79
127
  @name = name
80
- @libs = [File.expand_path(File.dirname(__FILE__) + '/../../../lib')]
128
+ @libs = ['lib']
81
129
  @pattern = nil
82
130
  @spec_files = nil
83
131
  @spec_opts = []
84
132
  @warning = false
85
133
  @ruby_opts = []
86
- @out = nil
87
134
  @fail_on_error = true
88
135
  @rcov = false
89
136
  @rcov_opts = ['--exclude', 'lib\/spec,bin\/spec,config\/boot.rb']
90
137
  @rcov_dir = "coverage"
91
138
 
92
139
  yield self if block_given?
93
- @pattern = 'spec/**/*_spec.rb' if @pattern.nil? && @spec_files.nil?
140
+ @pattern = 'spec/**/*_spec.rb' if pattern.nil? && spec_files.nil?
94
141
  define
95
142
  end
96
143
 
97
- def define
98
- spec_script = File.expand_path(File.dirname(__FILE__) + '/../../../bin/spec')
144
+ def define # :nodoc:
145
+ spec_script = File.expand_path(File.join(File.dirname(__FILE__),"..","..","..","bin","spec"))
99
146
 
100
- lib_path = @libs.join(File::PATH_SEPARATOR)
147
+ lib_path = libs.join(File::PATH_SEPARATOR)
101
148
  actual_name = Hash === name ? name.keys.first : name
102
149
  unless ::Rake.application.last_comment
103
- desc "Run RSpec for #{actual_name}" + (@rcov ? " using RCov" : "")
150
+ desc "Run specs" + (rcov ? " using RCov" : "")
104
151
  end
105
- task @name do
106
- RakeFileUtils.verbose(@verbose) do
152
+ task name do
153
+ RakeFileUtils.verbose(verbose) do
107
154
  unless spec_file_list.empty?
108
- # ruby [ruby_opts] -Ilib -S rcov [rcov_opts] bin/spec -- [spec_opts] examples
155
+ # ruby [ruby_opts] -Ilib -S rcov [rcov_opts] bin/spec -- examples [spec_opts]
109
156
  # or
110
- # ruby [ruby_opts] -Ilib bin/spec [spec_opts] examples
111
- cmd = "ruby "
112
-
113
- ruby_opts = @ruby_opts.clone
114
- ruby_opts << "-I\"#{lib_path}\""
115
- ruby_opts << "-S rcov" if @rcov
116
- ruby_opts << "-w" if @warning
117
- cmd << ruby_opts.join(" ")
118
- cmd << " "
119
- cmd << rcov_option_list
120
- cmd << %[ -o "#{@rcov_dir}" ] if @rcov
121
- cmd << %Q|"#{spec_script}"|
122
- cmd << " "
123
- cmd << "-- " if @rcov
124
- cmd << spec_file_list.collect { |fn| %["#{fn}"] }.join(' ')
125
- cmd << " "
126
- cmd << spec_option_list
127
- cmd << " "
128
- cmd << %Q| > "#{@out}"| if @out
129
-
157
+ # ruby [ruby_opts] -Ilib bin/spec examples [spec_opts]
158
+ cmd_parts = [ruby_cmd || RUBY]
159
+ cmd_parts += ruby_opts
160
+ cmd_parts << %[-I"#{lib_path}"]
161
+ cmd_parts << "-S rcov" if rcov
162
+ cmd_parts << "-w" if warning
163
+ cmd_parts << rcov_option_list
164
+ cmd_parts << %[-o "#{rcov_dir}"] if rcov
165
+ cmd_parts << %["#{spec_script}"]
166
+ cmd_parts << "--" if rcov
167
+ cmd_parts += spec_file_list.collect { |fn| %["#{fn}"] }
168
+ cmd_parts << spec_option_list
169
+ if out
170
+ cmd_parts << %[> "#{out}"]
171
+ STDERR.puts "The Spec::Rake::SpecTask#out attribute is DEPRECATED and will be removed in a future version. Use --format FORMAT:WHERE instead."
172
+ end
173
+ cmd = cmd_parts.join(" ")
174
+ puts cmd if verbose
130
175
  unless system(cmd)
131
- puts @failure_message if @failure_message
132
- raise("Command #{cmd} failed") if @fail_on_error
176
+ STDERR.puts failure_message if failure_message
177
+ raise("Command #{cmd} failed") if fail_on_error
133
178
  end
134
179
  end
135
180
  end
136
181
  end
137
182
 
138
- if @rcov
183
+ if rcov
139
184
  desc "Remove rcov products for #{actual_name}"
140
185
  task paste("clobber_", actual_name) do
141
- rm_r @rcov_dir rescue nil
186
+ rm_r rcov_dir rescue nil
142
187
  end
143
188
 
144
189
  clobber_task = paste("clobber_", actual_name)
@@ -150,12 +195,23 @@ module Spec
150
195
  end
151
196
 
152
197
  def rcov_option_list # :nodoc:
153
- return "" unless @rcov
154
- ENV['RCOVOPTS'] || @rcov_opts.join(" ") || ""
198
+ if rcov
199
+ ENV['RCOV_OPTS'] || rcov_opts.join(" ") || ""
200
+ else
201
+ ""
202
+ end
155
203
  end
156
204
 
157
205
  def spec_option_list # :nodoc:
158
- ENV['RSPECOPTS'] || @spec_opts.join(" ") || ""
206
+ STDERR.puts "RSPECOPTS is DEPRECATED and will be removed in a future version. Use SPEC_OPTS instead." if ENV['RSPECOPTS']
207
+ ENV['SPEC_OPTS'] || ENV['RSPECOPTS'] || spec_opts.join(" ") || ""
208
+ end
209
+
210
+ def evaluate(o) # :nodoc:
211
+ case o
212
+ when Proc then o.call
213
+ else o
214
+ end
159
215
  end
160
216
 
161
217
  def spec_file_list # :nodoc:
@@ -163,8 +219,8 @@ module Spec
163
219
  FileList[ ENV['SPEC'] ]
164
220
  else
165
221
  result = []
166
- result += @spec_files.to_a if @spec_files
167
- result += FileList[ @pattern ].to_a if @pattern
222
+ result += spec_files.to_a if spec_files
223
+ result += FileList[ pattern ].to_a if pattern
168
224
  FileList[result]
169
225
  end
170
226
  end
@@ -172,4 +228,3 @@ module Spec
172
228
  end
173
229
  end
174
230
  end
175
-