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,106 @@
1
+ module Spec
2
+ module Matchers
3
+
4
+ class ThrowSymbol #:nodoc:
5
+ def initialize(expected_symbol = nil, expected_arg=nil)
6
+ @expected_symbol = expected_symbol
7
+ @expected_arg = expected_arg
8
+ @caught_symbol = nil
9
+ end
10
+
11
+ def matches?(given_proc)
12
+ begin
13
+ if @expected_symbol.nil?
14
+ given_proc.call
15
+ else
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
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
+
31
+ ensure
32
+ if @expected_symbol.nil?
33
+ return !@caught_symbol.nil?
34
+ else
35
+ if @expected_arg.nil?
36
+ return @caught_symbol == @expected_symbol
37
+ else
38
+ # puts [@caught_symbol, @expected_symbol].inspect
39
+ # puts [@caught_arg, @expected_arg].inspect
40
+ return @caught_symbol == @expected_symbol && @caught_arg == @expected_arg
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ def failure_message
47
+ if @caught_symbol
48
+ "expected #{expected}, got #{@caught_symbol.inspect}"
49
+ else
50
+ "expected #{expected} but nothing was thrown"
51
+ end
52
+ end
53
+
54
+ def negative_failure_message
55
+ if @expected_symbol
56
+ "expected #{expected} not to be thrown"
57
+ else
58
+ "expected no Symbol, got :#{@caught_symbol}"
59
+ end
60
+ end
61
+
62
+ def description
63
+ "throw #{expected}"
64
+ end
65
+
66
+ private
67
+
68
+ def expected
69
+ @expected_symbol.nil? ? "a Symbol" : "#{@expected_symbol.inspect}#{args}"
70
+ end
71
+
72
+ def args
73
+ @expected_arg.nil? ? "" : " with #{@expected_arg.inspect}"
74
+ end
75
+
76
+ end
77
+
78
+ # :call-seq:
79
+ # should throw_symbol()
80
+ # should throw_symbol(:sym)
81
+ # should throw_symbol(:sym, arg)
82
+ # should_not throw_symbol()
83
+ # should_not throw_symbol(:sym)
84
+ # should_not throw_symbol(:sym, arg)
85
+ #
86
+ # Given no argument, matches if a proc throws any Symbol.
87
+ #
88
+ # Given a Symbol, matches if the given proc throws the specified Symbol.
89
+ #
90
+ # Given a Symbol and an arg, matches if the given proc throws the
91
+ # specified Symbol with the specified arg.
92
+ #
93
+ # == Examples
94
+ #
95
+ # lambda { do_something_risky }.should throw_symbol
96
+ # lambda { do_something_risky }.should throw_symbol(:that_was_risky)
97
+ # lambda { do_something_risky }.should throw_symbol(:that_was_risky, culprit)
98
+ #
99
+ # lambda { do_something_risky }.should_not throw_symbol
100
+ # lambda { do_something_risky }.should_not throw_symbol(:that_was_risky)
101
+ # lambda { do_something_risky }.should_not throw_symbol(:that_was_risky, culprit)
102
+ def throw_symbol(sym=nil)
103
+ Matchers::ThrowSymbol.new(sym)
104
+ end
105
+ end
106
+ 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
@@ -0,0 +1,141 @@
1
+ require 'spec/matchers/operator_matcher'
2
+ require 'spec/matchers/generated_descriptions'
3
+ require 'spec/matchers/errors'
4
+ require 'spec/matchers/method_missing'
5
+ require 'spec/matchers/simple_matcher'
6
+ require 'spec/matchers/be'
7
+ require 'spec/matchers/be_close'
8
+ require 'spec/matchers/change'
9
+ require 'spec/matchers/match_array'
10
+ require 'spec/matchers/eql'
11
+ require 'spec/matchers/equal'
12
+ require 'spec/matchers/exist'
13
+ require 'spec/matchers/has'
14
+ require 'spec/matchers/have'
15
+ require 'spec/matchers/include'
16
+ require 'spec/matchers/match'
17
+ require 'spec/matchers/raise_error'
18
+ require 'spec/matchers/respond_to'
19
+ require 'spec/matchers/satisfy'
20
+ require 'spec/matchers/throw_symbol'
21
+ require 'spec/matchers/wrap_expectation'
22
+
23
+ module Spec
24
+
25
+ # RSpec ships with a number of useful Expression Matchers. An Expression Matcher
26
+ # is any object that responds to the following methods:
27
+ #
28
+ # matches?(actual)
29
+ # failure_message
30
+ # negative_failure_message #optional
31
+ # description #optional
32
+ #
33
+ # See Spec::Expectations to learn how to use these as Expectation Matchers.
34
+ # See Spec::Mocks to learn how to use them as Mock Argument Matchers.
35
+ #
36
+ # == Predicates
37
+ #
38
+ # In addition to those Expression Matchers that are defined explicitly, RSpec will
39
+ # create custom Matchers on the fly for any arbitrary predicate, giving your specs
40
+ # a much more natural language feel.
41
+ #
42
+ # A Ruby predicate is a method that ends with a "?" and returns true or false.
43
+ # Common examples are +empty?+, +nil?+, and +instance_of?+.
44
+ #
45
+ # All you need to do is write +should be_+ followed by the predicate without
46
+ # the question mark, and RSpec will figure it out from there. For example:
47
+ #
48
+ # [].should be_empty => [].empty? #passes
49
+ # [].should_not be_empty => [].empty? #fails
50
+ #
51
+ # In addtion to prefixing the predicate matchers with "be_", you can also use "be_a_"
52
+ # and "be_an_", making your specs read much more naturally:
53
+ #
54
+ # "a string".should be_an_instance_of(String) =>"a string".instance_of?(String) #passes
55
+ #
56
+ # 3.should be_a_kind_of(Fixnum) => 3.kind_of?(Numeric) #passes
57
+ # 3.should be_a_kind_of(Numeric) => 3.kind_of?(Numeric) #passes
58
+ # 3.should be_an_instance_of(Fixnum) => 3.instance_of?(Fixnum) #passes
59
+ # 3.should_not be_instance_of(Numeric) => 3.instance_of?(Numeric) #fails
60
+ #
61
+ # RSpec will also create custom matchers for predicates like +has_key?+. To
62
+ # use this feature, just state that the object should have_key(:key) and RSpec will
63
+ # call has_key?(:key) on the target. For example:
64
+ #
65
+ # {:a => "A"}.should have_key(:a) => {:a => "A"}.has_key?(:a) #passes
66
+ # {:a => "A"}.should have_key(:b) => {:a => "A"}.has_key?(:b) #fails
67
+ #
68
+ # You can use this feature to invoke any predicate that begins with "has_", whether it is
69
+ # part of the Ruby libraries (like +Hash#has_key?+) or a method you wrote on your own class.
70
+ #
71
+ # == Custom Expectation Matchers
72
+ #
73
+ # When you find that none of the stock Expectation Matchers provide a natural
74
+ # feeling expectation, you can very easily write your own.
75
+ #
76
+ # For example, imagine that you are writing a game in which players can
77
+ # be in various zones on a virtual board. To specify that bob should
78
+ # be in zone 4, you could say:
79
+ #
80
+ # bob.current_zone.should eql(Zone.new("4"))
81
+ #
82
+ # But you might find it more expressive to say:
83
+ #
84
+ # bob.should be_in_zone("4")
85
+ #
86
+ # and/or
87
+ #
88
+ # bob.should_not be_in_zone("3")
89
+ #
90
+ # To do this, you would need to write a class like this:
91
+ #
92
+ # class BeInZone
93
+ # def initialize(expected)
94
+ # @expected = expected
95
+ # end
96
+ # def matches?(target)
97
+ # @target = target
98
+ # @target.current_zone.eql?(Zone.new(@expected))
99
+ # end
100
+ # def failure_message
101
+ # "expected #{@target.inspect} to be in Zone #{@expected}"
102
+ # end
103
+ # def negative_failure_message
104
+ # "expected #{@target.inspect} not to be in Zone #{@expected}"
105
+ # end
106
+ # end
107
+ #
108
+ # ... and a method like this:
109
+ #
110
+ # def be_in_zone(expected)
111
+ # BeInZone.new(expected)
112
+ # end
113
+ #
114
+ # And then expose the method to your specs. This is normally done
115
+ # by including the method and the class in a module, which is then
116
+ # included in your spec:
117
+ #
118
+ # module CustomGameMatchers
119
+ # class BeInZone
120
+ # ...
121
+ # end
122
+ #
123
+ # def be_in_zone(expected)
124
+ # ...
125
+ # end
126
+ # end
127
+ #
128
+ # describe "Player behaviour" do
129
+ # include CustomGameMatchers
130
+ # ...
131
+ # end
132
+ #
133
+ # or you can include in globally in a spec_helper.rb file <tt>require</tt>d
134
+ # from your spec file(s):
135
+ #
136
+ # Spec::Runner.configure do |config|
137
+ # config.include(CustomGameMatchers)
138
+ # end
139
+ #
140
+ module Matchers; end
141
+ end
@@ -0,0 +1,49 @@
1
+ module Spec
2
+ module Mocks
3
+
4
+ class ArgumentExpectation
5
+ attr_reader :args
6
+
7
+ def initialize(args, &block)
8
+ @args = args
9
+ @matchers_block = block
10
+
11
+ if ArgumentMatchers::AnyArgsMatcher === args.first
12
+ @match_any_args = true
13
+ elsif ArgumentMatchers::NoArgsMatcher === args.first
14
+ @matchers = []
15
+ else
16
+ @matchers = args.collect {|arg| matcher_for(arg)}
17
+ end
18
+ end
19
+
20
+ def matcher_for(arg)
21
+ return ArgumentMatchers::MatcherMatcher.new(arg) if is_matcher?(arg)
22
+ return ArgumentMatchers::RegexpMatcher.new(arg) if arg.is_a?(Regexp)
23
+ return ArgumentMatchers::EqualityProxy.new(arg)
24
+ end
25
+
26
+ def is_matcher?(obj)
27
+ return obj.respond_to?(:matches?) && obj.respond_to?(:description)
28
+ end
29
+
30
+ def args_match?(given_args)
31
+ match_any_args? || matchers_block_matches?(given_args) || matchers_match?(given_args)
32
+ end
33
+
34
+ def matchers_block_matches?(given_args)
35
+ @matchers_block ? @matchers_block.call(*given_args) : nil
36
+ end
37
+
38
+ def matchers_match?(given_args)
39
+ @matchers == given_args
40
+ end
41
+
42
+ def match_any_args?
43
+ @match_any_args
44
+ end
45
+
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,237 @@
1
+ module Spec
2
+ module Mocks
3
+
4
+ # ArgumentMatchers are messages that you can include in message
5
+ # expectations to match arguments against a broader check than simple
6
+ # equality.
7
+ #
8
+ # With the exception of any_args() and no_args(), the matchers
9
+ # are all positional - they match against the arg in the given position.
10
+ module ArgumentMatchers
11
+
12
+ class AnyArgsMatcher
13
+ def description
14
+ "any args"
15
+ end
16
+ end
17
+
18
+ class AnyArgMatcher
19
+ def initialize(ignore)
20
+ end
21
+
22
+ def ==(other)
23
+ true
24
+ end
25
+ end
26
+
27
+ class NoArgsMatcher
28
+ def description
29
+ "no args"
30
+ end
31
+
32
+ def ==(args)
33
+ args == []
34
+ end
35
+ end
36
+
37
+ class RegexpMatcher
38
+ def initialize(regexp)
39
+ @regexp = regexp
40
+ end
41
+
42
+ def ==(value)
43
+ return value =~ @regexp unless value.is_a?(Regexp)
44
+ value == @regexp
45
+ end
46
+ end
47
+
48
+ class BooleanMatcher
49
+ def initialize(ignore)
50
+ end
51
+
52
+ def ==(value)
53
+ TrueClass === value || FalseClass === value
54
+ end
55
+ end
56
+
57
+ class HashIncludingMatcher
58
+ def initialize(expected)
59
+ @expected = expected
60
+ end
61
+
62
+ def ==(actual)
63
+ @expected.each do | key, value |
64
+ return false unless actual.has_key?(key) && value == actual[key]
65
+ end
66
+ true
67
+ rescue NoMethodError => ex
68
+ return false
69
+ end
70
+
71
+ def description
72
+ "hash_including(#{@expected.inspect.sub(/^\{/,"").sub(/\}$/,"")})"
73
+ end
74
+ end
75
+
76
+ class HashNotIncludingMatcher
77
+ def initialize(expected)
78
+ @expected = expected
79
+ end
80
+
81
+ def ==(actual)
82
+ @expected.each do | key, value |
83
+ return false if actual.has_key?(key) && value == actual[key]
84
+ end
85
+ true
86
+ rescue NoMethodError => ex
87
+ return false
88
+ end
89
+
90
+ def description
91
+ "hash_not_including(#{@expected.inspect.sub(/^\{/,"").sub(/\}$/,"")})"
92
+ end
93
+ end
94
+
95
+ class DuckTypeMatcher
96
+ def initialize(*methods_to_respond_to)
97
+ @methods_to_respond_to = methods_to_respond_to
98
+ end
99
+
100
+ def ==(value)
101
+ @methods_to_respond_to.all? { |sym| value.respond_to?(sym) }
102
+ end
103
+ end
104
+
105
+ class MatcherMatcher
106
+ def initialize(matcher)
107
+ @matcher = matcher
108
+ end
109
+
110
+ def ==(value)
111
+ @matcher.matches?(value)
112
+ end
113
+ end
114
+
115
+ class EqualityProxy
116
+ def initialize(given)
117
+ @given = given
118
+ end
119
+
120
+ def ==(expected)
121
+ @given == expected
122
+ end
123
+ end
124
+
125
+ class InstanceOf
126
+ def initialize(klass)
127
+ @klass = klass
128
+ end
129
+
130
+ def ==(actual)
131
+ actual.instance_of?(@klass)
132
+ end
133
+ end
134
+
135
+ class KindOf
136
+ def initialize(klass)
137
+ @klass = klass
138
+ end
139
+
140
+ def ==(actual)
141
+ actual.kind_of?(@klass)
142
+ end
143
+ end
144
+
145
+ # :call-seq:
146
+ # object.should_receive(:message).with(any_args())
147
+ #
148
+ # Passes if object receives :message with any args at all. This is
149
+ # really a more explicit variation of object.should_receive(:message)
150
+ def any_args
151
+ AnyArgsMatcher.new
152
+ end
153
+
154
+ # :call-seq:
155
+ # object.should_receive(:message).with(anything())
156
+ #
157
+ # Passes as long as there is an argument.
158
+ def anything
159
+ AnyArgMatcher.new(nil)
160
+ end
161
+
162
+ # :call-seq:
163
+ # object.should_receive(:message).with(no_args)
164
+ #
165
+ # Passes if no arguments are passed along with the message
166
+ def no_args
167
+ NoArgsMatcher.new
168
+ end
169
+
170
+ # :call-seq:
171
+ # object.should_receive(:message).with(duck_type(:hello))
172
+ # object.should_receive(:message).with(duck_type(:hello, :goodbye))
173
+ #
174
+ # Passes if the argument responds to the specified messages.
175
+ #
176
+ # == Examples
177
+ #
178
+ # array = []
179
+ # display = mock('display')
180
+ # display.should_receive(:present_names).with(duck_type(:length, :each))
181
+ # => passes
182
+ def duck_type(*args)
183
+ DuckTypeMatcher.new(*args)
184
+ end
185
+
186
+ # :call-seq:
187
+ # object.should_receive(:message).with(boolean())
188
+ #
189
+ # Passes if the argument is boolean.
190
+ def boolean
191
+ BooleanMatcher.new(nil)
192
+ end
193
+
194
+ # :call-seq:
195
+ # object.should_receive(:message).with(hash_including(:key => val))
196
+ # object.should_receive(:message).with(hash_including(:key))
197
+ # object.should_receive(:message).with(hash_including(:key, :key2 => val2))
198
+ # Passes if the argument is a hash that includes the specified key(s) or key/value
199
+ # pairs. If the hash includes other keys, it will still pass.
200
+ def hash_including(*args)
201
+ HashIncludingMatcher.new(anythingize_lonely_keys(*args))
202
+ end
203
+
204
+ # :call-seq:
205
+ # object.should_receive(:message).with(hash_not_including(:key => val))
206
+ # object.should_receive(:message).with(hash_not_including(:key))
207
+ # object.should_receive(:message).with(hash_not_including(:key, :key2 => :val2))
208
+ #
209
+ # Passes if the argument is a hash that doesn't include the specified key(s) or key/value
210
+ def hash_not_including(*args)
211
+ HashNotIncludingMatcher.new(anythingize_lonely_keys(*args))
212
+ end
213
+
214
+ # Passes if arg.instance_of?(klass)
215
+ def instance_of(klass)
216
+ InstanceOf.new(klass)
217
+ end
218
+
219
+ alias_method :an_instance_of, :instance_of
220
+
221
+ # Passes if arg.kind_of?(klass)
222
+ def kind_of(klass)
223
+ KindOf.new(klass)
224
+ end
225
+
226
+ alias_method :a_kind_of, :kind_of
227
+
228
+ private
229
+
230
+ def anythingize_lonely_keys(*args)
231
+ hash = args.last.class == Hash ? args.delete_at(-1) : {}
232
+ args.each { | arg | hash[arg] = anything }
233
+ hash
234
+ end
235
+ end
236
+ end
237
+ end
@@ -0,0 +1,82 @@
1
+ module Spec
2
+ module Mocks
3
+ class ErrorGenerator
4
+ attr_writer :opts
5
+
6
+ def initialize(target, name)
7
+ @target = target
8
+ @name = name
9
+ end
10
+
11
+ def opts
12
+ @opts ||= {}
13
+ end
14
+
15
+ def raise_unexpected_message_error(sym, *args)
16
+ __raise "#{intro} received unexpected message :#{sym}#{arg_message(*args)}"
17
+ end
18
+
19
+ def raise_unexpected_message_args_error(expectation, *args)
20
+ expected_args = format_args(*expectation.expected_args)
21
+ actual_args = args.empty? ? "(no args)" : format_args(*args)
22
+ __raise "#{intro} expected #{expectation.sym.inspect} with #{expected_args} but received it with #{actual_args}"
23
+ end
24
+
25
+ def raise_expectation_error(sym, expected_received_count, actual_received_count, *args)
26
+ __raise "#{intro} expected :#{sym}#{arg_message(*args)} #{count_message(expected_received_count)}, but received it #{count_message(actual_received_count)}"
27
+ end
28
+
29
+ def raise_out_of_order_error(sym)
30
+ __raise "#{intro} received :#{sym} out of order"
31
+ end
32
+
33
+ def raise_block_failed_error(sym, detail)
34
+ __raise "#{intro} received :#{sym} but passed block failed with: #{detail}"
35
+ end
36
+
37
+ def raise_missing_block_error(args_to_yield)
38
+ __raise "#{intro} asked to yield |#{arg_list(*args_to_yield)}| but no block was passed"
39
+ end
40
+
41
+ def raise_wrong_arity_error(args_to_yield, arity)
42
+ __raise "#{intro} yielded |#{arg_list(*args_to_yield)}| to block with arity of #{arity}"
43
+ end
44
+
45
+ private
46
+ def intro
47
+ @name ? "Mock '#{@name}'" : @target.class == Class ? "<#{@target.inspect} (class)>" : (@target.nil? ? "nil" : @target.to_s)
48
+ end
49
+
50
+ def __raise(message)
51
+ message = opts[:message] unless opts[:message].nil?
52
+ Kernel::raise(Spec::Mocks::MockExpectationError, message)
53
+ end
54
+
55
+ def arg_message(*args)
56
+ " with " + format_args(*args)
57
+ end
58
+
59
+ def format_args(*args)
60
+ args.empty? ? "(no args)" : "(" + arg_list(*args) + ")"
61
+ end
62
+
63
+ def arg_list(*args)
64
+ args.collect do |arg|
65
+ arg.respond_to?(:description) ? arg.description : arg.inspect
66
+ end.join(", ")
67
+ end
68
+
69
+ def count_message(count)
70
+ return "at least #{pretty_print(count.abs)}" if count < 0
71
+ return pretty_print(count)
72
+ end
73
+
74
+ def pretty_print(count)
75
+ return "once" if count == 1
76
+ return "twice" if count == 2
77
+ return "#{count} times"
78
+ end
79
+
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,10 @@
1
+ module Spec
2
+ module Mocks
3
+ class MockExpectationError < StandardError
4
+ end
5
+
6
+ class AmbiguousReturnError < StandardError
7
+ end
8
+ end
9
+ end
10
+
@@ -0,0 +1,3 @@
1
+ class Object
2
+ include Spec::Mocks::Methods
3
+ end
@@ -0,0 +1 @@
1
+ require 'spec/mocks/extensions/object'
@@ -0,0 +1,15 @@
1
+ # Require everything except the global extensions of class and object. This
2
+ # supports wrapping rspec's mocking functionality without invading every
3
+ # object in the system.
4
+
5
+ require 'spec/mocks/methods'
6
+ require 'spec/mocks/argument_matchers'
7
+ require 'spec/mocks/spec_methods'
8
+ require 'spec/mocks/proxy'
9
+ require 'spec/mocks/mock'
10
+ require 'spec/mocks/argument_expectation'
11
+ require 'spec/mocks/message_expectation'
12
+ require 'spec/mocks/order_group'
13
+ require 'spec/mocks/errors'
14
+ require 'spec/mocks/error_generator'
15
+ require 'spec/mocks/space'