rspec 1.0.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. data/.document +7 -0
  2. data/History.rdoc +1546 -0
  3. data/{MIT-LICENSE → License.txt} +3 -1
  4. data/Manifest.txt +384 -0
  5. data/README.rdoc +41 -0
  6. data/Rakefile +94 -229
  7. data/Ruby1.9.rdoc +31 -0
  8. data/TODO.txt +17 -0
  9. data/Upgrade.rdoc +260 -0
  10. data/bin/autospec +4 -0
  11. data/bin/spec +5 -3
  12. data/cucumber.yml +5 -0
  13. data/examples/failing/README.txt +11 -0
  14. data/examples/failing/diffing_spec.rb +36 -0
  15. data/examples/failing/failing_implicit_docstrings_example.rb +17 -0
  16. data/examples/failing/failure_in_after.rb +10 -0
  17. data/examples/failing/failure_in_before.rb +10 -0
  18. data/examples/failing/mocking_example.rb +38 -0
  19. data/examples/failing/mocking_with_flexmock.rb +26 -0
  20. data/examples/failing/mocking_with_mocha.rb +25 -0
  21. data/examples/failing/mocking_with_rr.rb +27 -0
  22. data/examples/failing/partial_mock_example.rb +18 -0
  23. data/examples/failing/pending_example.rb +7 -0
  24. data/examples/failing/predicate_example.rb +32 -0
  25. data/examples/failing/raising_example.rb +47 -0
  26. data/examples/failing/syntax_error_example.rb +7 -0
  27. data/examples/failing/team_spec.rb +41 -0
  28. data/examples/failing/timeout_behaviour.rb +5 -0
  29. data/examples/{custom_formatter.rb → passing/custom_formatter.rb} +1 -1
  30. data/examples/passing/dynamic_spec.rb +7 -0
  31. data/examples/{file_accessor.rb → passing/file_accessor.rb} +18 -18
  32. data/examples/{file_accessor_spec.rb → passing/file_accessor_spec.rb} +37 -38
  33. data/examples/passing/filtered_formatter.rb +17 -0
  34. data/examples/passing/filtered_formatter_example.rb +31 -0
  35. data/examples/{greeter_spec.rb → passing/greeter_spec.rb} +1 -1
  36. data/examples/passing/helper_method_example.rb +12 -0
  37. data/examples/passing/implicit_docstrings_example.rb +16 -0
  38. data/examples/{io_processor.rb → passing/io_processor.rb} +8 -8
  39. data/examples/{io_processor_spec.rb → passing/io_processor_spec.rb} +2 -3
  40. data/examples/{mocking_example.rb → passing/mocking_example.rb} +0 -2
  41. data/examples/{multi_threaded_behaviour_runner.rb → passing/multi_threaded_example_group_runner.rb} +10 -9
  42. data/examples/passing/nested_classes_example.rb +35 -0
  43. data/examples/passing/options_example.rb +29 -0
  44. data/examples/passing/options_formatter.rb +20 -0
  45. data/examples/{partial_mock_example.rb → passing/partial_mock_example.rb} +2 -3
  46. data/examples/passing/pending_example.rb +18 -0
  47. data/examples/{predicate_example.rb → passing/predicate_example.rb} +1 -3
  48. data/examples/{shared_behaviours_example.rb → passing/shared_example_group_example.rb} +15 -11
  49. data/examples/passing/shared_stack_examples.rb +36 -0
  50. data/examples/passing/simple_matcher_example.rb +29 -0
  51. data/examples/{stack.rb → passing/stack.rb} +1 -1
  52. data/examples/{stack_spec.rb → passing/stack_spec.rb} +6 -40
  53. data/examples/passing/stack_spec_with_nested_example_groups.rb +66 -0
  54. data/examples/{stubbing_example.rb → passing/stubbing_example.rb} +1 -3
  55. data/examples/passing/yielding_example.rb +31 -0
  56. data/examples/ruby1.9.compatibility/access_to_constants_spec.rb +85 -0
  57. data/features/before_and_after_blocks/before_and_after_blocks.feature +167 -0
  58. data/features/command_line/line_number_option.feature +56 -0
  59. data/features/command_line/line_number_option_with_example_with_no_name.feature +22 -0
  60. data/features/example_groups/define_example_attribute.feature +41 -0
  61. data/features/example_groups/example_group_with_should_methods.feature +29 -0
  62. data/features/example_groups/implicit_docstrings.feature +59 -0
  63. data/features/example_groups/nested_groups.feature +32 -0
  64. data/features/expectations/customized_message.feature +54 -0
  65. data/features/expectations/expect_change.feature +65 -0
  66. data/features/expectations/expect_error.feature +44 -0
  67. data/features/extensions/custom_example_group.feature +19 -0
  68. data/features/formatters/custom_formatter.feature +30 -0
  69. data/features/formatters/nested_formatter.feature +32 -0
  70. data/features/interop/cucumber_stubs_dont_leak.feature +11 -0
  71. data/features/interop/examples_and_tests_together.feature +84 -0
  72. data/features/interop/rspec_output.feature +25 -0
  73. data/features/interop/test_but_not_test_unit.feature +26 -0
  74. data/features/interop/test_case_with_should_methods.feature +46 -0
  75. data/features/load_paths/add_lib_to_load_path.feature +20 -0
  76. data/features/load_paths/add_spec_to_load_path.feature +20 -0
  77. data/features/matchers/define_diffable_matcher.feature +26 -0
  78. data/features/matchers/define_matcher.feature +179 -0
  79. data/features/matchers/define_matcher_outside_rspec.feature +38 -0
  80. data/features/matchers/define_matcher_with_fluent_interface.feature +48 -0
  81. data/features/matchers/define_wrapped_matcher.feature +56 -0
  82. data/features/matchers/match_unless_raises.feature +60 -0
  83. data/features/matchers/match_unless_raises_unexpected_error.feature +39 -0
  84. data/features/mock_framework_integration/use_flexmock.feature +27 -0
  85. data/features/mock_framework_integration/use_mocha.feature +27 -0
  86. data/features/mock_framework_integration/use_rr.feature +27 -0
  87. data/features/mocks/block_local_expectations.feature +62 -0
  88. data/features/mocks/mix_stubs_and_mocks.feature +22 -0
  89. data/features/mocks/stub_implementation.feature +26 -0
  90. data/features/pending/pending_examples.feature +81 -0
  91. data/features/runner/specify_line_number.feature +32 -0
  92. data/features/spec_helper/spec_helper.feature +25 -0
  93. data/features/step_definitions/running_rspec_steps.rb +52 -0
  94. data/features/step_definitions/stubbing_steps.rb +16 -0
  95. data/features/subject/explicit_subject.feature +31 -0
  96. data/features/subject/implicit_subject.feature +43 -0
  97. data/features/support/env.rb +83 -0
  98. data/features/support/matchers/smart_match.rb +31 -0
  99. data/geminstaller.yml +29 -0
  100. data/init.rb +9 -0
  101. data/lib/autotest/discover.rb +3 -0
  102. data/lib/autotest/rspec.rb +54 -0
  103. data/lib/spec/adapters/mock_frameworks/flexmock.rb +24 -0
  104. data/{plugins → lib/spec/adapters}/mock_frameworks/mocha.rb +8 -4
  105. data/lib/spec/adapters/mock_frameworks/rr.rb +22 -0
  106. data/lib/spec/adapters/mock_frameworks/rspec.rb +21 -0
  107. data/lib/spec/autorun.rb +3 -0
  108. data/lib/spec/deprecation.rb +41 -0
  109. data/lib/spec/dsl/main.rb +93 -0
  110. data/lib/spec/dsl.rb +1 -10
  111. data/lib/spec/example/args_and_options.rb +27 -0
  112. data/lib/spec/example/before_and_after_hooks.rb +93 -0
  113. data/lib/spec/example/errors.rb +25 -0
  114. data/lib/spec/example/example_group.rb +10 -0
  115. data/lib/spec/example/example_group_factory.rb +82 -0
  116. data/lib/spec/example/example_group_hierarchy.rb +53 -0
  117. data/lib/spec/example/example_group_methods.rb +287 -0
  118. data/lib/spec/example/example_group_proxy.rb +61 -0
  119. data/lib/spec/example/example_matcher.rb +43 -0
  120. data/lib/spec/example/example_methods.rb +152 -0
  121. data/lib/spec/example/example_proxy.rb +41 -0
  122. data/lib/spec/example/module_reopening_fix.rb +43 -0
  123. data/lib/spec/example/pending.rb +18 -0
  124. data/lib/spec/example/predicate_matchers.rb +46 -0
  125. data/lib/spec/example/shared_example_group.rb +59 -0
  126. data/lib/spec/example/subject.rb +114 -0
  127. data/lib/spec/example.rb +164 -0
  128. data/lib/spec/expectations/errors.rb +7 -1
  129. data/lib/spec/expectations/extensions/kernel.rb +52 -0
  130. data/lib/spec/expectations/extensions.rb +1 -2
  131. data/lib/spec/expectations/fail_with.rb +45 -0
  132. data/lib/spec/expectations/handler.rb +37 -30
  133. data/lib/spec/expectations.rb +2 -23
  134. data/lib/spec/extensions/instance_exec.rb +31 -0
  135. data/lib/spec/interop/test/unit/autorunner.rb +6 -0
  136. data/lib/spec/interop/test/unit/testcase.rb +56 -0
  137. data/lib/spec/interop/test/unit/testresult.rb +6 -0
  138. data/lib/spec/interop/test/unit/testsuite_adapter.rb +36 -0
  139. data/lib/spec/interop/test/unit/ui/console/testrunner.rb +61 -0
  140. data/lib/spec/interop/test.rb +44 -0
  141. data/lib/spec/matchers/be.rb +183 -140
  142. data/lib/spec/matchers/be_close.rb +18 -23
  143. data/lib/spec/matchers/be_instance_of.rb +26 -0
  144. data/lib/spec/matchers/be_kind_of.rb +26 -0
  145. data/lib/spec/matchers/change.rb +72 -41
  146. data/lib/spec/matchers/compatibility.rb +14 -0
  147. data/lib/spec/matchers/dsl.rb +20 -0
  148. data/lib/spec/matchers/eql.rb +25 -26
  149. data/lib/spec/matchers/equal.rb +35 -25
  150. data/lib/spec/matchers/errors.rb +5 -0
  151. data/lib/spec/matchers/exist.rb +16 -0
  152. data/lib/spec/matchers/generated_descriptions.rb +36 -0
  153. data/lib/spec/matchers/has.rb +17 -26
  154. data/lib/spec/matchers/have.rb +36 -24
  155. data/lib/spec/matchers/include.rb +22 -48
  156. data/lib/spec/matchers/match.rb +11 -31
  157. data/lib/spec/matchers/match_array.rb +71 -0
  158. data/lib/spec/matchers/matcher.rb +132 -0
  159. data/lib/spec/matchers/method_missing.rb +9 -0
  160. data/lib/spec/matchers/operator_matcher.rb +55 -44
  161. data/lib/spec/matchers/pretty.rb +37 -0
  162. data/lib/spec/matchers/raise_exception.rb +131 -0
  163. data/lib/spec/matchers/respond_to.rb +35 -9
  164. data/lib/spec/matchers/satisfy.rb +2 -2
  165. data/lib/spec/matchers/simple_matcher.rb +134 -0
  166. data/lib/spec/matchers/throw_symbol.rb +56 -31
  167. data/lib/spec/matchers/wrap_expectation.rb +55 -0
  168. data/lib/spec/matchers.rb +104 -48
  169. data/lib/spec/mocks/argument_expectation.rb +28 -112
  170. data/lib/spec/mocks/argument_matchers.rb +237 -0
  171. data/lib/spec/mocks/error_generator.rb +20 -13
  172. data/lib/spec/mocks/errors.rb +1 -1
  173. data/lib/spec/mocks/example_methods.rb +69 -0
  174. data/lib/spec/mocks/extensions.rb +1 -0
  175. data/lib/spec/mocks/framework.rb +15 -0
  176. data/lib/spec/mocks/message_expectation.rb +206 -93
  177. data/lib/spec/mocks/methods.rb +66 -7
  178. data/lib/spec/mocks/mock.rb +53 -11
  179. data/lib/spec/mocks/proxy.rb +160 -55
  180. data/lib/spec/mocks/space.rb +2 -2
  181. data/lib/spec/mocks.rb +14 -23
  182. data/lib/spec/rake/spectask.rb +108 -53
  183. data/lib/spec/rake/verify_rcov.rb +4 -4
  184. data/lib/spec/ruby.rb +9 -0
  185. data/lib/spec/runner/backtrace_tweaker.rb +45 -23
  186. data/lib/spec/runner/class_and_arguments_parser.rb +14 -0
  187. data/lib/spec/runner/command_line.rb +7 -14
  188. data/lib/spec/runner/configuration.rb +202 -0
  189. data/lib/spec/runner/differs/default.rb +93 -0
  190. data/lib/spec/runner/differs/load-diff-lcs.rb +12 -0
  191. data/lib/spec/runner/drb_command_line.rb +18 -7
  192. data/lib/spec/runner/example_group_runner.rb +58 -0
  193. data/lib/spec/runner/extensions/kernel.rb +5 -46
  194. data/lib/spec/runner/formatter/base_formatter.rb +97 -26
  195. data/lib/spec/runner/formatter/base_text_formatter.rb +79 -39
  196. data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +25 -0
  197. data/lib/spec/runner/formatter/failing_examples_formatter.rb +6 -8
  198. data/lib/spec/runner/formatter/html_formatter.rb +101 -75
  199. data/lib/spec/runner/formatter/nested_text_formatter.rb +50 -0
  200. data/lib/spec/runner/formatter/no_op_method_missing.rb +21 -0
  201. data/lib/spec/runner/formatter/profile_formatter.rb +47 -0
  202. data/lib/spec/runner/formatter/progress_bar_formatter.rb +11 -8
  203. data/lib/spec/runner/formatter/silent_formatter.rb +10 -0
  204. data/lib/spec/runner/formatter/snippet_extractor.rb +2 -2
  205. data/lib/spec/runner/formatter/specdoc_formatter.rb +20 -15
  206. data/lib/spec/runner/formatter/text_mate_formatter.rb +16 -0
  207. data/lib/spec/runner/heckle_runner.rb +56 -56
  208. data/lib/spec/runner/{heckle_runner_win.rb → heckle_runner_unsupported.rb} +10 -10
  209. data/lib/spec/runner/line_number_query.rb +78 -0
  210. data/lib/spec/runner/option_parser.rb +147 -148
  211. data/lib/spec/runner/options.rb +343 -95
  212. data/lib/spec/runner/reporter.rb +117 -60
  213. data/lib/spec/runner.rb +39 -138
  214. data/lib/spec/stubs/cucumber.rb +5 -0
  215. data/lib/spec/test/unit.rb +10 -0
  216. data/lib/spec/version.rb +14 -22
  217. data/lib/spec.rb +5 -10
  218. data/resources/helpers/cmdline.rb +8 -0
  219. data/resources/rake/examples.rake +7 -0
  220. data/resources/rake/examples_with_rcov.rake +9 -0
  221. data/resources/rake/failing_examples_with_html.rake +9 -0
  222. data/resources/rake/verify_rcov.rake +7 -0
  223. data/spec/README.jruby +15 -0
  224. data/spec/autotest/autotest_helper.rb +8 -0
  225. data/spec/autotest/autotest_matchers.rb +38 -0
  226. data/spec/autotest/discover_spec.rb +8 -0
  227. data/spec/autotest/failed_results_re_spec.rb +31 -0
  228. data/spec/autotest/rspec_spec.rb +126 -0
  229. data/spec/ruby_forker.rb +13 -0
  230. data/spec/spec/dsl/main_spec.rb +103 -0
  231. data/spec/spec/example/example_group_class_definition_spec.rb +51 -0
  232. data/spec/spec/example/example_group_factory_spec.rb +180 -0
  233. data/spec/spec/example/example_group_methods_spec.rb +778 -0
  234. data/spec/spec/example/example_group_proxy_spec.rb +107 -0
  235. data/spec/spec/example/example_group_spec.rb +632 -0
  236. data/spec/spec/example/example_matcher_spec.rb +85 -0
  237. data/spec/spec/example/example_methods_spec.rb +162 -0
  238. data/spec/spec/example/example_proxy_spec.rb +57 -0
  239. data/spec/spec/example/helper_method_spec.rb +24 -0
  240. data/spec/spec/{dsl/behaviour_eval_spec.rb → example/nested_example_group_spec.rb} +25 -3
  241. data/spec/spec/example/pending_module_spec.rb +58 -0
  242. data/spec/spec/example/predicate_matcher_spec.rb +41 -0
  243. data/spec/spec/example/shared_example_group_spec.rb +257 -0
  244. data/spec/spec/example/subclassing_example_group_spec.rb +25 -0
  245. data/spec/spec/example/subject_spec.rb +110 -0
  246. data/spec/spec/expectations/differs/default_spec.rb +100 -13
  247. data/spec/spec/expectations/extensions/{object_spec.rb → kernel_spec.rb} +13 -14
  248. data/spec/spec/expectations/fail_with_spec.rb +42 -17
  249. data/spec/spec/expectations/handler_spec.rb +206 -0
  250. data/spec/spec/expectations/wrap_expectation_spec.rb +31 -0
  251. data/spec/spec/interop/test/unit/resources/spec_that_fails.rb +10 -0
  252. data/spec/spec/interop/test/unit/resources/spec_that_passes.rb +10 -0
  253. data/spec/spec/interop/test/unit/resources/spec_with_errors.rb +10 -0
  254. data/spec/spec/interop/test/unit/resources/spec_with_options_hash.rb +13 -0
  255. data/spec/spec/interop/test/unit/resources/test_case_that_fails.rb +10 -0
  256. data/spec/spec/interop/test/unit/resources/test_case_that_passes.rb +10 -0
  257. data/spec/spec/interop/test/unit/resources/test_case_with_errors.rb +10 -0
  258. data/spec/spec/interop/test/unit/resources/test_case_with_various_names.rb +22 -0
  259. data/spec/spec/interop/test/unit/resources/testsuite_adapter_spec_with_test_unit.rb +38 -0
  260. data/spec/spec/interop/test/unit/spec_spec.rb +48 -0
  261. data/spec/spec/interop/test/unit/test_unit_spec_helper.rb +18 -0
  262. data/spec/spec/interop/test/unit/testcase_spec.rb +50 -0
  263. data/spec/spec/interop/test/unit/testsuite_adapter_spec.rb +9 -0
  264. data/spec/spec/matchers/be_close_spec.rb +32 -21
  265. data/spec/spec/matchers/be_instance_of_spec.rb +36 -0
  266. data/spec/spec/matchers/be_kind_of_spec.rb +33 -0
  267. data/spec/spec/matchers/be_spec.rb +261 -10
  268. data/spec/spec/matchers/change_spec.rb +178 -61
  269. data/spec/spec/matchers/compatibility_spec.rb +28 -0
  270. data/spec/spec/matchers/description_generation_spec.rb +47 -46
  271. data/spec/spec/matchers/dsl_spec.rb +34 -0
  272. data/spec/spec/matchers/eql_spec.rb +14 -9
  273. data/spec/spec/matchers/equal_spec.rb +43 -14
  274. data/spec/spec/matchers/exist_spec.rb +41 -24
  275. data/spec/spec/matchers/has_spec.rb +154 -1
  276. data/spec/spec/matchers/have_spec.rb +311 -189
  277. data/spec/spec/matchers/include_spec.rb +45 -2
  278. data/spec/spec/matchers/match_array_spec.rb +115 -0
  279. data/spec/spec/matchers/match_spec.rb +25 -5
  280. data/spec/spec/matchers/matcher_spec.rb +289 -0
  281. data/spec/spec/matchers/matchers_spec.rb +2 -0
  282. data/spec/spec/matchers/operator_matcher_spec.rb +48 -15
  283. data/spec/spec/matchers/raise_exception_spec.rb +345 -0
  284. data/spec/spec/matchers/respond_to_spec.rb +78 -16
  285. data/spec/spec/matchers/satisfy_spec.rb +1 -1
  286. data/spec/spec/matchers/simple_matcher_spec.rb +100 -0
  287. data/spec/spec/matchers/throw_symbol_spec.rb +111 -41
  288. data/spec/spec/mocks/and_yield_spec.rb +117 -0
  289. data/spec/spec/mocks/any_number_of_times_spec.rb +9 -2
  290. data/spec/spec/mocks/argument_expectation_spec.rb +19 -15
  291. data/spec/spec/mocks/argument_matchers_spec.rb +19 -0
  292. data/spec/spec/mocks/at_least_spec.rb +2 -2
  293. data/spec/spec/mocks/at_most_spec.rb +3 -3
  294. data/spec/spec/mocks/bug_report_10260_spec.rb +1 -1
  295. data/spec/spec/mocks/bug_report_10263_spec.rb +27 -0
  296. data/spec/spec/mocks/bug_report_11545_spec.rb +32 -0
  297. data/spec/spec/mocks/bug_report_15719_spec.rb +30 -0
  298. data/spec/spec/mocks/bug_report_496_spec.rb +17 -0
  299. data/spec/spec/mocks/bug_report_600_spec.rb +22 -0
  300. data/spec/spec/mocks/bug_report_7611_spec.rb +2 -2
  301. data/spec/spec/mocks/bug_report_7805_spec.rb +2 -2
  302. data/spec/spec/mocks/bug_report_8165_spec.rb +4 -4
  303. data/spec/spec/mocks/bug_report_8302_spec.rb +2 -2
  304. data/spec/spec/mocks/bug_report_830_spec.rb +21 -0
  305. data/spec/spec/mocks/double_spec.rb +12 -0
  306. data/spec/spec/mocks/failing_argument_matchers_spec.rb +95 -0
  307. data/spec/spec/mocks/hash_including_matcher_spec.rb +90 -0
  308. data/spec/spec/mocks/hash_not_including_matcher_spec.rb +67 -0
  309. data/spec/spec/mocks/mock_ordering_spec.rb +15 -5
  310. data/spec/spec/mocks/mock_space_spec.rb +1 -1
  311. data/spec/spec/mocks/mock_spec.rb +346 -129
  312. data/spec/spec/mocks/multiple_return_value_spec.rb +9 -9
  313. data/spec/spec/mocks/nil_expectation_warning_spec.rb +53 -0
  314. data/spec/spec/mocks/null_object_mock_spec.rb +15 -1
  315. data/spec/spec/mocks/once_counts_spec.rb +2 -2
  316. data/spec/spec/mocks/options_hash_spec.rb +19 -17
  317. data/spec/spec/mocks/partial_mock_spec.rb +124 -12
  318. data/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +2 -2
  319. data/spec/spec/mocks/passing_argument_matchers_spec.rb +145 -0
  320. data/spec/spec/mocks/precise_counts_spec.rb +2 -2
  321. data/spec/spec/mocks/record_messages_spec.rb +2 -2
  322. data/spec/spec/mocks/stub_chain_spec.rb +42 -0
  323. data/spec/spec/mocks/stub_implementation_spec.rb +31 -0
  324. data/spec/spec/mocks/stub_spec.rb +147 -103
  325. data/spec/spec/mocks/stubbed_message_expectations_spec.rb +26 -0
  326. data/spec/spec/mocks/twice_counts_spec.rb +2 -2
  327. data/spec/spec/mocks/unstub_spec.rb +127 -0
  328. data/spec/spec/package/bin_spec_spec.rb +11 -7
  329. data/spec/spec/rake/spectask_spec.rb +150 -0
  330. data/spec/spec/runner/class_and_argument_parser_spec.rb +23 -0
  331. data/spec/spec/runner/command_line_spec.rb +158 -29
  332. data/spec/spec/runner/configuration_spec.rb +320 -0
  333. data/spec/spec/runner/drb_command_line_spec.rb +137 -72
  334. data/spec/spec/runner/empty_file.txt +0 -0
  335. data/spec/spec/runner/example_group_runner_spec.rb +26 -0
  336. data/spec/spec/runner/examples.txt +2 -0
  337. data/spec/spec/runner/failed.txt +3 -0
  338. data/spec/spec/runner/formatter/base_formatter_spec.rb +30 -0
  339. data/spec/spec/runner/formatter/base_text_formatter_spec.rb +113 -0
  340. data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +45 -0
  341. data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +17 -12
  342. data/spec/spec/runner/formatter/html_formatted-1.8.6-jruby.html +377 -0
  343. data/spec/spec/runner/formatter/html_formatted-1.8.6.html +377 -0
  344. data/spec/spec/runner/formatter/html_formatted-1.8.7.html +377 -0
  345. data/spec/spec/runner/formatter/html_formatted-1.9.1.html +377 -0
  346. data/spec/spec/runner/formatter/html_formatter_spec.rb +112 -52
  347. data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +329 -0
  348. data/spec/spec/runner/formatter/profile_formatter_spec.rb +70 -0
  349. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +87 -16
  350. data/spec/spec/runner/formatter/snippet_extractor_spec.rb +14 -7
  351. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +153 -50
  352. data/spec/spec/runner/formatter/text_mate_formatted-1.8.6-jruby.html +371 -0
  353. data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +371 -0
  354. data/spec/spec/runner/formatter/text_mate_formatted-1.8.7.html +371 -0
  355. data/spec/spec/runner/formatter/text_mate_formatted-1.9.1.html +371 -0
  356. data/spec/spec/runner/formatter/text_mate_formatter_spec.rb +106 -0
  357. data/spec/spec/runner/heckle_runner_spec.rb +32 -17
  358. data/spec/spec/runner/heckler_spec.rb +17 -11
  359. data/spec/spec/runner/line_number_query/line_number_query_fixture.rb +70 -0
  360. data/spec/spec/runner/line_number_query_spec.rb +129 -0
  361. data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +27 -21
  362. data/spec/spec/runner/option_parser_spec.rb +367 -164
  363. data/spec/spec/runner/options_spec.rb +506 -94
  364. data/spec/spec/runner/output_one_time_fixture.rb +7 -0
  365. data/spec/spec/runner/output_one_time_fixture_runner.rb +7 -0
  366. data/spec/spec/runner/output_one_time_spec.rb +15 -0
  367. data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +94 -27
  368. data/spec/spec/runner/reporter_spec.rb +212 -121
  369. data/spec/spec/runner/resources/a_bar.rb +0 -0
  370. data/spec/spec/runner/resources/a_foo.rb +0 -0
  371. data/spec/spec/runner/resources/a_spec.rb +1 -0
  372. data/spec/spec/runner/resources/custom_example_group_runner.rb +14 -0
  373. data/spec/spec/runner/resources/utf8_encoded.rb +8 -0
  374. data/spec/spec/runner/spec.opts +2 -0
  375. data/spec/spec/runner/spec_drb.opts +2 -0
  376. data/spec/spec/runner/spec_spaced.opts +2 -0
  377. data/spec/spec/runner_spec.rb +13 -0
  378. data/spec/spec.opts +6 -0
  379. data/spec/spec_helper.rb +87 -45
  380. data/spec/support/macros.rb +29 -0
  381. data/spec/{spec → support}/spec_classes.rb +26 -4
  382. metadata +461 -141
  383. data/CHANGES +0 -748
  384. data/EXAMPLES.rd +0 -108
  385. data/README +0 -70
  386. data/UPGRADE +0 -31
  387. data/bin/spec_translator +0 -8
  388. data/examples/auto_spec_description_example.rb +0 -19
  389. data/examples/before_and_after_example.rb +0 -39
  390. data/examples/behave_as_example.rb +0 -45
  391. data/examples/dynamic_spec.rb +0 -9
  392. data/examples/helper_method_example.rb +0 -11
  393. data/examples/legacy_spec.rb +0 -10
  394. data/examples/not_yet_implemented_spec.rb +0 -12
  395. data/examples/priority.txt +0 -1
  396. data/examples/spec_helper.rb +0 -1
  397. data/examples/test_case_adapter_example.rb +0 -26
  398. data/examples/test_case_spec.rb +0 -65
  399. data/lib/spec/dsl/behaviour.rb +0 -204
  400. data/lib/spec/dsl/behaviour_callbacks.rb +0 -77
  401. data/lib/spec/dsl/behaviour_eval.rb +0 -177
  402. data/lib/spec/dsl/behaviour_factory.rb +0 -42
  403. data/lib/spec/dsl/composite_proc_builder.rb +0 -28
  404. data/lib/spec/dsl/configuration.rb +0 -119
  405. data/lib/spec/dsl/description.rb +0 -46
  406. data/lib/spec/dsl/example.rb +0 -127
  407. data/lib/spec/dsl/example_matcher.rb +0 -28
  408. data/lib/spec/dsl/example_should_raise_handler.rb +0 -74
  409. data/lib/spec/expectations/differs/default.rb +0 -61
  410. data/lib/spec/expectations/extensions/object.rb +0 -66
  411. data/lib/spec/expectations/extensions/string_and_symbol.rb +0 -17
  412. data/lib/spec/extensions/object.rb +0 -6
  413. data/lib/spec/extensions.rb +0 -1
  414. data/lib/spec/matchers/raise_error.rb +0 -100
  415. data/lib/spec/mocks/argument_constraint_matchers.rb +0 -12
  416. data/lib/spec/mocks/spec_methods.rb +0 -30
  417. data/lib/spec/runner/behaviour_runner.rb +0 -102
  418. data/lib/spec/runner/extensions/object.rb +0 -32
  419. data/lib/spec/runner/formatter/failing_behaviours_formatter.rb +0 -25
  420. data/lib/spec/runner/formatter/rdoc_formatter.rb +0 -24
  421. data/lib/spec/runner/formatter.rb +0 -9
  422. data/lib/spec/runner/spec_parser.rb +0 -50
  423. data/lib/spec/test_case_adapter.rb +0 -10
  424. data/lib/spec/translator.rb +0 -106
  425. data/plugins/mock_frameworks/flexmock.rb +0 -27
  426. data/plugins/mock_frameworks/rspec.rb +0 -18
  427. data/spec/spec/dsl/behaviour_factory_spec.rb +0 -30
  428. data/spec/spec/dsl/behaviour_spec.rb +0 -604
  429. data/spec/spec/dsl/composite_proc_builder_spec.rb +0 -57
  430. data/spec/spec/dsl/configuration_spec.rb +0 -50
  431. data/spec/spec/dsl/description_spec.rb +0 -81
  432. data/spec/spec/dsl/example_class_spec.rb +0 -24
  433. data/spec/spec/dsl/example_instance_spec.rb +0 -162
  434. data/spec/spec/dsl/example_should_raise_spec.rb +0 -137
  435. data/spec/spec/dsl/predicate_matcher_spec.rb +0 -21
  436. data/spec/spec/dsl/shared_behaviour_spec.rb +0 -208
  437. data/spec/spec/matchers/handler_spec.rb +0 -88
  438. data/spec/spec/matchers/matcher_methods_spec.rb +0 -78
  439. data/spec/spec/matchers/raise_error_spec.rb +0 -147
  440. data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +0 -73
  441. data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +0 -92
  442. data/spec/spec/runner/behaviour_runner_spec.rb +0 -118
  443. data/spec/spec/runner/context_matching_spec.rb +0 -27
  444. data/spec/spec/runner/execution_context_spec.rb +0 -31
  445. data/spec/spec/runner/extensions/kernel_spec.rb +0 -36
  446. data/spec/spec/runner/formatter/failing_behaviours_formatter_spec.rb +0 -27
  447. data/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb +0 -21
  448. data/spec/spec/runner/formatter/progress_bar_formatter_failure_dump_spec.rb +0 -36
  449. data/spec/spec/runner/formatter/rdoc_formatter_dry_run_spec.rb +0 -19
  450. data/spec/spec/runner/formatter/rdoc_formatter_spec.rb +0 -46
  451. data/spec/spec/runner/formatter/specdoc_formatter_dry_run_spec.rb +0 -21
  452. data/spec/spec/runner/object_ext_spec.rb +0 -11
  453. data/spec/spec/runner/spec_matcher_spec.rb +0 -102
  454. data/spec/spec/runner/spec_parser_spec.rb +0 -93
  455. data/spec/spec/translator_spec.rb +0 -216
  456. /data/examples/{custom_expectation_matchers.rb → passing/custom_matchers.rb} +0 -0
@@ -4,54 +4,59 @@ module Spec
4
4
  #Based on patch from Wilson Bilkovich
5
5
  class Change #:nodoc:
6
6
  def initialize(receiver=nil, message=nil, &block)
7
- @receiver = receiver
8
- @message = message
9
- @block = block
7
+ @message = message || "result"
8
+ @value_proc = block || lambda {receiver.__send__(message)}
9
+ @to = @from = @minimum = @maximum = @amount = nil
10
10
  end
11
11
 
12
- def matches?(target, &block)
13
- if block
14
- raise MatcherError.new(<<-EOF
15
- block passed to should or should_not change must use {} instead of do/end
16
- EOF
17
- )
18
- end
19
- @target = target
20
- execute_change
21
- return false if @from && (@from != @before)
22
- return false if @to && (@to != @after)
12
+ def matches?(event_proc)
13
+ raise_block_syntax_error if block_given?
14
+
15
+ @before = evaluate_value_proc
16
+ event_proc.call
17
+ @after = evaluate_value_proc
18
+
19
+ return (@to = false) if @from unless @from == @before
20
+ return false if @to unless @to == @after
23
21
  return (@before + @amount == @after) if @amount
22
+ return ((@after - @before) >= @minimum) if @minimum
23
+ return ((@after - @before) <= @maximum) if @maximum
24
24
  return @before != @after
25
25
  end
26
26
 
27
- def execute_change
28
- @before = @block.nil? ? @receiver.send(@message) : @block.call
29
- @target.call
30
- @after = @block.nil? ? @receiver.send(@message) : @block.call
27
+ def raise_block_syntax_error
28
+ raise MatcherError.new(<<-MESSAGE
29
+ block passed to should or should_not change must use {} instead of do/end
30
+ MESSAGE
31
+ )
32
+ end
33
+
34
+ def evaluate_value_proc
35
+ @value_proc.call
31
36
  end
32
37
 
33
- def failure_message
38
+ def failure_message_for_should
34
39
  if @to
35
- "#{result} should have been changed to #{@to.inspect}, but is now #{@after.inspect}"
40
+ "#{@message} should have been changed to #{@to.inspect}, but is now #{@after.inspect}"
36
41
  elsif @from
37
- "#{result} should have initially been #{@from.inspect}, but was #{@before.inspect}"
42
+ "#{@message} should have initially been #{@from.inspect}, but was #{@before.inspect}"
38
43
  elsif @amount
39
- "#{result} should have been changed by #{@amount.inspect}, but was changed by #{actual_delta.inspect}"
44
+ "#{@message} should have been changed by #{@amount.inspect}, but was changed by #{actual_delta.inspect}"
45
+ elsif @minimum
46
+ "#{@message} should have been changed by at least #{@minimum.inspect}, but was changed by #{actual_delta.inspect}"
47
+ elsif @maximum
48
+ "#{@message} should have been changed by at most #{@maximum.inspect}, but was changed by #{actual_delta.inspect}"
40
49
  else
41
- "#{result} should have changed, but is still #{@before.inspect}"
50
+ "#{@message} should have changed, but is still #{@before.inspect}"
42
51
  end
43
52
  end
44
53
 
45
- def result
46
- @message || "result"
47
- end
48
-
49
54
  def actual_delta
50
55
  @after - @before
51
56
  end
52
57
 
53
- def negative_failure_message
54
- "#{result} should not have changed, but did change from #{@before.inspect} to #{@after.inspect}"
58
+ def failure_message_for_should_not
59
+ "#{@message} should not have changed, but did change from #{@before.inspect} to #{@after.inspect}"
55
60
  end
56
61
 
57
62
  def by(amount)
@@ -59,6 +64,16 @@ EOF
59
64
  self
60
65
  end
61
66
 
67
+ def by_at_least(minimum)
68
+ @minimum = minimum
69
+ self
70
+ end
71
+
72
+ def by_at_most(maximum)
73
+ @maximum = maximum
74
+ self
75
+ end
76
+
62
77
  def to(to)
63
78
  @to = to
64
79
  self
@@ -68,6 +83,10 @@ EOF
68
83
  @from = from
69
84
  self
70
85
  end
86
+
87
+ def description
88
+ "change ##{@message}"
89
+ end
71
90
  end
72
91
 
73
92
  # :call-seq:
@@ -88,9 +107,17 @@ EOF
88
107
  # team.add_player(player)
89
108
  # }.should change(roster, :count).by(1)
90
109
  #
110
+ # lambda {
111
+ # team.add_player(player)
112
+ # }.should change(roster, :count).by_at_least(1)
113
+ #
114
+ # lambda {
115
+ # team.add_player(player)
116
+ # }.should change(roster, :count).by_at_most(1)
117
+ #
91
118
  # string = "string"
92
119
  # lambda {
93
- # string.reverse
120
+ # string.reverse!
94
121
  # }.should change { string }.from("string").to("gnirts")
95
122
  #
96
123
  # lambda {
@@ -101,20 +128,24 @@ EOF
101
128
  # employee.develop_great_new_social_networking_app
102
129
  # }.should change(employee, :title).from("Mail Clerk").to("CEO")
103
130
  #
104
- # Evaluates +receiver.message+ or +block+ before and
105
- # after it evaluates the c object (generated by the lambdas in the examples above).
131
+ # Evaluates <tt>receiver.message</tt> or <tt>block</tt> before and after
132
+ # it evaluates the c object (generated by the lambdas in the examples
133
+ # above).
134
+ #
135
+ # Then compares the values before and after the <tt>receiver.message</tt>
136
+ # and evaluates the difference compared to the expected difference.
106
137
  #
107
- # Then compares the values before and after the +receiver.message+ and
108
- # evaluates the difference compared to the expected difference.
138
+ # == WARNING
139
+ # <tt>should_not change</tt> only supports the form with no
140
+ # subsequent calls to <tt>by</tt>, <tt>by_at_least</tt>,
141
+ # <tt>by_at_most</tt>, <tt>to</tt> or <tt>from</tt>.
109
142
  #
110
- # == Warning
111
- # +should_not+ +change+ only supports the form with no subsequent calls to
112
- # +be+, +to+ or +from+.
143
+ # blocks passed to <tt>should</tt> <tt>change</tt> and <tt>should_not</tt>
144
+ # <tt>change</tt> must use the <tt>{}</tt> form (<tt>do/end</tt> is not
145
+ # supported).
113
146
  #
114
- # blocks passed to +should+ +change+ and +should_not+ +change+
115
- # must use the <tt>{}</tt> form (<tt>do/end</tt> is not supported)
116
- def change(target=nil, message=nil, &block)
117
- Matchers::Change.new(target, message, &block)
147
+ def change(receiver=nil, message=nil, &block)
148
+ Matchers::Change.new(receiver, message, &block)
118
149
  end
119
150
  end
120
151
  end
@@ -0,0 +1,14 @@
1
+ Spec::Matchers.constants.each do |c|
2
+ if Class === (klass = Spec::Matchers.const_get(c))
3
+ if klass.public_instance_methods.any? {|m| ['failure_message_for_should',:failure_message_for_should].include?(m)}
4
+ klass.class_eval do
5
+ alias_method :failure_message, :failure_message_for_should
6
+ end
7
+ end
8
+ if klass.public_instance_methods.any? {|m| ['failure_message_for_should_not',:failure_message_for_should_not].include?(m)}
9
+ klass.class_eval do
10
+ alias_method :negative_failure_message, :failure_message_for_should_not
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,20 @@
1
+ module Spec
2
+ module Matchers
3
+ module DSL
4
+ # See Spec::Matchers
5
+ def define(name, &declarations)
6
+ define_method name do |*expected|
7
+ Spec::Matchers::Matcher.new name, *expected, &declarations
8
+ end
9
+ end
10
+
11
+ # Deprecated - use define
12
+ def create(name, &declarations)
13
+ Spec.deprecate("Spec::Matchers.create","Spec::Matchers.define")
14
+ define(name, &declarations)
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ Spec::Matchers.extend Spec::Matchers::DSL
@@ -1,29 +1,5 @@
1
1
  module Spec
2
2
  module Matchers
3
-
4
- class Eql #:nodoc:
5
- def initialize(expected)
6
- @expected = expected
7
- end
8
-
9
- def matches?(actual)
10
- @actual = actual
11
- @actual.eql?(@expected)
12
- end
13
-
14
- def failure_message
15
- return "expected #{@expected.inspect}, got #{@actual.inspect} (using .eql?)", @expected, @actual
16
- end
17
-
18
- def negative_failure_message
19
- return "expected #{@actual.inspect} not to equal #{@expected.inspect} (using .eql?)", @expected, @actual
20
- end
21
-
22
- def description
23
- "eql #{@expected.inspect}"
24
- end
25
- end
26
-
27
3
  # :call-seq:
28
4
  # should eql(expected)
29
5
  # should_not eql(expected)
@@ -37,7 +13,30 @@ module Spec
37
13
  # 5.should eql(5)
38
14
  # 5.should_not eql(3)
39
15
  def eql(expected)
40
- Matchers::Eql.new(expected)
16
+ Matcher.new :eql, expected do |_expected_|
17
+ match do |actual|
18
+ actual.eql?(_expected_)
19
+ end
20
+
21
+ failure_message_for_should do |actual|
22
+ <<-MESSAGE
23
+
24
+ expected #{_expected_.inspect}
25
+ got #{actual.inspect}
26
+
27
+ (compared using eql?)
28
+ MESSAGE
29
+ end
30
+
31
+ failure_message_for_should_not do |actual|
32
+ <<-MESSAGE
33
+
34
+ expected #{actual.inspect} not to equal #{_expected_.inspect}
35
+
36
+ (compared using eql?)
37
+ MESSAGE
38
+ end
39
+ end
41
40
  end
42
41
  end
43
- end
42
+ end
@@ -1,29 +1,6 @@
1
1
  module Spec
2
2
  module Matchers
3
-
4
- class Equal #:nodoc:
5
- def initialize(expected)
6
- @expected = expected
7
- end
8
-
9
- def matches?(actual)
10
- @actual = actual
11
- @actual.equal?(@expected)
12
- end
13
-
14
- def failure_message
15
- return "expected #{@expected.inspect}, got #{@actual.inspect} (using .equal?)", @expected, @actual
16
- end
17
3
 
18
- def negative_failure_message
19
- return "expected #{@actual.inspect} not to equal #{@expected.inspect} (using .equal?)", @expected, @actual
20
- end
21
-
22
- def description
23
- "equal #{@expected.inspect}"
24
- end
25
- end
26
-
27
4
  # :call-seq:
28
5
  # should equal(expected)
29
6
  # should_not equal(expected)
@@ -37,7 +14,40 @@ module Spec
37
14
  # 5.should equal(5) #Fixnums are equal
38
15
  # "5".should_not equal("5") #Strings that look the same are not the same object
39
16
  def equal(expected)
40
- Matchers::Equal.new(expected)
17
+ Matcher.new :equal, expected do |_expected_|
18
+ match do |actual|
19
+ actual.equal?(_expected_)
20
+ end
21
+
22
+ def inspect_object(o)
23
+ "#<#{o.class}:#{o.object_id}> => #{o.inspect}"
24
+ end
25
+
26
+ failure_message_for_should do |actual|
27
+ <<-MESSAGE
28
+
29
+ expected #{inspect_object(_expected_)}
30
+ got #{inspect_object(actual)}
31
+
32
+ Compared using equal?, which compares object identity,
33
+ but expected and actual are not the same object. Use
34
+ 'actual.should == expected' if you don't care about
35
+ object identity in this example.
36
+
37
+ MESSAGE
38
+ end
39
+
40
+ failure_message_for_should_not do |actual|
41
+ <<-MESSAGE
42
+
43
+ expected not #{inspect_object(actual)}
44
+ got #{inspect_object(_expected_)}
45
+
46
+ Compared using equal?, which compares object identity.
47
+
48
+ MESSAGE
49
+ end
50
+ end
41
51
  end
42
52
  end
43
- end
53
+ end
@@ -0,0 +1,5 @@
1
+ module Spec
2
+ module Matchers
3
+ class MatcherError < StandardError; end
4
+ end
5
+ end
@@ -0,0 +1,16 @@
1
+ module Spec
2
+ module Matchers
3
+ # :call-seq:
4
+ # should exist
5
+ # should_not exist
6
+ #
7
+ # Passes if actual.exist?
8
+ def exist(arg=nil)
9
+ Matcher.new :exist do
10
+ match do |actual|
11
+ arg ? actual.exist?(arg) : actual.exist?
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,36 @@
1
+ module Spec
2
+ module Matchers
3
+ class << self
4
+ attr_accessor :last_matcher, :last_should # :nodoc:
5
+ end
6
+
7
+ def self.clear_generated_description
8
+ self.last_matcher = nil
9
+ self.last_should = nil
10
+ end
11
+
12
+ def self.generated_description
13
+ return nil if last_should.nil?
14
+ "#{last_should.to_s.gsub('_',' ')} #{last_description}"
15
+ end
16
+
17
+ private
18
+
19
+ def self.last_description
20
+ last_matcher.respond_to?(:description) ? last_matcher.description : <<-MESSAGE
21
+ When you call a matcher in an example without a String, like this:
22
+
23
+ specify { object.should matcher }
24
+
25
+ or this:
26
+
27
+ it { should matcher }
28
+
29
+ RSpec expects the matcher to have a #description method. You should either
30
+ add a String to the example this matcher is being used in, or give it a
31
+ description method. Then you won't have to suffer this lengthy warning again.
32
+ MESSAGE
33
+ end
34
+ end
35
+ end
36
+
@@ -1,44 +1,35 @@
1
1
  module Spec
2
2
  module Matchers
3
3
 
4
- class Has #:nodoc:
5
- def initialize(sym, *args)
6
- @sym = sym
7
- @args = args
4
+ class Has
5
+
6
+ def initialize(expected, *args, &block)
7
+ @expected, @args, @block = expected, args, block
8
8
  end
9
9
 
10
- def matches?(target)
11
- @target = target
12
- begin
13
- return target.send(predicate, *@args)
14
- rescue => @error
15
- # This clause should be empty, but rcov will not report it as covered
16
- # unless something (anything) is executed within the clause
17
- rcov_error_report = "http://eigenclass.org/hiki.rb?rcov-0.8.0"
18
- end
19
- return false
10
+ def matches?(actual)
11
+ actual.__send__(predicate(@expected), *@args, &@block)
20
12
  end
21
13
 
22
- def failure_message
23
- raise @error if @error
24
- "expected ##{predicate}(#{@args[0].inspect}) to return true, got false"
14
+ def failure_message_for_should
15
+ "expected ##{predicate(@expected)}(#{@args[0].inspect}) to return true, got false"
25
16
  end
26
17
 
27
- def negative_failure_message
28
- raise @error if @error
29
- "expected ##{predicate}(#{@args[0].inspect}) to return false, got true"
18
+ def failure_message_for_should_not
19
+ "expected ##{predicate(@expected)}(#{@args[0].inspect}) to return false, got true"
30
20
  end
31
21
 
32
22
  def description
33
23
  "have key #{@args[0].inspect}"
34
24
  end
25
+
26
+ private
27
+
28
+ def predicate(sym)
29
+ "#{sym.to_s.sub("have_","has_")}?".to_sym
30
+ end
35
31
 
36
- private
37
- def predicate
38
- "#{@sym.to_s.sub("have_","has_")}?".to_sym
39
- end
40
-
41
32
  end
42
-
33
+
43
34
  end
44
35
  end
@@ -1,10 +1,11 @@
1
1
  module Spec
2
2
  module Matchers
3
-
4
3
  class Have #:nodoc:
5
4
  def initialize(expected, relativity=:exactly)
6
5
  @expected = (expected == :no ? 0 : expected)
7
6
  @relativity = relativity
7
+ @actual = nil
8
+ @plural_collection_name = nil
8
9
  end
9
10
 
10
11
  def relativities
@@ -15,61 +16,72 @@ module Spec
15
16
  }
16
17
  end
17
18
 
18
- def method_missing(sym, *args, &block)
19
- @collection_name = sym
20
- @args = args
21
- @block = block
22
- self
23
- end
24
-
25
19
  def matches?(collection_owner)
26
- if collection_owner.respond_to?(collection_name)
27
- collection = collection_owner.send(collection_name, *@args, &@block)
20
+ if collection_owner.respond_to?(@collection_name)
21
+ collection = collection_owner.__send__(@collection_name, *@args, &@block)
22
+ elsif (@plural_collection_name && collection_owner.respond_to?(@plural_collection_name))
23
+ collection = collection_owner.__send__(@plural_collection_name, *@args, &@block)
28
24
  elsif (collection_owner.respond_to?(:length) || collection_owner.respond_to?(:size))
29
25
  collection = collection_owner
30
26
  else
31
- collection_owner.send(collection_name, *@args, &@block)
27
+ collection_owner.__send__(@collection_name, *@args, &@block)
32
28
  end
33
- @actual = collection.length if collection.respond_to?(:length)
34
29
  @actual = collection.size if collection.respond_to?(:size)
30
+ @actual = collection.length if collection.respond_to?(:length)
31
+ raise not_a_collection if @actual.nil?
35
32
  return @actual >= @expected if @relativity == :at_least
36
33
  return @actual <= @expected if @relativity == :at_most
37
34
  return @actual == @expected
38
35
  end
36
+
37
+ def not_a_collection
38
+ "expected #{@collection_name} to be a collection but it does not respond to #length or #size"
39
+ end
39
40
 
40
- def failure_message
41
- "expected #{relative_expectation} #{collection_name}, got #{@actual}"
41
+ def failure_message_for_should
42
+ "expected #{relative_expectation} #{@collection_name}, got #{@actual}"
42
43
  end
43
44
 
44
- def negative_failure_message
45
+ def failure_message_for_should_not
45
46
  if @relativity == :exactly
46
- return "expected target not to have #{@expected} #{collection_name}, got #{@actual}"
47
+ return "expected target not to have #{@expected} #{@collection_name}, got #{@actual}"
47
48
  elsif @relativity == :at_most
48
49
  return <<-EOF
49
50
  Isn't life confusing enough?
50
51
  Instead of having to figure out the meaning of this:
51
- should_not have_at_most(#{@expected}).#{collection_name}
52
+ should_not have_at_most(#{@expected}).#{@collection_name}
52
53
  We recommend that you use this instead:
53
- should have_at_least(#{@expected + 1}).#{collection_name}
54
+ should have_at_least(#{@expected + 1}).#{@collection_name}
54
55
  EOF
55
56
  elsif @relativity == :at_least
56
57
  return <<-EOF
57
58
  Isn't life confusing enough?
58
59
  Instead of having to figure out the meaning of this:
59
- should_not have_at_least(#{@expected}).#{collection_name}
60
+ should_not have_at_least(#{@expected}).#{@collection_name}
60
61
  We recommend that you use this instead:
61
- should have_at_most(#{@expected - 1}).#{collection_name}
62
+ should have_at_most(#{@expected - 1}).#{@collection_name}
62
63
  EOF
63
64
  end
64
65
  end
65
66
 
66
67
  def description
67
- "have #{relative_expectation} #{collection_name}"
68
+ "have #{relative_expectation} #{@collection_name}"
68
69
  end
69
70
 
71
+ def respond_to?(sym)
72
+ @expected.respond_to?(sym) || super
73
+ end
74
+
70
75
  private
71
- def collection_name
72
- @collection_name
76
+
77
+ def method_missing(sym, *args, &block)
78
+ @collection_name = sym
79
+ if inflector = (defined?(ActiveSupport::Inflector) ? ActiveSupport::Inflector : (defined?(Inflector) ? Inflector : nil))
80
+ @plural_collection_name = inflector.pluralize(sym.to_s)
81
+ end
82
+ @args = args
83
+ @block = block
84
+ self
73
85
  end
74
86
 
75
87
  def relative_expectation
@@ -137,4 +149,4 @@ EOF
137
149
  Matchers::Have.new(n, :at_most)
138
150
  end
139
151
  end
140
- end
152
+ end
@@ -1,52 +1,5 @@
1
1
  module Spec
2
2
  module Matchers
3
-
4
- class Include #:nodoc:
5
-
6
- def initialize(*expecteds)
7
- @expecteds = expecteds
8
- end
9
-
10
- def matches?(actual)
11
- @actual = actual
12
- @expecteds.each do |expected|
13
- return false unless actual.include?(expected)
14
- end
15
- true
16
- end
17
-
18
- def failure_message
19
- _message
20
- end
21
-
22
- def negative_failure_message
23
- _message("not ")
24
- end
25
-
26
- def description
27
- "include #{_pretty_print(@expecteds)}"
28
- end
29
-
30
- private
31
- def _message(maybe_not="")
32
- "expected #{@actual.inspect} #{maybe_not}to include #{_pretty_print(@expecteds)}"
33
- end
34
-
35
- def _pretty_print(array)
36
- result = ""
37
- array.each_with_index do |item, index|
38
- if index < (array.length - 2)
39
- result << "#{item.inspect}, "
40
- elsif index < (array.length - 1)
41
- result << "#{item.inspect} and "
42
- else
43
- result << "#{item.inspect}"
44
- end
45
- end
46
- result
47
- end
48
- end
49
-
50
3
  # :call-seq:
51
4
  # should include(expected)
52
5
  # should_not include(expected)
@@ -64,7 +17,28 @@ module Spec
64
17
  # "spread".should include("read")
65
18
  # "spread".should_not include("red")
66
19
  def include(*expected)
67
- Matchers::Include.new(*expected)
20
+ Matcher.new :include, *expected do |*_expected_|
21
+ match do |actual|
22
+ helper(actual, *_expected_)
23
+ end
24
+
25
+ def helper(actual, *_expected_)
26
+ _expected_.each do |expected|
27
+ if actual.is_a?(Hash)
28
+ if expected.is_a?(Hash)
29
+ expected.each_pair do |k,v|
30
+ return false unless actual[k] == v
31
+ end
32
+ else
33
+ return false unless actual.has_key?(expected)
34
+ end
35
+ else
36
+ return false unless actual.include?(expected)
37
+ end
38
+ end
39
+ true
40
+ end
41
+ end
68
42
  end
69
43
  end
70
44
  end