opal-connect-rspec 0.5.0

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 (685) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +5 -0
  3. data/.gitmodules +15 -0
  4. data/.travis.yml +51 -0
  5. data/.yardopts +5 -0
  6. data/CHANGELOG.md +54 -0
  7. data/Gemfile +19 -0
  8. data/README.md +325 -0
  9. data/Rakefile +169 -0
  10. data/config.ru +15 -0
  11. data/example/Gemfile +4 -0
  12. data/example/README.md +13 -0
  13. data/example/Rakefile +8 -0
  14. data/example/opal/user.rb +11 -0
  15. data/example/spec/user_spec.rb +15 -0
  16. data/gemfiles/opal_master.gemfile +18 -0
  17. data/lib/opal-rspec.rb +2 -0
  18. data/lib/opal/rspec.rb +39 -0
  19. data/lib/opal/rspec/cached_environment.rb +25 -0
  20. data/lib/opal/rspec/post_rack_locator.rb +20 -0
  21. data/lib/opal/rspec/pre_rack_locator.rb +32 -0
  22. data/lib/opal/rspec/rake_task.rb +132 -0
  23. data/lib/opal/rspec/sprockets_environment.rb +37 -0
  24. data/lib/opal/rspec/version.rb +5 -0
  25. data/opal-rspec.gemspec +21 -0
  26. data/opal/opal-rspec.rb +1 -0
  27. data/opal/opal/rspec.rb +23 -0
  28. data/opal/opal/rspec/async.rb +5 -0
  29. data/opal/opal/rspec/async/async_example.rb +96 -0
  30. data/opal/opal/rspec/async/example_group.rb +96 -0
  31. data/opal/opal/rspec/async/hooks.rb +10 -0
  32. data/opal/opal/rspec/async/legacy.rb +50 -0
  33. data/opal/opal/rspec/async/reporter.rb +9 -0
  34. data/opal/opal/rspec/fixes.rb +5 -0
  35. data/opal/opal/rspec/fixes/opal.rb +5 -0
  36. data/opal/opal/rspec/fixes/opal/class.rb +8 -0
  37. data/opal/opal/rspec/fixes/opal/compatibility.rb +228 -0
  38. data/opal/opal/rspec/fixes/opal/corelib.rb +3 -0
  39. data/opal/opal/rspec/fixes/opal/corelib/error.rb +61 -0
  40. data/opal/opal/rspec/fixes/opal/corelib/regexp.rb +92 -0
  41. data/opal/opal/rspec/fixes/opal/corelib/struct.rb +260 -0
  42. data/opal/opal/rspec/fixes/opal/kernel.rb +80 -0
  43. data/opal/opal/rspec/fixes/opal/stdlib.rb +2 -0
  44. data/opal/opal/rspec/fixes/opal/stdlib/pp.rb +23 -0
  45. data/opal/opal/rspec/fixes/opal/stdlib/set.rb +36 -0
  46. data/opal/opal/rspec/fixes/rspec.rb +7 -0
  47. data/opal/opal/rspec/fixes/rspec/caller_filter.rb +6 -0
  48. data/opal/opal/rspec/fixes/rspec/core.rb +9 -0
  49. data/opal/opal/rspec/fixes/rspec/core/configuration.rb +11 -0
  50. data/opal/opal/rspec/fixes/rspec/core/example.rb +20 -0
  51. data/opal/opal/rspec/fixes/rspec/core/example_group.rb +9 -0
  52. data/opal/opal/rspec/fixes/rspec/core/formatters.rb +6 -0
  53. data/opal/opal/rspec/fixes/rspec/core/formatters/backtrace_formatter.rb +20 -0
  54. data/opal/opal/rspec/fixes/rspec/core/formatters/console_codes.rb +11 -0
  55. data/opal/opal/rspec/fixes/rspec/core/formatters/deprecation_formatter.rb +20 -0
  56. data/opal/opal/rspec/fixes/rspec/core/formatters/generated_deprecation_message.rb +15 -0
  57. data/opal/opal/rspec/fixes/rspec/core/formatters/json_formatter.rb +10 -0
  58. data/opal/opal/rspec/fixes/rspec/core/formatters/loader.rb +38 -0
  59. data/opal/opal/rspec/fixes/rspec/core/metadata.rb +39 -0
  60. data/opal/opal/rspec/fixes/rspec/core/notifications.rb +3 -0
  61. data/opal/opal/rspec/fixes/rspec/core/notifications/examples_notification.rb +30 -0
  62. data/opal/opal/rspec/fixes/rspec/core/notifications/failed_example_notification.rb +20 -0
  63. data/opal/opal/rspec/fixes/rspec/core/notifications/summary_notification.rb +26 -0
  64. data/opal/opal/rspec/fixes/rspec/core/ordering.rb +1 -0
  65. data/opal/opal/rspec/fixes/rspec/core/ordering/random.rb +13 -0
  66. data/opal/opal/rspec/fixes/rspec/core/reporter.rb +14 -0
  67. data/opal/opal/rspec/fixes/rspec/core/warnings.rb +18 -0
  68. data/opal/opal/rspec/fixes/rspec/example_groups.rb +49 -0
  69. data/opal/opal/rspec/fixes/rspec/expectations.rb +2 -0
  70. data/opal/opal/rspec/fixes/rspec/expectations/fail_with.rb +21 -0
  71. data/opal/opal/rspec/fixes/rspec/expectations/syntax.rb +25 -0
  72. data/opal/opal/rspec/fixes/rspec/matchers.rb +2 -0
  73. data/opal/opal/rspec/fixes/rspec/matchers/built_in.rb +4 -0
  74. data/opal/opal/rspec/fixes/rspec/matchers/built_in/all.rb +10 -0
  75. data/opal/opal/rspec/fixes/rspec/matchers/built_in/compound.rb +15 -0
  76. data/opal/opal/rspec/fixes/rspec/matchers/built_in/start_and_end_with.rb +42 -0
  77. data/opal/opal/rspec/fixes/rspec/matchers/built_in/yield.rb +21 -0
  78. data/opal/opal/rspec/fixes/rspec/matchers/pretty.rb +15 -0
  79. data/opal/opal/rspec/fixes/rspec/mocks.rb +4 -0
  80. data/opal/opal/rspec/fixes/rspec/mocks/error_generator.rb +40 -0
  81. data/opal/opal/rspec/fixes/rspec/mocks/space.rb +37 -0
  82. data/opal/opal/rspec/fixes/rspec/mocks/test_double.rb +39 -0
  83. data/opal/opal/rspec/fixes/rspec/mocks/verifying_double.rb +29 -0
  84. data/opal/opal/rspec/fixes/rspec/support.rb +4 -0
  85. data/opal/opal/rspec/fixes/rspec/support/encoded_string.rb +10 -0
  86. data/opal/opal/rspec/fixes/rspec/support/fuzzy_matcher.rb +23 -0
  87. data/opal/opal/rspec/fixes/rspec/support/recursive_const_methods.rb +7 -0
  88. data/opal/opal/rspec/fixes/rspec/support/ruby_features.rb +8 -0
  89. data/opal/opal/rspec/fixes/rspec/support/warnings.rb +18 -0
  90. data/opal/opal/rspec/formatter/browser_formatter.rb +38 -0
  91. data/opal/opal/rspec/formatter/document_io.rb +27 -0
  92. data/opal/opal/rspec/formatter/element.rb +100 -0
  93. data/opal/opal/rspec/formatter/html_printer.rb +121 -0
  94. data/opal/opal/rspec/formatter/noop_flush_string_io.rb +9 -0
  95. data/opal/opal/rspec/formatter/opal_closed_tty_io.rb +27 -0
  96. data/opal/opal/rspec/pre_require_fixes.rb +11 -0
  97. data/opal/opal/rspec/requires.rb +145 -0
  98. data/opal/opal/rspec/runner.rb +91 -0
  99. data/opal/opal/rspec/spec_opts.rb.erb +28 -0
  100. data/opal/opal/rspec/sprockets_runner.rb.erb +13 -0
  101. data/rspec-core/benchmarks/call_v_yield.rb +81 -0
  102. data/rspec-core/benchmarks/check_inclusion.rb +125 -0
  103. data/rspec-core/benchmarks/define_method_v_attr_reader_v_def.rb +81 -0
  104. data/rspec-core/benchmarks/eager_vs_lazy_metadata.rb +126 -0
  105. data/rspec-core/benchmarks/eager_vs_lazy_metadata/define_examples.rb +22 -0
  106. data/rspec-core/benchmarks/filter_object.rb +35 -0
  107. data/rspec-core/benchmarks/index_v_take_while.rb +47 -0
  108. data/rspec-core/benchmarks/map_then_flatten_vs_flat_map_benchmarks.rb +94 -0
  109. data/rspec-core/benchmarks/require_relative_v_require.rb +75 -0
  110. data/rspec-core/benchmarks/respond_to_v_defined.rb +72 -0
  111. data/rspec-core/benchmarks/several_regexps_v_one_big_one.rb +86 -0
  112. data/rspec-core/benchmarks/sort_by_v_shuffle.rb +83 -0
  113. data/rspec-core/benchmarks/to_proc_v_not_to_proc.rb +539 -0
  114. data/rspec-core/features/step_definitions/additional_cli_steps.rb +126 -0
  115. data/rspec-core/features/step_definitions/core_standalone_steps.rb +12 -0
  116. data/rspec-core/features/support/env.rb +21 -0
  117. data/rspec-core/features/support/require_expect_syntax_in_aruba_specs.rb +29 -0
  118. data/rspec-core/features/support/rubinius.rb +6 -0
  119. data/rspec-core/lib/rspec/autorun.rb +2 -0
  120. data/rspec-core/lib/rspec/core.rb +169 -0
  121. data/rspec-core/lib/rspec/core/backport_random.rb +336 -0
  122. data/rspec-core/lib/rspec/core/backtrace_formatter.rb +66 -0
  123. data/rspec-core/lib/rspec/core/configuration.rb +1440 -0
  124. data/rspec-core/lib/rspec/core/configuration_options.rb +173 -0
  125. data/rspec-core/lib/rspec/core/drb.rb +111 -0
  126. data/rspec-core/lib/rspec/core/dsl.rb +93 -0
  127. data/rspec-core/lib/rspec/core/example.rb +502 -0
  128. data/rspec-core/lib/rspec/core/example_group.rb +606 -0
  129. data/rspec-core/lib/rspec/core/filter_manager.rb +259 -0
  130. data/rspec-core/lib/rspec/core/flat_map.rb +18 -0
  131. data/rspec-core/lib/rspec/core/formatters.rb +240 -0
  132. data/rspec-core/lib/rspec/core/formatters/base_formatter.rb +67 -0
  133. data/rspec-core/lib/rspec/core/formatters/base_text_formatter.rb +76 -0
  134. data/rspec-core/lib/rspec/core/formatters/console_codes.rb +64 -0
  135. data/rspec-core/lib/rspec/core/formatters/deprecation_formatter.rb +222 -0
  136. data/rspec-core/lib/rspec/core/formatters/documentation_formatter.rb +68 -0
  137. data/rspec-core/lib/rspec/core/formatters/helpers.rb +87 -0
  138. data/rspec-core/lib/rspec/core/formatters/html_formatter.rb +149 -0
  139. data/rspec-core/lib/rspec/core/formatters/html_printer.rb +403 -0
  140. data/rspec-core/lib/rspec/core/formatters/json_formatter.rb +94 -0
  141. data/rspec-core/lib/rspec/core/formatters/profile_formatter.rb +65 -0
  142. data/rspec-core/lib/rspec/core/formatters/progress_formatter.rb +28 -0
  143. data/rspec-core/lib/rspec/core/formatters/protocol.rb +163 -0
  144. data/rspec-core/lib/rspec/core/formatters/snippet_extractor.rb +104 -0
  145. data/rspec-core/lib/rspec/core/hooks.rb +591 -0
  146. data/rspec-core/lib/rspec/core/memoized_helpers.rb +472 -0
  147. data/rspec-core/lib/rspec/core/metadata.rb +437 -0
  148. data/rspec-core/lib/rspec/core/metadata_filter.rb +95 -0
  149. data/rspec-core/lib/rspec/core/minitest_assertions_adapter.rb +28 -0
  150. data/rspec-core/lib/rspec/core/mocking_adapters/flexmock.rb +31 -0
  151. data/rspec-core/lib/rspec/core/mocking_adapters/mocha.rb +57 -0
  152. data/rspec-core/lib/rspec/core/mocking_adapters/null.rb +14 -0
  153. data/rspec-core/lib/rspec/core/mocking_adapters/rr.rb +31 -0
  154. data/rspec-core/lib/rspec/core/mocking_adapters/rspec.rb +32 -0
  155. data/rspec-core/lib/rspec/core/notifications.rb +542 -0
  156. data/rspec-core/lib/rspec/core/option_parser.rb +222 -0
  157. data/rspec-core/lib/rspec/core/ordering.rb +155 -0
  158. data/rspec-core/lib/rspec/core/pending.rb +163 -0
  159. data/rspec-core/lib/rspec/core/project_initializer.rb +48 -0
  160. data/rspec-core/lib/rspec/core/project_initializer/spec/spec_helper.rb +89 -0
  161. data/rspec-core/lib/rspec/core/rake_task.rb +187 -0
  162. data/rspec-core/lib/rspec/core/reporter.rb +149 -0
  163. data/rspec-core/lib/rspec/core/ruby_project.rb +45 -0
  164. data/rspec-core/lib/rspec/core/runner.rb +158 -0
  165. data/rspec-core/lib/rspec/core/shared_context.rb +55 -0
  166. data/rspec-core/lib/rspec/core/shared_example_group.rb +182 -0
  167. data/rspec-core/lib/rspec/core/test_unit_assertions_adapter.rb +30 -0
  168. data/rspec-core/lib/rspec/core/version.rb +9 -0
  169. data/rspec-core/lib/rspec/core/warnings.rb +40 -0
  170. data/rspec-core/lib/rspec/core/world.rb +183 -0
  171. data/rspec-core/spec/command_line/order_spec.rb +213 -0
  172. data/rspec-core/spec/rspec/core/backtrace_formatter_spec.rb +306 -0
  173. data/rspec-core/spec/rspec/core/configuration_options_spec.rb +425 -0
  174. data/rspec-core/spec/rspec/core/configuration_spec.rb +1963 -0
  175. data/rspec-core/spec/rspec/core/drb_spec.rb +278 -0
  176. data/rspec-core/spec/rspec/core/dsl_spec.rb +85 -0
  177. data/rspec-core/spec/rspec/core/example_execution_result_spec.rb +142 -0
  178. data/rspec-core/spec/rspec/core/example_group_constants_spec.rb +16 -0
  179. data/rspec-core/spec/rspec/core/example_group_spec.rb +1621 -0
  180. data/rspec-core/spec/rspec/core/example_spec.rb +662 -0
  181. data/rspec-core/spec/rspec/core/failed_example_notification_spec.rb +25 -0
  182. data/rspec-core/spec/rspec/core/filter_manager_spec.rb +299 -0
  183. data/rspec-core/spec/rspec/core/formatters/base_text_formatter_spec.rb +182 -0
  184. data/rspec-core/spec/rspec/core/formatters/console_codes_spec.rb +65 -0
  185. data/rspec-core/spec/rspec/core/formatters/deprecation_formatter_spec.rb +225 -0
  186. data/rspec-core/spec/rspec/core/formatters/documentation_formatter_spec.rb +111 -0
  187. data/rspec-core/spec/rspec/core/formatters/helpers_spec.rb +104 -0
  188. data/rspec-core/spec/rspec/core/formatters/html_formatter_spec.rb +111 -0
  189. data/rspec-core/spec/rspec/core/formatters/json_formatter_spec.rb +183 -0
  190. data/rspec-core/spec/rspec/core/formatters/profile_formatter_spec.rb +99 -0
  191. data/rspec-core/spec/rspec/core/formatters/progress_formatter_spec.rb +55 -0
  192. data/rspec-core/spec/rspec/core/formatters/snippet_extractor_spec.rb +26 -0
  193. data/rspec-core/spec/rspec/core/formatters_spec.rb +160 -0
  194. data/rspec-core/spec/rspec/core/hooks_filtering_spec.rb +227 -0
  195. data/rspec-core/spec/rspec/core/hooks_spec.rb +447 -0
  196. data/rspec-core/spec/rspec/core/memoized_helpers_spec.rb +537 -0
  197. data/rspec-core/spec/rspec/core/metadata_filter_spec.rb +181 -0
  198. data/rspec-core/spec/rspec/core/metadata_spec.rb +642 -0
  199. data/rspec-core/spec/rspec/core/notifications_spec.rb +92 -0
  200. data/rspec-core/spec/rspec/core/option_parser_spec.rb +270 -0
  201. data/rspec-core/spec/rspec/core/ordering_spec.rb +102 -0
  202. data/rspec-core/spec/rspec/core/pending_example_spec.rb +221 -0
  203. data/rspec-core/spec/rspec/core/pending_spec.rb +8 -0
  204. data/rspec-core/spec/rspec/core/project_initializer_spec.rb +123 -0
  205. data/rspec-core/spec/rspec/core/rake_task_spec.rb +351 -0
  206. data/rspec-core/spec/rspec/core/random_spec.rb +47 -0
  207. data/rspec-core/spec/rspec/core/reporter_spec.rb +198 -0
  208. data/rspec-core/spec/rspec/core/resources/a_bar.rb +0 -0
  209. data/rspec-core/spec/rspec/core/resources/a_foo.rb +0 -0
  210. data/rspec-core/spec/rspec/core/resources/a_spec.rb +1 -0
  211. data/rspec-core/spec/rspec/core/resources/acceptance/bar.rb +0 -0
  212. data/rspec-core/spec/rspec/core/resources/acceptance/foo_spec.rb +0 -0
  213. data/rspec-core/spec/rspec/core/resources/custom_example_group_runner.rb +14 -0
  214. data/rspec-core/spec/rspec/core/resources/formatter_specs.rb +58 -0
  215. data/rspec-core/spec/rspec/core/resources/utf8_encoded.rb +9 -0
  216. data/rspec-core/spec/rspec/core/rspec_matchers_spec.rb +45 -0
  217. data/rspec-core/spec/rspec/core/ruby_project_spec.rb +26 -0
  218. data/rspec-core/spec/rspec/core/runner_spec.rb +309 -0
  219. data/rspec-core/spec/rspec/core/shared_context_spec.rb +102 -0
  220. data/rspec-core/spec/rspec/core/shared_example_group_spec.rb +268 -0
  221. data/rspec-core/spec/rspec/core/warnings_spec.rb +72 -0
  222. data/rspec-core/spec/rspec/core/world_spec.rb +142 -0
  223. data/rspec-core/spec/rspec/core_spec.rb +103 -0
  224. data/rspec-core/spec/spec_helper.rb +89 -0
  225. data/rspec-core/spec/support/config_options_helper.rb +13 -0
  226. data/rspec-core/spec/support/fake_minitest/minitest.rb +0 -0
  227. data/rspec-core/spec/support/fake_minitest/minitest/minitest_assertions.rb +4 -0
  228. data/rspec-core/spec/support/fake_minitest/test/unit/assertions.rb +6 -0
  229. data/rspec-core/spec/support/formatter_support.rb +263 -0
  230. data/rspec-core/spec/support/helper_methods.rb +26 -0
  231. data/rspec-core/spec/support/isolated_home_directory.rb +16 -0
  232. data/rspec-core/spec/support/matchers.rb +103 -0
  233. data/rspec-core/spec/support/mathn_integration_support.rb +12 -0
  234. data/rspec-core/spec/support/sandboxing.rb +50 -0
  235. data/rspec-core/spec/support/shared_example_groups.rb +43 -0
  236. data/rspec-core/spec/support/spec_files.rb +44 -0
  237. data/rspec-expectations/benchmarks/2.x_vs_3.x_matcher_dsl_implementation.rb +253 -0
  238. data/rspec-expectations/benchmarks/autoload_v_require.rb +25 -0
  239. data/rspec-expectations/benchmarks/cloning_matchers.rb +19 -0
  240. data/rspec-expectations/benchmarks/default_messages_as_methods_v_blocks.rb +27 -0
  241. data/rspec-expectations/benchmarks/example_spec.rb +9 -0
  242. data/rspec-expectations/benchmarks/include_v_superclass.rb +39 -0
  243. data/rspec-expectations/benchmarks/match_array/failing_with_distinct_items.rb +147 -0
  244. data/rspec-expectations/benchmarks/match_array/failing_with_duplicate_items.rb +122 -0
  245. data/rspec-expectations/benchmarks/match_array/passing_with_distinct_items.rb +154 -0
  246. data/rspec-expectations/benchmarks/match_array/passing_with_duplicate_items.rb +132 -0
  247. data/rspec-expectations/benchmarks/match_array/rubyprof/passing_with_distinct_items.rb +9 -0
  248. data/rspec-expectations/benchmarks/matcher_dsl_vs_classes.rb +180 -0
  249. data/rspec-expectations/benchmarks/method_to_proc.rb +72 -0
  250. data/rspec-expectations/benchmarks/set_vs_array_include.rb +68 -0
  251. data/rspec-expectations/features/step_definitions/additional_cli_steps.rb +22 -0
  252. data/rspec-expectations/features/support/disallow_certain_apis.rb +34 -0
  253. data/rspec-expectations/features/support/env.rb +21 -0
  254. data/rspec-expectations/features/support/rubinius.rb +6 -0
  255. data/rspec-expectations/lib/rspec/expectations.rb +68 -0
  256. data/rspec-expectations/lib/rspec/expectations/configuration.rb +147 -0
  257. data/rspec-expectations/lib/rspec/expectations/expectation_target.rb +119 -0
  258. data/rspec-expectations/lib/rspec/expectations/fail_with.rb +34 -0
  259. data/rspec-expectations/lib/rspec/expectations/handler.rb +167 -0
  260. data/rspec-expectations/lib/rspec/expectations/minitest_integration.rb +17 -0
  261. data/rspec-expectations/lib/rspec/expectations/syntax.rb +132 -0
  262. data/rspec-expectations/lib/rspec/expectations/version.rb +8 -0
  263. data/rspec-expectations/lib/rspec/matchers.rb +967 -0
  264. data/rspec-expectations/lib/rspec/matchers/aliased_matcher.rb +116 -0
  265. data/rspec-expectations/lib/rspec/matchers/built_in.rb +52 -0
  266. data/rspec-expectations/lib/rspec/matchers/built_in/all.rb +85 -0
  267. data/rspec-expectations/lib/rspec/matchers/built_in/base_matcher.rb +132 -0
  268. data/rspec-expectations/lib/rspec/matchers/built_in/be.rb +277 -0
  269. data/rspec-expectations/lib/rspec/matchers/built_in/be_between.rb +77 -0
  270. data/rspec-expectations/lib/rspec/matchers/built_in/be_instance_of.rb +22 -0
  271. data/rspec-expectations/lib/rspec/matchers/built_in/be_kind_of.rb +16 -0
  272. data/rspec-expectations/lib/rspec/matchers/built_in/be_within.rb +72 -0
  273. data/rspec-expectations/lib/rspec/matchers/built_in/change.rb +337 -0
  274. data/rspec-expectations/lib/rspec/matchers/built_in/compound.rb +258 -0
  275. data/rspec-expectations/lib/rspec/matchers/built_in/contain_exactly.rb +249 -0
  276. data/rspec-expectations/lib/rspec/matchers/built_in/cover.rb +24 -0
  277. data/rspec-expectations/lib/rspec/matchers/built_in/eq.rb +75 -0
  278. data/rspec-expectations/lib/rspec/matchers/built_in/eql.rb +34 -0
  279. data/rspec-expectations/lib/rspec/matchers/built_in/equal.rb +81 -0
  280. data/rspec-expectations/lib/rspec/matchers/built_in/exist.rb +86 -0
  281. data/rspec-expectations/lib/rspec/matchers/built_in/has.rb +101 -0
  282. data/rspec-expectations/lib/rspec/matchers/built_in/have_attributes.rb +84 -0
  283. data/rspec-expectations/lib/rspec/matchers/built_in/include.rb +105 -0
  284. data/rspec-expectations/lib/rspec/matchers/built_in/match.rb +29 -0
  285. data/rspec-expectations/lib/rspec/matchers/built_in/operators.rb +119 -0
  286. data/rspec-expectations/lib/rspec/matchers/built_in/output.rb +152 -0
  287. data/rspec-expectations/lib/rspec/matchers/built_in/raise_error.rb +174 -0
  288. data/rspec-expectations/lib/rspec/matchers/built_in/respond_to.rb +91 -0
  289. data/rspec-expectations/lib/rspec/matchers/built_in/satisfy.rb +39 -0
  290. data/rspec-expectations/lib/rspec/matchers/built_in/start_and_end_with.rb +82 -0
  291. data/rspec-expectations/lib/rspec/matchers/built_in/throw_symbol.rb +132 -0
  292. data/rspec-expectations/lib/rspec/matchers/built_in/yield.rb +420 -0
  293. data/rspec-expectations/lib/rspec/matchers/composable.rb +183 -0
  294. data/rspec-expectations/lib/rspec/matchers/dsl.rb +391 -0
  295. data/rspec-expectations/lib/rspec/matchers/generated_descriptions.rb +42 -0
  296. data/rspec-expectations/lib/rspec/matchers/matcher_delegator.rb +33 -0
  297. data/rspec-expectations/lib/rspec/matchers/matcher_protocol.rb +99 -0
  298. data/rspec-expectations/lib/rspec/matchers/pretty.rb +77 -0
  299. data/rspec-expectations/spec/rspec/expectations/configuration_spec.rb +226 -0
  300. data/rspec-expectations/spec/rspec/expectations/expectation_target_spec.rb +147 -0
  301. data/rspec-expectations/spec/rspec/expectations/extensions/kernel_spec.rb +69 -0
  302. data/rspec-expectations/spec/rspec/expectations/fail_with_spec.rb +73 -0
  303. data/rspec-expectations/spec/rspec/expectations/handler_spec.rb +200 -0
  304. data/rspec-expectations/spec/rspec/expectations/minitest_integration_spec.rb +25 -0
  305. data/rspec-expectations/spec/rspec/expectations/syntax_spec.rb +93 -0
  306. data/rspec-expectations/spec/rspec/expectations_spec.rb +15 -0
  307. data/rspec-expectations/spec/rspec/matchers/aliased_matcher_spec.rb +113 -0
  308. data/rspec-expectations/spec/rspec/matchers/aliases_spec.rb +455 -0
  309. data/rspec-expectations/spec/rspec/matchers/built_in/all_spec.rb +212 -0
  310. data/rspec-expectations/spec/rspec/matchers/built_in/base_matcher_spec.rb +140 -0
  311. data/rspec-expectations/spec/rspec/matchers/built_in/be_between_spec.rb +157 -0
  312. data/rspec-expectations/spec/rspec/matchers/built_in/be_instance_of_spec.rb +61 -0
  313. data/rspec-expectations/spec/rspec/matchers/built_in/be_kind_of_spec.rb +39 -0
  314. data/rspec-expectations/spec/rspec/matchers/built_in/be_spec.rb +685 -0
  315. data/rspec-expectations/spec/rspec/matchers/built_in/be_within_spec.rb +139 -0
  316. data/rspec-expectations/spec/rspec/matchers/built_in/change_spec.rb +829 -0
  317. data/rspec-expectations/spec/rspec/matchers/built_in/compound_spec.rb +537 -0
  318. data/rspec-expectations/spec/rspec/matchers/built_in/contain_exactly_spec.rb +556 -0
  319. data/rspec-expectations/spec/rspec/matchers/built_in/cover_spec.rb +67 -0
  320. data/rspec-expectations/spec/rspec/matchers/built_in/eq_spec.rb +176 -0
  321. data/rspec-expectations/spec/rspec/matchers/built_in/eql_spec.rb +39 -0
  322. data/rspec-expectations/spec/rspec/matchers/built_in/equal_spec.rb +130 -0
  323. data/rspec-expectations/spec/rspec/matchers/built_in/exist_spec.rb +139 -0
  324. data/rspec-expectations/spec/rspec/matchers/built_in/has_spec.rb +179 -0
  325. data/rspec-expectations/spec/rspec/matchers/built_in/have_attributes_spec.rb +177 -0
  326. data/rspec-expectations/spec/rspec/matchers/built_in/include_spec.rb +587 -0
  327. data/rspec-expectations/spec/rspec/matchers/built_in/match_spec.rb +100 -0
  328. data/rspec-expectations/spec/rspec/matchers/built_in/operators_spec.rb +250 -0
  329. data/rspec-expectations/spec/rspec/matchers/built_in/output_spec.rb +168 -0
  330. data/rspec-expectations/spec/rspec/matchers/built_in/raise_error_spec.rb +446 -0
  331. data/rspec-expectations/spec/rspec/matchers/built_in/respond_to_spec.rb +290 -0
  332. data/rspec-expectations/spec/rspec/matchers/built_in/satisfy_spec.rb +42 -0
  333. data/rspec-expectations/spec/rspec/matchers/built_in/start_and_end_with_spec.rb +347 -0
  334. data/rspec-expectations/spec/rspec/matchers/built_in/throw_symbol_spec.rb +133 -0
  335. data/rspec-expectations/spec/rspec/matchers/built_in/yield_spec.rb +643 -0
  336. data/rspec-expectations/spec/rspec/matchers/composable_spec.rb +77 -0
  337. data/rspec-expectations/spec/rspec/matchers/define_negated_matcher_spec.rb +199 -0
  338. data/rspec-expectations/spec/rspec/matchers/description_generation_spec.rb +189 -0
  339. data/rspec-expectations/spec/rspec/matchers/dsl_spec.rb +1036 -0
  340. data/rspec-expectations/spec/rspec/matchers/legacy_spec.rb +104 -0
  341. data/rspec-expectations/spec/rspec/matchers_spec.rb +108 -0
  342. data/rspec-expectations/spec/spec_helper.rb +94 -0
  343. data/rspec-expectations/spec/support/matchers.rb +54 -0
  344. data/rspec-expectations/spec/support/shared_examples.rb +101 -0
  345. data/rspec-mocks/benchmarks/double_creation.rb +66 -0
  346. data/rspec-mocks/benchmarks/each_value_v_values_each.rb +58 -0
  347. data/rspec-mocks/benchmarks/find_original_method_early.rb +64 -0
  348. data/rspec-mocks/benchmarks/method_defined_at_any_visibility.rb +101 -0
  349. data/rspec-mocks/benchmarks/thread_safety.rb +24 -0
  350. data/rspec-mocks/benchmarks/transfer_nested_constants.rb +77 -0
  351. data/rspec-mocks/features/step_definitions/additional_cli_steps.rb +21 -0
  352. data/rspec-mocks/features/support/disallow_certain_apis.rb +24 -0
  353. data/rspec-mocks/features/support/env.rb +22 -0
  354. data/rspec-mocks/features/support/rubinius.rb +6 -0
  355. data/rspec-mocks/lib/rspec/mocks.rb +126 -0
  356. data/rspec-mocks/lib/rspec/mocks/any_instance.rb +10 -0
  357. data/rspec-mocks/lib/rspec/mocks/any_instance/chain.rb +109 -0
  358. data/rspec-mocks/lib/rspec/mocks/any_instance/expect_chain_chain.rb +35 -0
  359. data/rspec-mocks/lib/rspec/mocks/any_instance/expectation_chain.rb +48 -0
  360. data/rspec-mocks/lib/rspec/mocks/any_instance/message_chains.rb +85 -0
  361. data/rspec-mocks/lib/rspec/mocks/any_instance/proxy.rb +116 -0
  362. data/rspec-mocks/lib/rspec/mocks/any_instance/recorder.rb +267 -0
  363. data/rspec-mocks/lib/rspec/mocks/any_instance/stub_chain.rb +45 -0
  364. data/rspec-mocks/lib/rspec/mocks/any_instance/stub_chain_chain.rb +27 -0
  365. data/rspec-mocks/lib/rspec/mocks/argument_list_matcher.rb +72 -0
  366. data/rspec-mocks/lib/rspec/mocks/argument_matchers.rb +282 -0
  367. data/rspec-mocks/lib/rspec/mocks/configuration.rb +157 -0
  368. data/rspec-mocks/lib/rspec/mocks/error_generator.rb +253 -0
  369. data/rspec-mocks/lib/rspec/mocks/example_methods.rb +379 -0
  370. data/rspec-mocks/lib/rspec/mocks/instance_method_stasher.rb +135 -0
  371. data/rspec-mocks/lib/rspec/mocks/marshal_extension.rb +41 -0
  372. data/rspec-mocks/lib/rspec/mocks/matchers/expectation_customization.rb +20 -0
  373. data/rspec-mocks/lib/rspec/mocks/matchers/have_received.rb +121 -0
  374. data/rspec-mocks/lib/rspec/mocks/matchers/receive.rb +106 -0
  375. data/rspec-mocks/lib/rspec/mocks/matchers/receive_message_chain.rb +66 -0
  376. data/rspec-mocks/lib/rspec/mocks/matchers/receive_messages.rb +71 -0
  377. data/rspec-mocks/lib/rspec/mocks/message_chain.rb +91 -0
  378. data/rspec-mocks/lib/rspec/mocks/message_expectation.rb +694 -0
  379. data/rspec-mocks/lib/rspec/mocks/method_double.rb +260 -0
  380. data/rspec-mocks/lib/rspec/mocks/method_reference.rb +155 -0
  381. data/rspec-mocks/lib/rspec/mocks/mutate_const.rb +324 -0
  382. data/rspec-mocks/lib/rspec/mocks/object_reference.rb +91 -0
  383. data/rspec-mocks/lib/rspec/mocks/order_group.rb +81 -0
  384. data/rspec-mocks/lib/rspec/mocks/proxy.rb +431 -0
  385. data/rspec-mocks/lib/rspec/mocks/space.rb +221 -0
  386. data/rspec-mocks/lib/rspec/mocks/standalone.rb +3 -0
  387. data/rspec-mocks/lib/rspec/mocks/syntax.rb +329 -0
  388. data/rspec-mocks/lib/rspec/mocks/targets.rb +97 -0
  389. data/rspec-mocks/lib/rspec/mocks/test_double.rb +135 -0
  390. data/rspec-mocks/lib/rspec/mocks/verifying_double.rb +127 -0
  391. data/rspec-mocks/lib/rspec/mocks/verifying_message_expecation.rb +62 -0
  392. data/rspec-mocks/lib/rspec/mocks/verifying_proxy.rb +171 -0
  393. data/rspec-mocks/lib/rspec/mocks/version.rb +9 -0
  394. data/rspec-mocks/spec/rspec/mocks/and_call_original_spec.rb +267 -0
  395. data/rspec-mocks/spec/rspec/mocks/and_return_spec.rb +21 -0
  396. data/rspec-mocks/spec/rspec/mocks/and_wrap_original_spec.rb +63 -0
  397. data/rspec-mocks/spec/rspec/mocks/and_yield_spec.rb +161 -0
  398. data/rspec-mocks/spec/rspec/mocks/any_instance/message_chains_spec.rb +39 -0
  399. data/rspec-mocks/spec/rspec/mocks/any_instance_spec.rb +1242 -0
  400. data/rspec-mocks/spec/rspec/mocks/argument_matchers_spec.rb +336 -0
  401. data/rspec-mocks/spec/rspec/mocks/array_including_matcher_spec.rb +39 -0
  402. data/rspec-mocks/spec/rspec/mocks/at_least_spec.rb +147 -0
  403. data/rspec-mocks/spec/rspec/mocks/at_most_spec.rb +113 -0
  404. data/rspec-mocks/spec/rspec/mocks/before_all_spec.rb +75 -0
  405. data/rspec-mocks/spec/rspec/mocks/block_return_value_spec.rb +68 -0
  406. data/rspec-mocks/spec/rspec/mocks/combining_implementation_instructions_spec.rb +196 -0
  407. data/rspec-mocks/spec/rspec/mocks/configuration_spec.rb +175 -0
  408. data/rspec-mocks/spec/rspec/mocks/double_spec.rb +830 -0
  409. data/rspec-mocks/spec/rspec/mocks/example_methods_spec.rb +11 -0
  410. data/rspec-mocks/spec/rspec/mocks/expiration_spec.rb +90 -0
  411. data/rspec-mocks/spec/rspec/mocks/hash_excluding_matcher_spec.rb +65 -0
  412. data/rspec-mocks/spec/rspec/mocks/hash_including_matcher_spec.rb +92 -0
  413. data/rspec-mocks/spec/rspec/mocks/instance_method_stasher_spec.rb +72 -0
  414. data/rspec-mocks/spec/rspec/mocks/marshal_extension_spec.rb +67 -0
  415. data/rspec-mocks/spec/rspec/mocks/matchers/have_received_spec.rb +513 -0
  416. data/rspec-mocks/spec/rspec/mocks/matchers/receive_message_chain_spec.rb +227 -0
  417. data/rspec-mocks/spec/rspec/mocks/matchers/receive_messages_spec.rb +148 -0
  418. data/rspec-mocks/spec/rspec/mocks/matchers/receive_spec.rb +525 -0
  419. data/rspec-mocks/spec/rspec/mocks/methods_spec.rb +24 -0
  420. data/rspec-mocks/spec/rspec/mocks/mock_expectation_error_spec.rb +20 -0
  421. data/rspec-mocks/spec/rspec/mocks/mock_ordering_spec.rb +112 -0
  422. data/rspec-mocks/spec/rspec/mocks/multiple_return_value_spec.rb +130 -0
  423. data/rspec-mocks/spec/rspec/mocks/mutate_const_spec.rb +561 -0
  424. data/rspec-mocks/spec/rspec/mocks/nil_expectation_warning_spec.rb +52 -0
  425. data/rspec-mocks/spec/rspec/mocks/null_object_double_spec.rb +135 -0
  426. data/rspec-mocks/spec/rspec/mocks/once_counts_spec.rb +50 -0
  427. data/rspec-mocks/spec/rspec/mocks/order_group_spec.rb +26 -0
  428. data/rspec-mocks/spec/rspec/mocks/partial_double_spec.rb +379 -0
  429. data/rspec-mocks/spec/rspec/mocks/partial_double_using_mocks_directly_spec.rb +83 -0
  430. data/rspec-mocks/spec/rspec/mocks/precise_counts_spec.rb +66 -0
  431. data/rspec-mocks/spec/rspec/mocks/serialization_spec.rb +89 -0
  432. data/rspec-mocks/spec/rspec/mocks/should_syntax_spec.rb +539 -0
  433. data/rspec-mocks/spec/rspec/mocks/space_spec.rb +242 -0
  434. data/rspec-mocks/spec/rspec/mocks/spy_spec.rb +127 -0
  435. data/rspec-mocks/spec/rspec/mocks/stash_spec.rb +43 -0
  436. data/rspec-mocks/spec/rspec/mocks/stub_chain_spec.rb +166 -0
  437. data/rspec-mocks/spec/rspec/mocks/stub_implementation_spec.rb +98 -0
  438. data/rspec-mocks/spec/rspec/mocks/stub_spec.rb +520 -0
  439. data/rspec-mocks/spec/rspec/mocks/stubbed_message_expectations_spec.rb +56 -0
  440. data/rspec-mocks/spec/rspec/mocks/syntax_agnostic_message_matchers_spec.rb +99 -0
  441. data/rspec-mocks/spec/rspec/mocks/syntax_spec.rb +7 -0
  442. data/rspec-mocks/spec/rspec/mocks/test_double_spec.rb +53 -0
  443. data/rspec-mocks/spec/rspec/mocks/thrice_counts_spec.rb +72 -0
  444. data/rspec-mocks/spec/rspec/mocks/to_ary_spec.rb +52 -0
  445. data/rspec-mocks/spec/rspec/mocks/twice_counts_spec.rb +64 -0
  446. data/rspec-mocks/spec/rspec/mocks/verifying_doubles/class_double_with_class_loaded_spec.rb +118 -0
  447. data/rspec-mocks/spec/rspec/mocks/verifying_doubles/class_double_with_class_not_loaded_spec.rb +58 -0
  448. data/rspec-mocks/spec/rspec/mocks/verifying_doubles/construction_spec.rb +54 -0
  449. data/rspec-mocks/spec/rspec/mocks/verifying_doubles/expected_arg_verification_spec.rb +81 -0
  450. data/rspec-mocks/spec/rspec/mocks/verifying_doubles/instance_double_with_class_loaded_spec.rb +195 -0
  451. data/rspec-mocks/spec/rspec/mocks/verifying_doubles/instance_double_with_class_not_loaded_spec.rb +57 -0
  452. data/rspec-mocks/spec/rspec/mocks/verifying_doubles/method_visibility_spec.rb +129 -0
  453. data/rspec-mocks/spec/rspec/mocks/verifying_doubles/object_double_spec.rb +68 -0
  454. data/rspec-mocks/spec/rspec/mocks_spec.rb +199 -0
  455. data/rspec-mocks/spec/spec_helper.rb +131 -0
  456. data/rspec-mocks/spec/support/before_all_shared_example_group.rb +16 -0
  457. data/rspec-mocks/spec/support/doubled_classes.rb +74 -0
  458. data/rspec-mocks/spec/support/matchers.rb +15 -0
  459. data/rspec-support/benchmarks/caller.rb +81 -0
  460. data/rspec-support/lib/rspec/support.rb +76 -0
  461. data/rspec-support/lib/rspec/support/caller_filter.rb +63 -0
  462. data/rspec-support/lib/rspec/support/differ.rb +214 -0
  463. data/rspec-support/lib/rspec/support/directory_maker.rb +61 -0
  464. data/rspec-support/lib/rspec/support/encoded_string.rb +69 -0
  465. data/rspec-support/lib/rspec/support/fuzzy_matcher.rb +48 -0
  466. data/rspec-support/lib/rspec/support/hunk_generator.rb +47 -0
  467. data/rspec-support/lib/rspec/support/matcher_definition.rb +31 -0
  468. data/rspec-support/lib/rspec/support/method_signature_verifier.rb +272 -0
  469. data/rspec-support/lib/rspec/support/os.rb +18 -0
  470. data/rspec-support/lib/rspec/support/recursive_const_methods.rb +76 -0
  471. data/rspec-support/lib/rspec/support/ruby_features.rb +45 -0
  472. data/rspec-support/lib/rspec/support/spec.rb +72 -0
  473. data/rspec-support/lib/rspec/support/spec/deprecation_helpers.rb +60 -0
  474. data/rspec-support/lib/rspec/support/spec/formatting_support.rb +9 -0
  475. data/rspec-support/lib/rspec/support/spec/in_sub_process.rb +43 -0
  476. data/rspec-support/lib/rspec/support/spec/prevent_load_time_warnings.rb +44 -0
  477. data/rspec-support/lib/rspec/support/spec/shell_out.rb +69 -0
  478. data/rspec-support/lib/rspec/support/spec/stderr_splitter.rb +52 -0
  479. data/rspec-support/lib/rspec/support/spec/with_isolated_directory.rb +9 -0
  480. data/rspec-support/lib/rspec/support/spec/with_isolated_stderr.rb +13 -0
  481. data/rspec-support/lib/rspec/support/version.rb +7 -0
  482. data/rspec-support/lib/rspec/support/version_checker.rb +53 -0
  483. data/rspec-support/lib/rspec/support/warnings.rb +39 -0
  484. data/rspec-support/spec/rspec/support/caller_filter_spec.rb +66 -0
  485. data/rspec-support/spec/rspec/support/differ_spec.rb +322 -0
  486. data/rspec-support/spec/rspec/support/directory_maker_spec.rb +58 -0
  487. data/rspec-support/spec/rspec/support/encoded_string_spec.rb +86 -0
  488. data/rspec-support/spec/rspec/support/fuzzy_matcher_spec.rb +179 -0
  489. data/rspec-support/spec/rspec/support/method_signature_verifier_spec.rb +357 -0
  490. data/rspec-support/spec/rspec/support/os_spec.rb +36 -0
  491. data/rspec-support/spec/rspec/support/recursive_const_methods_spec.rb +49 -0
  492. data/rspec-support/spec/rspec/support/spec/in_sub_process_spec.rb +36 -0
  493. data/rspec-support/spec/rspec/support/spec/prevent_load_time_warnings_spec.rb +10 -0
  494. data/rspec-support/spec/rspec/support/spec/shell_out_spec.rb +44 -0
  495. data/rspec-support/spec/rspec/support/spec/stderr_splitter_spec.rb +60 -0
  496. data/rspec-support/spec/rspec/support/spec/with_isolated_std_err_spec.rb +21 -0
  497. data/rspec-support/spec/rspec/support/version_checker_spec.rb +29 -0
  498. data/rspec-support/spec/rspec/support/warnings_spec.rb +66 -0
  499. data/rspec-support/spec/rspec/support_spec.rb +119 -0
  500. data/rspec-support/spec/spec_helper.rb +2 -0
  501. data/rspec/lib/rspec.rb +3 -0
  502. data/rspec/lib/rspec/version.rb +5 -0
  503. data/spec/mri/integration/browser_spec.rb +31 -0
  504. data/spec/mri/integration/rack/sprockets_runner_js_errors.rb.erb +20 -0
  505. data/spec/mri/integration/spec_opts_spec.rb +81 -0
  506. data/spec/mri/unit/opal/rspec/browser_formatter_spec.rb +35 -0
  507. data/spec/mri/unit/opal/rspec/cached_environment_spec.rb +85 -0
  508. data/spec/mri/unit/opal/rspec/opal/browser_formatter_spec.rb +14 -0
  509. data/spec/mri/unit/opal/rspec/rack/config.ru +12 -0
  510. data/spec/mri/unit/opal/rspec/rake_task_spec.rb +261 -0
  511. data/spec/mri/unit/opal/rspec/sprockets_environment_spec.rb +55 -0
  512. data/spec/mri/unit/opal/rspec/temp_dir_helper.rb +19 -0
  513. data/spec/opal/after_hooks_spec.rb +140 -0
  514. data/spec/opal/around_hooks_spec.rb +164 -0
  515. data/spec/opal/async_spec.rb +184 -0
  516. data/spec/opal/before_hooks_spec.rb +183 -0
  517. data/spec/opal/example_spec.rb +174 -0
  518. data/spec/opal/expected_failures.txt +40 -0
  519. data/spec/opal/matchers_spec.rb +205 -0
  520. data/spec/opal/mock_spec.rb +63 -0
  521. data/spec/opal/should_syntax_spec.rb +17 -0
  522. data/spec/opal/skip_pending_spec.rb +43 -0
  523. data/spec/opal/subject_spec.rb +87 -0
  524. data/spec/other/color_on_by_default_spec.rb +9 -0
  525. data/spec/other/dummy_spec.rb +5 -0
  526. data/spec/other/formatter_dependency.rb +3 -0
  527. data/spec/other/ignored_spec.opal +5 -0
  528. data/spec/other/test_formatter.rb +9 -0
  529. data/spec/rspec/core/config.rb +5 -0
  530. data/spec/rspec/core/config.ru +4 -0
  531. data/spec/rspec/core/core_spec_loader.rb +46 -0
  532. data/spec/rspec/core/filter/core/async/example_group.txt +13 -0
  533. data/spec/rspec/core/filter/core/async/hooks.rb +12 -0
  534. data/spec/rspec/core/filter/core/async/memoized_helpers.txt +3 -0
  535. data/spec/rspec/core/filter/core/async/metadata.txt +2 -0
  536. data/spec/rspec/core/filter/core/bugs/filter_manager.txt +4 -0
  537. data/spec/rspec/core/filter/core/bugs/formatters.txt +4 -0
  538. data/spec/rspec/core/filter/core/bugs/memoized_helpers.rb +11 -0
  539. data/spec/rspec/core/filter/core/bugs/metadata.txt +5 -0
  540. data/spec/rspec/core/filter/core/bugs/sandbox/subject_issue_test.rb +328 -0
  541. data/spec/rspec/core/filter/core/bugs/warnings_deprecations.txt +3 -0
  542. data/spec/rspec/core/filter/core/unsupported/core.txt +5 -0
  543. data/spec/rspec/core/filter/core/unsupported/example.txt +7 -0
  544. data/spec/rspec/core/filter/core/unsupported/example_group.txt +13 -0
  545. data/spec/rspec/core/filter/core/unsupported/filter_manager.txt +7 -0
  546. data/spec/rspec/core/filter/core/unsupported/formatters.txt +27 -0
  547. data/spec/rspec/core/filter/core/unsupported/hooks.txt +2 -0
  548. data/spec/rspec/core/filter/core/unsupported/memoized_helpers.txt +6 -0
  549. data/spec/rspec/core/filter/core/unsupported/metadata.txt +14 -0
  550. data/spec/rspec/core/filter/core/unsupported/metadata_filter.txt +2 -0
  551. data/spec/rspec/core/filter/core/unsupported/notifications.txt +8 -0
  552. data/spec/rspec/core/filter/core/unsupported/world.txt +3 -0
  553. data/spec/rspec/core/fixes/missing_constants.rb +20 -0
  554. data/spec/rspec/core/fixes/opal_itself.rb +38 -0
  555. data/spec/rspec/core/fixes/shared_examples.rb +3 -0
  556. data/spec/rspec/core/opal_alternates/rspec/core/example_group_spec.rb +145 -0
  557. data/spec/rspec/core/opal_alternates/rspec/core/failed_example_notification_spec.rb +31 -0
  558. data/spec/rspec/core/opal_alternates/rspec/core/hooks_spec.rb +113 -0
  559. data/spec/rspec/core/opal_alternates/rspec/core/memoized_helpers_spec.rb +36 -0
  560. data/spec/rspec/core/opal_alternates/rspec/core/metadata_spec.rb +48 -0
  561. data/spec/rspec/core/require_specs.rb +25 -0
  562. data/spec/rspec/core/sandboxing.rb +72 -0
  563. data/spec/rspec/core/spec_files_exclude.txt +41 -0
  564. data/spec/rspec/expectations/config.rb +16 -0
  565. data/spec/rspec/expectations/config.ru +4 -0
  566. data/spec/rspec/expectations/expectation_spec_loader.rb +110 -0
  567. data/spec/rspec/expectations/filter/bugs/aliased_matcher.txt +2 -0
  568. data/spec/rspec/expectations/filter/bugs/aliases.rb +13 -0
  569. data/spec/rspec/expectations/filter/bugs/base_matcher.txt +2 -0
  570. data/spec/rspec/expectations/filter/bugs/be.rb +4 -0
  571. data/spec/rspec/expectations/filter/bugs/be_instance_of.rb +7 -0
  572. data/spec/rspec/expectations/filter/bugs/be_spec.txt +2 -0
  573. data/spec/rspec/expectations/filter/bugs/configuration.txt +8 -0
  574. data/spec/rspec/expectations/filter/bugs/contain_exactly.rb +13 -0
  575. data/spec/rspec/expectations/filter/bugs/define_negated_matcher.rb +9 -0
  576. data/spec/rspec/expectations/filter/bugs/description_generation.rb +4 -0
  577. data/spec/rspec/expectations/filter/bugs/dsl.txt +14 -0
  578. data/spec/rspec/expectations/filter/bugs/equal.txt +3 -0
  579. data/spec/rspec/expectations/filter/bugs/expectation_target.txt +2 -0
  580. data/spec/rspec/expectations/filter/bugs/expectations.txt +2 -0
  581. data/spec/rspec/expectations/filter/bugs/have_attributes.rb +8 -0
  582. data/spec/rspec/expectations/filter/bugs/include.rb +4 -0
  583. data/spec/rspec/expectations/filter/bugs/operators.txt +2 -0
  584. data/spec/rspec/expectations/filter/bugs/raise_error.txt +2 -0
  585. data/spec/rspec/expectations/filter/bugs/respond_to.rb +13 -0
  586. data/spec/rspec/expectations/filter/bugs/sandbox/undef.rb +20 -0
  587. data/spec/rspec/expectations/filter/unsupported/aliases.txt +5 -0
  588. data/spec/rspec/expectations/filter/unsupported/be.txt +2 -0
  589. data/spec/rspec/expectations/filter/unsupported/be_instance_of.txt +3 -0
  590. data/spec/rspec/expectations/filter/unsupported/change.txt +2 -0
  591. data/spec/rspec/expectations/filter/unsupported/configuration.txt +2 -0
  592. data/spec/rspec/expectations/filter/unsupported/contain_exactly.txt +2 -0
  593. data/spec/rspec/expectations/filter/unsupported/description_generation.txt +6 -0
  594. data/spec/rspec/expectations/filter/unsupported/dsl.txt +8 -0
  595. data/spec/rspec/expectations/filter/unsupported/eq.txt +10 -0
  596. data/spec/rspec/expectations/filter/unsupported/equal.txt +3 -0
  597. data/spec/rspec/expectations/filter/unsupported/expectation_target.txt +2 -0
  598. data/spec/rspec/expectations/filter/unsupported/expectations.txt +8 -0
  599. data/spec/rspec/expectations/filter/unsupported/has.txt +2 -0
  600. data/spec/rspec/expectations/filter/unsupported/include.txt +3 -0
  601. data/spec/rspec/expectations/filter/unsupported/match.txt +2 -0
  602. data/spec/rspec/expectations/filter/unsupported/matchers.txt +11 -0
  603. data/spec/rspec/expectations/filter/unsupported/output.txt +14 -0
  604. data/spec/rspec/expectations/filter/unsupported/raise_error.txt +3 -0
  605. data/spec/rspec/expectations/filter/unsupported/respond_to.rb +5 -0
  606. data/spec/rspec/expectations/filter/unsupported/syntax.txt +3 -0
  607. data/spec/rspec/expectations/filter/unsupported/yield.txt +2 -0
  608. data/spec/rspec/expectations/fixes/example_patches.rb +32 -0
  609. data/spec/rspec/expectations/fixes/missing_constants.rb +12 -0
  610. data/spec/rspec/expectations/fixes/not_compatible.rb +6 -0
  611. data/spec/rspec/expectations/fixes/opal_itself.rb +140 -0
  612. data/spec/rspec/expectations/opal_alternates/be_instance_of_spec.rb +11 -0
  613. data/spec/rspec/expectations/opal_alternates/dsl_spec.rb +66 -0
  614. data/spec/rspec/expectations/opal_alternates/expectation_target_spec.rb +21 -0
  615. data/spec/rspec/expectations/opal_alternates/yield_spec.rb +11 -0
  616. data/spec/rspec/expectations/require_specs.rb +16 -0
  617. data/spec/rspec/expectations/shared_examples.rb +47 -0
  618. data/spec/rspec/expectations/spec_files_exclude.txt +2 -0
  619. data/spec/rspec/expectations/spec_helper_opal.rb +13 -0
  620. data/spec/rspec/filter_processor.rb +77 -0
  621. data/spec/rspec/mocks/config.ru +4 -0
  622. data/spec/rspec/mocks/filter/bugs/and_call_original.txt +9 -0
  623. data/spec/rspec/mocks/filter/bugs/and_wrap_original.txt +2 -0
  624. data/spec/rspec/mocks/filter/bugs/any_instance.rb +24 -0
  625. data/spec/rspec/mocks/filter/bugs/argument_matchers.rb +3 -0
  626. data/spec/rspec/mocks/filter/bugs/configuration.txt +2 -0
  627. data/spec/rspec/mocks/filter/bugs/double.txt +3 -0
  628. data/spec/rspec/mocks/filter/bugs/expiration.txt +2 -0
  629. data/spec/rspec/mocks/filter/bugs/instance_method_stasher.txt +2 -0
  630. data/spec/rspec/mocks/filter/bugs/methods.rb +5 -0
  631. data/spec/rspec/mocks/filter/bugs/mocks.txt +6 -0
  632. data/spec/rspec/mocks/filter/bugs/mutate_const.txt +2 -0
  633. data/spec/rspec/mocks/filter/bugs/partial_double.rb +8 -0
  634. data/spec/rspec/mocks/filter/bugs/receive.txt +5 -0
  635. data/spec/rspec/mocks/filter/bugs/should_syntax.txt +5 -0
  636. data/spec/rspec/mocks/filter/bugs/space.txt +2 -0
  637. data/spec/rspec/mocks/filter/bugs/spy.txt +5 -0
  638. data/spec/rspec/mocks/filter/bugs/stub_implementation.rb +9 -0
  639. data/spec/rspec/mocks/filter/unsupported/and_call_original.txt +5 -0
  640. data/spec/rspec/mocks/filter/unsupported/and_return.txt +2 -0
  641. data/spec/rspec/mocks/filter/unsupported/any_instance.rb +6 -0
  642. data/spec/rspec/mocks/filter/unsupported/argument_matchers.rb +10 -0
  643. data/spec/rspec/mocks/filter/unsupported/combining_implementation_instructions.rb +9 -0
  644. data/spec/rspec/mocks/filter/unsupported/double.rb +16 -0
  645. data/spec/rspec/mocks/filter/unsupported/expected_arg_verification.txt +2 -0
  646. data/spec/rspec/mocks/filter/unsupported/have_received.txt +2 -0
  647. data/spec/rspec/mocks/filter/unsupported/instance_double_with_class_loaded.txt +8 -0
  648. data/spec/rspec/mocks/filter/unsupported/mocks.rb +8 -0
  649. data/spec/rspec/mocks/filter/unsupported/nil_expectation_warning.rb +8 -0
  650. data/spec/rspec/mocks/filter/unsupported/partial_double.rb +6 -0
  651. data/spec/rspec/mocks/filter/unsupported/receive.txt +13 -0
  652. data/spec/rspec/mocks/filter/unsupported/receive_message_chain.rb +4 -0
  653. data/spec/rspec/mocks/filter/unsupported/receive_messages.txt +2 -0
  654. data/spec/rspec/mocks/filter/unsupported/should_syntax.txt +1 -0
  655. data/spec/rspec/mocks/filter/unsupported/space.rb +7 -0
  656. data/spec/rspec/mocks/filter/unsupported/stub.rb +7 -0
  657. data/spec/rspec/mocks/fixes/doubled_classes.rb +76 -0
  658. data/spec/rspec/mocks/fixes/missing_constants.rb +3 -0
  659. data/spec/rspec/mocks/fixes/opal_itself.rb +59 -0
  660. data/spec/rspec/mocks/mocks_spec_loader.rb +91 -0
  661. data/spec/rspec/mocks/require_specs.rb +15 -0
  662. data/spec/rspec/mocks/spec_files_exclude.txt +11 -0
  663. data/spec/rspec/mocks/spec_helper_opal.rb +129 -0
  664. data/spec/rspec/opal_rspec_spec_loader.rb +359 -0
  665. data/spec/rspec/shared/opal/fixes/deprecation_helpers.rb +31 -0
  666. data/spec/rspec/shared/opal/fixes/rspec_helpers.rb +6 -0
  667. data/spec/rspec/shared/opal/progress_json_formatter.rb +29 -0
  668. data/spec/rspec/support/config.rb +5 -0
  669. data/spec/rspec/support/config.ru +4 -0
  670. data/spec/rspec/support/filter/bugs/recursive_const_methods.txt +3 -0
  671. data/spec/rspec/support/filter/bugs/sandbox/basic_object.rb +30 -0
  672. data/spec/rspec/support/filter/bugs/stderr_splitter_spec.txt +2 -0
  673. data/spec/rspec/support/filter/bugs/support.txt +2 -0
  674. data/spec/rspec/support/filter/unsupported/fuzzy_matcher.txt +2 -0
  675. data/spec/rspec/support/filter/unsupported/support.rb +7 -0
  676. data/spec/rspec/support/filter/unsupported/warnings.txt +6 -0
  677. data/spec/rspec/support/fixes/missing_constants.rb +3 -0
  678. data/spec/rspec/support/fixes/opal_itself.rb +13 -0
  679. data/spec/rspec/support/require_specs.rb +15 -0
  680. data/spec/rspec/support/spec_files_exclude.txt +26 -0
  681. data/spec/rspec/support/spec_helper.rb +27 -0
  682. data/spec/rspec/support/support_spec_loader.rb +38 -0
  683. data/util/create_requires.rb +49 -0
  684. data/vendor/spec_runner.js +64 -0
  685. metadata +774 -0
@@ -0,0 +1,167 @@
1
+ module RSpec
2
+ module Expectations
3
+ # @private
4
+ module ExpectationHelper
5
+ def self.check_message(msg)
6
+ unless msg.nil? || msg.respond_to?(:to_str) || msg.respond_to?(:call)
7
+ ::Kernel.warn [
8
+ "WARNING: ignoring the provided expectation message argument (",
9
+ msg.inspect,
10
+ ") since it is not a string or a proc."
11
+ ].join
12
+ end
13
+ end
14
+
15
+ # Returns an RSpec-3+ compatible matcher, wrapping a legacy one
16
+ # in an adapter if necessary.
17
+ #
18
+ # @private
19
+ def self.modern_matcher_from(matcher)
20
+ LegacyMatcherAdapter::RSpec2.wrap(matcher) ||
21
+ LegacyMatcherAdapter::RSpec1.wrap(matcher) || matcher
22
+ end
23
+
24
+ def self.setup(handler, matcher, message)
25
+ check_message(message)
26
+ ::RSpec::Matchers.last_expectation_handler = handler
27
+ ::RSpec::Matchers.last_matcher = modern_matcher_from(matcher)
28
+ end
29
+
30
+ def self.handle_failure(matcher, message, failure_message_method)
31
+ message = message.call if message.respond_to?(:call)
32
+ message ||= matcher.__send__(failure_message_method)
33
+
34
+ if matcher.respond_to?(:diffable?) && matcher.diffable?
35
+ ::RSpec::Expectations.fail_with message, matcher.expected, matcher.actual
36
+ else
37
+ ::RSpec::Expectations.fail_with message
38
+ end
39
+ end
40
+ end
41
+
42
+ # @private
43
+ class PositiveExpectationHandler
44
+ def self.handle_matcher(actual, initial_matcher, message=nil, &block)
45
+ matcher = ExpectationHelper.setup(self, initial_matcher, message)
46
+
47
+ return ::RSpec::Matchers::BuiltIn::PositiveOperatorMatcher.new(actual) unless initial_matcher
48
+ matcher.matches?(actual, &block) || ExpectationHelper.handle_failure(matcher, message, :failure_message)
49
+ end
50
+
51
+ def self.verb
52
+ "should"
53
+ end
54
+
55
+ def self.should_method
56
+ :should
57
+ end
58
+
59
+ def self.opposite_should_method
60
+ :should_not
61
+ end
62
+ end
63
+
64
+ # @private
65
+ class NegativeExpectationHandler
66
+ def self.handle_matcher(actual, initial_matcher, message=nil, &block)
67
+ matcher = ExpectationHelper.setup(self, initial_matcher, message)
68
+
69
+ return ::RSpec::Matchers::BuiltIn::NegativeOperatorMatcher.new(actual) unless initial_matcher
70
+ !(does_not_match?(matcher, actual, &block) || ExpectationHelper.handle_failure(matcher, message, :failure_message_when_negated))
71
+ end
72
+
73
+ def self.does_not_match?(matcher, actual, &block)
74
+ if matcher.respond_to?(:does_not_match?)
75
+ matcher.does_not_match?(actual, &block)
76
+ else
77
+ !matcher.matches?(actual, &block)
78
+ end
79
+ end
80
+
81
+ def self.verb
82
+ "should not"
83
+ end
84
+
85
+ def self.should_method
86
+ :should_not
87
+ end
88
+
89
+ def self.opposite_should_method
90
+ :should
91
+ end
92
+ end
93
+
94
+ # Wraps a matcher written against one of the legacy protocols in
95
+ # order to present the current protocol.
96
+ #
97
+ # @private
98
+ class LegacyMatcherAdapter < Matchers::MatcherDelegator
99
+ def initialize(matcher)
100
+ super
101
+ ::RSpec.warn_deprecation(<<-EOS.gsub(/^\s+\|/, ''), :type => "legacy_matcher")
102
+ |#{matcher.class.name || matcher.inspect} implements a legacy RSpec matcher
103
+ |protocol. For the current protocol you should expose the failure messages
104
+ |via the `failure_message` and `failure_message_when_negated` methods.
105
+ |(Used from #{CallerFilter.first_non_rspec_line})
106
+ EOS
107
+ end
108
+
109
+ def self.wrap(matcher)
110
+ new(matcher) if interface_matches?(matcher)
111
+ end
112
+
113
+ # Starting in RSpec 1.2 (and continuing through all 2.x releases),
114
+ # the failure message protocol was:
115
+ # * `failure_message_for_should`
116
+ # * `failure_message_for_should_not`
117
+ # @private
118
+ class RSpec2 < self
119
+ def failure_message
120
+ base_matcher.failure_message_for_should
121
+ end
122
+
123
+ def failure_message_when_negated
124
+ base_matcher.failure_message_for_should_not
125
+ end
126
+
127
+ def self.interface_matches?(matcher)
128
+ (
129
+ !matcher.respond_to?(:failure_message) &&
130
+ matcher.respond_to?(:failure_message_for_should)
131
+ ) || (
132
+ !matcher.respond_to?(:failure_message_when_negated) &&
133
+ matcher.respond_to?(:failure_message_for_should_not)
134
+ )
135
+ end
136
+ end
137
+
138
+ # Before RSpec 1.2, the failure message protocol was:
139
+ # * `failure_message`
140
+ # * `negative_failure_message`
141
+ # @private
142
+ class RSpec1 < self
143
+ def failure_message
144
+ base_matcher.failure_message
145
+ end
146
+
147
+ def failure_message_when_negated
148
+ base_matcher.negative_failure_message
149
+ end
150
+
151
+ # Note: `failure_message` is part of the RSpec 3 protocol
152
+ # (paired with `failure_message_when_negated`), so we don't check
153
+ # for `failure_message` here.
154
+ def self.interface_matches?(matcher)
155
+ !matcher.respond_to?(:failure_message_when_negated) &&
156
+ matcher.respond_to?(:negative_failure_message)
157
+ end
158
+ end
159
+ end
160
+
161
+ # RSpec 3.0 was released with the class name misspelled. For SemVer compatibility,
162
+ # we will provide this misspelled alias until 4.0.
163
+ # @deprecated Use LegacyMatcherAdapter instead.
164
+ # @private
165
+ LegacyMacherAdapter = LegacyMatcherAdapter
166
+ end
167
+ end
@@ -0,0 +1,17 @@
1
+ require 'rspec/expectations'
2
+
3
+ Minitest::Test.class_eval do
4
+ include ::RSpec::Matchers
5
+
6
+ def expect(*a, &b)
7
+ assert(true) # so each expectation gets counted in minitest's assertion stats
8
+ super
9
+ end
10
+ end
11
+
12
+ module RSpec
13
+ module Expectations
14
+ remove_const :ExpectationNotMetError
15
+ ExpectationNotMetError = ::Minitest::Assertion
16
+ end
17
+ end
@@ -0,0 +1,132 @@
1
+ module RSpec
2
+ module Expectations
3
+ # @api private
4
+ # Provides methods for enabling and disabling the available
5
+ # syntaxes provided by rspec-expectations.
6
+ module Syntax
7
+ module_function
8
+
9
+ # @api private
10
+ # Determines where we add `should` and `should_not`.
11
+ def default_should_host
12
+ @default_should_host ||= ::Object.ancestors.last
13
+ end
14
+
15
+ # @api private
16
+ # Instructs rspec-expectations to warn on first usage of `should` or `should_not`.
17
+ # Enabled by default. This is largely here to facilitate testing.
18
+ def warn_about_should!
19
+ @warn_about_should = true
20
+ end
21
+
22
+ # @api private
23
+ # Generates a deprecation warning for the given method if no warning
24
+ # has already been issued.
25
+ def warn_about_should_unless_configured(method_name)
26
+ return unless @warn_about_should
27
+
28
+ RSpec.deprecate(
29
+ "Using `#{method_name}` from rspec-expectations' old `:should` syntax without explicitly enabling the syntax",
30
+ :replacement => "the new `:expect` syntax or explicitly enable `:should`"
31
+ )
32
+
33
+ @warn_about_should = false
34
+ end
35
+
36
+ # @api private
37
+ # Enables the `should` syntax.
38
+ def enable_should(syntax_host=default_should_host)
39
+ @warn_about_should = false if syntax_host == default_should_host
40
+ return if should_enabled?(syntax_host)
41
+
42
+ syntax_host.module_exec do
43
+ def should(matcher=nil, message=nil, &block)
44
+ ::RSpec::Expectations::Syntax.warn_about_should_unless_configured(__method__)
45
+ ::RSpec::Expectations::PositiveExpectationHandler.handle_matcher(self, matcher, message, &block)
46
+ end
47
+
48
+ def should_not(matcher=nil, message=nil, &block)
49
+ ::RSpec::Expectations::Syntax.warn_about_should_unless_configured(__method__)
50
+ ::RSpec::Expectations::NegativeExpectationHandler.handle_matcher(self, matcher, message, &block)
51
+ end
52
+ end
53
+ end
54
+
55
+ # @api private
56
+ # Disables the `should` syntax.
57
+ def disable_should(syntax_host=default_should_host)
58
+ return unless should_enabled?(syntax_host)
59
+
60
+ syntax_host.module_exec do
61
+ undef should
62
+ undef should_not
63
+ end
64
+ end
65
+
66
+ # @api private
67
+ # Enables the `expect` syntax.
68
+ def enable_expect(syntax_host=::RSpec::Matchers)
69
+ return if expect_enabled?(syntax_host)
70
+
71
+ syntax_host.module_exec do
72
+ def expect(value=::RSpec::Expectations::ExpectationTarget::UndefinedValue, &block)
73
+ ::RSpec::Expectations::ExpectationTarget.for(value, block)
74
+ end
75
+ end
76
+ end
77
+
78
+ # @api private
79
+ # Disables the `expect` syntax.
80
+ def disable_expect(syntax_host=::RSpec::Matchers)
81
+ return unless expect_enabled?(syntax_host)
82
+
83
+ syntax_host.module_exec do
84
+ undef expect
85
+ end
86
+ end
87
+
88
+ # @api private
89
+ # Indicates whether or not the `should` syntax is enabled.
90
+ def should_enabled?(syntax_host=default_should_host)
91
+ syntax_host.method_defined?(:should)
92
+ end
93
+
94
+ # @api private
95
+ # Indicates whether or not the `expect` syntax is enabled.
96
+ def expect_enabled?(syntax_host=::RSpec::Matchers)
97
+ syntax_host.method_defined?(:expect)
98
+ end
99
+ end
100
+ end
101
+ end
102
+
103
+ if defined?(BasicObject)
104
+ # The legacy `:should` syntax adds the following methods directly to
105
+ # `BasicObject` so that they are available off of any object. Note, however,
106
+ # that this syntax does not always play nice with delegate/proxy objects.
107
+ # We recommend you use the non-monkeypatching `:expect` syntax instead.
108
+ class BasicObject
109
+ # @method should
110
+ # Passes if `matcher` returns true. Available on every `Object`.
111
+ # @example
112
+ # actual.should eq expected
113
+ # actual.should match /expression/
114
+ # @param [Matcher]
115
+ # matcher
116
+ # @param [String] message optional message to display when the expectation fails
117
+ # @return [Boolean] true if the expectation succeeds (else raises)
118
+ # @note This is only available when you have enabled the `:should` syntax.
119
+ # @see RSpec::Matchers
120
+
121
+ # @method should_not
122
+ # Passes if `matcher` returns false. Available on every `Object`.
123
+ # @example
124
+ # actual.should_not eq expected
125
+ # @param [Matcher]
126
+ # matcher
127
+ # @param [String] message optional message to display when the expectation fails
128
+ # @return [Boolean] false if the negative expectation succeeds (else raises)
129
+ # @note This is only available when you have enabled the `:should` syntax.
130
+ # @see RSpec::Matchers
131
+ end
132
+ end
@@ -0,0 +1,8 @@
1
+ module RSpec
2
+ module Expectations
3
+ # @private
4
+ module Version
5
+ STRING = '3.1.2'
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,967 @@
1
+ require 'rspec/support'
2
+ RSpec::Support.require_rspec_support 'matcher_definition'
3
+ RSpec::Support.define_optimized_require_for_rspec(:matchers) { |f| require_relative(f) }
4
+
5
+ %w[
6
+ pretty
7
+ composable
8
+ built_in
9
+ generated_descriptions
10
+ dsl
11
+ matcher_delegator
12
+ aliased_matcher
13
+ ].each { |file| RSpec::Support.require_rspec_matchers(file) }
14
+
15
+ # RSpec's top level namespace. All of rspec-expectations is contained
16
+ # in the `RSpec::Expectations` and `RSpec::Matchers` namespaces.
17
+ module RSpec
18
+ # RSpec::Matchers provides a number of useful matchers we use to define
19
+ # expectations. Any object that implements the [matcher protocol](Matchers/MatcherProtocol)
20
+ # can be used as a matcher.
21
+ #
22
+ # ## Predicates
23
+ #
24
+ # In addition to matchers that are defined explicitly, RSpec will create
25
+ # custom matchers on the fly for any arbitrary predicate, giving your specs a
26
+ # much more natural language feel.
27
+ #
28
+ # A Ruby predicate is a method that ends with a "?" and returns true or false.
29
+ # Common examples are `empty?`, `nil?`, and `instance_of?`.
30
+ #
31
+ # All you need to do is write `expect(..).to be_` followed by the predicate
32
+ # without the question mark, and RSpec will figure it out from there.
33
+ # For example:
34
+ #
35
+ # expect([]).to be_empty # => [].empty?() | passes
36
+ # expect([]).not_to be_empty # => [].empty?() | fails
37
+ #
38
+ # In addtion to prefixing the predicate matchers with "be_", you can also use "be_a_"
39
+ # and "be_an_", making your specs read much more naturally:
40
+ #
41
+ # expect("a string").to be_an_instance_of(String) # =>"a string".instance_of?(String) # passes
42
+ #
43
+ # expect(3).to be_a_kind_of(Fixnum) # => 3.kind_of?(Numeric) | passes
44
+ # expect(3).to be_a_kind_of(Numeric) # => 3.kind_of?(Numeric) | passes
45
+ # expect(3).to be_an_instance_of(Fixnum) # => 3.instance_of?(Fixnum) | passes
46
+ # expect(3).not_to be_an_instance_of(Numeric) # => 3.instance_of?(Numeric) | fails
47
+ #
48
+ # RSpec will also create custom matchers for predicates like `has_key?`. To
49
+ # use this feature, just state that the object should have_key(:key) and RSpec will
50
+ # call has_key?(:key) on the target. For example:
51
+ #
52
+ # expect(:a => "A").to have_key(:a)
53
+ # expect(:a => "A").to have_key(:b) # fails
54
+ #
55
+ # You can use this feature to invoke any predicate that begins with "has_", whether it is
56
+ # part of the Ruby libraries (like `Hash#has_key?`) or a method you wrote on your own class.
57
+ #
58
+ # Note that RSpec does not provide composable aliases for these dynamic predicate
59
+ # matchers. You can easily define your own aliases, though:
60
+ #
61
+ # RSpec::Matchers.alias_matcher :a_user_who_is_an_admin, :be_an_admin
62
+ # expect(user_list).to include(a_user_who_is_an_admin)
63
+ #
64
+ # ## Custom Matchers
65
+ #
66
+ # When you find that none of the stock matchers provide a natural feeling
67
+ # expectation, you can very easily write your own using RSpec's matcher DSL
68
+ # or writing one from scratch.
69
+ #
70
+ # ### Matcher DSL
71
+ #
72
+ # Imagine that you are writing a game in which players can be in various
73
+ # zones on a virtual board. To specify that bob should be in zone 4, you
74
+ # could say:
75
+ #
76
+ # expect(bob.current_zone).to eql(Zone.new("4"))
77
+ #
78
+ # But you might find it more expressive to say:
79
+ #
80
+ # expect(bob).to be_in_zone("4")
81
+ #
82
+ # and/or
83
+ #
84
+ # expect(bob).not_to be_in_zone("3")
85
+ #
86
+ # You can create such a matcher like so:
87
+ #
88
+ # RSpec::Matchers.define :be_in_zone do |zone|
89
+ # match do |player|
90
+ # player.in_zone?(zone)
91
+ # end
92
+ # end
93
+ #
94
+ # This will generate a <tt>be_in_zone</tt> method that returns a matcher
95
+ # with logical default messages for failures. You can override the failure
96
+ # messages and the generated description as follows:
97
+ #
98
+ # RSpec::Matchers.define :be_in_zone do |zone|
99
+ # match do |player|
100
+ # player.in_zone?(zone)
101
+ # end
102
+ #
103
+ # failure_message do |player|
104
+ # # generate and return the appropriate string.
105
+ # end
106
+ #
107
+ # failure_message_when_negated do |player|
108
+ # # generate and return the appropriate string.
109
+ # end
110
+ #
111
+ # description do
112
+ # # generate and return the appropriate string.
113
+ # end
114
+ # end
115
+ #
116
+ # Each of the message-generation methods has access to the block arguments
117
+ # passed to the <tt>create</tt> method (in this case, <tt>zone</tt>). The
118
+ # failure message methods (<tt>failure_message</tt> and
119
+ # <tt>failure_message_when_negated</tt>) are passed the actual value (the
120
+ # receiver of <tt>expect(..)</tt> or <tt>expect(..).not_to</tt>).
121
+ #
122
+ # ### Custom Matcher from scratch
123
+ #
124
+ # You could also write a custom matcher from scratch, as follows:
125
+ #
126
+ # class BeInZone
127
+ # def initialize(expected)
128
+ # @expected = expected
129
+ # end
130
+ #
131
+ # def matches?(target)
132
+ # @target = target
133
+ # @target.current_zone.eql?(Zone.new(@expected))
134
+ # end
135
+ #
136
+ # def failure_message
137
+ # "expected #{@target.inspect} to be in Zone #{@expected}"
138
+ # end
139
+ #
140
+ # def failure_message_when_negated
141
+ # "expected #{@target.inspect} not to be in Zone #{@expected}"
142
+ # end
143
+ # end
144
+ #
145
+ # ... and a method like this:
146
+ #
147
+ # def be_in_zone(expected)
148
+ # BeInZone.new(expected)
149
+ # end
150
+ #
151
+ # And then expose the method to your specs. This is normally done
152
+ # by including the method and the class in a module, which is then
153
+ # included in your spec:
154
+ #
155
+ # module CustomGameMatchers
156
+ # class BeInZone
157
+ # # ...
158
+ # end
159
+ #
160
+ # def be_in_zone(expected)
161
+ # # ...
162
+ # end
163
+ # end
164
+ #
165
+ # describe "Player behaviour" do
166
+ # include CustomGameMatchers
167
+ # # ...
168
+ # end
169
+ #
170
+ # or you can include in globally in a spec_helper.rb file <tt>require</tt>d
171
+ # from your spec file(s):
172
+ #
173
+ # RSpec::configure do |config|
174
+ # config.include(CustomGameMatchers)
175
+ # end
176
+ #
177
+ # ### Making custom matchers composable
178
+ #
179
+ # RSpec's built-in matchers are designed to be composed, in expressions like:
180
+ #
181
+ # expect(["barn", 2.45]).to contain_exactly(
182
+ # a_value_within(0.1).of(2.5),
183
+ # a_string_starting_with("bar")
184
+ # )
185
+ #
186
+ # Custom matchers can easily participate in composed matcher expressions like these.
187
+ # Include {RSpec::Matchers::Composable} in your custom matcher to make it support
188
+ # being composed (matchers defined using the DSL have this included automatically).
189
+ # Within your matcher's `matches?` method (or the `match` block, if using the DSL),
190
+ # use `values_match?(expected, actual)` rather than `expected == actual`.
191
+ # Under the covers, `values_match?` is able to match arbitrary
192
+ # nested data structures containing a mix of both matchers and non-matcher objects.
193
+ # It uses `===` and `==` to perform the matching, considering the values to
194
+ # match if either returns `true`. The `Composable` mixin also provides some helper
195
+ # methods for surfacing the matcher descriptions within your matcher's description
196
+ # or failure messages.
197
+ #
198
+ # RSpec's built-in matchers each have a number of aliases that rephrase the matcher
199
+ # from a verb phrase (such as `be_within`) to a noun phrase (such as `a_value_within`),
200
+ # which reads better when the matcher is passed as an argument in a composed matcher
201
+ # expressions, and also uses the noun-phrase wording in the matcher's `description`,
202
+ # for readable failure messages. You can alias your custom matchers in similar fashion
203
+ # using {RSpec::Matchers.alias_matcher}.
204
+ module Matchers
205
+ # @method expect
206
+ # Supports `expect(actual).to matcher` syntax by wrapping `actual` in an
207
+ # `ExpectationTarget`.
208
+ # @example
209
+ # expect(actual).to eq(expected)
210
+ # expect(actual).not_to eq(expected)
211
+ # @return [ExpectationTarget]
212
+ # @see ExpectationTarget#to
213
+ # @see ExpectationTarget#not_to
214
+
215
+ # Defines a matcher alias. The returned matcher's `description` will be overriden
216
+ # to reflect the phrasing of the new name, which will be used in failure messages
217
+ # when passed as an argument to another matcher in a composed matcher expression.
218
+ #
219
+ # @param new_name [Symbol] the new name for the matcher
220
+ # @param old_name [Symbol] the original name for the matcher
221
+ # @param options [Hash] options for the aliased matcher
222
+ # @option options [Class] :klass the ruby class to use as the decorator. (Not normally used).
223
+ # @yield [String] optional block that, when given is used to define the overriden
224
+ # description. The yielded arg is the original description. If no block is
225
+ # provided, a default description override is used based on the old and
226
+ # new names.
227
+ #
228
+ # @example
229
+ #
230
+ # RSpec::Matchers.alias_matcher :a_list_that_sums_to, :sum_to
231
+ # sum_to(3).description # => "sum to 3"
232
+ # a_list_that_sums_to(3).description # => "a list that sums to 3"
233
+ #
234
+ # @example
235
+ #
236
+ # RSpec::Matchers.alias_matcher :a_list_sorted_by, :be_sorted_by do |description|
237
+ # description.sub("be sorted by", "a list sorted by")
238
+ # end
239
+ #
240
+ # be_sorted_by(:age).description # => "be sorted by age"
241
+ # a_list_sorted_by(:age).description # => "a list sorted by age"
242
+ #
243
+ # @!macro [attach] alias_matcher
244
+ # @!parse
245
+ # alias $1 $2
246
+ def self.alias_matcher(new_name, old_name, options={}, &description_override)
247
+ description_override ||= lambda do |old_desc|
248
+ old_desc.gsub(Pretty.split_words(old_name), Pretty.split_words(new_name))
249
+ end
250
+ klass = options.fetch(:klass) { AliasedMatcher }
251
+
252
+ define_method(new_name) do |*args, &block|
253
+ matcher = __send__(old_name, *args, &block)
254
+ klass.new(matcher, description_override)
255
+ end
256
+ end
257
+
258
+ # Defines a negated matcher. The returned matcher's `description` and `failure_message`
259
+ # will be overriden to reflect the phrasing of the new name, and the match logic will
260
+ # be based on the original matcher but negated.
261
+ #
262
+ # @param negated_name [Symbol] the name for the negated matcher
263
+ # @param base_name [Symbol] the name of the original matcher that will be negated
264
+ # @yield [String] optional block that, when given is used to define the overriden
265
+ # description. The yielded arg is the original description. If no block is
266
+ # provided, a default description override is used based on the old and
267
+ # new names.
268
+ #
269
+ # @example
270
+ #
271
+ # RSpec::Matchers.define_negated_matcher :a_value_not_between, :a_value_between
272
+ # a_value_between(3, 5).description # => "a value between 3 and 5"
273
+ # a_value_not_between(3, 5).description # => "a value not between 3 and 5"
274
+ def self.define_negated_matcher(negated_name, base_name, &description_override)
275
+ alias_matcher(negated_name, base_name, :klass => AliasedNegatedMatcher, &description_override)
276
+ end
277
+
278
+ # Passes if actual is truthy (anything but false or nil)
279
+ def be_truthy
280
+ BuiltIn::BeTruthy.new
281
+ end
282
+ alias_matcher :a_truthy_value, :be_truthy
283
+
284
+ # Passes if actual is falsey (false or nil)
285
+ def be_falsey
286
+ BuiltIn::BeFalsey.new
287
+ end
288
+ alias_matcher :be_falsy, :be_falsey
289
+ alias_matcher :a_falsey_value, :be_falsey
290
+ alias_matcher :a_falsy_value, :be_falsey
291
+
292
+ # Passes if actual is nil
293
+ def be_nil
294
+ BuiltIn::BeNil.new
295
+ end
296
+ alias_matcher :a_nil_value, :be_nil
297
+
298
+ # @example
299
+ # expect(actual).to be_truthy
300
+ # expect(actual).to be_falsey
301
+ # expect(actual).to be_nil
302
+ # expect(actual).to be_[arbitrary_predicate](*args)
303
+ # expect(actual).not_to be_nil
304
+ # expect(actual).not_to be_[arbitrary_predicate](*args)
305
+ #
306
+ # Given true, false, or nil, will pass if actual value is true, false or
307
+ # nil (respectively). Given no args means the caller should satisfy an if
308
+ # condition (to be or not to be).
309
+ #
310
+ # Predicates are any Ruby method that ends in a "?" and returns true or
311
+ # false. Given be_ followed by arbitrary_predicate (without the "?"),
312
+ # RSpec will match convert that into a query against the target object.
313
+ #
314
+ # The arbitrary_predicate feature will handle any predicate prefixed with
315
+ # "be_an_" (e.g. be_an_instance_of), "be_a_" (e.g. be_a_kind_of) or "be_"
316
+ # (e.g. be_empty), letting you choose the prefix that best suits the
317
+ # predicate.
318
+ def be(*args)
319
+ args.empty? ? Matchers::BuiltIn::Be.new : equal(*args)
320
+ end
321
+ alias_matcher :a_value, :be, :klass => AliasedMatcherWithOperatorSupport
322
+
323
+ # passes if target.kind_of?(klass)
324
+ def be_a(klass)
325
+ be_a_kind_of(klass)
326
+ end
327
+ alias_method :be_an, :be_a
328
+
329
+ # Passes if actual.instance_of?(expected)
330
+ #
331
+ # @example
332
+ #
333
+ # expect(5).to be_an_instance_of(Fixnum)
334
+ # expect(5).not_to be_an_instance_of(Numeric)
335
+ # expect(5).not_to be_an_instance_of(Float)
336
+ def be_an_instance_of(expected)
337
+ BuiltIn::BeAnInstanceOf.new(expected)
338
+ end
339
+ alias_method :be_instance_of, :be_an_instance_of
340
+ alias_matcher :an_instance_of, :be_an_instance_of
341
+
342
+ # Passes if actual.kind_of?(expected)
343
+ #
344
+ # @example
345
+ #
346
+ # expect(5).to be_a_kind_of(Fixnum)
347
+ # expect(5).to be_a_kind_of(Numeric)
348
+ # expect(5).not_to be_a_kind_of(Float)
349
+ def be_a_kind_of(expected)
350
+ BuiltIn::BeAKindOf.new(expected)
351
+ end
352
+ alias_method :be_kind_of, :be_a_kind_of
353
+ alias_matcher :a_kind_of, :be_a_kind_of
354
+
355
+ # Passes if actual.between?(min, max). Works with any Comparable object,
356
+ # including String, Symbol, Time, or Numeric (Fixnum, Bignum, Integer,
357
+ # Float, Complex, and Rational).
358
+ #
359
+ # By default, `be_between` is inclusive (i.e. passes when given either the max or min value),
360
+ # but you can make it `exclusive` by chaining that off the matcher.
361
+ #
362
+ # @example
363
+ #
364
+ # expect(5).to be_between(1, 10)
365
+ # expect(11).not_to be_between(1, 10)
366
+ # expect(10).not_to be_between(1, 10).exclusive
367
+ def be_between(min, max)
368
+ BuiltIn::BeBetween.new(min, max)
369
+ end
370
+ alias_matcher :a_value_between, :be_between
371
+
372
+ # Passes if actual == expected +/- delta
373
+ #
374
+ # @example
375
+ #
376
+ # expect(result).to be_within(0.5).of(3.0)
377
+ # expect(result).not_to be_within(0.5).of(3.0)
378
+ def be_within(delta)
379
+ BuiltIn::BeWithin.new(delta)
380
+ end
381
+ alias_matcher :a_value_within, :be_within
382
+ alias_matcher :within, :be_within
383
+
384
+ # Applied to a proc, specifies that its execution will cause some value to
385
+ # change.
386
+ #
387
+ # @param [Object] receiver
388
+ # @param [Symbol] message the message to send the receiver
389
+ #
390
+ # You can either pass <tt>receiver</tt> and <tt>message</tt>, or a block,
391
+ # but not both.
392
+ #
393
+ # When passing a block, it must use the `{ ... }` format, not
394
+ # do/end, as `{ ... }` binds to the `change` method, whereas do/end
395
+ # would errantly bind to the `expect(..).to` or `expect(...).not_to` method.
396
+ #
397
+ # You can chain any of the following off of the end to specify details
398
+ # about the change:
399
+ #
400
+ # * `from`
401
+ # * `to`
402
+ #
403
+ # or any one of:
404
+ #
405
+ # * `by`
406
+ # * `by_at_least`
407
+ # * `by_at_most`
408
+ #
409
+ # @example
410
+ #
411
+ # expect {
412
+ # team.add_player(player)
413
+ # }.to change(roster, :count)
414
+ #
415
+ # expect {
416
+ # team.add_player(player)
417
+ # }.to change(roster, :count).by(1)
418
+ #
419
+ # expect {
420
+ # team.add_player(player)
421
+ # }.to change(roster, :count).by_at_least(1)
422
+ #
423
+ # expect {
424
+ # team.add_player(player)
425
+ # }.to change(roster, :count).by_at_most(1)
426
+ #
427
+ # string = "string"
428
+ # expect {
429
+ # string.reverse!
430
+ # }.to change { string }.from("string").to("gnirts")
431
+ #
432
+ # string = "string"
433
+ # expect {
434
+ # string
435
+ # }.not_to change { string }.from("string")
436
+ #
437
+ # expect {
438
+ # person.happy_birthday
439
+ # }.to change(person, :birthday).from(32).to(33)
440
+ #
441
+ # expect {
442
+ # employee.develop_great_new_social_networking_app
443
+ # }.to change(employee, :title).from("Mail Clerk").to("CEO")
444
+ #
445
+ # expect {
446
+ # doctor.leave_office
447
+ # }.to change(doctor, :sign).from(/is in/).to(/is out/)
448
+ #
449
+ # user = User.new(:type => "admin")
450
+ # expect {
451
+ # user.symbolize_type
452
+ # }.to change(user, :type).from(String).to(Symbol)
453
+ #
454
+ # == Notes
455
+ #
456
+ # Evaluates `receiver.message` or `block` before and after it
457
+ # evaluates the block passed to `expect`.
458
+ #
459
+ # `expect( ... ).not_to change` supports the form that specifies `from`
460
+ # (which specifies what you expect the starting, unchanged value to be)
461
+ # but does not support forms with subsequent calls to `by`, `by_at_least`,
462
+ # `by_at_most` or `to`.
463
+ def change(receiver=nil, message=nil, &block)
464
+ BuiltIn::Change.new(receiver, message, &block)
465
+ end
466
+ alias_matcher :a_block_changing, :change
467
+ alias_matcher :changing, :change
468
+
469
+ # Passes if actual contains all of the expected regardless of order.
470
+ # This works for collections. Pass in multiple args and it will only
471
+ # pass if all args are found in collection.
472
+ #
473
+ # @note This is also available using the `=~` operator with `should`,
474
+ # but `=~` is not supported with `expect`.
475
+ #
476
+ # @example
477
+ #
478
+ # expect([1, 2, 3]).to contain_exactly(1, 2, 3)
479
+ # expect([1, 2, 3]).to contain_exactly(1, 3, 2)
480
+ #
481
+ # @see #match_array
482
+ def contain_exactly(*items)
483
+ BuiltIn::ContainExactly.new(items)
484
+ end
485
+ alias_matcher :a_collection_containing_exactly, :contain_exactly
486
+ alias_matcher :containing_exactly, :contain_exactly
487
+
488
+ # Passes if actual covers expected. This works for
489
+ # Ranges. You can also pass in multiple args
490
+ # and it will only pass if all args are found in Range.
491
+ #
492
+ # @example
493
+ # expect(1..10).to cover(5)
494
+ # expect(1..10).to cover(4, 6)
495
+ # expect(1..10).to cover(4, 6, 11) # fails
496
+ # expect(1..10).not_to cover(11)
497
+ # expect(1..10).not_to cover(5) # fails
498
+ #
499
+ # ### Warning:: Ruby >= 1.9 only
500
+ def cover(*values)
501
+ BuiltIn::Cover.new(*values)
502
+ end
503
+ alias_matcher :a_range_covering, :cover
504
+ alias_matcher :covering, :cover
505
+
506
+ # Matches if the actual value ends with the expected value(s). In the case
507
+ # of a string, matches against the last `expected.length` characters of the
508
+ # actual string. In the case of an array, matches against the last
509
+ # `expected.length` elements of the actual array.
510
+ #
511
+ # @example
512
+ #
513
+ # expect("this string").to end_with "string"
514
+ # expect([0, 1, 2, 3, 4]).to end_with 4
515
+ # expect([0, 2, 3, 4, 4]).to end_with 3, 4
516
+ def end_with(*expected)
517
+ BuiltIn::EndWith.new(*expected)
518
+ end
519
+ alias_matcher :a_collection_ending_with, :end_with
520
+ alias_matcher :a_string_ending_with, :end_with
521
+ alias_matcher :ending_with, :end_with
522
+
523
+ # Passes if <tt>actual == expected</tt>.
524
+ #
525
+ # See http://www.ruby-doc.org/core/classes/Object.html#M001057 for more
526
+ # information about equality in Ruby.
527
+ #
528
+ # @example
529
+ #
530
+ # expect(5).to eq(5)
531
+ # expect(5).not_to eq(3)
532
+ def eq(expected)
533
+ BuiltIn::Eq.new(expected)
534
+ end
535
+ alias_matcher :an_object_eq_to, :eq
536
+ alias_matcher :eq_to, :eq
537
+
538
+ # Passes if `actual.eql?(expected)`
539
+ #
540
+ # See http://www.ruby-doc.org/core/classes/Object.html#M001057 for more
541
+ # information about equality in Ruby.
542
+ #
543
+ # @example
544
+ #
545
+ # expect(5).to eql(5)
546
+ # expect(5).not_to eql(3)
547
+ def eql(expected)
548
+ BuiltIn::Eql.new(expected)
549
+ end
550
+ alias_matcher :an_object_eql_to, :eql
551
+ alias_matcher :eql_to, :eql
552
+
553
+ # Passes if <tt>actual.equal?(expected)</tt> (object identity).
554
+ #
555
+ # See http://www.ruby-doc.org/core/classes/Object.html#M001057 for more
556
+ # information about equality in Ruby.
557
+ #
558
+ # @example
559
+ #
560
+ # expect(5).to equal(5) # Fixnums are equal
561
+ # expect("5").not_to equal("5") # Strings that look the same are not the same object
562
+ def equal(expected)
563
+ BuiltIn::Equal.new(expected)
564
+ end
565
+ alias_matcher :an_object_equal_to, :equal
566
+ alias_matcher :equal_to, :equal
567
+
568
+ # Passes if `actual.exist?` or `actual.exists?`
569
+ #
570
+ # @example
571
+ # expect(File).to exist("path/to/file")
572
+ def exist(*args)
573
+ BuiltIn::Exist.new(*args)
574
+ end
575
+ alias_matcher :an_object_existing, :exist
576
+ alias_matcher :existing, :exist
577
+
578
+ # Passes if actual's attribute values match the expected attributes hash.
579
+ # This works no matter how you define your attribute readers.
580
+ #
581
+ # @example
582
+ #
583
+ # Person = Struct.new(:name, :age)
584
+ # person = Person.new("Bob", 32)
585
+ #
586
+ # expect(person).to have_attributes(:name => "Bob", :age => 32)
587
+ # expect(person).to have_attributes(:name => a_string_starting_with("B"), :age => (a_value > 30) )
588
+ #
589
+ # @note It will fail if actual doesn't respond to any of the expected attributes.
590
+ #
591
+ # @example
592
+ #
593
+ # expect(person).to have_attributes(:color => "red")
594
+ def have_attributes(expected)
595
+ BuiltIn::HaveAttributes.new(expected)
596
+ end
597
+ alias_matcher :an_object_having_attributes, :have_attributes
598
+
599
+ # Passes if actual includes expected. This works for
600
+ # collections and Strings. You can also pass in multiple args
601
+ # and it will only pass if all args are found in collection.
602
+ #
603
+ # @example
604
+ #
605
+ # expect([1,2,3]).to include(3)
606
+ # expect([1,2,3]).to include(2,3)
607
+ # expect([1,2,3]).to include(2,3,4) # fails
608
+ # expect([1,2,3]).not_to include(4)
609
+ # expect("spread").to include("read")
610
+ # expect("spread").not_to include("red")
611
+ def include(*expected)
612
+ BuiltIn::Include.new(*expected)
613
+ end
614
+ alias_matcher :a_collection_including, :include
615
+ alias_matcher :a_string_including, :include
616
+ alias_matcher :a_hash_including, :include
617
+ alias_matcher :including, :include
618
+
619
+ # Passes if actual all expected objects pass. This works for
620
+ # any enumerable object.
621
+ #
622
+ # @example
623
+ #
624
+ # expect([1, 3, 5]).to all be_odd
625
+ # expect([1, 3, 6]).to all be_odd # fails
626
+ #
627
+ # @note The negative form `not_to all` is not supported. Instead
628
+ # use `not_to include` or pass a negative form of a matcher
629
+ # as the argument (e.g. `all exclude(:foo)`).
630
+ #
631
+ # @note You can also use this with compound matchers as well.
632
+ #
633
+ # @example
634
+ # expect([1, 3, 5]).to all( be_odd.and be_an(Integer) )
635
+ def all(expected)
636
+ BuiltIn::All.new(expected)
637
+ end
638
+
639
+ # Given a `Regexp` or `String`, passes if `actual.match(pattern)`
640
+ # Given an arbitrary nested data structure (e.g. arrays and hashes),
641
+ # matches if `expected === actual` || `actual == expected` for each
642
+ # pair of elements.
643
+ #
644
+ # @example
645
+ #
646
+ # expect(email).to match(/^([^\s]+)((?:[-a-z0-9]+\.)+[a-z]{2,})$/i)
647
+ # expect(email).to match("@example.com")
648
+ #
649
+ # @example
650
+ #
651
+ # hash = {
652
+ # :a => {
653
+ # :b => ["foo", 5],
654
+ # :c => { :d => 2.05 }
655
+ # }
656
+ # }
657
+ #
658
+ # expect(hash).to match(
659
+ # :a => {
660
+ # :b => a_collection_containing_exactly(
661
+ # a_string_starting_with("f"),
662
+ # an_instance_of(Fixnum)
663
+ # ),
664
+ # :c => { :d => (a_value < 3) }
665
+ # }
666
+ # )
667
+ #
668
+ # @note The `match_regex` alias is deprecated and is not recommended for use.
669
+ # It was added in 2.12.1 to facilitate its use from within custom
670
+ # matchers (due to how the custom matcher DSL was evaluated in 2.x,
671
+ # `match` could not be used there), but is no longer needed in 3.x.
672
+ def match(expected)
673
+ BuiltIn::Match.new(expected)
674
+ end
675
+ alias_matcher :match_regex, :match
676
+ alias_matcher :an_object_matching, :match
677
+ alias_matcher :a_string_matching, :match
678
+ alias_matcher :matching, :match
679
+
680
+ # An alternate form of `contain_exactly` that accepts
681
+ # the expected contents as a single array arg rather
682
+ # that splatted out as individual items.
683
+ #
684
+ # @example
685
+ #
686
+ # expect(results).to contain_exactly(1, 2)
687
+ # # is identical to:
688
+ # expect(results).to match_array([1, 2])
689
+ #
690
+ # @see #contain_exactly
691
+ def match_array(items)
692
+ contain_exactly(*items)
693
+ end
694
+
695
+ # With no arg, passes if the block outputs `to_stdout` or `to_stderr`.
696
+ # With a string, passes if the blocks outputs that specific string `to_stdout` or `to_stderr`.
697
+ # With a regexp or matcher, passes if the blocks outputs a string `to_stdout` or `to_stderr` that matches.
698
+ #
699
+ # @example
700
+ #
701
+ # expect { print 'foo' }.to output.to_stdout
702
+ # expect { print 'foo' }.to output('foo').to_stdout
703
+ # expect { print 'foo' }.to output(/foo/).to_stdout
704
+ #
705
+ # expect { do_something }.to_not output.to_stdout
706
+ #
707
+ # expect { warn('foo') }.to output.to_stderr
708
+ # expect { warn('foo') }.to output('foo').to_stderr
709
+ # expect { warn('foo') }.to output(/foo/).to_stderr
710
+ #
711
+ # expect { do_something }.to_not output.to_stderr
712
+ #
713
+ # @note This matcher works by temporarily replacing `$stdout` or `$stderr`,
714
+ # so it's not able to intercept stream output that explicitly uses `STDOUT`/`STDERR`
715
+ # or that uses a reference to `$stdout`/`$stderr` that was stored before the
716
+ # matcher is used.
717
+ def output(expected=nil)
718
+ BuiltIn::Output.new(expected)
719
+ end
720
+ alias_matcher :a_block_outputting, :output
721
+
722
+ # With no args, matches if any error is raised.
723
+ # With a named error, matches only if that specific error is raised.
724
+ # With a named error and messsage specified as a String, matches only if both match.
725
+ # With a named error and messsage specified as a Regexp, matches only if both match.
726
+ # Pass an optional block to perform extra verifications on the exception matched
727
+ #
728
+ # @example
729
+ #
730
+ # expect { do_something_risky }.to raise_error
731
+ # expect { do_something_risky }.to raise_error(PoorRiskDecisionError)
732
+ # expect { do_something_risky }.to raise_error(PoorRiskDecisionError) { |error| expect(error.data).to eq 42 }
733
+ # expect { do_something_risky }.to raise_error(PoorRiskDecisionError, "that was too risky")
734
+ # expect { do_something_risky }.to raise_error(PoorRiskDecisionError, /oo ri/)
735
+ #
736
+ # expect { do_something_risky }.not_to raise_error
737
+ def raise_error(error=Exception, message=nil, &block)
738
+ BuiltIn::RaiseError.new(error, message, &block)
739
+ end
740
+ alias_method :raise_exception, :raise_error
741
+
742
+ alias_matcher :a_block_raising, :raise_error do |desc|
743
+ desc.sub("raise", "a block raising")
744
+ end
745
+
746
+ alias_matcher :raising, :raise_error do |desc|
747
+ desc.sub("raise", "raising")
748
+ end
749
+
750
+ # Matches if the target object responds to all of the names
751
+ # provided. Names can be Strings or Symbols.
752
+ #
753
+ # @example
754
+ #
755
+ # expect("string").to respond_to(:length)
756
+ #
757
+ def respond_to(*names)
758
+ BuiltIn::RespondTo.new(*names)
759
+ end
760
+ alias_matcher :an_object_responding_to, :respond_to
761
+ alias_matcher :responding_to, :respond_to
762
+
763
+ # Passes if the submitted block returns true. Yields target to the
764
+ # block.
765
+ #
766
+ # Generally speaking, this should be thought of as a last resort when
767
+ # you can't find any other way to specify the behaviour you wish to
768
+ # specify.
769
+ #
770
+ # If you do find yourself in such a situation, you could always write
771
+ # a custom matcher, which would likely make your specs more expressive.
772
+ #
773
+ # @example
774
+ #
775
+ # expect(5).to satisfy { |n| n > 3 }
776
+ def satisfy(&block)
777
+ BuiltIn::Satisfy.new(&block)
778
+ end
779
+ alias_matcher :an_object_satisfying, :satisfy
780
+ alias_matcher :satisfying, :satisfy
781
+
782
+ # Matches if the actual value starts with the expected value(s). In the
783
+ # case of a string, matches against the first `expected.length` characters
784
+ # of the actual string. In the case of an array, matches against the first
785
+ # `expected.length` elements of the actual array.
786
+ #
787
+ # @example
788
+ #
789
+ # expect("this string").to start_with "this s"
790
+ # expect([0, 1, 2, 3, 4]).to start_with 0
791
+ # expect([0, 2, 3, 4, 4]).to start_with 0, 1
792
+ def start_with(*expected)
793
+ BuiltIn::StartWith.new(*expected)
794
+ end
795
+ alias_matcher :a_collection_starting_with, :start_with
796
+ alias_matcher :a_string_starting_with, :start_with
797
+ alias_matcher :starting_with, :start_with
798
+
799
+ # Given no argument, matches if a proc throws any Symbol.
800
+ #
801
+ # Given a Symbol, matches if the given proc throws the specified Symbol.
802
+ #
803
+ # Given a Symbol and an arg, matches if the given proc throws the
804
+ # specified Symbol with the specified arg.
805
+ #
806
+ # @example
807
+ #
808
+ # expect { do_something_risky }.to throw_symbol
809
+ # expect { do_something_risky }.to throw_symbol(:that_was_risky)
810
+ # expect { do_something_risky }.to throw_symbol(:that_was_risky, 'culprit')
811
+ #
812
+ # expect { do_something_risky }.not_to throw_symbol
813
+ # expect { do_something_risky }.not_to throw_symbol(:that_was_risky)
814
+ # expect { do_something_risky }.not_to throw_symbol(:that_was_risky, 'culprit')
815
+ def throw_symbol(expected_symbol=nil, expected_arg=nil)
816
+ BuiltIn::ThrowSymbol.new(expected_symbol, expected_arg)
817
+ end
818
+
819
+ alias_matcher :a_block_throwing, :throw_symbol do |desc|
820
+ desc.sub("throw", "a block throwing")
821
+ end
822
+
823
+ alias_matcher :throwing, :throw_symbol do |desc|
824
+ desc.sub("throw", "throwing")
825
+ end
826
+
827
+ # Passes if the method called in the expect block yields, regardless
828
+ # of whether or not arguments are yielded.
829
+ #
830
+ # @example
831
+ #
832
+ # expect { |b| 5.tap(&b) }.to yield_control
833
+ # expect { |b| "a".to_sym(&b) }.not_to yield_control
834
+ #
835
+ # @note Your expect block must accept a parameter and pass it on to
836
+ # the method-under-test as a block.
837
+ # @note This matcher is not designed for use with methods that yield
838
+ # multiple times.
839
+ def yield_control
840
+ BuiltIn::YieldControl.new
841
+ end
842
+ alias_matcher :a_block_yielding_control, :yield_control
843
+ alias_matcher :yielding_control, :yield_control
844
+
845
+ # Passes if the method called in the expect block yields with
846
+ # no arguments. Fails if it does not yield, or yields with arguments.
847
+ #
848
+ # @example
849
+ #
850
+ # expect { |b| User.transaction(&b) }.to yield_with_no_args
851
+ # expect { |b| 5.tap(&b) }.not_to yield_with_no_args # because it yields with `5`
852
+ # expect { |b| "a".to_sym(&b) }.not_to yield_with_no_args # because it does not yield
853
+ #
854
+ # @note Your expect block must accept a parameter and pass it on to
855
+ # the method-under-test as a block.
856
+ # @note This matcher is not designed for use with methods that yield
857
+ # multiple times.
858
+ def yield_with_no_args
859
+ BuiltIn::YieldWithNoArgs.new
860
+ end
861
+ alias_matcher :a_block_yielding_with_no_args, :yield_with_no_args
862
+ alias_matcher :yielding_with_no_args, :yield_with_no_args
863
+
864
+ # Given no arguments, matches if the method called in the expect
865
+ # block yields with arguments (regardless of what they are or how
866
+ # many there are).
867
+ #
868
+ # Given arguments, matches if the method called in the expect block
869
+ # yields with arguments that match the given arguments.
870
+ #
871
+ # Argument matching is done using `===` (the case match operator)
872
+ # and `==`. If the expected and actual arguments match with either
873
+ # operator, the matcher will pass.
874
+ #
875
+ # @example
876
+ #
877
+ # expect { |b| 5.tap(&b) }.to yield_with_args # because #tap yields an arg
878
+ # expect { |b| 5.tap(&b) }.to yield_with_args(5) # because 5 == 5
879
+ # expect { |b| 5.tap(&b) }.to yield_with_args(Fixnum) # because Fixnum === 5
880
+ # expect { |b| File.open("f.txt", &b) }.to yield_with_args(/txt/) # because /txt/ === "f.txt"
881
+ #
882
+ # expect { |b| User.transaction(&b) }.not_to yield_with_args # because it yields no args
883
+ # expect { |b| 5.tap(&b) }.not_to yield_with_args(1, 2, 3)
884
+ #
885
+ # @note Your expect block must accept a parameter and pass it on to
886
+ # the method-under-test as a block.
887
+ # @note This matcher is not designed for use with methods that yield
888
+ # multiple times.
889
+ def yield_with_args(*args)
890
+ BuiltIn::YieldWithArgs.new(*args)
891
+ end
892
+ alias_matcher :a_block_yielding_with_args, :yield_with_args
893
+ alias_matcher :yielding_with_args, :yield_with_args
894
+
895
+ # Designed for use with methods that repeatedly yield (such as
896
+ # iterators). Passes if the method called in the expect block yields
897
+ # multiple times with arguments matching those given.
898
+ #
899
+ # Argument matching is done using `===` (the case match operator)
900
+ # and `==`. If the expected and actual arguments match with either
901
+ # operator, the matcher will pass.
902
+ #
903
+ # @example
904
+ #
905
+ # expect { |b| [1, 2, 3].each(&b) }.to yield_successive_args(1, 2, 3)
906
+ # expect { |b| { :a => 1, :b => 2 }.each(&b) }.to yield_successive_args([:a, 1], [:b, 2])
907
+ # expect { |b| [1, 2, 3].each(&b) }.not_to yield_successive_args(1, 2)
908
+ #
909
+ # @note Your expect block must accept a parameter and pass it on to
910
+ # the method-under-test as a block.
911
+ def yield_successive_args(*args)
912
+ BuiltIn::YieldSuccessiveArgs.new(*args)
913
+ end
914
+ alias_matcher :a_block_yielding_successive_args, :yield_successive_args
915
+ alias_matcher :yielding_successive_args, :yield_successive_args
916
+
917
+ # Delegates to {RSpec::Expectations.configuration}.
918
+ # This is here because rspec-core's `expect_with` option
919
+ # looks for a `configuration` method on the mixin
920
+ # (`RSpec::Matchers`) to yield to a block.
921
+ # @return [RSpec::Expectations::Configuration] the configuration object
922
+ def self.configuration
923
+ Expectations.configuration
924
+ end
925
+
926
+ private
927
+
928
+ BE_PREDICATE_REGEX = /^(be_(?:an?_)?)(.*)/
929
+ HAS_REGEX = /^(?:have_)(.*)/
930
+
931
+ def method_missing(method, *args, &block)
932
+ case method.to_s
933
+ when BE_PREDICATE_REGEX
934
+ BuiltIn::BePredicate.new(method, *args, &block)
935
+ when HAS_REGEX
936
+ BuiltIn::Has.new(method, *args, &block)
937
+ else
938
+ super
939
+ end
940
+ end
941
+
942
+ # @api private
943
+ def self.is_a_matcher?(obj)
944
+ return true if ::RSpec::Matchers::BuiltIn::BaseMatcher === obj
945
+ begin
946
+ return false if obj.respond_to?(:i_respond_to_everything_so_im_not_really_a_matcher)
947
+ rescue NoMethodError
948
+ # Some objects, like BasicObject, don't implemented standard
949
+ # reflection methods.
950
+ return false
951
+ end
952
+ return false unless obj.respond_to?(:matches?)
953
+
954
+ obj.respond_to?(:failure_message) ||
955
+ obj.respond_to?(:failure_message_for_should) # support legacy matchers
956
+ end
957
+
958
+ ::RSpec::Support.register_matcher_definition do |obj|
959
+ is_a_matcher?(obj)
960
+ end
961
+
962
+ # @api private
963
+ def self.is_a_describable_matcher?(obj)
964
+ is_a_matcher?(obj) && obj.respond_to?(:description)
965
+ end
966
+ end
967
+ end