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,16 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ RSpec.describe "::RSpec::Core::ExampleGroup" do
5
+ context "does not cause problems when users reference a top level constant of the same name" do
6
+ file_in_outer_group = File
7
+ example { expect(File).to eq ::File }
8
+ example { expect(file_in_outer_group).to be(::File) }
9
+
10
+ describe "File" do
11
+ file_in_inner_group = File
12
+ example { expect(File).to eq ::File }
13
+ example { expect(file_in_inner_group).to be(::File) }
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,1621 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ module RSpec::Core
5
+ RSpec.describe ExampleGroup do
6
+ it_behaves_like "metadata hash builder" do
7
+ def metadata_hash(*args)
8
+ group = ExampleGroup.describe('example description', *args)
9
+ group.metadata
10
+ end
11
+ end
12
+
13
+ context "when RSpec.configuration.format_docstrings is set to a block" do
14
+ it "formats the description with that block" do
15
+ RSpec.configuration.format_docstrings { |s| s.upcase }
16
+ group = ExampleGroup.describe(' an example ')
17
+ expect(group.description).to eq(' AN EXAMPLE ')
18
+ end
19
+ end
20
+
21
+ it 'does not treat the first argument as a metadata key even if it is a symbol' do
22
+ group = ExampleGroup.describe(:symbol)
23
+ expect(group.metadata).not_to include(:symbol)
24
+ end
25
+
26
+ it 'treats the first argument as part of the description when it is a symbol' do
27
+ group = ExampleGroup.describe(:symbol)
28
+ expect(group.description).to eq("symbol")
29
+ end
30
+
31
+ describe "constant naming" do
32
+ around do |ex|
33
+ before_constants = RSpec::ExampleGroups.constants
34
+ ex.run
35
+ after_constants = RSpec::ExampleGroups.constants
36
+
37
+ (after_constants - before_constants).each do |name|
38
+ RSpec::ExampleGroups.send(:remove_const, name)
39
+ end
40
+ end
41
+
42
+ if RUBY_VERSION == "1.9.2"
43
+ RSpec::Matchers.define :have_class_const do |class_name|
44
+ match do |group|
45
+ class_name.gsub!('::','_::')
46
+ class_name << '_'
47
+ group.name == "RSpec::ExampleGroups::#{class_name}" &&
48
+ group == class_name.split('::').inject(RSpec::ExampleGroups) do |mod, name|
49
+ mod.const_get(name)
50
+ end
51
+ end
52
+ end
53
+ else
54
+ RSpec::Matchers.define :have_class_const do |class_name, _|
55
+ match do |group|
56
+ group.name == "RSpec::ExampleGroups::#{class_name}" &&
57
+ group == class_name.split('::').inject(RSpec::ExampleGroups) do |mod, name|
58
+ mod.const_get(name)
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ it 'gives groups friendly human readable class names' do
65
+ stub_const("MyGem::Klass", Class.new)
66
+ parent = ExampleGroup.describe(MyGem::Klass)
67
+ expect(parent).to have_class_const("MyGemKlass")
68
+ end
69
+
70
+ it 'nests constants to match the group nesting' do
71
+ grandparent = ExampleGroup.describe("The grandparent")
72
+ parent = grandparent.describe("the parent")
73
+ child = parent.describe("the child")
74
+
75
+ expect(parent).to have_class_const("TheGrandparent::TheParent")
76
+ expect(child).to have_class_const("TheGrandparent::TheParent::TheChild")
77
+ end
78
+
79
+ it 'removes non-ascii characters from the const name since some rubies barf on that' do
80
+ group = ExampleGroup.describe("A chinese character: 们")
81
+ expect(group).to have_class_const("AChineseCharacter")
82
+ end
83
+
84
+ it 'prefixes the const name with "Nested" if needed to make a valid const' do
85
+ expect {
86
+ ExampleGroup.const_set("1B", Object.new)
87
+ }.to raise_error(NameError)
88
+
89
+ group = ExampleGroup.describe("1B")
90
+ expect(group).to have_class_const("Nested1B")
91
+ end
92
+
93
+ it 'does not warn when defining a Config example group (since RbConfig triggers warnings when Config is referenced)' do
94
+ expect { ExampleGroup.describe("Config") }.not_to output.to_stderr
95
+ end
96
+
97
+ it 'ignores top level constants that have the same name' do
98
+ parent = RSpec.describe("Some Parent Group")
99
+ child = parent.describe("Hash")
100
+ # This would be `SomeParentGroup::Hash_2` if we didn't ignore the top level `Hash`
101
+ expect(child).to have_class_const("SomeParentGroup::Hash")
102
+ end
103
+
104
+ it 'disambiguates name collisions by appending a number', :unless => RUBY_VERSION == '1.9.2' do
105
+ groups = 10.times.map { ExampleGroup.describe("Collision") }
106
+ expect(groups[0]).to have_class_const("Collision")
107
+ expect(groups[1]).to have_class_const("Collision_2")
108
+ expect(groups[8]).to have_class_const("Collision_9")
109
+
110
+ if RUBY_VERSION.to_f > 1.8 && !(defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx')
111
+ # on 1.8.7, rbx "Collision_9".next => "Collisioo_0"
112
+ expect(groups[9]).to have_class_const("Collision_10")
113
+ end
114
+ end
115
+
116
+ it 'identifies unnamed groups as "Anonymous"' do
117
+ # Wrap the anonymous group is a uniquely named one,
118
+ # so the presence of another anonymous group in our
119
+ # test suite doesn't cause an unexpected number
120
+ # to be appended.
121
+ group = ExampleGroup.describe("name of unnamed group")
122
+ subgroup = group.describe
123
+ expect(subgroup).to have_class_const("NameOfUnnamedGroup::Anonymous")
124
+ end
125
+
126
+ it 'assigns the const before evaling the group so error messages include the name' do
127
+ expect {
128
+ ExampleGroup.describe("Calling an undefined method") { foo }
129
+ }.to raise_error(/ExampleGroups::CallingAnUndefinedMethod/)
130
+ end
131
+
132
+ it 'does not have problems with example groups named "Core"', :unless => RUBY_VERSION == '1.9.2' do
133
+ ExampleGroup.describe("Core")
134
+ expect(defined?(::RSpec::ExampleGroups::Core)).to be_truthy
135
+
136
+ # The original bug was triggered when a group was defined AFTER one named `Core`,
137
+ # due to it not using the fully qualified `::RSpec::Core::ExampleGroup` constant.
138
+ group = ExampleGroup.describe("Another group")
139
+ expect(group).to have_class_const("AnotherGroup")
140
+ end
141
+
142
+ it 'does not have problems with example groups named "RSpec"', :unless => RUBY_VERSION == '1.9.2' do
143
+ ExampleGroup.describe("RSpec")
144
+ expect(defined?(::RSpec::ExampleGroups::RSpec)).to be_truthy
145
+
146
+ # The original bug was triggered when a group was defined AFTER one named `RSpec`,
147
+ # due to it not using the fully qualified `::RSpec::Core::ExampleGroup` constant.
148
+ group = ExampleGroup.describe("Yet Another group")
149
+ expect(group).to have_class_const("YetAnotherGroup")
150
+ end
151
+ end
152
+
153
+ describe "ordering" do
154
+ context "when tagged with `:order => :defined`" do
155
+ it 'orders the subgroups and examples in defined order regardless of global order' do
156
+ RSpec.configuration.order = :random
157
+
158
+ run_order = []
159
+ group = ExampleGroup.describe "outer", :order => :defined do
160
+ context "subgroup 1" do
161
+ example { run_order << :g1_e1 }
162
+ example { run_order << :g1_e2 }
163
+ end
164
+
165
+ context "subgroup 2" do
166
+ example { run_order << :g2_e1 }
167
+ example { run_order << :g2_e2 }
168
+ end
169
+ end
170
+
171
+ group.run
172
+ expect(run_order).to eq([:g1_e1, :g1_e2, :g2_e1, :g2_e2])
173
+ end
174
+ end
175
+
176
+ context "when tagged with an unrecognized ordering" do
177
+ let(:run_order) { [] }
178
+ let(:definition_line) { __LINE__ + 4 }
179
+ let(:group) do
180
+ order = self.run_order
181
+
182
+ ExampleGroup.describe "group", :order => :unrecognized do
183
+ example { order << :ex_1 }
184
+ example { order << :ex_2 }
185
+ end
186
+ end
187
+
188
+ before do
189
+ RSpec.configuration.register_ordering(:global, &:reverse)
190
+ allow(group).to receive(:warn)
191
+ end
192
+
193
+ it 'falls back to the global ordering' do
194
+ group.run
195
+ expect(run_order).to eq([:ex_2, :ex_1])
196
+ end
197
+
198
+ it 'prints a warning so users are notified of their mistake' do
199
+ warning = nil
200
+ allow(group).to receive(:warn) { |msg| warning = msg }
201
+
202
+ group.run
203
+
204
+ expect(warning).to match(/unrecognized/)
205
+ expect(warning).to match(/#{File.basename __FILE__}:#{definition_line}/)
206
+ end
207
+ end
208
+
209
+ context "when tagged with a custom ordering" do
210
+ def ascending_numbers
211
+ lambda { |g| Integer(g.description[/\d+/]) }
212
+ end
213
+
214
+ it 'uses the custom orderings' do
215
+ RSpec.configure do |c|
216
+ c.register_ordering :custom do |items|
217
+ items.sort_by(&ascending_numbers)
218
+ end
219
+ end
220
+
221
+ run_order = []
222
+ group = ExampleGroup.describe "outer", :order => :custom do
223
+ example("e2") { run_order << :e2 }
224
+ example("e1") { run_order << :e1 }
225
+
226
+ context "subgroup 2" do
227
+ example("ex 3") { run_order << :g2_e3 }
228
+ example("ex 1") { run_order << :g2_e1 }
229
+ example("ex 2") { run_order << :g2_e2 }
230
+ end
231
+
232
+ context "subgroup 1" do
233
+ example("ex 2") { run_order << :g1_e2 }
234
+ example("ex 1") { run_order << :g1_e1 }
235
+ example("ex 3") { run_order << :g1_e3 }
236
+ end
237
+
238
+ context "subgroup 3" do
239
+ example("ex 2") { run_order << :g3_e2 }
240
+ example("ex 3") { run_order << :g3_e3 }
241
+ example("ex 1") { run_order << :g3_e1 }
242
+ end
243
+ end
244
+
245
+ group.run
246
+
247
+ expect(run_order).to eq([
248
+ :e1, :e2,
249
+ :g1_e1, :g1_e2, :g1_e3,
250
+ :g2_e1, :g2_e2, :g2_e3,
251
+ :g3_e1, :g3_e2, :g3_e3
252
+ ])
253
+ end
254
+ end
255
+ end
256
+
257
+ describe "top level group" do
258
+ it "runs its children" do
259
+ examples_run = []
260
+ group = ExampleGroup.describe("parent") do
261
+ describe("child") do
262
+ it "does something" do |ex|
263
+ examples_run << ex
264
+ end
265
+ end
266
+ end
267
+
268
+ group.run
269
+ expect(examples_run.count).to eq(1)
270
+ end
271
+
272
+ context "with a failure in the top level group" do
273
+ it "runs its children " do
274
+ examples_run = []
275
+ group = ExampleGroup.describe("parent") do
276
+ it "fails" do |ex|
277
+ examples_run << ex
278
+ raise "fail"
279
+ end
280
+ describe("child") do
281
+ it "does something" do |ex|
282
+ examples_run << ex
283
+ end
284
+ end
285
+ end
286
+
287
+ group.run
288
+ expect(examples_run.count).to eq(2)
289
+ end
290
+ end
291
+
292
+ describe "descendants" do
293
+ it "returns self + all descendants" do
294
+ group = ExampleGroup.describe("parent") do
295
+ describe("child") do
296
+ describe("grandchild 1") {}
297
+ describe("grandchild 2") {}
298
+ end
299
+ end
300
+ expect(group.descendants.size).to eq(4)
301
+ end
302
+ end
303
+ end
304
+
305
+ describe "child" do
306
+ it "is known by parent" do
307
+ parent = ExampleGroup.describe
308
+ child = parent.describe
309
+ expect(parent.children).to eq([child])
310
+ end
311
+
312
+ it "is not registered in world" do
313
+ world = RSpec::Core::World.new
314
+ parent = ExampleGroup.describe
315
+ world.register(parent)
316
+ parent.describe
317
+ expect(world.example_groups).to eq([parent])
318
+ end
319
+ end
320
+
321
+ describe "filtering" do
322
+ let(:world) { World.new }
323
+ before { allow(RSpec).to receive_messages(:world => world) }
324
+
325
+ shared_examples "matching filters" do
326
+ context "inclusion" do
327
+ before do
328
+ filter_manager = FilterManager.new
329
+ filter_manager.include filter_metadata
330
+ allow(world).to receive_messages(:filter_manager => filter_manager)
331
+ end
332
+
333
+ it "includes examples in groups matching filter" do
334
+ group = ExampleGroup.describe("does something", spec_metadata)
335
+ all_examples = [ group.example("first"), group.example("second") ]
336
+
337
+ expect(group.filtered_examples).to eq(all_examples)
338
+ end
339
+
340
+ it "includes examples directly matching filter" do
341
+ group = ExampleGroup.describe("does something")
342
+ filtered_examples = [
343
+ group.example("first", spec_metadata),
344
+ group.example("second", spec_metadata)
345
+ ]
346
+ group.example("third (not-filtered)")
347
+
348
+ expect(group.filtered_examples).to eq(filtered_examples)
349
+ end
350
+ end
351
+
352
+ context "exclusion" do
353
+ before do
354
+ filter_manager = FilterManager.new
355
+ filter_manager.exclude filter_metadata
356
+ allow(world).to receive_messages(:filter_manager => filter_manager)
357
+ end
358
+
359
+ it "excludes examples in groups matching filter" do
360
+ group = ExampleGroup.describe("does something", spec_metadata)
361
+ [ group.example("first"), group.example("second") ]
362
+
363
+ expect(group.filtered_examples).to be_empty
364
+ end
365
+
366
+ it "excludes examples directly matching filter" do
367
+ group = ExampleGroup.describe("does something")
368
+ [
369
+ group.example("first", spec_metadata),
370
+ group.example("second", spec_metadata)
371
+ ]
372
+ unfiltered_example = group.example("third (not-filtered)")
373
+
374
+ expect(group.filtered_examples).to eq([unfiltered_example])
375
+ end
376
+ end
377
+ end
378
+
379
+ context "matching false" do
380
+ let(:spec_metadata) { { :awesome => false }}
381
+
382
+ context "against false" do
383
+ let(:filter_metadata) { { :awesome => false }}
384
+ include_examples "matching filters"
385
+ end
386
+
387
+ context "against 'false'" do
388
+ let(:filter_metadata) { { :awesome => 'false' }}
389
+ include_examples "matching filters"
390
+ end
391
+
392
+ context "against :false" do
393
+ let(:filter_metadata) { { :awesome => :false }}
394
+ include_examples "matching filters"
395
+ end
396
+ end
397
+
398
+ context "matching true" do
399
+ let(:spec_metadata) { { :awesome => true }}
400
+
401
+ context "against true" do
402
+ let(:filter_metadata) { { :awesome => true }}
403
+ include_examples "matching filters"
404
+ end
405
+
406
+ context "against 'true'" do
407
+ let(:filter_metadata) { { :awesome => 'true' }}
408
+ include_examples "matching filters"
409
+ end
410
+
411
+ context "against :true" do
412
+ let(:filter_metadata) { { :awesome => :true }}
413
+ include_examples "matching filters"
414
+ end
415
+ end
416
+
417
+ context "matching a string" do
418
+ let(:spec_metadata) { { :type => 'special' }}
419
+
420
+ context "against a string" do
421
+ let(:filter_metadata) { { :type => 'special' }}
422
+ include_examples "matching filters"
423
+ end
424
+
425
+ context "against a symbol" do
426
+ let(:filter_metadata) { { :type => :special }}
427
+ include_examples "matching filters"
428
+ end
429
+ end
430
+
431
+ context "matching a symbol" do
432
+ let(:spec_metadata) { { :type => :special }}
433
+
434
+ context "against a string" do
435
+ let(:filter_metadata) { { :type => 'special' }}
436
+ include_examples "matching filters"
437
+ end
438
+
439
+ context "against a symbol" do
440
+ let(:filter_metadata) { { :type => :special }}
441
+ include_examples "matching filters"
442
+ end
443
+ end
444
+
445
+ context "with no filters" do
446
+ it "returns all" do
447
+ group = ExampleGroup.describe
448
+ allow(group).to receive(:world) { world }
449
+ example = group.example("does something")
450
+ expect(group.filtered_examples).to eq([example])
451
+ end
452
+ end
453
+
454
+ context "with no examples or groups that match filters" do
455
+ it "returns none" do
456
+ filter_manager = FilterManager.new
457
+ filter_manager.include :awesome => false
458
+ allow(world).to receive_messages(:filter_manager => filter_manager)
459
+ group = ExampleGroup.describe
460
+ allow(group).to receive(:world) { world }
461
+ group.example("does something")
462
+ expect(group.filtered_examples).to eq([])
463
+ end
464
+ end
465
+ end
466
+
467
+ describe '#described_class' do
468
+
469
+ context "with a constant as the first parameter" do
470
+ it "is that constant" do
471
+ expect(ExampleGroup.describe(Object) { }.described_class).to eq(Object)
472
+ end
473
+ end
474
+
475
+ context "with a string as the first parameter" do
476
+ it "is nil" do
477
+ expect(ExampleGroup.describe("i'm a computer") { }.described_class).to be_nil
478
+ end
479
+ end
480
+
481
+ context "with a constant in an outer group" do
482
+ context "and a string in an inner group" do
483
+ it "is the top level constant" do
484
+ group = ExampleGroup.describe(String) do
485
+ describe "inner" do
486
+ example "described_class is String" do
487
+ expect(described_class).to eq(String)
488
+ end
489
+ end
490
+ end
491
+
492
+ expect(group.run).to be_truthy
493
+ end
494
+ end
495
+
496
+ context "and metadata redefinition after `described_class` call" do
497
+ it "is the redefined level constant" do
498
+ group = ExampleGroup.describe(String) do
499
+ described_class
500
+ metadata[:described_class] = Object
501
+ describe "inner" do
502
+ example "described_class is Object" do
503
+ expect(described_class).to eq(Object)
504
+ end
505
+ end
506
+ end
507
+
508
+ expect(group.run).to be_truthy
509
+ end
510
+ end
511
+ end
512
+
513
+ context "in a nested group" do
514
+ it "inherits the described class/module from the outer group" do
515
+ group = ExampleGroup.describe(String) do
516
+ describe "nested" do
517
+ example "describes is String" do
518
+ expect(described_class).to eq(String)
519
+ end
520
+ end
521
+ end
522
+
523
+ expect(group.run).to be_truthy, "expected examples in group to pass"
524
+ end
525
+
526
+ context "when a class is passed" do
527
+ def described_class_value
528
+ value = nil
529
+
530
+ ExampleGroup.describe(String) do
531
+ yield if block_given?
532
+ describe Array do
533
+ example { value = described_class }
534
+ end
535
+ end.run
536
+
537
+ value
538
+ end
539
+
540
+ it "overrides the described class" do
541
+ expect(described_class_value).to eq(Array)
542
+ end
543
+
544
+ it "overrides the described class even when described_class is referenced in the outer group" do
545
+ expect(described_class_value { described_class }).to eq(Array)
546
+ end
547
+ end
548
+ end
549
+
550
+ context "for `describe(SomeClass)` within a `describe 'some string' group" do
551
+ def define_and_run_group(define_outer_example = false)
552
+ outer_described_class = inner_described_class = nil
553
+
554
+ ExampleGroup.describe("some string") do
555
+ example { outer_described_class = described_class } if define_outer_example
556
+
557
+ describe Array do
558
+ example { inner_described_class = described_class }
559
+ end
560
+ end.run
561
+
562
+ return outer_described_class, inner_described_class
563
+ end
564
+
565
+ it "has a `nil` described_class in the outer group" do
566
+ outer_described_class, _ = define_and_run_group(:define_outer_example)
567
+ expect(outer_described_class).to be(nil)
568
+ end
569
+
570
+ it "has the inner described class as the described_class of the inner group" do
571
+ _, inner_described_class = define_and_run_group
572
+ expect(inner_described_class).to be(Array)
573
+
574
+ # This is weird, but in RSpec 2.12 (and before, presumably),
575
+ # the `described_class` value would be incorrect if there was an
576
+ # example in the outer group, and correct if there was not one.
577
+ _, inner_described_class = define_and_run_group(:define_outer_example)
578
+ expect(inner_described_class).to be(Array)
579
+ end
580
+ end
581
+ end
582
+
583
+ describe '#described_class' do
584
+ it "is the same as described_class" do
585
+ expect(self.class.described_class).to eq(self.class.described_class)
586
+ end
587
+ end
588
+
589
+ describe '#description' do
590
+ it "grabs the description from the metadata" do
591
+ group = ExampleGroup.describe(Object, "my desc") { }
592
+ expect(group.description).to eq(group.metadata[:description])
593
+ end
594
+ end
595
+
596
+ describe '#metadata' do
597
+ it "adds the third parameter to the metadata" do
598
+ expect(ExampleGroup.describe(Object, nil, 'foo' => 'bar') { }.metadata).to include({ "foo" => 'bar' })
599
+ end
600
+
601
+ it "adds the the file_path to metadata" do
602
+ expect(ExampleGroup.describe(Object) { }.metadata[:file_path]).to eq(relative_path(__FILE__))
603
+ end
604
+
605
+ it "has a reader for file_path" do
606
+ expect(ExampleGroup.describe(Object) { }.file_path).to eq(relative_path(__FILE__))
607
+ end
608
+
609
+ it "adds the line_number to metadata" do
610
+ expect(ExampleGroup.describe(Object) { }.metadata[:line_number]).to eq(__LINE__)
611
+ end
612
+ end
613
+
614
+ [:focus, :fexample, :fit, :fspecify].each do |example_alias|
615
+ describe ".#{example_alias}" do
616
+ let(:focused_example) { ExampleGroup.describe.send example_alias, "a focused example" }
617
+
618
+ it 'defines an example that can be filtered with :focus => true' do
619
+ expect(focused_example.metadata[:focus]).to be_truthy
620
+ end
621
+ end
622
+ end
623
+
624
+ describe "#before, after, and around hooks" do
625
+ describe "scope aliasing" do
626
+ it "aliases the `:context` hook scope to `:all` for before-hooks" do
627
+ group = ExampleGroup.describe
628
+ order = []
629
+ group.before(:context) { order << :before_context }
630
+ group.example("example") { order << :example }
631
+ group.example("example") { order << :example }
632
+
633
+ group.run
634
+ expect(order).to eq([:before_context, :example, :example])
635
+ end
636
+
637
+ it "aliases the `:example` hook scope to `:each` for before-hooks" do
638
+ group = ExampleGroup.describe
639
+ order = []
640
+ group.before(:example) { order << :before_example }
641
+ group.example("example") { order << :example }
642
+ group.example("example") { order << :example }
643
+
644
+ group.run
645
+ expect(order).to eq([:before_example, :example, :before_example, :example])
646
+ end
647
+
648
+ it "aliases the `:context` hook scope to `:all` for after-hooks" do
649
+ group = ExampleGroup.describe
650
+ order = []
651
+ group.example("example") { order << :example }
652
+ group.example("example") { order << :example }
653
+ group.after(:context) { order << :after_context }
654
+
655
+ group.run
656
+ expect(order).to eq([:example, :example, :after_context])
657
+ end
658
+
659
+ it "aliases the `:example` hook scope to `:each` for after-hooks" do
660
+ group = ExampleGroup.describe
661
+ order = []
662
+ group.example("example") { order << :example }
663
+ group.example("example") { order << :example }
664
+ group.after(:example) { order << :after_example }
665
+
666
+ group.run
667
+ expect(order).to eq([:example, :after_example, :example, :after_example])
668
+ end
669
+ end
670
+
671
+ it "runs the before alls in order" do
672
+ group = ExampleGroup.describe
673
+ order = []
674
+ group.before(:all) { order << 1 }
675
+ group.before(:all) { order << 2 }
676
+ group.before(:all) { order << 3 }
677
+ group.example("example") {}
678
+
679
+ group.run
680
+
681
+ expect(order).to eq([1,2,3])
682
+ end
683
+
684
+ it "does not set RSpec.world.wants_to_quit in case of an error in before all (without fail_fast?)" do
685
+ group = ExampleGroup.describe
686
+ group.before(:all) { raise "error in before all" }
687
+ group.example("example") {}
688
+
689
+ group.run
690
+ expect(RSpec.world.wants_to_quit).to be_falsey
691
+ end
692
+
693
+ it "runs the before eachs in order" do
694
+ group = ExampleGroup.describe
695
+ order = []
696
+ group.before(:each) { order << 1 }
697
+ group.before(:each) { order << 2 }
698
+ group.before(:each) { order << 3 }
699
+ group.example("example") {}
700
+
701
+ group.run
702
+
703
+ expect(order).to eq([1,2,3])
704
+ end
705
+
706
+ it "runs the after eachs in reverse order" do
707
+ group = ExampleGroup.describe
708
+ order = []
709
+ group.after(:each) { order << 1 }
710
+ group.after(:each) { order << 2 }
711
+ group.after(:each) { order << 3 }
712
+ group.example("example") {}
713
+
714
+ group.run
715
+
716
+ expect(order).to eq([3,2,1])
717
+ end
718
+
719
+ it "runs the after alls in reverse order" do
720
+ group = ExampleGroup.describe
721
+ order = []
722
+ group.after(:all) { order << 1 }
723
+ group.after(:all) { order << 2 }
724
+ group.after(:all) { order << 3 }
725
+ group.example("example") {}
726
+
727
+ group.run
728
+
729
+ expect(order).to eq([3,2,1])
730
+ end
731
+
732
+ it "only runs before/after(:all) hooks from example groups that have specs that run" do
733
+ hooks_run = []
734
+
735
+ RSpec.configure do |c|
736
+ c.filter_run :focus => true
737
+ end
738
+
739
+ unfiltered_group = ExampleGroup.describe "unfiltered" do
740
+ before(:all) { hooks_run << :unfiltered_before_all }
741
+ after(:all) { hooks_run << :unfiltered_after_all }
742
+
743
+ context "a subcontext" do
744
+ it("has an example") { }
745
+ end
746
+ end
747
+
748
+ filtered_group = ExampleGroup.describe "filtered", :focus => true do
749
+ before(:all) { hooks_run << :filtered_before_all }
750
+ after(:all) { hooks_run << :filtered_after_all }
751
+
752
+ context "a subcontext" do
753
+ it("has an example") { }
754
+ end
755
+ end
756
+
757
+ unfiltered_group.run
758
+ filtered_group.run
759
+
760
+ expect(hooks_run).to eq([:filtered_before_all, :filtered_after_all])
761
+ end
762
+
763
+ it "runs before_all_defined_in_config, before all, before each, example, after each, after all, after_all_defined_in_config in that order" do
764
+ order = []
765
+
766
+ RSpec.configure do |c|
767
+ c.before(:all) { order << :before_all_defined_in_config }
768
+ c.after(:all) { order << :after_all_defined_in_config }
769
+ end
770
+
771
+ group = ExampleGroup.describe
772
+ group.before(:all) { order << :top_level_before_all }
773
+ group.before(:each) { order << :before_each }
774
+ group.after(:each) { order << :after_each }
775
+ group.after(:all) { order << :top_level_after_all }
776
+ group.example("top level example") { order << :top_level_example }
777
+
778
+ context1 = group.describe("context 1")
779
+ context1.before(:all) { order << :nested_before_all }
780
+ context1.example("nested example 1") { order << :nested_example_1 }
781
+
782
+ context2 = group.describe("context 2")
783
+ context2.after(:all) { order << :nested_after_all }
784
+ context2.example("nested example 2") { order << :nested_example_2 }
785
+
786
+ group.run
787
+
788
+ expect(order).to eq([
789
+ :before_all_defined_in_config,
790
+ :top_level_before_all,
791
+ :before_each,
792
+ :top_level_example,
793
+ :after_each,
794
+ :nested_before_all,
795
+ :before_each,
796
+ :nested_example_1,
797
+ :after_each,
798
+ :before_each,
799
+ :nested_example_2,
800
+ :after_each,
801
+ :nested_after_all,
802
+ :top_level_after_all,
803
+ :after_all_defined_in_config
804
+ ])
805
+ end
806
+
807
+ context "after(:all)" do
808
+ let(:outer) { ExampleGroup.describe }
809
+ let(:inner) { outer.describe }
810
+
811
+ it "has access to state defined before(:all)" do
812
+ outer.before(:all) { @outer = "outer" }
813
+ inner.before(:all) { @inner = "inner" }
814
+
815
+ outer.after(:all) do
816
+ expect(@outer).to eq("outer")
817
+ expect(@inner).to eq("inner")
818
+ end
819
+ inner.after(:all) do
820
+ expect(@inner).to eq("inner")
821
+ expect(@outer).to eq("outer")
822
+ end
823
+
824
+ outer.run
825
+ end
826
+
827
+ it "cleans up ivars in after(:all)" do
828
+ outer.before(:all) { @outer = "outer" }
829
+ inner.before(:all) { @inner = "inner" }
830
+
831
+ outer.run
832
+
833
+ expect(inner.before_context_ivars[:@inner]).to be_nil
834
+ expect(inner.before_context_ivars[:@outer]).to be_nil
835
+ expect(outer.before_context_ivars[:@inner]).to be_nil
836
+ expect(outer.before_context_ivars[:@outer]).to be_nil
837
+ end
838
+ end
839
+
840
+ it "treats an error in before(:each) as a failure" do
841
+ group = ExampleGroup.describe
842
+ group.before(:each) { raise "error in before each" }
843
+ example = group.example("equality") { expect(1).to eq(2) }
844
+ expect(group.run).to be(false)
845
+
846
+ expect(example.execution_result.exception.message).to eq("error in before each")
847
+ end
848
+
849
+ it "treats an error in before(:all) as a failure" do
850
+ group = ExampleGroup.describe
851
+ group.before(:all) { raise "error in before all" }
852
+ example = group.example("equality") { expect(1).to eq(2) }
853
+ expect(group.run).to be_falsey
854
+
855
+ expect(example.metadata).not_to be_nil
856
+ expect(example.execution_result.exception).not_to be_nil
857
+ expect(example.execution_result.exception.message).to eq("error in before all")
858
+ end
859
+
860
+ it "exposes instance variables set in before(:all) from after(:all) even if a before(:all) error occurs" do
861
+ ivar_value_in_after_hook = nil
862
+
863
+ group = ExampleGroup.describe do
864
+ before(:all) do
865
+ @an_ivar = :set_in_before_all
866
+ raise "fail"
867
+ end
868
+
869
+ after(:all) { ivar_value_in_after_hook = @an_ivar }
870
+
871
+ it("has a spec") { }
872
+ end
873
+
874
+ group.run
875
+ expect(ivar_value_in_after_hook).to eq(:set_in_before_all)
876
+ end
877
+
878
+ it "treats an error in before(:all) as a failure for a spec in a nested group" do
879
+ example = nil
880
+ group = ExampleGroup.describe do
881
+ before(:all) { raise "error in before all" }
882
+
883
+ describe "nested" do
884
+ example = it("equality") { expect(1).to eq(2) }
885
+ end
886
+ end
887
+ group.run
888
+
889
+ expect(example.metadata).not_to be_nil
890
+ expect(example.execution_result.exception).not_to be_nil
891
+ expect(example.execution_result.exception.message).to eq("error in before all")
892
+ end
893
+
894
+ context "when an error occurs in an after(:all) hook" do
895
+ hooks_run = []
896
+
897
+ before(:each) do
898
+ hooks_run = []
899
+ allow(RSpec.configuration.reporter).to receive(:message)
900
+ end
901
+
902
+ let(:group) do
903
+ ExampleGroup.describe do
904
+ after(:all) { hooks_run << :one; raise "An error in an after(:all) hook" }
905
+ after(:all) { hooks_run << :two; raise "A different hook raising an error" }
906
+ it("equality") { expect(1).to eq(1) }
907
+ end
908
+ end
909
+
910
+ it "allows the example to pass" do
911
+ group.run
912
+ example = group.examples.first
913
+ expect(example.execution_result.status).to eq(:passed)
914
+ end
915
+
916
+ it "rescues any error(s) and prints them out" do
917
+ expect(RSpec.configuration.reporter).to receive(:message).with(/An error in an after\(:all\) hook/)
918
+ expect(RSpec.configuration.reporter).to receive(:message).with(/A different hook raising an error/)
919
+ group.run
920
+ end
921
+
922
+ it "still runs both after blocks" do
923
+ group.run
924
+ expect(hooks_run).to eq [:two,:one]
925
+ end
926
+ end
927
+ end
928
+
929
+ describe ".pending" do
930
+ let(:group) { ExampleGroup.describe { pending { fail } } }
931
+
932
+ it "generates a pending example" do
933
+ group.run
934
+ expect(group.examples.first).to be_pending
935
+ end
936
+
937
+ it "sets the pending message" do
938
+ group.run
939
+ expect(group.examples.first.execution_result.pending_message).to eq(RSpec::Core::Pending::NO_REASON_GIVEN)
940
+ end
941
+
942
+ it 'sets the backtrace to the example definition so it can be located by the user' do
943
+ file = RSpec::Core::Metadata.relative_path(__FILE__)
944
+ expected = [file, __LINE__ + 2].map(&:to_s)
945
+ group = RSpec::Core::ExampleGroup.describe do
946
+ pending { }
947
+ end
948
+ group.run
949
+
950
+ actual = group.examples.first.exception.backtrace.first.split(':')[0..1]
951
+ expect(actual).to eq(expected)
952
+ end
953
+
954
+ it 'generates a pending example when no block is provided' do
955
+ group = RSpec.describe "group"
956
+ example = group.pending "just because"
957
+ group.run
958
+ expect(example).to be_pending
959
+ end
960
+ end
961
+
962
+ describe "pending with metadata" do
963
+ let(:group) { ExampleGroup.describe {
964
+ example("unimplemented", :pending => true) { fail }
965
+ } }
966
+
967
+ it "generates a pending example" do
968
+ group.run
969
+ expect(group.examples.first).to be_pending
970
+ end
971
+
972
+ it "sets the pending message" do
973
+ group.run
974
+ expect(group.examples.first.execution_result.pending_message).to eq(RSpec::Core::Pending::NO_REASON_GIVEN)
975
+ end
976
+ end
977
+
978
+ describe "pending with message in metadata" do
979
+ let(:group) { ExampleGroup.describe {
980
+ example("unimplemented", :pending => 'not done') { fail }
981
+ } }
982
+
983
+ it "generates a pending example" do
984
+ group.run
985
+ expect(group.examples.first).to be_pending
986
+ end
987
+
988
+ it "sets the pending message" do
989
+ group.run
990
+ expect(group.examples.first.execution_result.pending_message).to eq("not done")
991
+ end
992
+ end
993
+
994
+ describe ".skip" do
995
+ let(:group) { ExampleGroup.describe { skip("skip this") { } } }
996
+
997
+ it "generates a skipped example" do
998
+ group.run
999
+ expect(group.examples.first).to be_skipped
1000
+ end
1001
+
1002
+ it "sets the pending message" do
1003
+ group.run
1004
+ expect(group.examples.first.execution_result.pending_message).to eq(RSpec::Core::Pending::NO_REASON_GIVEN)
1005
+ end
1006
+ end
1007
+
1008
+ describe "skip with metadata" do
1009
+ let(:group) { ExampleGroup.describe {
1010
+ example("skip this", :skip => true) { }
1011
+ } }
1012
+
1013
+ it "generates a skipped example" do
1014
+ group.run
1015
+ expect(group.examples.first).to be_skipped
1016
+ end
1017
+
1018
+ it "sets the pending message" do
1019
+ group.run
1020
+ expect(group.examples.first.execution_result.pending_message).to eq(RSpec::Core::Pending::NO_REASON_GIVEN)
1021
+ end
1022
+ end
1023
+
1024
+ describe "skip with message in metadata" do
1025
+ let(:group) { ExampleGroup.describe {
1026
+ example("skip this", :skip => 'not done') { }
1027
+ } }
1028
+
1029
+ it "generates a skipped example" do
1030
+ group.run
1031
+ expect(group.examples.first).to be_skipped
1032
+ end
1033
+
1034
+ it "sets the pending message" do
1035
+ group.run
1036
+ expect(group.examples.first.execution_result.pending_message).to eq('not done')
1037
+ end
1038
+ end
1039
+
1040
+ %w[xit xspecify xexample].each do |method_name|
1041
+ describe ".#{method_name}" do
1042
+ let(:group) { ExampleGroup.describe.tap {|x|
1043
+ x.send(method_name, "is pending") { }
1044
+ }}
1045
+
1046
+ it "generates a skipped example" do
1047
+ group.run
1048
+ expect(group.examples.first).to be_skipped
1049
+ end
1050
+
1051
+ it "sets the pending message" do
1052
+ group.run
1053
+ expect(group.examples.first.execution_result.pending_message).to eq("Temporarily skipped with #{method_name}")
1054
+ end
1055
+ end
1056
+ end
1057
+
1058
+ %w[ xdescribe xcontext ].each do |method_name|
1059
+ describe ".#{method_name}" do
1060
+ def extract_execution_results(group)
1061
+ group.examples.map do |ex|
1062
+ ex.metadata.fetch(:execution_result)
1063
+ end
1064
+ end
1065
+
1066
+ it 'generates a pending example group' do
1067
+ group = ExampleGroup.send(method_name, "group") do
1068
+ it("passes") { }
1069
+ it("fails") { expect(2).to eq(3) }
1070
+ end
1071
+ group.run
1072
+
1073
+ expect(extract_execution_results(group).map(&:to_h)).to match([
1074
+ a_hash_including(
1075
+ :status => :pending,
1076
+ :pending_message => "Temporarily skipped with #{method_name}"
1077
+ )
1078
+ ] * 2)
1079
+ end
1080
+ end
1081
+ end
1082
+
1083
+ %w[ fdescribe fcontext ].each do |method_name|
1084
+ describe ".#{method_name}" do
1085
+ def executed_examples_of(group)
1086
+ examples = group.examples.select { |ex| ex.execution_result.started_at }
1087
+ group.children.inject(examples) { |exs, child| exs + executed_examples_of(child) }
1088
+ end
1089
+
1090
+ it "generates an example group that can be filtered with :focus" do
1091
+ RSpec.configuration.filter_run :focus
1092
+
1093
+ parent_group = ExampleGroup.describe do
1094
+ describe "not focused" do
1095
+ example("not focused example") { }
1096
+ end
1097
+
1098
+ send(method_name, "focused") do
1099
+ example("focused example") { }
1100
+ end
1101
+ end
1102
+
1103
+ parent_group.run
1104
+
1105
+ executed_descriptions = executed_examples_of(parent_group).map(&:description)
1106
+ expect(executed_descriptions).to eq(["focused example"])
1107
+ end
1108
+ end
1109
+ end
1110
+
1111
+ describe "setting pending metadata in parent" do
1112
+ def extract_execution_results(group)
1113
+ group.examples.map do |ex|
1114
+ ex.metadata.fetch(:execution_result)
1115
+ end
1116
+ end
1117
+
1118
+ it 'marks every example as pending' do
1119
+ group = ExampleGroup.describe("group", :pending => true) do
1120
+ it("passes") { }
1121
+ it("fails", :pending => 'unimplemented') { fail }
1122
+ end
1123
+ group.run
1124
+
1125
+ expect(extract_execution_results(group).map(&:to_h)).to match([
1126
+ a_hash_including(
1127
+ :status => :failed,
1128
+ :pending_message => "No reason given"
1129
+ ),
1130
+ a_hash_including(
1131
+ :status => :pending,
1132
+ :pending_message => "unimplemented"
1133
+ )
1134
+ ])
1135
+ end
1136
+ end
1137
+
1138
+ describe "adding examples" do
1139
+
1140
+ it "allows adding an example using 'it'" do
1141
+ group = ExampleGroup.describe
1142
+ group.it("should do something") { }
1143
+ expect(group.examples.size).to eq(1)
1144
+ end
1145
+
1146
+ it "exposes all examples at examples" do
1147
+ group = ExampleGroup.describe
1148
+ group.it("should do something 1") { }
1149
+ group.it("should do something 2") { }
1150
+ group.it("should do something 3") { }
1151
+ expect(group.examples.count).to eq(3)
1152
+ end
1153
+
1154
+ it "maintains the example order" do
1155
+ group = ExampleGroup.describe
1156
+ group.it("should 1") { }
1157
+ group.it("should 2") { }
1158
+ group.it("should 3") { }
1159
+ expect(group.examples[0].description).to eq('should 1')
1160
+ expect(group.examples[1].description).to eq('should 2')
1161
+ expect(group.examples[2].description).to eq('should 3')
1162
+ end
1163
+
1164
+ end
1165
+
1166
+ describe Object, "describing nested example_groups", :little_less_nested => 'yep' do
1167
+
1168
+ describe "A sample nested group", :nested_describe => "yep" do
1169
+ it "sets the described class to the nearest described class" do |ex|
1170
+ expect(ex.example_group.described_class).to eq(Object)
1171
+ end
1172
+
1173
+ it "sets the description to 'A sample nested describe'" do |ex|
1174
+ expect(ex.example_group.description).to eq('A sample nested group')
1175
+ end
1176
+
1177
+ it "has top level metadata from the example_group and its parent groups" do |ex|
1178
+ expect(ex.example_group.metadata).to include(:little_less_nested => 'yep', :nested_describe => 'yep')
1179
+ end
1180
+
1181
+ it "exposes the parent metadata to the contained examples" do |ex|
1182
+ expect(ex.metadata).to include(:little_less_nested => 'yep', :nested_describe => 'yep')
1183
+ end
1184
+ end
1185
+
1186
+ end
1187
+
1188
+ describe "#run_examples" do
1189
+
1190
+ let(:reporter) { double("reporter").as_null_object }
1191
+
1192
+ it "returns true if all examples pass" do
1193
+ group = ExampleGroup.describe('group') do
1194
+ example('ex 1') { expect(1).to eq(1) }
1195
+ example('ex 2') { expect(1).to eq(1) }
1196
+ end
1197
+ allow(group).to receive(:filtered_examples) { group.examples }
1198
+ expect(group.run(reporter)).to be_truthy
1199
+ end
1200
+
1201
+ it "returns false if any of the examples fail" do
1202
+ group = ExampleGroup.describe('group') do
1203
+ example('ex 1') { expect(1).to eq(1) }
1204
+ example('ex 2') { expect(1).to eq(2) }
1205
+ end
1206
+ allow(group).to receive(:filtered_examples) { group.examples }
1207
+ expect(group.run(reporter)).to be_falsey
1208
+ end
1209
+
1210
+ it "runs all examples, regardless of any of them failing" do
1211
+ group = ExampleGroup.describe('group') do
1212
+ example('ex 1') { expect(1).to eq(2) }
1213
+ example('ex 2') { expect(1).to eq(1) }
1214
+ end
1215
+ allow(group).to receive(:filtered_examples) { group.examples }
1216
+ group.filtered_examples.each do |example|
1217
+ expect(example).to receive(:run)
1218
+ end
1219
+ expect(group.run(reporter)).to be_falsey
1220
+ end
1221
+ end
1222
+
1223
+ describe "how instance variables are inherited" do
1224
+ before(:all) do
1225
+ @before_all_top_level = 'before_all_top_level'
1226
+ end
1227
+
1228
+ before(:each) do
1229
+ @before_each_top_level = 'before_each_top_level'
1230
+ end
1231
+
1232
+ it "can access a before each ivar at the same level" do
1233
+ expect(@before_each_top_level).to eq('before_each_top_level')
1234
+ end
1235
+
1236
+ it "can access a before all ivar at the same level" do
1237
+ expect(@before_all_top_level).to eq('before_all_top_level')
1238
+ end
1239
+
1240
+ it "can access the before all ivars in the before_all_ivars hash", :ruby => 1.8 do |ex|
1241
+ expect(ex.example_group.before_context_ivars).to include('@before_all_top_level' => 'before_all_top_level')
1242
+ end
1243
+
1244
+ it "can access the before all ivars in the before_all_ivars hash", :ruby => 1.9 do |ex|
1245
+ expect(ex.example_group.before_context_ivars).to include(:@before_all_top_level => 'before_all_top_level')
1246
+ end
1247
+
1248
+ describe "but now I am nested" do
1249
+ it "can access a parent example groups before each ivar at a nested level" do
1250
+ expect(@before_each_top_level).to eq('before_each_top_level')
1251
+ end
1252
+
1253
+ it "can access a parent example groups before all ivar at a nested level" do
1254
+ expect(@before_all_top_level).to eq("before_all_top_level")
1255
+ end
1256
+
1257
+ it "changes to before all ivars from within an example do not persist outside the current describe" do
1258
+ @before_all_top_level = "ive been changed"
1259
+ end
1260
+
1261
+ describe "accessing a before_all ivar that was changed in a parent example_group" do
1262
+ it "does not have access to the modified version" do
1263
+ expect(@before_all_top_level).to eq('before_all_top_level')
1264
+ end
1265
+ end
1266
+ end
1267
+
1268
+ end
1269
+
1270
+ describe "ivars are not shared across examples" do
1271
+ it "(first example)" do
1272
+ @a = 1
1273
+ expect(defined?(@b)).to be_falsey
1274
+ end
1275
+
1276
+ it "(second example)" do
1277
+ @b = 2
1278
+ expect(defined?(@a)).to be_falsey
1279
+ end
1280
+ end
1281
+
1282
+
1283
+ describe "#top_level_description" do
1284
+ it "returns the description from the outermost example group" do
1285
+ group = nil
1286
+ ExampleGroup.describe("top") do
1287
+ context "middle" do
1288
+ group = describe "bottom" do
1289
+ end
1290
+ end
1291
+ end
1292
+
1293
+ expect(group.top_level_description).to eq("top")
1294
+ end
1295
+ end
1296
+
1297
+ describe "#run" do
1298
+ let(:reporter) { double("reporter").as_null_object }
1299
+
1300
+ context "with fail_fast? => true" do
1301
+ let(:group) do
1302
+ group = RSpec::Core::ExampleGroup.describe
1303
+ allow(group).to receive(:fail_fast?) { true }
1304
+ group
1305
+ end
1306
+
1307
+ it "does not run examples after the failed example" do
1308
+ examples_run = []
1309
+ group.example('example 1') { examples_run << self }
1310
+ group.example('example 2') { examples_run << self; fail; }
1311
+ group.example('example 3') { examples_run << self }
1312
+
1313
+ group.run
1314
+
1315
+ expect(examples_run.length).to eq(2)
1316
+ end
1317
+
1318
+ it "sets RSpec.world.wants_to_quit flag if encountering an exception in before(:all)" do
1319
+ group.before(:all) { raise "error in before all" }
1320
+ group.example("equality") { expect(1).to eq(2) }
1321
+ expect(group.run).to be_falsey
1322
+ expect(RSpec.world.wants_to_quit).to be_truthy
1323
+ end
1324
+ end
1325
+
1326
+ context "with RSpec.world.wants_to_quit=true" do
1327
+ let(:group) { RSpec::Core::ExampleGroup.describe }
1328
+
1329
+ before do
1330
+ allow(RSpec.world).to receive(:wants_to_quit) { true }
1331
+ allow(RSpec.world).to receive(:clear_remaining_example_groups)
1332
+ end
1333
+
1334
+ it "returns without starting the group" do
1335
+ expect(reporter).not_to receive(:example_group_started)
1336
+ group.run(reporter)
1337
+ end
1338
+
1339
+ context "at top level" do
1340
+ it "purges remaining groups" do
1341
+ expect(RSpec.world).to receive(:clear_remaining_example_groups)
1342
+ group.run(reporter)
1343
+ end
1344
+ end
1345
+
1346
+ context "in a nested group" do
1347
+ it "does not purge remaining groups" do
1348
+ nested_group = group.describe
1349
+ expect(RSpec.world).not_to receive(:clear_remaining_example_groups)
1350
+ nested_group.run(reporter)
1351
+ end
1352
+ end
1353
+ end
1354
+
1355
+ context "with all examples passing" do
1356
+ it "returns true" do
1357
+ group = RSpec::Core::ExampleGroup.describe("something") do
1358
+ it "does something" do
1359
+ # pass
1360
+ end
1361
+ describe "nested" do
1362
+ it "does something else" do
1363
+ # pass
1364
+ end
1365
+ end
1366
+ end
1367
+
1368
+ expect(group.run(reporter)).to be_truthy
1369
+ end
1370
+ end
1371
+
1372
+ context "with top level example failing" do
1373
+ it "returns false" do
1374
+ group = RSpec::Core::ExampleGroup.describe("something") do
1375
+ it "does something (wrong - fail)" do
1376
+ raise "fail"
1377
+ end
1378
+ describe "nested" do
1379
+ it "does something else" do
1380
+ # pass
1381
+ end
1382
+ end
1383
+ end
1384
+
1385
+ expect(group.run(reporter)).to be_falsey
1386
+ end
1387
+ end
1388
+
1389
+ context "with nested example failing" do
1390
+ it "returns true" do
1391
+ group = RSpec::Core::ExampleGroup.describe("something") do
1392
+ it "does something" do
1393
+ # pass
1394
+ end
1395
+ describe "nested" do
1396
+ it "does something else (wrong -fail)" do
1397
+ raise "fail"
1398
+ end
1399
+ end
1400
+ end
1401
+
1402
+ expect(group.run(reporter)).to be_falsey
1403
+ end
1404
+ end
1405
+ end
1406
+
1407
+ %w[include_examples include_context].each do |name|
1408
+ describe "##{name}" do
1409
+ let(:group) { ExampleGroup.describe }
1410
+ before do
1411
+ group.shared_examples "named this" do
1412
+ example("does something") {}
1413
+ end
1414
+ end
1415
+
1416
+ it "includes the named examples" do
1417
+ group.send(name, "named this")
1418
+ expect(group.examples.first.description).to eq("does something")
1419
+ end
1420
+
1421
+ it "raises a helpful error message when shared content is not found" do
1422
+ expect do
1423
+ group.send(name, "shared stuff")
1424
+ end.to raise_error(ArgumentError, /Could not find .* "shared stuff"/)
1425
+ end
1426
+
1427
+ it "passes parameters to the shared content" do
1428
+ passed_params = {}
1429
+ group = ExampleGroup.describe
1430
+
1431
+ group.shared_examples "named this with params" do |param1, param2|
1432
+ it("has access to the given parameters") do
1433
+ passed_params[:param1] = param1
1434
+ passed_params[:param2] = param2
1435
+ end
1436
+ end
1437
+
1438
+ group.send(name, "named this with params", :value1, :value2)
1439
+ group.run
1440
+
1441
+ expect(passed_params).to eq({ :param1 => :value1, :param2 => :value2 })
1442
+ end
1443
+
1444
+ it "adds shared instance methods to the group" do
1445
+ group = ExampleGroup.describe('fake group')
1446
+ group.shared_examples "named this with params" do |param1|
1447
+ def foo; end
1448
+ end
1449
+ group.send(name, "named this with params", :a)
1450
+ expect(group.public_instance_methods.map{|m| m.to_s}).to include("foo")
1451
+ end
1452
+
1453
+ it "evals the shared example group only once" do
1454
+ eval_count = 0
1455
+ group = ExampleGroup.describe('fake group')
1456
+ group.shared_examples("named this with params") { |p| eval_count += 1 }
1457
+ group.send(name, "named this with params", :a)
1458
+ expect(eval_count).to eq(1)
1459
+ end
1460
+
1461
+ it "evals the block when given" do
1462
+ key = "#{__FILE__}:#{__LINE__}"
1463
+ group = ExampleGroup.describe do
1464
+ shared_examples(key) do
1465
+ it("does something") do
1466
+ expect(foo).to eq("bar")
1467
+ end
1468
+ end
1469
+
1470
+ send name, key do
1471
+ def foo; "bar"; end
1472
+ end
1473
+ end
1474
+ expect(group.run).to be_truthy
1475
+ end
1476
+ end
1477
+ end
1478
+
1479
+ describe "#it_should_behave_like" do
1480
+ it "creates a nested group" do
1481
+ group = ExampleGroup.describe('fake group')
1482
+ group.shared_examples_for("thing") {}
1483
+ group.it_should_behave_like("thing")
1484
+ expect(group.children.count).to eq(1)
1485
+ end
1486
+
1487
+ it "creates a nested group for a class" do
1488
+ klass = Class.new
1489
+ group = ExampleGroup.describe('fake group')
1490
+ group.shared_examples_for(klass) {}
1491
+ group.it_should_behave_like(klass)
1492
+ expect(group.children.count).to eq(1)
1493
+ end
1494
+
1495
+ it "adds shared examples to nested group" do
1496
+ group = ExampleGroup.describe('fake group')
1497
+ group.shared_examples_for("thing") do
1498
+ it("does something")
1499
+ end
1500
+ shared_group = group.it_should_behave_like("thing")
1501
+ expect(shared_group.examples.count).to eq(1)
1502
+ end
1503
+
1504
+ it "adds shared instance methods to nested group" do
1505
+ group = ExampleGroup.describe('fake group')
1506
+ group.shared_examples_for("thing") do
1507
+ def foo; end
1508
+ end
1509
+ shared_group = group.it_should_behave_like("thing")
1510
+ expect(shared_group.public_instance_methods.map{|m| m.to_s}).to include("foo")
1511
+ end
1512
+
1513
+ it "adds shared class methods to nested group" do
1514
+ group = ExampleGroup.describe('fake group')
1515
+ group.shared_examples_for("thing") do
1516
+ def self.foo; end
1517
+ end
1518
+ shared_group = group.it_should_behave_like("thing")
1519
+ expect(shared_group.methods.map{|m| m.to_s}).to include("foo")
1520
+ end
1521
+
1522
+ it "passes parameters to the shared example group" do
1523
+ passed_params = {}
1524
+
1525
+ group = ExampleGroup.describe("group") do
1526
+ shared_examples_for("thing") do |param1, param2|
1527
+ it("has access to the given parameters") do
1528
+ passed_params[:param1] = param1
1529
+ passed_params[:param2] = param2
1530
+ end
1531
+ end
1532
+
1533
+ it_should_behave_like "thing", :value1, :value2
1534
+ end
1535
+
1536
+ group.run
1537
+
1538
+ expect(passed_params).to eq({ :param1 => :value1, :param2 => :value2 })
1539
+ end
1540
+
1541
+ it "adds shared instance methods to nested group" do
1542
+ group = ExampleGroup.describe('fake group')
1543
+ group.shared_examples_for("thing") do |param1|
1544
+ def foo; end
1545
+ end
1546
+ shared_group = group.it_should_behave_like("thing", :a)
1547
+ expect(shared_group.public_instance_methods.map{|m| m.to_s}).to include("foo")
1548
+ end
1549
+
1550
+ it "evals the shared example group only once" do
1551
+ eval_count = 0
1552
+ group = ExampleGroup.describe('fake group')
1553
+ group.shared_examples_for("thing") { |p| eval_count += 1 }
1554
+ group.it_should_behave_like("thing", :a)
1555
+ expect(eval_count).to eq(1)
1556
+ end
1557
+
1558
+ context "given a block" do
1559
+ it "evaluates the block in nested group" do
1560
+ scopes = []
1561
+ group = ExampleGroup.describe("group") do
1562
+ shared_examples_for("thing") do
1563
+ it("gets run in the nested group") do
1564
+ scopes << self.class
1565
+ end
1566
+ end
1567
+ it_should_behave_like "thing" do
1568
+ it("gets run in the same nested group") do
1569
+ scopes << self.class
1570
+ end
1571
+ end
1572
+ end
1573
+ group.run
1574
+
1575
+ expect(scopes[0]).to be(scopes[1])
1576
+ end
1577
+ end
1578
+
1579
+ it "raises a helpful error message when shared context is not found" do
1580
+ expect do
1581
+ ExampleGroup.describe do
1582
+ it_should_behave_like "shared stuff"
1583
+ end
1584
+ end.to raise_error(ArgumentError,%q|Could not find shared examples "shared stuff"|)
1585
+ end
1586
+ end
1587
+
1588
+ it 'minimizes the number of methods that users could inadvertantly overwrite' do
1589
+ rspec_core_methods = ExampleGroup.instance_methods -
1590
+ RSpec::Matchers.instance_methods -
1591
+ RSpec::Mocks::ExampleMethods.instance_methods -
1592
+ Object.instance_methods
1593
+
1594
+ # Feel free to expand this list if you intend to add another public API
1595
+ # for users. RSpec internals should not add methods here, though.
1596
+ expect(rspec_core_methods.map(&:to_sym)).to contain_exactly(
1597
+ :described_class, :subject,
1598
+ :is_expected, :should, :should_not,
1599
+ :pending, :skip,
1600
+ :setup_mocks_for_rspec, :teardown_mocks_for_rspec, :verify_mocks_for_rspec
1601
+ )
1602
+ end
1603
+
1604
+ it 'prevents defining nested isolated contexts' do
1605
+ expect {
1606
+ RSpec.describe do
1607
+ describe {}
1608
+ RSpec.describe {}
1609
+ end
1610
+ }.to raise_error(/not allowed/)
1611
+ end
1612
+
1613
+ it 'prevents defining nested isolated shared contexts' do
1614
+ expect {
1615
+ ExampleGroup.describe do
1616
+ ExampleGroup.shared_examples("common functionality") {}
1617
+ end
1618
+ }.to raise_error(/not allowed/)
1619
+ end
1620
+ end
1621
+ end