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
@@ -3,159 +3,269 @@ module Spec
3
3
 
4
4
  class BaseExpectation
5
5
  attr_reader :sym
6
-
7
- def initialize(error_generator, expectation_ordering, expected_from, sym, method_block, expected_received_count=1, opts={})
6
+ attr_writer :expected_received_count, :method_block, :expected_from
7
+ protected :expected_received_count=, :method_block=, :expected_from=
8
+ attr_accessor :error_generator
9
+ protected :error_generator, :error_generator=
10
+
11
+ def initialize(error_generator, expectation_ordering, expected_from, sym, method_block, expected_received_count=1, opts={}, &implementation)
8
12
  @error_generator = error_generator
9
13
  @error_generator.opts = opts
10
14
  @expected_from = expected_from
11
15
  @sym = sym
12
16
  @method_block = method_block
13
- @return_block = lambda {}
14
- @received_count = 0
17
+ @actual_received_count = 0
15
18
  @expected_received_count = expected_received_count
16
- @args_expectation = ArgumentExpectation.new([:any_args])
19
+ @args_expectation = ArgumentExpectation.new([ArgumentMatchers::AnyArgsMatcher.new])
17
20
  @consecutive = false
18
21
  @exception_to_raise = nil
19
22
  @symbol_to_throw = nil
20
23
  @order_group = expectation_ordering
21
24
  @at_least = nil
22
25
  @at_most = nil
23
- @args_to_yield = nil
26
+ @args_to_yield = []
27
+ @failed_fast = nil
28
+ @args_to_yield_were_cloned = false
29
+ @return_block = implementation
30
+ @eval_context = nil
31
+ end
32
+
33
+ def build_child(expected_from, method_block, expected_received_count, opts={})
34
+ child = clone
35
+ child.expected_from = expected_from
36
+ child.method_block = method_block
37
+ child.expected_received_count = expected_received_count
38
+ child.clear_actual_received_count!
39
+ new_gen = error_generator.clone
40
+ new_gen.opts = opts
41
+ child.error_generator = new_gen
42
+ child.clone_args_to_yield @args_to_yield
43
+ child
24
44
  end
25
-
45
+
26
46
  def expected_args
27
47
  @args_expectation.args
28
48
  end
29
49
 
30
50
  def and_return(*values, &return_block)
31
51
  Kernel::raise AmbiguousReturnError unless @method_block.nil?
32
- if values.size == 0
33
- value = nil
34
- elsif values.size == 1
35
- value = values[0]
52
+ case values.size
53
+ when 0 then value = nil
54
+ when 1 then value = values[0]
36
55
  else
37
56
  value = values
38
57
  @consecutive = true
39
- @expected_received_count = values.size if @expected_received_count != :any &&
58
+ @expected_received_count = values.size if !ignoring_args? &&
40
59
  @expected_received_count < values.size
41
60
  end
42
61
  @return_block = block_given? ? return_block : lambda { value }
43
62
  end
44
-
63
+
64
+ # :call-seq:
65
+ # and_raise()
66
+ # and_raise(Exception) #any exception class
67
+ # and_raise(exception) #any exception object
68
+ #
69
+ # == Warning
70
+ #
71
+ # When you pass an exception class, the MessageExpectation will
72
+ # raise an instance of it, creating it with +new+. If the exception
73
+ # class initializer requires any parameters, you must pass in an
74
+ # instance and not the class.
45
75
  def and_raise(exception=Exception)
46
76
  @exception_to_raise = exception
47
77
  end
48
-
78
+
49
79
  def and_throw(symbol)
50
80
  @symbol_to_throw = symbol
51
81
  end
52
-
53
- def and_yield(*args)
54
- @args_to_yield = args
82
+
83
+ def and_yield(*args, &block)
84
+ if @args_to_yield_were_cloned
85
+ @args_to_yield.clear
86
+ @args_to_yield_were_cloned = false
87
+ end
88
+
89
+ if block
90
+ require 'spec/extensions/instance_exec'
91
+ @eval_context = Object.new
92
+ @eval_context.extend Spec::Matchers::InstanceExec
93
+ yield @eval_context
94
+ end
95
+ @args_to_yield << args
96
+ self
55
97
  end
56
-
98
+
57
99
  def matches(sym, args)
58
- @sym == sym and @args_expectation.check_args(args)
100
+ @sym == sym and @args_expectation.args_match?(args)
59
101
  end
60
-
61
- def invoke(args, block)
102
+
103
+ def invoke(*args, &block)
104
+ if @expected_received_count == 0
105
+ @failed_fast = true
106
+ @actual_received_count += 1
107
+ @error_generator.raise_expectation_error @sym, @expected_received_count, @actual_received_count, *args
108
+ end
109
+
62
110
  @order_group.handle_order_constraint self
63
111
 
64
112
  begin
65
- if @exception_to_raise.class == Class
66
- @exception_instance_to_raise = @exception_to_raise.new
67
- else
68
- @exception_instance_to_raise = @exception_to_raise
69
- end
70
113
  Kernel::raise @exception_to_raise unless @exception_to_raise.nil?
71
114
  Kernel::throw @symbol_to_throw unless @symbol_to_throw.nil?
72
115
 
116
+
73
117
  if !@method_block.nil?
74
- return invoke_method_block(args)
75
- elsif !@args_to_yield.nil?
76
- return invoke_with_yield(block)
77
- elsif @consecutive
78
- return invoke_consecutive_return_block(args, block)
118
+ default_return_val = invoke_method_block(*args)
119
+ elsif @args_to_yield.size > 0 || @eval_context
120
+ default_return_val = invoke_with_yield(&block)
79
121
  else
80
- return invoke_return_block(args, block)
122
+ default_return_val = nil
123
+ end
124
+
125
+ if @consecutive
126
+ return invoke_consecutive_return_block(*args, &block)
127
+ elsif @return_block
128
+ return invoke_return_block(*args, &block)
129
+ else
130
+ return default_return_val
81
131
  end
82
132
  ensure
83
- @received_count += 1
133
+ @actual_received_count += 1
84
134
  end
85
135
  end
86
-
136
+
137
+ def called_max_times?
138
+ @expected_received_count != :any && @expected_received_count > 0 &&
139
+ @actual_received_count >= @expected_received_count
140
+ end
141
+
142
+ def invoke_return_block(*args, &block)
143
+ args << block unless block.nil?
144
+ # Ruby 1.9 - when we set @return_block to return values
145
+ # regardless of arguments, any arguments will result in
146
+ # a "wrong number of arguments" error
147
+ @return_block.arity == 0 ? @return_block.call : @return_block.call(*args)
148
+ end
149
+
87
150
  protected
88
151
 
89
- def invoke_method_block(args)
152
+ def invoke_method_block(*args)
90
153
  begin
91
154
  @method_block.call(*args)
92
155
  rescue => detail
93
156
  @error_generator.raise_block_failed_error @sym, detail.message
94
157
  end
95
158
  end
96
-
97
- def invoke_with_yield(block)
159
+
160
+ def invoke_with_yield(&block)
98
161
  if block.nil?
99
162
  @error_generator.raise_missing_block_error @args_to_yield
100
163
  end
101
- if block.arity > -1 && @args_to_yield.length != block.arity
102
- @error_generator.raise_wrong_arity_error @args_to_yield, block.arity
164
+ value = nil
165
+ @args_to_yield.each do |args_to_yield_this_time|
166
+ if block.arity > -1 && args_to_yield_this_time.length != block.arity
167
+ @error_generator.raise_wrong_arity_error args_to_yield_this_time, block.arity
168
+ end
169
+ value = eval_block(*args_to_yield_this_time, &block)
103
170
  end
104
- block.call(*@args_to_yield)
171
+ value
105
172
  end
106
-
107
- def invoke_consecutive_return_block(args, block)
108
- args << block unless block.nil?
109
- value = @return_block.call(*args)
110
-
111
- index = [@received_count, value.size-1].min
173
+
174
+ def eval_block(*args, &block)
175
+ if @eval_context
176
+ @eval_context.instance_exec(*args, &block)
177
+ else
178
+ block.call(*args)
179
+ end
180
+ end
181
+
182
+ def invoke_consecutive_return_block(*args, &block)
183
+ value = invoke_return_block(*args, &block)
184
+ index = [@actual_received_count, value.size-1].min
112
185
  value[index]
113
186
  end
114
-
115
- def invoke_return_block(args, block)
116
- args << block unless block.nil?
117
- value = @return_block.call(*args)
118
-
119
- value
187
+
188
+ def clone_args_to_yield(args)
189
+ @args_to_yield = args.clone
190
+ @args_to_yield_were_cloned = true
191
+ end
192
+
193
+ def failed_fast?
194
+ @failed_fast
120
195
  end
121
196
  end
122
-
197
+
123
198
  class MessageExpectation < BaseExpectation
124
-
199
+
200
+ def matches_name?(sym)
201
+ @sym == sym
202
+ end
203
+
125
204
  def matches_name_but_not_args(sym, args)
126
- @sym == sym and not @args_expectation.check_args(args)
127
- end
128
-
129
- def verify_messages_received
130
- return if @expected_received_count == :any
131
- return if (@at_least) && (@received_count >= @expected_received_count)
132
- return if (@at_most) && (@received_count <= @expected_received_count)
133
- return if @expected_received_count == @received_count
134
-
135
- begin
136
- @error_generator.raise_expectation_error(@sym, @expected_received_count, @received_count, *@args_expectation.args)
137
- rescue => error
138
- error.backtrace.insert(0, @expected_from)
139
- Kernel::raise error
205
+ matches_name?(sym) and not @args_expectation.args_match?(args)
206
+ end
207
+
208
+ def verify_messages_received
209
+ return if expected_messages_received? || failed_fast?
210
+
211
+ generate_error
212
+ rescue Spec::Mocks::MockExpectationError => error
213
+ error.backtrace.insert(0, @expected_from)
214
+ Kernel::raise error
215
+ end
216
+
217
+ def expected_messages_received?
218
+ ignoring_args? || matches_exact_count? ||
219
+ matches_at_least_count? || matches_at_most_count?
220
+ end
221
+
222
+ def ignoring_args?
223
+ @expected_received_count == :any
224
+ end
225
+
226
+ def matches_at_least_count?
227
+ @at_least && @actual_received_count >= @expected_received_count
228
+ end
229
+
230
+ def matches_at_most_count?
231
+ @at_most && @actual_received_count <= @expected_received_count
232
+ end
233
+
234
+ def matches_exact_count?
235
+ @expected_received_count == @actual_received_count
236
+ end
237
+
238
+ def similar_messages
239
+ @similar_messages ||= []
240
+ end
241
+
242
+ def advise(args, block)
243
+ similar_messages << args
244
+ end
245
+
246
+ def generate_error
247
+ if similar_messages.empty?
248
+ @error_generator.raise_expectation_error(@sym, @expected_received_count, @actual_received_count, *@args_expectation.args)
249
+ else
250
+ @error_generator.raise_unexpected_message_args_error(self, *@similar_messages)
140
251
  end
141
252
  end
142
253
 
143
254
  def with(*args, &block)
144
- @method_block = block if block
145
- @args_expectation = ArgumentExpectation.new(args)
255
+ @args_expectation = ArgumentExpectation.new(args, &block)
146
256
  self
147
257
  end
148
-
258
+
149
259
  def exactly(n)
150
260
  set_expected_received_count :exactly, n
151
261
  self
152
262
  end
153
-
263
+
154
264
  def at_least(n)
155
265
  set_expected_received_count :at_least, n
156
266
  self
157
267
  end
158
-
268
+
159
269
  def at_most(n)
160
270
  set_expected_received_count :at_most, n
161
271
  self
@@ -165,67 +275,70 @@ module Spec
165
275
  @method_block = block if block
166
276
  self
167
277
  end
168
-
278
+
169
279
  def any_number_of_times(&block)
170
280
  @method_block = block if block
171
281
  @expected_received_count = :any
172
282
  self
173
283
  end
174
-
284
+
175
285
  def never
176
286
  @expected_received_count = 0
177
287
  self
178
288
  end
179
-
289
+
180
290
  def once(&block)
181
291
  @method_block = block if block
182
292
  @expected_received_count = 1
183
293
  self
184
294
  end
185
-
295
+
186
296
  def twice(&block)
187
297
  @method_block = block if block
188
298
  @expected_received_count = 2
189
299
  self
190
300
  end
191
-
301
+
192
302
  def ordered(&block)
193
303
  @method_block = block if block
194
304
  @order_group.register(self)
195
305
  @ordered = true
196
306
  self
197
307
  end
198
-
308
+
199
309
  def negative_expectation_for?(sym)
200
310
  return false
201
311
  end
202
-
312
+
203
313
  protected
204
314
  def set_expected_received_count(relativity, n)
205
315
  @at_least = (relativity == :at_least)
206
316
  @at_most = (relativity == :at_most)
207
- @expected_received_count = 1 if n == :once
208
- @expected_received_count = 2 if n == :twice
209
- @expected_received_count = n if n.kind_of? Numeric
317
+ @expected_received_count = case n
318
+ when Numeric
319
+ n
320
+ when :once
321
+ 1
322
+ when :twice
323
+ 2
324
+ end
210
325
  end
211
-
326
+
327
+ def clear_actual_received_count!
328
+ @actual_received_count = 0
329
+ end
330
+
212
331
  end
213
-
332
+
214
333
  class NegativeMessageExpectation < MessageExpectation
215
334
  def initialize(message, expectation_ordering, expected_from, sym, method_block)
216
335
  super(message, expectation_ordering, expected_from, sym, method_block, 0)
217
336
  end
218
-
337
+
219
338
  def negative_expectation_for?(sym)
220
339
  return @sym == sym
221
340
  end
222
341
  end
223
-
224
- class MethodStub < BaseExpectation
225
- def initialize(message, expectation_ordering, expected_from, sym, method_block)
226
- super(message, expectation_ordering, expected_from, sym, method_block, 0)
227
- @expected_received_count = :any
228
- end
229
- end
342
+
230
343
  end
231
344
  end
@@ -2,19 +2,74 @@ module Spec
2
2
  module Mocks
3
3
  module Methods
4
4
  def should_receive(sym, opts={}, &block)
5
- __mock_proxy.add_message_expectation(opts[:expected_from] || caller(1)[0], sym, opts, &block)
5
+ __mock_proxy.add_message_expectation(opts[:expected_from] || caller(1)[0], sym.to_sym, opts, &block)
6
6
  end
7
7
 
8
8
  def should_not_receive(sym, &block)
9
- __mock_proxy.add_negative_message_expectation(caller(1)[0], sym, &block)
9
+ __mock_proxy.add_negative_message_expectation(caller(1)[0], sym.to_sym, &block)
10
10
  end
11
11
 
12
- def stub!(sym)
13
- __mock_proxy.add_stub(caller(1)[0], sym)
12
+ def stub!(sym_or_hash, opts={}, &block)
13
+ if Hash === sym_or_hash
14
+ sym_or_hash.each {|method, value| stub!(method).and_return value }
15
+ else
16
+ __mock_proxy.add_stub(caller(1)[0], sym_or_hash.to_sym, opts, &block)
17
+ end
18
+ end
19
+
20
+ alias_method :stub, :stub!
21
+
22
+ def unstub!(message)
23
+ __mock_proxy.remove_stub(message)
24
+ end
25
+
26
+ alias_method :unstub, :unstub!
27
+
28
+ # :call-seq:
29
+ # object.stub_chain(:first, :second, :third).and_return(:this)
30
+ #
31
+ # Supports stubbing a chain of methods. Each argument represents
32
+ # a method name to stub, and each one returns a proxy object that
33
+ # can accept more stubs, until the last, which returns whatever
34
+ # is passed to +and_return_.
35
+ #
36
+ # == Examples
37
+ #
38
+ # # with this in an example ...
39
+ # article = double('article')
40
+ # Article.stub_chain(:authored_by, :published, :recent).and_return([article])
41
+ # # then this will return an Array with the article double in it:
42
+ # Article.authored_by(params[:author_id]).published.recent
43
+ def stub_chain(*methods)
44
+ if methods.length > 1
45
+ if matching_stub = __mock_proxy.find_matching_method_stub(methods[0])
46
+ methods.shift
47
+ matching_stub.invoke_return_block.stub_chain(*methods)
48
+ else
49
+ next_in_chain = Object.new
50
+ stub!(methods.shift) {next_in_chain}
51
+ next_in_chain.stub_chain(*methods)
52
+ end
53
+ else
54
+ stub!(methods.shift)
55
+ end
56
+ end
57
+
58
+ # Record and otherwise ignore all messages that aren't specified,
59
+ # with +stub+, +stub!+, or +should_receive+.
60
+ #
61
+ # == Returns
62
+ # self
63
+ def as_null_object
64
+ __mock_proxy.as_null_object
65
+ end
66
+
67
+ def null_object?
68
+ __mock_proxy.null_object?
14
69
  end
15
70
 
16
71
  def received_message?(sym, *args, &block) #:nodoc:
17
- __mock_proxy.received_message?(sym, *args, &block)
72
+ __mock_proxy.received_message?(sym.to_sym, *args, &block)
18
73
  end
19
74
 
20
75
  def rspec_verify #:nodoc:
@@ -28,8 +83,12 @@ module Spec
28
83
  private
29
84
 
30
85
  def __mock_proxy
31
- @mock_proxy ||= Proxy.new(self, @name, @options)
86
+ if Mock === self
87
+ @mock_proxy ||= Proxy.new(self, @name, @options)
88
+ else
89
+ @mock_proxy ||= Proxy.new(self)
90
+ end
32
91
  end
33
92
  end
34
93
  end
35
- end
94
+ end
@@ -3,27 +3,69 @@ module Spec
3
3
  class Mock
4
4
  include Methods
5
5
 
6
- # Creates a new mock with a +name+ (that will be used in error messages only)
7
- # == Options:
8
- # * <tt>:null_object</tt> - if true, the mock object acts as a forgiving null object allowing any message to be sent to it.
9
- def initialize(name, options={})
10
- @name = name
11
- @options = options
6
+ # Creates a new mock with a +name+ (that will be used in error messages
7
+ # only) == Options:
8
+ # * <tt>:null_object</tt> - if true, the mock object acts as a forgiving
9
+ # null object allowing any message to be sent to it.
10
+ def initialize(name=nil, stubs_and_options={})
11
+ if name.is_a?(Hash) && stubs_and_options.empty?
12
+ stubs_and_options = name
13
+ @name = nil
14
+ else
15
+ @name = name
16
+ end
17
+ @options = extract_options(stubs_and_options)
18
+ assign_stubs(stubs_and_options)
19
+ end
20
+
21
+ # This allows for comparing the mock to other objects that proxy such as
22
+ # ActiveRecords belongs_to proxy objects. By making the other object run
23
+ # the comparison, we're sure the call gets delegated to the proxy
24
+ # target.
25
+ def ==(other)
26
+ other == __mock_proxy
27
+ end
28
+
29
+ def inspect
30
+ "#<#{self.class}:#{sprintf '0x%x', self.object_id} @name=#{@name.inspect}>"
31
+ end
32
+
33
+ def to_s
34
+ inspect.gsub('<','[').gsub('>',']')
12
35
  end
13
36
 
37
+ private
38
+
14
39
  def method_missing(sym, *args, &block)
15
- __mock_proxy.instance_eval {@messages_received << [sym, args, block]}
40
+ __mock_proxy.record_message_received(sym, args, block)
16
41
  begin
17
42
  return self if __mock_proxy.null_object?
18
43
  super(sym, *args, &block)
19
- rescue NoMethodError
44
+ rescue NameError
20
45
  __mock_proxy.raise_unexpected_message_error sym, *args
21
46
  end
22
47
  end
48
+
49
+ def extract_options(stubs_and_options)
50
+ options = {}
51
+ extract_option(stubs_and_options, options, :null_object)
52
+ extract_option(stubs_and_options, options, :__declared_as, 'Mock')
53
+ options
54
+ end
23
55
 
24
- def inspect
25
- "#<#{self.class}:#{sprintf '0x%x', self.object_id} @name=#{@name.inspect}>"
56
+ def extract_option(source, target, key, default=nil)
57
+ if source[key]
58
+ target[key] = source.delete(key)
59
+ elsif default
60
+ target[key] = default
61
+ end
62
+ end
63
+
64
+ def assign_stubs(stubs)
65
+ stubs.each_pair do |message, response|
66
+ stub!(message).and_return(response)
67
+ end
26
68
  end
27
69
  end
28
70
  end
29
- end
71
+ end