newbamboo-rspec 1.1.12

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 (324) hide show
  1. data/.autotest +4 -0
  2. data/History.txt +1263 -0
  3. data/License.txt +22 -0
  4. data/Manifest.txt +327 -0
  5. data/README.txt +57 -0
  6. data/Rakefile +104 -0
  7. data/TODO.txt +18 -0
  8. data/bin/autospec +4 -0
  9. data/bin/spec +4 -0
  10. data/examples/failing/README.txt +7 -0
  11. data/examples/failing/diffing_spec.rb +36 -0
  12. data/examples/failing/failing_autogenerated_docstrings_example.rb +19 -0
  13. data/examples/failing/failure_in_after.rb +10 -0
  14. data/examples/failing/failure_in_before.rb +10 -0
  15. data/examples/failing/mocking_example.rb +40 -0
  16. data/examples/failing/mocking_with_flexmock.rb +26 -0
  17. data/examples/failing/mocking_with_mocha.rb +25 -0
  18. data/examples/failing/mocking_with_rr.rb +27 -0
  19. data/examples/failing/partial_mock_example.rb +20 -0
  20. data/examples/failing/predicate_example.rb +34 -0
  21. data/examples/failing/raising_example.rb +47 -0
  22. data/examples/failing/spec_helper.rb +3 -0
  23. data/examples/failing/syntax_error_example.rb +7 -0
  24. data/examples/failing/team_spec.rb +44 -0
  25. data/examples/failing/timeout_behaviour.rb +7 -0
  26. data/examples/passing/autogenerated_docstrings_example.rb +25 -0
  27. data/examples/passing/before_and_after_example.rb +40 -0
  28. data/examples/passing/behave_as_example.rb +45 -0
  29. data/examples/passing/custom_expectation_matchers.rb +54 -0
  30. data/examples/passing/custom_formatter.rb +12 -0
  31. data/examples/passing/dynamic_spec.rb +9 -0
  32. data/examples/passing/file_accessor.rb +19 -0
  33. data/examples/passing/file_accessor_spec.rb +38 -0
  34. data/examples/passing/greeter_spec.rb +31 -0
  35. data/examples/passing/helper_method_example.rb +14 -0
  36. data/examples/passing/io_processor.rb +8 -0
  37. data/examples/passing/io_processor_spec.rb +21 -0
  38. data/examples/passing/legacy_spec.rb +11 -0
  39. data/examples/passing/mocking_example.rb +27 -0
  40. data/examples/passing/multi_threaded_example_group_runner.rb +26 -0
  41. data/examples/passing/nested_classes_example.rb +36 -0
  42. data/examples/passing/partial_mock_example.rb +29 -0
  43. data/examples/passing/pending_example.rb +20 -0
  44. data/examples/passing/predicate_example.rb +27 -0
  45. data/examples/passing/priority.txt +1 -0
  46. data/examples/passing/shared_example_group_example.rb +81 -0
  47. data/examples/passing/shared_stack_examples.rb +36 -0
  48. data/examples/passing/simple_matcher_example.rb +31 -0
  49. data/examples/passing/spec_helper.rb +3 -0
  50. data/examples/passing/stack.rb +36 -0
  51. data/examples/passing/stack_spec.rb +64 -0
  52. data/examples/passing/stack_spec_with_nested_example_groups.rb +67 -0
  53. data/examples/passing/stubbing_example.rb +69 -0
  54. data/examples/passing/yielding_example.rb +33 -0
  55. data/examples/ruby1.9.compatibility/access_to_constants_spec.rb +86 -0
  56. data/features/before_and_after_blocks/before_and_after_blocks.feature +168 -0
  57. data/features/example_groups/autogenerated_docstrings.feature +45 -0
  58. data/features/example_groups/example_group_with_should_methods.feature +17 -0
  59. data/features/example_groups/nested_groups.feature +17 -0
  60. data/features/example_groups/output.feature +20 -0
  61. data/features/interop/examples_and_tests_together.feature +31 -0
  62. data/features/interop/test_but_not_test_unit.feature +14 -0
  63. data/features/interop/test_case_with_should_methods.feature +17 -0
  64. data/features/mock_framework_integration/use_flexmock.feature +27 -0
  65. data/features/step_definitions/running_rspec.rb +54 -0
  66. data/features/support/env.rb +26 -0
  67. data/features/support/helpers/cmdline.rb +9 -0
  68. data/features/support/matchers/smart_match.rb +37 -0
  69. data/init.rb +9 -0
  70. data/lib/adapters/mock_frameworks/flexmock.rb +24 -0
  71. data/lib/adapters/mock_frameworks/mocha.rb +20 -0
  72. data/lib/adapters/mock_frameworks/rr.rb +22 -0
  73. data/lib/adapters/mock_frameworks/rspec.rb +20 -0
  74. data/lib/autotest/discover.rb +3 -0
  75. data/lib/autotest/rspec.rb +47 -0
  76. data/lib/spec/dsl/main.rb +87 -0
  77. data/lib/spec/dsl.rb +1 -0
  78. data/lib/spec/example/before_and_after_hooks.rb +99 -0
  79. data/lib/spec/example/errors.rb +30 -0
  80. data/lib/spec/example/example_group.rb +26 -0
  81. data/lib/spec/example/example_group_factory.rb +98 -0
  82. data/lib/spec/example/example_group_methods.rb +376 -0
  83. data/lib/spec/example/example_matcher.rb +44 -0
  84. data/lib/spec/example/example_methods.rb +137 -0
  85. data/lib/spec/example/module_reopening_fix.rb +21 -0
  86. data/lib/spec/example/pending.rb +18 -0
  87. data/lib/spec/example/shared_example_group.rb +59 -0
  88. data/lib/spec/example.rb +187 -0
  89. data/lib/spec/expectations/differs/default.rb +66 -0
  90. data/lib/spec/expectations/errors.rb +12 -0
  91. data/lib/spec/expectations/extensions/object.rb +63 -0
  92. data/lib/spec/expectations/extensions/string_and_symbol.rb +17 -0
  93. data/lib/spec/expectations/extensions.rb +2 -0
  94. data/lib/spec/expectations/handler.rb +32 -0
  95. data/lib/spec/expectations.rb +60 -0
  96. data/lib/spec/interop/test/unit/autorunner.rb +6 -0
  97. data/lib/spec/interop/test/unit/testcase.rb +73 -0
  98. data/lib/spec/interop/test/unit/testresult.rb +6 -0
  99. data/lib/spec/interop/test/unit/testsuite_adapter.rb +34 -0
  100. data/lib/spec/interop/test/unit/ui/console/testrunner.rb +61 -0
  101. data/lib/spec/interop/test.rb +12 -0
  102. data/lib/spec/matchers/be.rb +208 -0
  103. data/lib/spec/matchers/be_close.rb +21 -0
  104. data/lib/spec/matchers/change.rb +148 -0
  105. data/lib/spec/matchers/eql.rb +25 -0
  106. data/lib/spec/matchers/equal.rb +25 -0
  107. data/lib/spec/matchers/errors.rb +5 -0
  108. data/lib/spec/matchers/exist.rb +16 -0
  109. data/lib/spec/matchers/generated_descriptions.rb +48 -0
  110. data/lib/spec/matchers/has.rb +15 -0
  111. data/lib/spec/matchers/have.rb +150 -0
  112. data/lib/spec/matchers/include.rb +80 -0
  113. data/lib/spec/matchers/match.rb +22 -0
  114. data/lib/spec/matchers/match_array.rb +79 -0
  115. data/lib/spec/matchers/method_missing.rb +9 -0
  116. data/lib/spec/matchers/operator_matcher.rb +70 -0
  117. data/lib/spec/matchers/raise_error.rb +128 -0
  118. data/lib/spec/matchers/respond_to.rb +71 -0
  119. data/lib/spec/matchers/satisfy.rb +47 -0
  120. data/lib/spec/matchers/simple_matcher.rb +132 -0
  121. data/lib/spec/matchers/throw_symbol.rb +106 -0
  122. data/lib/spec/matchers/wrap_expectation.rb +55 -0
  123. data/lib/spec/matchers.rb +141 -0
  124. data/lib/spec/mocks/argument_expectation.rb +49 -0
  125. data/lib/spec/mocks/argument_matchers.rb +237 -0
  126. data/lib/spec/mocks/error_generator.rb +82 -0
  127. data/lib/spec/mocks/errors.rb +10 -0
  128. data/lib/spec/mocks/extensions/object.rb +3 -0
  129. data/lib/spec/mocks/extensions.rb +1 -0
  130. data/lib/spec/mocks/framework.rb +15 -0
  131. data/lib/spec/mocks/message_expectation.rb +331 -0
  132. data/lib/spec/mocks/methods.rb +51 -0
  133. data/lib/spec/mocks/mock.rb +55 -0
  134. data/lib/spec/mocks/order_group.rb +29 -0
  135. data/lib/spec/mocks/proxy.rb +230 -0
  136. data/lib/spec/mocks/space.rb +28 -0
  137. data/lib/spec/mocks/spec_methods.rb +55 -0
  138. data/lib/spec/mocks.rb +200 -0
  139. data/lib/spec/rake/spectask.rb +225 -0
  140. data/lib/spec/rake/verify_rcov.rb +52 -0
  141. data/lib/spec/ruby.rb +9 -0
  142. data/lib/spec/runner/backtrace_tweaker.rb +58 -0
  143. data/lib/spec/runner/class_and_arguments_parser.rb +14 -0
  144. data/lib/spec/runner/command_line.rb +35 -0
  145. data/lib/spec/runner/configuration.rb +166 -0
  146. data/lib/spec/runner/drb_command_line.rb +20 -0
  147. data/lib/spec/runner/example_group_runner.rb +70 -0
  148. data/lib/spec/runner/formatter/base_formatter.rb +79 -0
  149. data/lib/spec/runner/formatter/base_text_formatter.rb +127 -0
  150. data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +27 -0
  151. data/lib/spec/runner/formatter/failing_examples_formatter.rb +20 -0
  152. data/lib/spec/runner/formatter/html_formatter.rb +340 -0
  153. data/lib/spec/runner/formatter/nested_text_formatter.rb +65 -0
  154. data/lib/spec/runner/formatter/profile_formatter.rb +51 -0
  155. data/lib/spec/runner/formatter/progress_bar_formatter.rb +34 -0
  156. data/lib/spec/runner/formatter/snippet_extractor.rb +52 -0
  157. data/lib/spec/runner/formatter/specdoc_formatter.rb +39 -0
  158. data/lib/spec/runner/formatter/text_mate_formatter.rb +16 -0
  159. data/lib/spec/runner/heckle_runner.rb +74 -0
  160. data/lib/spec/runner/heckle_runner_unsupported.rb +10 -0
  161. data/lib/spec/runner/option_parser.rb +204 -0
  162. data/lib/spec/runner/options.rb +320 -0
  163. data/lib/spec/runner/reporter.rb +167 -0
  164. data/lib/spec/runner/spec_parser.rb +73 -0
  165. data/lib/spec/runner.rb +88 -0
  166. data/lib/spec/version.rb +15 -0
  167. data/lib/spec.rb +7 -0
  168. data/resources/rake/examples.rake +7 -0
  169. data/resources/rake/examples_with_rcov.rake +9 -0
  170. data/resources/rake/failing_examples_with_html.rake +9 -0
  171. data/resources/rake/verify_rcov.rake +7 -0
  172. data/resources/spec/example_group_with_should_methods.rb +12 -0
  173. data/resources/spec/simple_spec.rb +8 -0
  174. data/resources/test/spec_and_test_together.rb +57 -0
  175. data/resources/test/spec_including_test_but_not_unit.rb +11 -0
  176. data/resources/test/test_case_with_should_methods.rb +30 -0
  177. data/rspec.gemspec +32 -0
  178. data/spec/README.jruby +15 -0
  179. data/spec/autotest/autotest_helper.rb +6 -0
  180. data/spec/autotest/autotest_matchers.rb +47 -0
  181. data/spec/autotest/discover_spec.rb +8 -0
  182. data/spec/autotest/failed_results_re_spec.rb +24 -0
  183. data/spec/autotest/rspec_spec.rb +114 -0
  184. data/spec/rspec_suite.rb +6 -0
  185. data/spec/ruby_forker.rb +13 -0
  186. data/spec/spec/dsl/main_spec.rb +88 -0
  187. data/spec/spec/example/example_group_class_definition_spec.rb +49 -0
  188. data/spec/spec/example/example_group_factory_spec.rb +224 -0
  189. data/spec/spec/example/example_group_methods_spec.rb +653 -0
  190. data/spec/spec/example/example_group_spec.rb +661 -0
  191. data/spec/spec/example/example_matcher_spec.rb +79 -0
  192. data/spec/spec/example/example_methods_spec.rb +204 -0
  193. data/spec/spec/example/helper_method_spec.rb +24 -0
  194. data/spec/spec/example/nested_example_group_spec.rb +71 -0
  195. data/spec/spec/example/pending_module_spec.rb +139 -0
  196. data/spec/spec/example/predicate_matcher_spec.rb +21 -0
  197. data/spec/spec/example/shared_example_group_spec.rb +257 -0
  198. data/spec/spec/example/subclassing_example_group_spec.rb +25 -0
  199. data/spec/spec/expectations/differs/default_spec.rb +127 -0
  200. data/spec/spec/expectations/extensions/object_spec.rb +45 -0
  201. data/spec/spec/expectations/fail_with_spec.rb +71 -0
  202. data/spec/spec/expectations/wrap_expectation_spec.rb +30 -0
  203. data/spec/spec/interop/test/unit/resources/spec_that_fails.rb +10 -0
  204. data/spec/spec/interop/test/unit/resources/spec_that_passes.rb +10 -0
  205. data/spec/spec/interop/test/unit/resources/spec_with_errors.rb +10 -0
  206. data/spec/spec/interop/test/unit/resources/spec_with_options_hash.rb +13 -0
  207. data/spec/spec/interop/test/unit/resources/test_case_that_fails.rb +10 -0
  208. data/spec/spec/interop/test/unit/resources/test_case_that_passes.rb +10 -0
  209. data/spec/spec/interop/test/unit/resources/test_case_with_errors.rb +10 -0
  210. data/spec/spec/interop/test/unit/resources/testsuite_adapter_spec_with_test_unit.rb +38 -0
  211. data/spec/spec/interop/test/unit/spec_spec.rb +48 -0
  212. data/spec/spec/interop/test/unit/test_unit_spec_helper.rb +18 -0
  213. data/spec/spec/interop/test/unit/testcase_spec.rb +49 -0
  214. data/spec/spec/interop/test/unit/testsuite_adapter_spec.rb +9 -0
  215. data/spec/spec/matchers/be_close_spec.rb +41 -0
  216. data/spec/spec/matchers/be_spec.rb +303 -0
  217. data/spec/spec/matchers/change_spec.rb +329 -0
  218. data/spec/spec/matchers/description_generation_spec.rb +172 -0
  219. data/spec/spec/matchers/eql_spec.rb +29 -0
  220. data/spec/spec/matchers/equal_spec.rb +29 -0
  221. data/spec/spec/matchers/exist_spec.rb +57 -0
  222. data/spec/spec/matchers/handler_spec.rb +111 -0
  223. data/spec/spec/matchers/has_spec.rb +63 -0
  224. data/spec/spec/matchers/have_spec.rb +399 -0
  225. data/spec/spec/matchers/include_spec.rb +88 -0
  226. data/spec/spec/matchers/match_array_spec.rb +83 -0
  227. data/spec/spec/matchers/match_spec.rb +37 -0
  228. data/spec/spec/matchers/matcher_methods_spec.rb +66 -0
  229. data/spec/spec/matchers/operator_matcher_spec.rb +191 -0
  230. data/spec/spec/matchers/raise_error_spec.rb +333 -0
  231. data/spec/spec/matchers/respond_to_spec.rb +116 -0
  232. data/spec/spec/matchers/satisfy_spec.rb +36 -0
  233. data/spec/spec/matchers/simple_matcher_spec.rb +93 -0
  234. data/spec/spec/matchers/throw_symbol_spec.rb +96 -0
  235. data/spec/spec/mocks/any_number_of_times_spec.rb +36 -0
  236. data/spec/spec/mocks/argument_expectation_spec.rb +23 -0
  237. data/spec/spec/mocks/at_least_spec.rb +97 -0
  238. data/spec/spec/mocks/at_most_spec.rb +93 -0
  239. data/spec/spec/mocks/bug_report_10260_spec.rb +8 -0
  240. data/spec/spec/mocks/bug_report_10263_spec.rb +24 -0
  241. data/spec/spec/mocks/bug_report_11545_spec.rb +32 -0
  242. data/spec/spec/mocks/bug_report_15719_spec.rb +30 -0
  243. data/spec/spec/mocks/bug_report_496.rb +19 -0
  244. data/spec/spec/mocks/bug_report_600_spec.rb +22 -0
  245. data/spec/spec/mocks/bug_report_7611_spec.rb +19 -0
  246. data/spec/spec/mocks/bug_report_7805_spec.rb +22 -0
  247. data/spec/spec/mocks/bug_report_8165_spec.rb +31 -0
  248. data/spec/spec/mocks/bug_report_8302_spec.rb +26 -0
  249. data/spec/spec/mocks/failing_argument_matchers_spec.rb +95 -0
  250. data/spec/spec/mocks/hash_including_matcher_spec.rb +90 -0
  251. data/spec/spec/mocks/hash_not_including_matcher_spec.rb +67 -0
  252. data/spec/spec/mocks/mock_ordering_spec.rb +84 -0
  253. data/spec/spec/mocks/mock_space_spec.rb +54 -0
  254. data/spec/spec/mocks/mock_spec.rb +579 -0
  255. data/spec/spec/mocks/multiple_return_value_spec.rb +113 -0
  256. data/spec/spec/mocks/nil_expectation_warning_spec.rb +53 -0
  257. data/spec/spec/mocks/null_object_mock_spec.rb +54 -0
  258. data/spec/spec/mocks/once_counts_spec.rb +53 -0
  259. data/spec/spec/mocks/options_hash_spec.rb +35 -0
  260. data/spec/spec/mocks/partial_mock_spec.rb +149 -0
  261. data/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +66 -0
  262. data/spec/spec/mocks/passing_argument_matchers_spec.rb +145 -0
  263. data/spec/spec/mocks/precise_counts_spec.rb +52 -0
  264. data/spec/spec/mocks/record_messages_spec.rb +26 -0
  265. data/spec/spec/mocks/stub_spec.rb +194 -0
  266. data/spec/spec/mocks/stubbed_message_expectations_spec.rb +14 -0
  267. data/spec/spec/mocks/twice_counts_spec.rb +67 -0
  268. data/spec/spec/package/bin_spec_spec.rb +22 -0
  269. data/spec/spec/runner/class_and_argument_parser_spec.rb +23 -0
  270. data/spec/spec/runner/command_line_spec.rb +141 -0
  271. data/spec/spec/runner/configuration_spec.rb +301 -0
  272. data/spec/spec/runner/drb_command_line_spec.rb +97 -0
  273. data/spec/spec/runner/empty_file.txt +0 -0
  274. data/spec/spec/runner/example_group_runner_spec.rb +33 -0
  275. data/spec/spec/runner/examples.txt +2 -0
  276. data/spec/spec/runner/failed.txt +3 -0
  277. data/spec/spec/runner/formatter/base_formatter_spec.rb +23 -0
  278. data/spec/spec/runner/formatter/base_text_formatter_spec.rb +23 -0
  279. data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +45 -0
  280. data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +33 -0
  281. data/spec/spec/runner/formatter/html_formatted-1.8.4.html +365 -0
  282. data/spec/spec/runner/formatter/html_formatted-1.8.5-jruby.html +387 -0
  283. data/spec/spec/runner/formatter/html_formatted-1.8.5.html +371 -0
  284. data/spec/spec/runner/formatter/html_formatted-1.8.6-jruby.html +381 -0
  285. data/spec/spec/runner/formatter/html_formatted-1.8.6.html +379 -0
  286. data/spec/spec/runner/formatter/html_formatted-1.8.7.html +379 -0
  287. data/spec/spec/runner/formatter/html_formatted-1.9.1.html +379 -0
  288. data/spec/spec/runner/formatter/html_formatter_spec.rb +62 -0
  289. data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +318 -0
  290. data/spec/spec/runner/formatter/profile_formatter_spec.rb +65 -0
  291. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +145 -0
  292. data/spec/spec/runner/formatter/snippet_extractor_spec.rb +18 -0
  293. data/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +104 -0
  294. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +159 -0
  295. data/spec/spec/runner/formatter/text_mate_formatted-1.8.4.html +365 -0
  296. data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +373 -0
  297. data/spec/spec/runner/formatter/text_mate_formatted-1.8.7.html +373 -0
  298. data/spec/spec/runner/formatter/text_mate_formatted-1.9.1.html +373 -0
  299. data/spec/spec/runner/heckle_runner_spec.rb +78 -0
  300. data/spec/spec/runner/heckler_spec.rb +20 -0
  301. data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +45 -0
  302. data/spec/spec/runner/option_parser_spec.rb +396 -0
  303. data/spec/spec/runner/options_spec.rb +469 -0
  304. data/spec/spec/runner/output_one_time_fixture.rb +7 -0
  305. data/spec/spec/runner/output_one_time_fixture_runner.rb +8 -0
  306. data/spec/spec/runner/output_one_time_spec.rb +16 -0
  307. data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +62 -0
  308. data/spec/spec/runner/reporter_spec.rb +238 -0
  309. data/spec/spec/runner/resources/a_bar.rb +0 -0
  310. data/spec/spec/runner/resources/a_foo.rb +0 -0
  311. data/spec/spec/runner/resources/a_spec.rb +1 -0
  312. data/spec/spec/runner/resources/custom_example_group_runner.rb +14 -0
  313. data/spec/spec/runner/resources/utf8_encoded.rb +7 -0
  314. data/spec/spec/runner/spec.opts +2 -0
  315. data/spec/spec/runner/spec_drb.opts +1 -0
  316. data/spec/spec/runner/spec_parser/spec_parser_fixture.rb +70 -0
  317. data/spec/spec/runner/spec_parser_spec.rb +91 -0
  318. data/spec/spec/runner/spec_spaced.opts +2 -0
  319. data/spec/spec/runner_spec.rb +11 -0
  320. data/spec/spec/spec_classes.rb +133 -0
  321. data/spec/spec/spec_spec.rb +21 -0
  322. data/spec/spec.opts +6 -0
  323. data/spec/spec_helper.rb +107 -0
  324. metadata +388 -0
@@ -0,0 +1,80 @@
1
+ module Spec
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
+ if actual.is_a?(Hash)
14
+ if expected.is_a?(Hash)
15
+ expected.each_pair do |k,v|
16
+ return false unless actual[k] == v
17
+ end
18
+ else
19
+ return false unless actual.has_key?(expected)
20
+ end
21
+ else
22
+ return false unless actual.include?(expected)
23
+ end
24
+ end
25
+ true
26
+ end
27
+
28
+ def failure_message
29
+ _message
30
+ end
31
+
32
+ def negative_failure_message
33
+ _message("not ")
34
+ end
35
+
36
+ def description
37
+ "include #{_pretty_print(@expecteds)}"
38
+ end
39
+
40
+ private
41
+ def _message(maybe_not="")
42
+ "expected #{@actual.inspect} #{maybe_not}to include #{_pretty_print(@expecteds)}"
43
+ end
44
+
45
+ def _pretty_print(array)
46
+ result = ""
47
+ array.each_with_index do |item, index|
48
+ if index < (array.length - 2)
49
+ result << "#{item.inspect}, "
50
+ elsif index < (array.length - 1)
51
+ result << "#{item.inspect} and "
52
+ else
53
+ result << "#{item.inspect}"
54
+ end
55
+ end
56
+ result
57
+ end
58
+ end
59
+
60
+ # :call-seq:
61
+ # should include(expected)
62
+ # should_not include(expected)
63
+ #
64
+ # Passes if actual includes expected. This works for
65
+ # collections and Strings. You can also pass in multiple args
66
+ # and it will only pass if all args are found in collection.
67
+ #
68
+ # == Examples
69
+ #
70
+ # [1,2,3].should include(3)
71
+ # [1,2,3].should include(2,3) #would pass
72
+ # [1,2,3].should include(2,3,4) #would fail
73
+ # [1,2,3].should_not include(4)
74
+ # "spread".should include("read")
75
+ # "spread".should_not include("red")
76
+ def include(*expected)
77
+ Matchers::Include.new(*expected)
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,22 @@
1
+ module Spec
2
+ module Matchers
3
+
4
+ # :call-seq:
5
+ # should match(regexp)
6
+ # should_not match(regexp)
7
+ #
8
+ # Given a Regexp, passes if actual =~ regexp
9
+ #
10
+ # == Examples
11
+ #
12
+ # email.should match(/^([^\s]+)((?:[-a-z0-9]+\.)+[a-z]{2,})$/i)
13
+ def match(regexp)
14
+ simple_matcher do |actual, matcher|
15
+ matcher.failure_message = "expected #{actual.inspect} to match #{regexp.inspect}", regexp, actual
16
+ matcher.negative_failure_message = "expected #{actual.inspect} not to match #{regexp.inspect}", regexp, actual
17
+ matcher.description = "match #{regexp.inspect}"
18
+ actual =~ regexp
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,79 @@
1
+ module Spec
2
+ module Matchers
3
+
4
+ class MatchArray #:nodoc:
5
+
6
+ def initialize(expected)
7
+ @expected = expected
8
+ end
9
+
10
+ def matches?(actual)
11
+ @actual = actual
12
+ @extra_items = difference_between_arrays(@actual, @expected)
13
+ @missing_items = difference_between_arrays(@expected, @actual)
14
+ @extra_items.empty? && @missing_items.empty?
15
+ end
16
+
17
+ def failure_message
18
+ message = "expected collection contained: #{@expected.sort.inspect}\n"
19
+ message += "actual collection contained: #{@actual.sort.inspect}\n"
20
+ message += "the missing elements were: #{@missing_items.sort.inspect}\n" unless @missing_items.empty?
21
+ message += "the extra elements were: #{@extra_items.sort.inspect}\n" unless @extra_items.empty?
22
+ message
23
+ end
24
+
25
+ def negative_failure_message
26
+ "Matcher does not support should_not"
27
+ end
28
+
29
+ def description
30
+ "contain exactly #{_pretty_print(@expected)}"
31
+ end
32
+
33
+ private
34
+
35
+ def difference_between_arrays(array_1, array_2)
36
+ difference = array_1.dup
37
+ array_2.each do |element|
38
+ if index = difference.index(element)
39
+ difference.delete_at(index)
40
+ end
41
+ end
42
+ difference
43
+ end
44
+
45
+ def _pretty_print(array)
46
+ result = ""
47
+ array.each_with_index do |item, index|
48
+ if index < (array.length - 2)
49
+ result << "#{item.inspect}, "
50
+ elsif index < (array.length - 1)
51
+ result << "#{item.inspect} and "
52
+ else
53
+ result << "#{item.inspect}"
54
+ end
55
+ end
56
+ result
57
+ end
58
+
59
+ end
60
+
61
+ # :call-seq:
62
+ # should =~ expected
63
+ #
64
+ # Passes if actual contains all of the expected regardless of order.
65
+ # This works for collections. Pass in multiple args and it will only
66
+ # pass if all args are found in collection.
67
+ #
68
+ # NOTE: there is no should_not version of array.should =~ other_array
69
+ #
70
+ # == Examples
71
+ #
72
+ # [1,2,3].should =~ [1,2,3] # => would pass
73
+ # [1,2,3].should =~ [2,3,1] # => would pass
74
+ # [1,2,3,4].should =~ [1,2,3] # => would fail
75
+ # [1,2,2,3].should =~ [1,2,3] # => would fail
76
+ # [1,2,3].should =~ [1,2,3,4] # => would fail
77
+ OperatorMatcher.register(Array, '=~', Spec::Matchers::MatchArray)
78
+ end
79
+ end
@@ -0,0 +1,9 @@
1
+ module Spec
2
+ module Matchers
3
+ def method_missing(sym, *args, &block) # :nodoc:
4
+ return Matchers::Be.new(sym, *args) if sym.starts_with?("be_")
5
+ return has(sym, *args) if sym.starts_with?("have_")
6
+ super
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,70 @@
1
+ module Spec
2
+ module Matchers
3
+
4
+ class OperatorMatcher
5
+ class << self
6
+ def registry
7
+ @registry ||= Hash.new {|h,k| h[k] = {}}
8
+ end
9
+
10
+ def register(klass, operator, matcher)
11
+ registry[klass][operator] = matcher
12
+ end
13
+
14
+ def get(klass, operator)
15
+ registry[klass][operator]
16
+ end
17
+ end
18
+
19
+ def initialize(actual)
20
+ @actual = actual
21
+ end
22
+
23
+ def self.use_custom_matcher_or_delegate(operator)
24
+ define_method(operator) do |expected|
25
+ if matcher = OperatorMatcher.get(@actual.class, operator)
26
+ @actual.send(::Spec::Matchers.last_should, matcher.new(expected))
27
+ else
28
+ ::Spec::Matchers.last_matcher = self
29
+ @operator, @expected = operator, expected
30
+ __delegate_operator(@actual, operator, expected)
31
+ end
32
+ end
33
+ end
34
+
35
+ ['==', '===', '=~', '>', '>=', '<', '<='].each do |operator|
36
+ use_custom_matcher_or_delegate operator
37
+ end
38
+
39
+ def fail_with_message(message)
40
+ Spec::Expectations.fail_with(message, @expected, @actual)
41
+ end
42
+
43
+ def description
44
+ "#{@operator} #{@expected.inspect}"
45
+ end
46
+
47
+ end
48
+
49
+ class PositiveOperatorMatcher < OperatorMatcher #:nodoc:
50
+ def __delegate_operator(actual, operator, expected)
51
+ return true if actual.__send__(operator, expected)
52
+ if ['==','===', '=~'].include?(operator)
53
+ fail_with_message("expected: #{expected.inspect},\n got: #{actual.inspect} (using #{operator})")
54
+ else
55
+ fail_with_message("expected: #{operator} #{expected.inspect},\n got: #{operator.gsub(/./, ' ')} #{actual.inspect}")
56
+ end
57
+ end
58
+
59
+ end
60
+
61
+ class NegativeOperatorMatcher < OperatorMatcher #:nodoc:
62
+ def __delegate_operator(actual, operator, expected)
63
+ return true unless actual.__send__(operator, expected)
64
+ return fail_with_message("expected not: #{operator} #{expected.inspect},\n got: #{operator.gsub(/./, ' ')} #{actual.inspect}")
65
+ end
66
+
67
+ end
68
+
69
+ end
70
+ end
@@ -0,0 +1,128 @@
1
+ module Spec
2
+ module Matchers
3
+ class RaiseError #:nodoc:
4
+ def initialize(expected_error_or_message=Exception, expected_message=nil, &block)
5
+ @block = block
6
+ case expected_error_or_message
7
+ when String, Regexp
8
+ @expected_error, @expected_message = Exception, expected_error_or_message
9
+ else
10
+ @expected_error, @expected_message = expected_error_or_message, expected_message
11
+ end
12
+ end
13
+
14
+ def matches?(given_proc)
15
+ @raised_expected_error = false
16
+ @with_expected_message = false
17
+ @eval_block = false
18
+ @eval_block_passed = false
19
+ begin
20
+ given_proc.call
21
+ rescue @expected_error => @given_error
22
+ @raised_expected_error = true
23
+ @with_expected_message = verify_message
24
+ rescue Exception => @given_error
25
+ # This clause should be empty, but rcov will not report it as covered
26
+ # unless something (anything) is executed within the clause
27
+ rcov_error_report = "http://eigenclass.org/hiki.rb?rcov-0.8.0"
28
+ end
29
+
30
+ unless negative_expectation?
31
+ eval_block if @raised_expected_error && @with_expected_message && @block
32
+ end
33
+ ensure
34
+ return (@raised_expected_error && @with_expected_message) ? (@eval_block ? @eval_block_passed : true) : false
35
+ end
36
+
37
+ def eval_block
38
+ @eval_block = true
39
+ begin
40
+ @block[@given_error]
41
+ @eval_block_passed = true
42
+ rescue Exception => err
43
+ @given_error = err
44
+ end
45
+ end
46
+
47
+ def verify_message
48
+ case @expected_message
49
+ when nil
50
+ true
51
+ when Regexp
52
+ @expected_message =~ @given_error.message
53
+ else
54
+ @expected_message == @given_error.message
55
+ end
56
+ end
57
+
58
+ def failure_message
59
+ @eval_block ? @given_error.message : "expected #{expected_error}#{given_error}"
60
+ end
61
+
62
+ def negative_failure_message
63
+ "expected no #{expected_error}#{given_error}"
64
+ end
65
+
66
+ def description
67
+ "raise #{expected_error}"
68
+ end
69
+
70
+ private
71
+ def expected_error
72
+ case @expected_message
73
+ when nil
74
+ @expected_error
75
+ when Regexp
76
+ "#{@expected_error} with message matching #{@expected_message.inspect}"
77
+ else
78
+ "#{@expected_error} with #{@expected_message.inspect}"
79
+ end
80
+ end
81
+
82
+ def given_error
83
+ @given_error.nil? ? " but nothing was raised" : ", got #{@given_error.inspect}"
84
+ end
85
+
86
+ def negative_expectation?
87
+ # YES - I'm a bad person... help me find a better way - ryand
88
+ caller.first(3).find { |s| s =~ /should_not/ }
89
+ end
90
+ end
91
+
92
+ # :call-seq:
93
+ # should raise_error()
94
+ # should raise_error(NamedError)
95
+ # should raise_error(NamedError, String)
96
+ # should raise_error(NamedError, Regexp)
97
+ # should raise_error() { |error| ... }
98
+ # should raise_error(NamedError) { |error| ... }
99
+ # should raise_error(NamedError, String) { |error| ... }
100
+ # should raise_error(NamedError, Regexp) { |error| ... }
101
+ # should_not raise_error()
102
+ # should_not raise_error(NamedError)
103
+ # should_not raise_error(NamedError, String)
104
+ # should_not raise_error(NamedError, Regexp)
105
+ #
106
+ # With no args, matches if any error is raised.
107
+ # With a named error, matches only if that specific error is raised.
108
+ # With a named error and messsage specified as a String, matches only if both match.
109
+ # With a named error and messsage specified as a Regexp, matches only if both match.
110
+ # Pass an optional block to perform extra verifications on the exception matched
111
+ #
112
+ # == Examples
113
+ #
114
+ # lambda { do_something_risky }.should raise_error
115
+ # lambda { do_something_risky }.should raise_error(PoorRiskDecisionError)
116
+ # lambda { do_something_risky }.should raise_error(PoorRiskDecisionError) { |error| error.data.should == 42 }
117
+ # lambda { do_something_risky }.should raise_error(PoorRiskDecisionError, "that was too risky")
118
+ # lambda { do_something_risky }.should raise_error(PoorRiskDecisionError, /oo ri/)
119
+ #
120
+ # lambda { do_something_risky }.should_not raise_error
121
+ # lambda { do_something_risky }.should_not raise_error(PoorRiskDecisionError)
122
+ # lambda { do_something_risky }.should_not raise_error(PoorRiskDecisionError, "that was too risky")
123
+ # lambda { do_something_risky }.should_not raise_error(PoorRiskDecisionError, /oo ri/)
124
+ def raise_error(error=Exception, message=nil, &block)
125
+ Matchers::RaiseError.new(error, message, &block)
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,71 @@
1
+ module Spec
2
+ module Matchers
3
+
4
+ class RespondTo #:nodoc:
5
+ def initialize(*names)
6
+ @names = names
7
+ @expected_arity = nil
8
+ @names_not_responded_to = []
9
+ end
10
+
11
+ def matches?(actual)
12
+ @actual = actual
13
+ @names.each do |name|
14
+ @names_not_responded_to << name unless actual.respond_to?(name) && matches_arity?(actual, name)
15
+ end
16
+ return @names_not_responded_to.empty?
17
+ end
18
+
19
+ def failure_message
20
+ "expected #{@actual.inspect} to respond to #{@names_not_responded_to.collect {|name| name.inspect }.join(', ')}#{with_arity}"
21
+ end
22
+
23
+ def negative_failure_message
24
+ "expected #{@actual.inspect} not to respond to #{@names.collect {|name| name.inspect }.join(', ')}"
25
+ end
26
+
27
+ def description
28
+ # Ruby 1.9 returns the same thing for array.to_s as array.inspect, so just use array.inspect here
29
+ "respond to #{pp_names}#{with_arity}"
30
+ end
31
+
32
+ def with(n)
33
+ @expected_arity = n
34
+ self
35
+ end
36
+
37
+ def argument
38
+ self
39
+ end
40
+ alias :arguments :argument
41
+
42
+ private
43
+
44
+ def matches_arity?(actual, name)
45
+ @expected_arity.nil?? true : @expected_arity == actual.method(name).arity
46
+ end
47
+
48
+ def with_arity
49
+ @expected_arity.nil?? "" :
50
+ " with #{@expected_arity} argument#{@expected_arity == 1 ? '' : 's'}"
51
+ end
52
+
53
+ def pp_names
54
+ @names.length == 1 ? "##{@names.first}" : @names.inspect
55
+ end
56
+ end
57
+
58
+ # :call-seq:
59
+ # should respond_to(*names)
60
+ # should_not respond_to(*names)
61
+ #
62
+ # Matches if the target object responds to all of the names
63
+ # provided. Names can be Strings or Symbols.
64
+ #
65
+ # == Examples
66
+ #
67
+ def respond_to(*names)
68
+ Matchers::RespondTo.new(*names)
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,47 @@
1
+ module Spec
2
+ module Matchers
3
+
4
+ class Satisfy #:nodoc:
5
+ def initialize(&block)
6
+ @block = block
7
+ end
8
+
9
+ def matches?(given, &block)
10
+ @block = block if block
11
+ @given = given
12
+ @block.call(given)
13
+ end
14
+
15
+ def failure_message
16
+ "expected #{@given} to satisfy block"
17
+ end
18
+
19
+ def negative_failure_message
20
+ "expected #{@given} not to satisfy block"
21
+ end
22
+ end
23
+
24
+ # :call-seq:
25
+ # should satisfy {}
26
+ # should_not satisfy {}
27
+ #
28
+ # Passes if the submitted block returns true. Yields target to the
29
+ # block.
30
+ #
31
+ # Generally speaking, this should be thought of as a last resort when
32
+ # you can't find any other way to specify the behaviour you wish to
33
+ # specify.
34
+ #
35
+ # If you do find yourself in such a situation, you could always write
36
+ # a custom matcher, which would likely make your specs more expressive.
37
+ #
38
+ # == Examples
39
+ #
40
+ # 5.should satisfy { |n|
41
+ # n > 3
42
+ # }
43
+ def satisfy(&block)
44
+ Matchers::Satisfy.new(&block)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,132 @@
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
+ end
10
+
11
+ def matches?(given)
12
+ @given = given
13
+ case @match_block.arity
14
+ when 2
15
+ @match_block.call(@given, self)
16
+ else
17
+ @match_block.call(@given)
18
+ end
19
+ end
20
+
21
+ def description
22
+ @description || explanation
23
+ end
24
+
25
+ def failure_message
26
+ @failure_message || (@description.nil? ? explanation : %[expected #{@description.inspect} but got #{@given.inspect}])
27
+ end
28
+
29
+ def negative_failure_message
30
+ @negative_failure_message || (@description.nil? ? explanation : %[expected not to get #{@description.inspect}, but got #{@given.inspect}])
31
+ end
32
+
33
+ def explanation
34
+ "No description provided. See RDoc for simple_matcher()"
35
+ end
36
+ end
37
+
38
+ # simple_matcher makes it easy for you to create your own custom matchers
39
+ # in just a few lines of code when you don't need all the power of a
40
+ # completely custom matcher object.
41
+ #
42
+ # The <tt>description</tt> argument will appear as part of any failure
43
+ # message, and is also the source for auto-generated descriptions.
44
+ #
45
+ # The <tt>match_block</tt> can have an arity of 1 or 2. The first block
46
+ # argument will be the given value. The second, if the block accepts it
47
+ # will be the matcher itself, giving you access to set custom failure
48
+ # messages in favor of the defaults.
49
+ #
50
+ # The <tt>match_block</tt> should return a boolean: <tt>true</tt>
51
+ # indicates a match, which will pass if you use <tt>should</tt> and fail
52
+ # if you use <tt>should_not</tt>. false (or nil) indicates no match,
53
+ # which will do the reverse: fail if you use <tt>should</tt> and pass if
54
+ # you use <tt>should_not</tt>.
55
+ #
56
+ # An error in the <tt>match_block</tt> will bubble up, resulting in a
57
+ # failure.
58
+ #
59
+ # == Example with default messages
60
+ #
61
+ # def be_even
62
+ # simple_matcher("an even number") { |given| given % 2 == 0 }
63
+ # end
64
+ #
65
+ # describe 2 do
66
+ # it "should be even" do
67
+ # 2.should be_even
68
+ # end
69
+ # end
70
+ #
71
+ # Given an odd number, this example would produce an error message stating:
72
+ # expected "an even number", got 3.
73
+ #
74
+ # Unfortunately, if you're a fan of auto-generated descriptions, this will
75
+ # produce "should an even number." Not the most desirable result. You can
76
+ # control that using custom messages:
77
+ #
78
+ # == Example with custom messages
79
+ #
80
+ # def rhyme_with(expected)
81
+ # simple_matcher("rhyme with #{expected.inspect}") do |given, matcher|
82
+ # matcher.failure_message = "expected #{given.inspect} to rhyme with #{expected.inspect}"
83
+ # matcher.negative_failure_message = "expected #{given.inspect} not to rhyme with #{expected.inspect}"
84
+ # given.rhymes_with? expected
85
+ # end
86
+ # end
87
+ #
88
+ # # OR
89
+ #
90
+ # def rhyme_with(expected)
91
+ # simple_matcher do |given, matcher|
92
+ # matcher.description = "rhyme with #{expected.inspect}"
93
+ # matcher.failure_message = "expected #{given.inspect} to rhyme with #{expected.inspect}"
94
+ # matcher.negative_failure_message = "expected #{given.inspect} not to rhyme with #{expected.inspect}"
95
+ # given.rhymes_with? expected
96
+ # end
97
+ # end
98
+ #
99
+ # describe "pecan" do
100
+ # it "should rhyme with 'be gone'" do
101
+ # nut = "pecan"
102
+ # nut.extend Rhymer
103
+ # nut.should rhyme_with("be gone")
104
+ # end
105
+ # end
106
+ #
107
+ # The resulting messages would be:
108
+ # description: rhyme with "be gone"
109
+ # failure_message: expected "pecan" to rhyme with "be gone"
110
+ # negative failure_message: expected "pecan" not to rhyme with "be gone"
111
+ #
112
+ # == Wrapped Expectations
113
+ #
114
+ # Because errors will bubble up, it is possible to wrap other expectations
115
+ # in a SimpleMatcher.
116
+ #
117
+ # def be_even
118
+ # simple_matcher("an even number") { |given| (given % 2).should == 0 }
119
+ # end
120
+ #
121
+ # BE VERY CAREFUL when you do this. Only use wrapped expectations for
122
+ # matchers that will always be used in only the positive
123
+ # (<tt>should</tt>) or negative (<tt>should_not</tt>), but not both.
124
+ # The reason is that is you wrap a <tt>should</tt> and call the wrapper
125
+ # with <tt>should_not</tt>, the correct result (the <tt>should</tt>
126
+ # failing), will fail when you want it to pass.
127
+ #
128
+ def simple_matcher(description=nil, &match_block)
129
+ SimpleMatcher.new(description, &match_block)
130
+ end
131
+ end
132
+ end