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
@@ -0,0 +1,134 @@
1
+ module Spec
2
+ module Matchers
3
+ class SimpleMatcher
4
+ attr_writer :failure_message, :negative_failure_message, :description
5
+
6
+ def initialize(description, &match_block)
7
+ @description = description
8
+ @match_block = match_block
9
+ @failure_message = @negative_failure_message = nil
10
+ end
11
+
12
+ def matches?(given)
13
+ @given = given
14
+ case @match_block.arity
15
+ when 2
16
+ @match_block.call(@given, self)
17
+ else
18
+ @match_block.call(@given)
19
+ end
20
+ end
21
+
22
+ def description
23
+ @description || explanation
24
+ end
25
+
26
+ def failure_message_for_should
27
+ @failure_message || (@description.nil? ? explanation : %[expected #{@description.inspect} but got #{@given.inspect}])
28
+ end
29
+
30
+ def failure_message_for_should_not
31
+ @negative_failure_message || (@description.nil? ? explanation : %[expected not to get #{@description.inspect}, but got #{@given.inspect}])
32
+ end
33
+
34
+ def explanation
35
+ "No description provided. See RDoc for simple_matcher()"
36
+ end
37
+ end
38
+
39
+ # simple_matcher makes it easy for you to create your own custom matchers
40
+ # in just a few lines of code when you don't need all the power of a
41
+ # completely custom matcher object.
42
+ #
43
+ # The <tt>description</tt> argument will appear as part of any failure
44
+ # message, and is also the source for auto-generated descriptions.
45
+ #
46
+ # The <tt>match_block</tt> can have an arity of 1 or 2. The first block
47
+ # argument will be the given value. The second, if the block accepts it
48
+ # will be the matcher itself, giving you access to set custom failure
49
+ # messages in favor of the defaults.
50
+ #
51
+ # The <tt>match_block</tt> should return a boolean: <tt>true</tt>
52
+ # indicates a match, which will pass if you use <tt>should</tt> and fail
53
+ # if you use <tt>should_not</tt>. false (or nil) indicates no match,
54
+ # which will do the reverse: fail if you use <tt>should</tt> and pass if
55
+ # you use <tt>should_not</tt>.
56
+ #
57
+ # An error in the <tt>match_block</tt> will bubble up, resulting in a
58
+ # failure.
59
+ #
60
+ # == Example with default messages
61
+ #
62
+ # def be_even
63
+ # simple_matcher("an even number") { |given| given % 2 == 0 }
64
+ # end
65
+ #
66
+ # describe 2 do
67
+ # it "should be even" do
68
+ # 2.should be_even
69
+ # end
70
+ # end
71
+ #
72
+ # Given an odd number, this example would produce an error message stating:
73
+ # expected "an even number", got 3.
74
+ #
75
+ # Unfortunately, if you're a fan of auto-generated descriptions, this will
76
+ # produce "should an even number." Not the most desirable result. You can
77
+ # control that using custom messages:
78
+ #
79
+ # == Example with custom messages
80
+ #
81
+ # def rhyme_with(expected)
82
+ # simple_matcher("rhyme with #{expected.inspect}") do |given, matcher|
83
+ # matcher.failure_message = "expected #{given.inspect} to rhyme with #{expected.inspect}"
84
+ # matcher.negative_failure_message = "expected #{given.inspect} not to rhyme with #{expected.inspect}"
85
+ # given.rhymes_with? expected
86
+ # end
87
+ # end
88
+ #
89
+ # # OR
90
+ #
91
+ # def rhyme_with(expected)
92
+ # simple_matcher do |given, matcher|
93
+ # matcher.description = "rhyme with #{expected.inspect}"
94
+ # matcher.failure_message = "expected #{given.inspect} to rhyme with #{expected.inspect}"
95
+ # matcher.negative_failure_message = "expected #{given.inspect} not to rhyme with #{expected.inspect}"
96
+ # given.rhymes_with? expected
97
+ # end
98
+ # end
99
+ #
100
+ # describe "pecan" do
101
+ # it "should rhyme with 'be gone'" do
102
+ # nut = "pecan"
103
+ # nut.extend Rhymer
104
+ # nut.should rhyme_with("be gone")
105
+ # end
106
+ # end
107
+ #
108
+ # The resulting messages would be:
109
+ # description: rhyme with "be gone"
110
+ # failure_message: expected "pecan" to rhyme with "be gone"
111
+ # negative failure_message: expected "pecan" not to rhyme with "be gone"
112
+ #
113
+ # == Wrapped Expectations
114
+ #
115
+ # Because errors will bubble up, it is possible to wrap other expectations
116
+ # in a SimpleMatcher.
117
+ #
118
+ # def be_even
119
+ # simple_matcher("an even number") { |given| (given % 2).should == 0 }
120
+ # end
121
+ #
122
+ # BE VERY CAREFUL when you do this. Only use wrapped expectations for
123
+ # matchers that will always be used in only the positive
124
+ # (<tt>should</tt>) or negative (<tt>should_not</tt>), but not both.
125
+ # The reason is that is you wrap a <tt>should</tt> and call the wrapper
126
+ # with <tt>should_not</tt>, the correct result (the <tt>should</tt>
127
+ # failing), will fail when you want it to pass.
128
+ #
129
+ def simple_matcher(description=nil, &match_block)
130
+ Spec.deprecate("simple_matcher", "Matcher DSL (http://rspec.rubyforge.org/rspec/1.3.0/classes/Spec/Matchers.html)")
131
+ SimpleMatcher.new(description, &match_block)
132
+ end
133
+ end
134
+ end
@@ -1,75 +1,100 @@
1
1
  module Spec
2
2
  module Matchers
3
-
3
+
4
4
  class ThrowSymbol #:nodoc:
5
- def initialize(expected=nil)
6
- @expected = expected
5
+ def initialize(expected_symbol = nil, expected_arg=nil)
6
+ @expected_symbol = expected_symbol
7
+ @expected_arg = expected_arg
8
+ @caught_symbol = @caught_arg = nil
7
9
  end
8
-
9
- def matches?(proc)
10
+
11
+ def matches?(given_proc)
10
12
  begin
11
- proc.call
12
- rescue NameError => e
13
- @actual = extract_sym_from_name_error(e)
14
- ensure
15
- if @expected.nil?
16
- return @actual.nil? ? false : true
13
+ if @expected_symbol.nil?
14
+ given_proc.call
17
15
  else
18
- return @actual == @expected
16
+ @caught_arg = catch :proc_did_not_throw_anything do
17
+ catch @expected_symbol do
18
+ given_proc.call
19
+ throw :proc_did_not_throw_anything, :nothing_thrown
20
+ end
21
+ end
22
+ @caught_symbol = @expected_symbol unless @caught_arg == :nothing_thrown
19
23
  end
24
+
25
+ # Ruby 1.8 uses NameError with `symbol'
26
+ # Ruby 1.9 uses ArgumentError with :symbol
27
+ rescue NameError, ArgumentError => e
28
+ raise e unless e.message =~ /uncaught throw (`|\:)([a-zA-Z0-9_]*)(')?/
29
+ @caught_symbol = $2.to_sym
30
+ end
31
+ if @expected_symbol.nil?
32
+ !@caught_symbol.nil?
33
+ elsif @expected_arg.nil?
34
+ @caught_symbol == @expected_symbol
35
+ else
36
+ (@caught_symbol == @expected_symbol) & (@caught_arg == @expected_arg)
20
37
  end
21
38
  end
22
39
 
23
- def failure_message
24
- if @actual
25
- "expected #{expected}, got #{@actual.inspect}"
40
+ def failure_message_for_should
41
+ if @caught_symbol
42
+ "expected #{expected}, got #{@caught_symbol.inspect}"
26
43
  else
27
44
  "expected #{expected} but nothing was thrown"
28
45
  end
29
46
  end
30
-
31
- def negative_failure_message
32
- if @expected
47
+
48
+ def failure_message_for_should_not
49
+ if @expected_symbol
33
50
  "expected #{expected} not to be thrown"
34
51
  else
35
- "expected no Symbol, got :#{@actual}"
52
+ "expected no Symbol, got :#{@caught_symbol}"
36
53
  end
37
54
  end
38
-
55
+
39
56
  def description
40
57
  "throw #{expected}"
41
58
  end
42
-
59
+
43
60
  private
44
-
61
+
45
62
  def expected
46
- @expected.nil? ? "a Symbol" : @expected.inspect
63
+ @expected_symbol.nil? ? "a Symbol" : "#{@expected_symbol.inspect}#{args}"
47
64
  end
48
-
49
- def extract_sym_from_name_error(error)
50
- return "#{error.message.split("`").last.split("'").first}".to_sym
65
+
66
+ def args
67
+ @expected_arg.nil? ? "" : " with #{@expected_arg.inspect}"
51
68
  end
69
+
52
70
  end
53
-
71
+
54
72
  # :call-seq:
55
73
  # should throw_symbol()
56
74
  # should throw_symbol(:sym)
75
+ # should throw_symbol(:sym, arg)
57
76
  # should_not throw_symbol()
58
77
  # should_not throw_symbol(:sym)
59
- #
60
- # Given a Symbol argument, matches if a proc throws the specified Symbol.
78
+ # should_not throw_symbol(:sym, arg)
61
79
  #
62
80
  # Given no argument, matches if a proc throws any Symbol.
63
81
  #
82
+ # Given a Symbol, matches if the given proc throws the specified Symbol.
83
+ #
84
+ # Given a Symbol and an arg, matches if the given proc throws the
85
+ # specified Symbol with the specified arg.
86
+ #
64
87
  # == Examples
65
88
  #
66
89
  # lambda { do_something_risky }.should throw_symbol
67
90
  # lambda { do_something_risky }.should throw_symbol(:that_was_risky)
91
+ # lambda { do_something_risky }.should throw_symbol(:that_was_risky, culprit)
68
92
  #
69
93
  # lambda { do_something_risky }.should_not throw_symbol
70
94
  # lambda { do_something_risky }.should_not throw_symbol(:that_was_risky)
71
- def throw_symbol(sym=nil)
72
- Matchers::ThrowSymbol.new(sym)
95
+ # lambda { do_something_risky }.should_not throw_symbol(:that_was_risky, culprit)
96
+ def throw_symbol(expected_symbol = nil, expected_arg=nil)
97
+ Matchers::ThrowSymbol.new(expected_symbol, expected_arg)
73
98
  end
74
99
  end
75
100
  end
@@ -0,0 +1,55 @@
1
+ module Spec
2
+ module Matchers
3
+ # wraps an expectation in a block that will return true if the
4
+ # expectation passes and false if it fails (without bubbling up
5
+ # the failure).
6
+ #
7
+ # This is intended to be used in the context of a simple matcher,
8
+ # and is especially useful for wrapping multiple expectations or
9
+ # one or more assertions from test/unit extensions when running
10
+ # with test/unit.
11
+ #
12
+ # == Examples
13
+ #
14
+ # def eat_cheese(cheese)
15
+ # simple_matcher do |mouse, matcher|
16
+ # matcher.failure_message = "expected #{mouse} to eat cheese"
17
+ # wrap_expectation do |matcher|
18
+ # assert_eats_cheese(mouse)
19
+ # end
20
+ # end
21
+ # end
22
+ #
23
+ # describe Mouse do
24
+ # it "eats cheese" do
25
+ # Mouse.new.should eat_cheese
26
+ # end
27
+ # end
28
+ #
29
+ # You might be wondering "why would I do this if I could just say"
30
+ # assert_eats_cheese?", a fair question, indeed. You might prefer
31
+ # to replace the word assert with something more aligned with the
32
+ # rest of your code examples. You are using rspec, after all.
33
+ #
34
+ # The other benefit you get is that you can use the negative version
35
+ # of the matcher:
36
+ #
37
+ # describe Cat do
38
+ # it "does not eat cheese" do
39
+ # Cat.new.should_not eat_cheese
40
+ # end
41
+ # end
42
+ #
43
+ # So in the event there is no assert_does_not_eat_cheese available,
44
+ # you're all set!
45
+ def wrap_expectation(matcher, &block)
46
+ begin
47
+ block.call(matcher)
48
+ return true
49
+ rescue Exception => e
50
+ matcher.failure_message = e.message
51
+ return false
52
+ end
53
+ end
54
+ end
55
+ end
data/lib/spec/matchers.rb CHANGED
@@ -1,17 +1,31 @@
1
+ require 'spec/extensions/instance_exec'
2
+ require 'spec/matchers/pretty'
3
+ require 'spec/matchers/matcher'
4
+ require 'spec/matchers/operator_matcher'
1
5
  require 'spec/matchers/be'
2
6
  require 'spec/matchers/be_close'
7
+ require 'spec/matchers/be_instance_of'
8
+ require 'spec/matchers/be_kind_of'
3
9
  require 'spec/matchers/change'
4
10
  require 'spec/matchers/eql'
5
11
  require 'spec/matchers/equal'
12
+ require 'spec/matchers/errors'
13
+ require 'spec/matchers/exist'
14
+ require 'spec/matchers/generated_descriptions'
6
15
  require 'spec/matchers/has'
7
16
  require 'spec/matchers/have'
8
17
  require 'spec/matchers/include'
9
18
  require 'spec/matchers/match'
10
- require 'spec/matchers/raise_error'
19
+ require 'spec/matchers/match_array'
20
+ require 'spec/matchers/method_missing'
21
+ require 'spec/matchers/raise_exception'
11
22
  require 'spec/matchers/respond_to'
12
23
  require 'spec/matchers/satisfy'
24
+ require 'spec/matchers/simple_matcher'
13
25
  require 'spec/matchers/throw_symbol'
14
- require 'spec/matchers/operator_matcher'
26
+ require 'spec/matchers/wrap_expectation'
27
+ require 'spec/matchers/compatibility'
28
+ require 'spec/matchers/dsl'
15
29
 
16
30
  module Spec
17
31
 
@@ -19,12 +33,21 @@ module Spec
19
33
  # is any object that responds to the following methods:
20
34
  #
21
35
  # matches?(actual)
22
- # failure_message
23
- # negative_failure_message #optional
36
+ # failure_message_for_should
37
+ #
38
+ # These methods are also part of the matcher protocol, but are optional:
39
+ #
40
+ # does_not_match?(actual)
41
+ # failure_message_for_should_not
24
42
  # description #optional
25
43
  #
44
+ # These methods are from older versions of the protocol. They are still supported,
45
+ # but are not recommended:
46
+ #
47
+ # failure_message (use failure_message_for_should instead)
48
+ # negative_failure_message (use failure_message_for_should_not instead)
49
+ #
26
50
  # See Spec::Expectations to learn how to use these as Expectation Matchers.
27
- # See Spec::Mocks to learn how to use them as Mock Argument Constraints.
28
51
  #
29
52
  # == Predicates
30
53
  #
@@ -61,14 +84,17 @@ module Spec
61
84
  # You can use this feature to invoke any predicate that begins with "has_", whether it is
62
85
  # part of the Ruby libraries (like +Hash#has_key?+) or a method you wrote on your own class.
63
86
  #
64
- # == Custom Expression Matchers
87
+ # == Custom Matchers
88
+ #
89
+ # When you find that none of the stock Expectation Matchers provide a natural
90
+ # feeling expectation, you can very easily write your own using RSpec's matcher
91
+ # DSL or writing one from scratch.
65
92
  #
66
- # When you find that none of the stock Expression Matchers provide a natural
67
- # feeling expectation, you can very easily write your own.
93
+ # === Matcher DSL
68
94
  #
69
- # For example, imagine that you are writing a game in which players can
70
- # be in various zones on a virtual board. To specify that bob should
71
- # be in zone 4, you could say:
95
+ # Imagine that you are writing a game in which players can be in various
96
+ # zones on a virtual board. To specify that bob should be in zone 4, you
97
+ # could say:
72
98
  #
73
99
  # bob.current_zone.should eql(Zone.new("4"))
74
100
  #
@@ -80,7 +106,61 @@ module Spec
80
106
  #
81
107
  # bob.should_not be_in_zone("3")
82
108
  #
83
- # To do this, you would need to write a class like this:
109
+ # You can create such a matcher like so:
110
+ #
111
+ # Spec::Matchers.define :be_in_zone do |zone|
112
+ # match do |player|
113
+ # player.in_zone?(zone)
114
+ # end
115
+ # end
116
+ #
117
+ # This will generate a <tt>be_in_zone</tt> method that returns a matcher
118
+ # with logical default messages for failures. You can override the failure
119
+ # messages and the generated description as follows:
120
+ #
121
+ # Spec::Matchers.define :be_in_zone do |zone|
122
+ # match do |player|
123
+ # player.in_zone?(zone)
124
+ # end
125
+ # failure_message_for_should do |player|
126
+ # # generate and return the appropriate string.
127
+ # end
128
+ # failure_message_for_should_not do |player|
129
+ # # generate and return the appropriate string.
130
+ # end
131
+ # description do
132
+ # # generate and return the appropriate string.
133
+ # end
134
+ # end
135
+ #
136
+ # Each of the message-generation methods has access to the block arguments
137
+ # passed to the <tt>create</tt> method (in this case, <tt>zone</tt>). The
138
+ # failure message methods (<tt>failure_message_for_should</tt> and
139
+ # <tt>failure_message_for_should_not</tt>) are passed the actual value (the
140
+ # receiver of <tt>should</tt> or <tt>should_not</tt>).
141
+ #
142
+ # You can also create matchers that obey a fluent interface using the
143
+ # <tt>chain</tt> method:
144
+ #
145
+ # Spec::Matchers.define :tip do |expected_tip|
146
+ # chain :on do |bill|
147
+ # @bill = bill
148
+ # end
149
+ #
150
+ # match do |person|
151
+ # person.tip_for(bill) == expected_tip
152
+ # end
153
+ # end
154
+ #
155
+ # This matcher can be used as follows:
156
+ #
157
+ # describe Customer do
158
+ # it { should tip(10).on(50) }
159
+ # end
160
+ #
161
+ # === Custom Matcher from scratch
162
+ #
163
+ # You could also write a custom matcher from scratch, as follows:
84
164
  #
85
165
  # class BeInZone
86
166
  # def initialize(expected)
@@ -90,10 +170,10 @@ module Spec
90
170
  # @target = target
91
171
  # @target.current_zone.eql?(Zone.new(@expected))
92
172
  # end
93
- # def failure_message
173
+ # def failure_message_for_should
94
174
  # "expected #{@target.inspect} to be in Zone #{@expected}"
95
175
  # end
96
- # def negative_failure_message
176
+ # def failure_message_for_should_not
97
177
  # "expected #{@target.inspect} not to be in Zone #{@expected}"
98
178
  # end
99
179
  # end
@@ -122,37 +202,13 @@ module Spec
122
202
  # include CustomGameMatchers
123
203
  # ...
124
204
  # end
125
- module Matchers
126
- module ModuleMethods
127
- def description_generated(callback)
128
- description_generated_callbacks << callback
129
- end
130
-
131
- def unregister_description_generated(callback)
132
- description_generated_callbacks.delete(callback)
133
- end
134
-
135
- def generated_description=(name)
136
- description_generated_callbacks.each do |callback|
137
- callback.call(name)
138
- end
139
- end
140
-
141
- private
142
- def description_generated_callbacks
143
- @description_generated_callbacks ||= []
144
- end
145
- end
146
- extend ModuleMethods
147
-
148
- def method_missing(sym, *args, &block) # :nodoc:
149
- return Matchers::Be.new(sym, *args) if sym.starts_with?("be_")
150
- return Matchers::Has.new(sym, *args) if sym.starts_with?("have_")
151
- super
152
- end
153
-
154
- class MatcherError < StandardError
155
- end
156
-
157
- end
158
- end
205
+ #
206
+ # or you can include in globally in a spec_helper.rb file <tt>require</tt>d
207
+ # from your spec file(s):
208
+ #
209
+ # Spec::Runner.configure do |config|
210
+ # config.include(CustomGameMatchers)
211
+ # end
212
+ #
213
+ module Matchers; end
214
+ end
@@ -1,134 +1,50 @@
1
1
  module Spec
2
2
  module Mocks
3
-
4
- class MatcherConstraint
5
- def initialize(matcher)
6
- @matcher = matcher
7
- end
8
-
9
- def matches?(value)
10
- @matcher.matches?(value)
11
- end
12
- end
13
-
14
- class LiteralArgConstraint
15
- def initialize(literal)
16
- @literal_value = literal
17
- end
18
-
19
- def matches?(value)
20
- @literal_value == value
21
- end
22
- end
23
3
 
24
- class RegexpArgConstraint
25
- def initialize(regexp)
26
- @regexp = regexp
27
- end
28
-
29
- def matches?(value)
30
- return value =~ @regexp unless value.is_a?(Regexp)
31
- value == @regexp
32
- end
33
- end
34
-
35
- class AnyArgConstraint
36
- def initialize(ignore)
37
- end
38
-
39
- def matches?(value)
40
- true
41
- end
42
- end
43
-
44
- class NumericArgConstraint
45
- def initialize(ignore)
46
- end
47
-
48
- def matches?(value)
49
- value.is_a?(Numeric)
50
- end
51
- end
52
-
53
- class BooleanArgConstraint
54
- def initialize(ignore)
55
- end
56
-
57
- def matches?(value)
58
- return true if value.is_a?(TrueClass)
59
- return true if value.is_a?(FalseClass)
60
- false
61
- end
62
- end
63
-
64
- class StringArgConstraint
65
- def initialize(ignore)
66
- end
67
-
68
- def matches?(value)
69
- value.is_a?(String)
70
- end
71
- end
72
-
73
- class DuckTypeArgConstraint
74
- def initialize(*methods_to_respond_to)
75
- @methods_to_respond_to = methods_to_respond_to
76
- end
77
-
78
- def matches?(value)
79
- @methods_to_respond_to.all? { |sym| value.respond_to?(sym) }
80
- end
81
-
82
- def description
83
- "duck_type"
84
- end
85
- end
86
-
87
4
  class ArgumentExpectation
88
5
  attr_reader :args
89
- @@constraint_classes = Hash.new { |hash, key| LiteralArgConstraint}
90
- @@constraint_classes[:anything] = AnyArgConstraint
91
- @@constraint_classes[:numeric] = NumericArgConstraint
92
- @@constraint_classes[:boolean] = BooleanArgConstraint
93
- @@constraint_classes[:string] = StringArgConstraint
94
6
 
95
- def initialize(args)
7
+ def initialize(args, &block)
96
8
  @args = args
97
- if [:any_args] == args then @expected_params = nil
98
- elsif [:no_args] == args then @expected_params = []
99
- else @expected_params = process_arg_constraints(args)
9
+ @matchers_block = block
10
+ @match_any_args = false
11
+ @matchers = nil
12
+
13
+ if ArgumentMatchers::AnyArgsMatcher === args.first
14
+ @match_any_args = true
15
+ elsif ArgumentMatchers::NoArgsMatcher === args.first
16
+ @matchers = []
17
+ else
18
+ @matchers = args.collect {|arg| matcher_for(arg)}
100
19
  end
101
20
  end
102
21
 
103
- def process_arg_constraints(constraints)
104
- constraints.collect do |constraint|
105
- convert_constraint(constraint)
106
- end
22
+ def matcher_for(arg)
23
+ return ArgumentMatchers::MatcherMatcher.new(arg) if is_matcher?(arg)
24
+ return ArgumentMatchers::RegexpMatcher.new(arg) if arg.is_a?(Regexp)
25
+ return ArgumentMatchers::EqualityProxy.new(arg)
107
26
  end
108
27
 
109
- def convert_constraint(constraint)
110
- return @@constraint_classes[constraint].new(constraint) if constraint.is_a?(Symbol)
111
- return MatcherConstraint.new(constraint) if is_matcher?(constraint)
112
- return RegexpArgConstraint.new(constraint) if constraint.is_a?(Regexp)
113
- return LiteralArgConstraint.new(constraint)
28
+ def is_matcher?(obj)
29
+ return obj.respond_to?(:matches?) & obj.respond_to?(:description)
114
30
  end
115
31
 
116
- def is_matcher?(obj)
117
- return obj.respond_to?(:matches?) && obj.respond_to?(:description)
32
+ def args_match?(given_args)
33
+ match_any_args? || matchers_block_matches?(given_args) || matchers_match?(given_args)
118
34
  end
119
35
 
120
- def check_args(args)
121
- return true if @expected_params.nil?
122
- return true if @expected_params == args
123
- return constraints_match?(args)
36
+ def matchers_block_matches?(given_args)
37
+ @matchers_block ? @matchers_block.call(*given_args) : nil
124
38
  end
125
39
 
126
- def constraints_match?(args)
127
- return false if args.length != @expected_params.length
128
- @expected_params.each_index { |i| return false unless @expected_params[i].matches?(args[i]) }
129
- return true
40
+ def matchers_match?(given_args)
41
+ @matchers == given_args
130
42
  end
131
-
43
+
44
+ def match_any_args?
45
+ @match_any_args
46
+ end
47
+
132
48
  end
133
49
 
134
50
  end