opal-rspec 0.4.3 → 0.5.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (525) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +9 -3
  4. data/Gemfile +6 -5
  5. data/README.md +73 -13
  6. data/Rakefile +108 -12
  7. data/lib/opal/rspec/version.rb +1 -1
  8. data/lib/opal/rspec.rb +35 -12
  9. data/opal/opal/rspec/async/async_example.rb +87 -0
  10. data/opal/opal/rspec/async/example_group.rb +94 -0
  11. data/opal/opal/rspec/async/hooks.rb +46 -0
  12. data/opal/opal/rspec/async/legacy.rb +50 -0
  13. data/opal/opal/rspec/async.rb +4 -289
  14. data/opal/opal/rspec/browser_formatter.rb +55 -18
  15. data/opal/opal/rspec/fixes/caller_filter.rb +6 -0
  16. data/opal/opal/rspec/fixes/example.rb +20 -0
  17. data/opal/opal/rspec/fixes/example_groups.rb +32 -0
  18. data/opal/opal/rspec/fixes/expectations.rb +21 -0
  19. data/opal/opal/rspec/fixes/formatter.rb +62 -0
  20. data/opal/opal/rspec/fixes/kernel.rb +35 -0
  21. data/opal/opal/rspec/fixes/matchers.rb +15 -0
  22. data/opal/opal/rspec/fixes/mocks.rb +13 -0
  23. data/opal/opal/rspec/fixes/reporter.rb +12 -0
  24. data/opal/opal/rspec/fixes.rb +11 -115
  25. data/opal/opal/rspec/pre_require_fixes.rb +4 -0
  26. data/opal/opal/rspec/requires.rb +103 -35
  27. data/opal/opal/rspec/runner.rb +19 -15
  28. data/opal/opal/rspec/text_formatter.rb +24 -10
  29. data/opal/opal/rspec.rb +4 -9
  30. data/opal-rspec.gemspec +5 -2
  31. data/{vendor_lib → rspec/lib}/rspec/version.rb +1 -1
  32. data/{vendor_lib → rspec/lib}/rspec.rb +0 -0
  33. data/rspec-core/benchmarks/call_v_yield.rb +81 -0
  34. data/rspec-core/benchmarks/check_inclusion.rb +125 -0
  35. data/rspec-core/benchmarks/define_method_v_attr_reader_v_def.rb +81 -0
  36. data/rspec-core/benchmarks/eager_vs_lazy_metadata/define_examples.rb +22 -0
  37. data/rspec-core/benchmarks/eager_vs_lazy_metadata.rb +126 -0
  38. data/rspec-core/benchmarks/filter_object.rb +35 -0
  39. data/rspec-core/benchmarks/index_v_take_while.rb +47 -0
  40. data/rspec-core/benchmarks/map_then_flatten_vs_flat_map_benchmarks.rb +94 -0
  41. data/rspec-core/benchmarks/require_relative_v_require.rb +75 -0
  42. data/rspec-core/benchmarks/respond_to_v_defined.rb +72 -0
  43. data/rspec-core/benchmarks/several_regexps_v_one_big_one.rb +86 -0
  44. data/rspec-core/benchmarks/sort_by_v_shuffle.rb +83 -0
  45. data/rspec-core/benchmarks/to_proc_v_not_to_proc.rb +539 -0
  46. data/rspec-core/features/step_definitions/additional_cli_steps.rb +126 -0
  47. data/rspec-core/features/step_definitions/core_standalone_steps.rb +12 -0
  48. data/rspec-core/features/support/env.rb +21 -0
  49. data/rspec-core/features/support/require_expect_syntax_in_aruba_specs.rb +29 -0
  50. data/rspec-core/features/support/rubinius.rb +6 -0
  51. data/{vendor_lib → rspec-core/lib}/rspec/autorun.rb +0 -0
  52. data/{vendor_lib → rspec-core/lib}/rspec/core/backport_random.rb +40 -6
  53. data/rspec-core/lib/rspec/core/backtrace_formatter.rb +66 -0
  54. data/{vendor_lib → rspec-core/lib}/rspec/core/configuration.rb +561 -250
  55. data/rspec-core/lib/rspec/core/configuration_options.rb +173 -0
  56. data/rspec-core/lib/rspec/core/drb.rb +111 -0
  57. data/rspec-core/lib/rspec/core/dsl.rb +93 -0
  58. data/rspec-core/lib/rspec/core/example.rb +502 -0
  59. data/rspec-core/lib/rspec/core/example_group.rb +606 -0
  60. data/rspec-core/lib/rspec/core/filter_manager.rb +259 -0
  61. data/{vendor_lib → rspec-core/lib}/rspec/core/flat_map.rb +1 -0
  62. data/rspec-core/lib/rspec/core/formatters/base_formatter.rb +67 -0
  63. data/rspec-core/lib/rspec/core/formatters/base_text_formatter.rb +76 -0
  64. data/rspec-core/lib/rspec/core/formatters/console_codes.rb +64 -0
  65. data/{vendor_lib → rspec-core/lib}/rspec/core/formatters/deprecation_formatter.rb +65 -36
  66. data/rspec-core/lib/rspec/core/formatters/documentation_formatter.rb +68 -0
  67. data/{vendor_lib → rspec-core/lib}/rspec/core/formatters/helpers.rb +18 -13
  68. data/{vendor_lib → rspec-core/lib}/rspec/core/formatters/html_formatter.rb +69 -75
  69. data/{vendor_lib → rspec-core/lib}/rspec/core/formatters/html_printer.rb +17 -22
  70. data/rspec-core/lib/rspec/core/formatters/json_formatter.rb +94 -0
  71. data/rspec-core/lib/rspec/core/formatters/profile_formatter.rb +65 -0
  72. data/rspec-core/lib/rspec/core/formatters/progress_formatter.rb +28 -0
  73. data/rspec-core/lib/rspec/core/formatters/protocol.rb +163 -0
  74. data/{vendor_lib → rspec-core/lib}/rspec/core/formatters/snippet_extractor.rb +15 -12
  75. data/rspec-core/lib/rspec/core/formatters.rb +240 -0
  76. data/rspec-core/lib/rspec/core/hooks.rb +591 -0
  77. data/{vendor_lib → rspec-core/lib}/rspec/core/memoized_helpers.rb +82 -41
  78. data/rspec-core/lib/rspec/core/metadata.rb +437 -0
  79. data/rspec-core/lib/rspec/core/metadata_filter.rb +95 -0
  80. data/rspec-core/lib/rspec/core/minitest_assertions_adapter.rb +28 -0
  81. data/rspec-core/lib/rspec/core/mocking_adapters/flexmock.rb +31 -0
  82. data/{vendor_lib/rspec/core/mocking/with_mocha.rb → rspec-core/lib/rspec/core/mocking_adapters/mocha.rb} +21 -16
  83. data/rspec-core/lib/rspec/core/mocking_adapters/null.rb +14 -0
  84. data/rspec-core/lib/rspec/core/mocking_adapters/rr.rb +31 -0
  85. data/rspec-core/lib/rspec/core/mocking_adapters/rspec.rb +32 -0
  86. data/rspec-core/lib/rspec/core/notifications.rb +542 -0
  87. data/{vendor_lib → rspec-core/lib}/rspec/core/option_parser.rb +53 -65
  88. data/{vendor_lib → rspec-core/lib}/rspec/core/ordering.rb +11 -10
  89. data/rspec-core/lib/rspec/core/pending.rb +163 -0
  90. data/rspec-core/lib/rspec/core/project_initializer/spec/spec_helper.rb +89 -0
  91. data/rspec-core/lib/rspec/core/project_initializer.rb +48 -0
  92. data/rspec-core/lib/rspec/core/rake_task.rb +187 -0
  93. data/rspec-core/lib/rspec/core/reporter.rb +149 -0
  94. data/{vendor_lib → rspec-core/lib}/rspec/core/ruby_project.rb +3 -2
  95. data/rspec-core/lib/rspec/core/runner.rb +158 -0
  96. data/{vendor_lib → rspec-core/lib}/rspec/core/shared_context.rb +7 -5
  97. data/rspec-core/lib/rspec/core/shared_example_group.rb +182 -0
  98. data/rspec-core/lib/rspec/core/test_unit_assertions_adapter.rb +30 -0
  99. data/rspec-core/lib/rspec/core/version.rb +9 -0
  100. data/rspec-core/lib/rspec/core/warnings.rb +40 -0
  101. data/{vendor_lib → rspec-core/lib}/rspec/core/world.rb +78 -26
  102. data/{vendor_lib → rspec-core/lib}/rspec/core.rb +64 -98
  103. data/rspec-core/spec/command_line/order_spec.rb +213 -0
  104. data/rspec-core/spec/rspec/core/backtrace_formatter_spec.rb +306 -0
  105. data/rspec-core/spec/rspec/core/configuration_options_spec.rb +425 -0
  106. data/rspec-core/spec/rspec/core/configuration_spec.rb +1963 -0
  107. data/rspec-core/spec/rspec/core/drb_spec.rb +278 -0
  108. data/rspec-core/spec/rspec/core/dsl_spec.rb +85 -0
  109. data/rspec-core/spec/rspec/core/example_execution_result_spec.rb +142 -0
  110. data/rspec-core/spec/rspec/core/example_group_constants_spec.rb +16 -0
  111. data/rspec-core/spec/rspec/core/example_group_spec.rb +1621 -0
  112. data/rspec-core/spec/rspec/core/example_spec.rb +662 -0
  113. data/rspec-core/spec/rspec/core/failed_example_notification_spec.rb +25 -0
  114. data/rspec-core/spec/rspec/core/filter_manager_spec.rb +299 -0
  115. data/rspec-core/spec/rspec/core/formatters/base_text_formatter_spec.rb +182 -0
  116. data/rspec-core/spec/rspec/core/formatters/console_codes_spec.rb +65 -0
  117. data/rspec-core/spec/rspec/core/formatters/deprecation_formatter_spec.rb +225 -0
  118. data/rspec-core/spec/rspec/core/formatters/documentation_formatter_spec.rb +111 -0
  119. data/rspec-core/spec/rspec/core/formatters/helpers_spec.rb +104 -0
  120. data/rspec-core/spec/rspec/core/formatters/html_formatter_spec.rb +111 -0
  121. data/rspec-core/spec/rspec/core/formatters/json_formatter_spec.rb +183 -0
  122. data/rspec-core/spec/rspec/core/formatters/profile_formatter_spec.rb +99 -0
  123. data/rspec-core/spec/rspec/core/formatters/progress_formatter_spec.rb +55 -0
  124. data/rspec-core/spec/rspec/core/formatters/snippet_extractor_spec.rb +26 -0
  125. data/rspec-core/spec/rspec/core/formatters_spec.rb +160 -0
  126. data/rspec-core/spec/rspec/core/hooks_filtering_spec.rb +227 -0
  127. data/rspec-core/spec/rspec/core/hooks_spec.rb +447 -0
  128. data/rspec-core/spec/rspec/core/memoized_helpers_spec.rb +537 -0
  129. data/rspec-core/spec/rspec/core/metadata_filter_spec.rb +181 -0
  130. data/rspec-core/spec/rspec/core/metadata_spec.rb +642 -0
  131. data/rspec-core/spec/rspec/core/notifications_spec.rb +92 -0
  132. data/rspec-core/spec/rspec/core/option_parser_spec.rb +270 -0
  133. data/rspec-core/spec/rspec/core/ordering_spec.rb +102 -0
  134. data/rspec-core/spec/rspec/core/pending_example_spec.rb +221 -0
  135. data/rspec-core/spec/rspec/core/pending_spec.rb +8 -0
  136. data/rspec-core/spec/rspec/core/project_initializer_spec.rb +123 -0
  137. data/rspec-core/spec/rspec/core/rake_task_spec.rb +351 -0
  138. data/rspec-core/spec/rspec/core/random_spec.rb +47 -0
  139. data/rspec-core/spec/rspec/core/reporter_spec.rb +198 -0
  140. data/rspec-core/spec/rspec/core/resources/a_bar.rb +0 -0
  141. data/rspec-core/spec/rspec/core/resources/a_foo.rb +0 -0
  142. data/rspec-core/spec/rspec/core/resources/a_spec.rb +1 -0
  143. data/rspec-core/spec/rspec/core/resources/acceptance/bar.rb +0 -0
  144. data/rspec-core/spec/rspec/core/resources/acceptance/foo_spec.rb +0 -0
  145. data/rspec-core/spec/rspec/core/resources/custom_example_group_runner.rb +14 -0
  146. data/rspec-core/spec/rspec/core/resources/formatter_specs.rb +58 -0
  147. data/rspec-core/spec/rspec/core/resources/utf8_encoded.rb +9 -0
  148. data/rspec-core/spec/rspec/core/rspec_matchers_spec.rb +45 -0
  149. data/rspec-core/spec/rspec/core/ruby_project_spec.rb +26 -0
  150. data/rspec-core/spec/rspec/core/runner_spec.rb +309 -0
  151. data/rspec-core/spec/rspec/core/shared_context_spec.rb +102 -0
  152. data/rspec-core/spec/rspec/core/shared_example_group_spec.rb +268 -0
  153. data/rspec-core/spec/rspec/core/warnings_spec.rb +72 -0
  154. data/rspec-core/spec/rspec/core/world_spec.rb +142 -0
  155. data/rspec-core/spec/rspec/core_spec.rb +103 -0
  156. data/rspec-core/spec/spec_helper.rb +89 -0
  157. data/rspec-core/spec/support/config_options_helper.rb +13 -0
  158. data/rspec-core/spec/support/fake_minitest/minitest/minitest_assertions.rb +4 -0
  159. data/rspec-core/spec/support/fake_minitest/minitest.rb +0 -0
  160. data/rspec-core/spec/support/fake_minitest/test/unit/assertions.rb +6 -0
  161. data/rspec-core/spec/support/formatter_support.rb +263 -0
  162. data/rspec-core/spec/support/helper_methods.rb +26 -0
  163. data/rspec-core/spec/support/isolated_home_directory.rb +16 -0
  164. data/rspec-core/spec/support/matchers.rb +103 -0
  165. data/rspec-core/spec/support/mathn_integration_support.rb +12 -0
  166. data/rspec-core/spec/support/sandboxing.rb +50 -0
  167. data/rspec-core/spec/support/shared_example_groups.rb +43 -0
  168. data/rspec-core/spec/support/spec_files.rb +44 -0
  169. data/rspec-expectations/benchmarks/2.x_vs_3.x_matcher_dsl_implementation.rb +253 -0
  170. data/rspec-expectations/benchmarks/autoload_v_require.rb +25 -0
  171. data/rspec-expectations/benchmarks/cloning_matchers.rb +19 -0
  172. data/rspec-expectations/benchmarks/default_messages_as_methods_v_blocks.rb +27 -0
  173. data/rspec-expectations/benchmarks/example_spec.rb +9 -0
  174. data/rspec-expectations/benchmarks/include_v_superclass.rb +39 -0
  175. data/rspec-expectations/benchmarks/match_array/failing_with_distinct_items.rb +147 -0
  176. data/rspec-expectations/benchmarks/match_array/failing_with_duplicate_items.rb +122 -0
  177. data/rspec-expectations/benchmarks/match_array/passing_with_distinct_items.rb +154 -0
  178. data/rspec-expectations/benchmarks/match_array/passing_with_duplicate_items.rb +132 -0
  179. data/rspec-expectations/benchmarks/match_array/rubyprof/passing_with_distinct_items.rb +9 -0
  180. data/rspec-expectations/benchmarks/matcher_dsl_vs_classes.rb +180 -0
  181. data/rspec-expectations/benchmarks/method_to_proc.rb +72 -0
  182. data/rspec-expectations/benchmarks/set_vs_array_include.rb +68 -0
  183. data/rspec-expectations/features/step_definitions/additional_cli_steps.rb +22 -0
  184. data/rspec-expectations/features/support/disallow_certain_apis.rb +34 -0
  185. data/rspec-expectations/features/support/env.rb +21 -0
  186. data/rspec-expectations/features/support/rubinius.rb +6 -0
  187. data/{vendor_lib/rspec/matchers → rspec-expectations/lib/rspec/expectations}/configuration.rb +50 -16
  188. data/rspec-expectations/lib/rspec/expectations/expectation_target.rb +119 -0
  189. data/rspec-expectations/lib/rspec/expectations/fail_with.rb +34 -0
  190. data/rspec-expectations/lib/rspec/expectations/handler.rb +167 -0
  191. data/rspec-expectations/lib/rspec/expectations/minitest_integration.rb +17 -0
  192. data/rspec-expectations/lib/rspec/expectations/syntax.rb +132 -0
  193. data/{vendor_lib → rspec-expectations/lib}/rspec/expectations/version.rb +1 -1
  194. data/rspec-expectations/lib/rspec/expectations.rb +68 -0
  195. data/rspec-expectations/lib/rspec/matchers/aliased_matcher.rb +116 -0
  196. data/rspec-expectations/lib/rspec/matchers/built_in/all.rb +85 -0
  197. data/rspec-expectations/lib/rspec/matchers/built_in/base_matcher.rb +132 -0
  198. data/rspec-expectations/lib/rspec/matchers/built_in/be.rb +277 -0
  199. data/rspec-expectations/lib/rspec/matchers/built_in/be_between.rb +77 -0
  200. data/{vendor_lib → rspec-expectations/lib}/rspec/matchers/built_in/be_instance_of.rb +11 -4
  201. data/{vendor_lib → rspec-expectations/lib}/rspec/matchers/built_in/be_kind_of.rb +5 -0
  202. data/rspec-expectations/lib/rspec/matchers/built_in/be_within.rb +72 -0
  203. data/rspec-expectations/lib/rspec/matchers/built_in/change.rb +337 -0
  204. data/rspec-expectations/lib/rspec/matchers/built_in/compound.rb +258 -0
  205. data/rspec-expectations/lib/rspec/matchers/built_in/contain_exactly.rb +249 -0
  206. data/{vendor_lib → rspec-expectations/lib}/rspec/matchers/built_in/cover.rb +3 -0
  207. data/rspec-expectations/lib/rspec/matchers/built_in/eq.rb +75 -0
  208. data/{vendor_lib → rspec-expectations/lib}/rspec/matchers/built_in/eql.rb +17 -6
  209. data/rspec-expectations/lib/rspec/matchers/built_in/equal.rb +81 -0
  210. data/rspec-expectations/lib/rspec/matchers/built_in/exist.rb +86 -0
  211. data/rspec-expectations/lib/rspec/matchers/built_in/has.rb +101 -0
  212. data/rspec-expectations/lib/rspec/matchers/built_in/have_attributes.rb +84 -0
  213. data/rspec-expectations/lib/rspec/matchers/built_in/include.rb +105 -0
  214. data/rspec-expectations/lib/rspec/matchers/built_in/match.rb +29 -0
  215. data/rspec-expectations/lib/rspec/matchers/built_in/operators.rb +119 -0
  216. data/rspec-expectations/lib/rspec/matchers/built_in/output.rb +152 -0
  217. data/{vendor_lib → rspec-expectations/lib}/rspec/matchers/built_in/raise_error.rb +66 -46
  218. data/{vendor_lib → rspec-expectations/lib}/rspec/matchers/built_in/respond_to.rb +43 -26
  219. data/{vendor_lib → rspec-expectations/lib}/rspec/matchers/built_in/satisfy.rb +13 -4
  220. data/rspec-expectations/lib/rspec/matchers/built_in/start_and_end_with.rb +82 -0
  221. data/{vendor_lib → rspec-expectations/lib}/rspec/matchers/built_in/throw_symbol.rb +51 -13
  222. data/rspec-expectations/lib/rspec/matchers/built_in/yield.rb +420 -0
  223. data/rspec-expectations/lib/rspec/matchers/built_in.rb +52 -0
  224. data/rspec-expectations/lib/rspec/matchers/composable.rb +183 -0
  225. data/{vendor_lib/rspec/matchers/matcher.rb → rspec-expectations/lib/rspec/matchers/dsl.rb} +120 -30
  226. data/{vendor_lib → rspec-expectations/lib}/rspec/matchers/generated_descriptions.rb +13 -6
  227. data/rspec-expectations/lib/rspec/matchers/matcher_delegator.rb +33 -0
  228. data/rspec-expectations/lib/rspec/matchers/matcher_protocol.rb +99 -0
  229. data/rspec-expectations/lib/rspec/matchers/pretty.rb +77 -0
  230. data/{vendor_lib → rspec-expectations/lib}/rspec/matchers.rb +408 -74
  231. data/rspec-expectations/spec/rspec/expectations/configuration_spec.rb +226 -0
  232. data/rspec-expectations/spec/rspec/expectations/expectation_target_spec.rb +147 -0
  233. data/rspec-expectations/spec/rspec/expectations/extensions/kernel_spec.rb +69 -0
  234. data/rspec-expectations/spec/rspec/expectations/fail_with_spec.rb +73 -0
  235. data/rspec-expectations/spec/rspec/expectations/handler_spec.rb +200 -0
  236. data/rspec-expectations/spec/rspec/expectations/minitest_integration_spec.rb +25 -0
  237. data/rspec-expectations/spec/rspec/expectations/syntax_spec.rb +93 -0
  238. data/rspec-expectations/spec/rspec/expectations_spec.rb +15 -0
  239. data/rspec-expectations/spec/rspec/matchers/aliased_matcher_spec.rb +113 -0
  240. data/rspec-expectations/spec/rspec/matchers/aliases_spec.rb +455 -0
  241. data/rspec-expectations/spec/rspec/matchers/built_in/all_spec.rb +212 -0
  242. data/rspec-expectations/spec/rspec/matchers/built_in/base_matcher_spec.rb +140 -0
  243. data/rspec-expectations/spec/rspec/matchers/built_in/be_between_spec.rb +157 -0
  244. data/rspec-expectations/spec/rspec/matchers/built_in/be_instance_of_spec.rb +61 -0
  245. data/rspec-expectations/spec/rspec/matchers/built_in/be_kind_of_spec.rb +39 -0
  246. data/rspec-expectations/spec/rspec/matchers/built_in/be_spec.rb +685 -0
  247. data/rspec-expectations/spec/rspec/matchers/built_in/be_within_spec.rb +139 -0
  248. data/rspec-expectations/spec/rspec/matchers/built_in/change_spec.rb +829 -0
  249. data/rspec-expectations/spec/rspec/matchers/built_in/compound_spec.rb +537 -0
  250. data/rspec-expectations/spec/rspec/matchers/built_in/contain_exactly_spec.rb +556 -0
  251. data/rspec-expectations/spec/rspec/matchers/built_in/cover_spec.rb +67 -0
  252. data/rspec-expectations/spec/rspec/matchers/built_in/eq_spec.rb +176 -0
  253. data/rspec-expectations/spec/rspec/matchers/built_in/eql_spec.rb +39 -0
  254. data/rspec-expectations/spec/rspec/matchers/built_in/equal_spec.rb +130 -0
  255. data/rspec-expectations/spec/rspec/matchers/built_in/exist_spec.rb +139 -0
  256. data/rspec-expectations/spec/rspec/matchers/built_in/has_spec.rb +179 -0
  257. data/rspec-expectations/spec/rspec/matchers/built_in/have_attributes_spec.rb +177 -0
  258. data/rspec-expectations/spec/rspec/matchers/built_in/include_spec.rb +587 -0
  259. data/rspec-expectations/spec/rspec/matchers/built_in/match_spec.rb +100 -0
  260. data/rspec-expectations/spec/rspec/matchers/built_in/operators_spec.rb +250 -0
  261. data/rspec-expectations/spec/rspec/matchers/built_in/output_spec.rb +168 -0
  262. data/rspec-expectations/spec/rspec/matchers/built_in/raise_error_spec.rb +446 -0
  263. data/rspec-expectations/spec/rspec/matchers/built_in/respond_to_spec.rb +290 -0
  264. data/rspec-expectations/spec/rspec/matchers/built_in/satisfy_spec.rb +42 -0
  265. data/rspec-expectations/spec/rspec/matchers/built_in/start_and_end_with_spec.rb +347 -0
  266. data/rspec-expectations/spec/rspec/matchers/built_in/throw_symbol_spec.rb +133 -0
  267. data/rspec-expectations/spec/rspec/matchers/built_in/yield_spec.rb +643 -0
  268. data/rspec-expectations/spec/rspec/matchers/composable_spec.rb +77 -0
  269. data/rspec-expectations/spec/rspec/matchers/define_negated_matcher_spec.rb +199 -0
  270. data/rspec-expectations/spec/rspec/matchers/description_generation_spec.rb +189 -0
  271. data/rspec-expectations/spec/rspec/matchers/dsl_spec.rb +1036 -0
  272. data/rspec-expectations/spec/rspec/matchers/legacy_spec.rb +104 -0
  273. data/rspec-expectations/spec/rspec/matchers_spec.rb +108 -0
  274. data/rspec-expectations/spec/spec_helper.rb +94 -0
  275. data/rspec-expectations/spec/support/matchers.rb +54 -0
  276. data/rspec-expectations/spec/support/shared_examples.rb +101 -0
  277. data/rspec-mocks/benchmarks/double_creation.rb +66 -0
  278. data/rspec-mocks/benchmarks/each_value_v_values_each.rb +58 -0
  279. data/rspec-mocks/benchmarks/find_original_method_early.rb +64 -0
  280. data/rspec-mocks/benchmarks/method_defined_at_any_visibility.rb +101 -0
  281. data/rspec-mocks/benchmarks/thread_safety.rb +24 -0
  282. data/rspec-mocks/benchmarks/transfer_nested_constants.rb +77 -0
  283. data/rspec-mocks/features/step_definitions/additional_cli_steps.rb +21 -0
  284. data/rspec-mocks/features/support/disallow_certain_apis.rb +24 -0
  285. data/rspec-mocks/features/support/env.rb +22 -0
  286. data/rspec-mocks/features/support/rubinius.rb +6 -0
  287. data/{vendor_lib → rspec-mocks/lib}/rspec/mocks/any_instance/chain.rb +19 -2
  288. data/rspec-mocks/lib/rspec/mocks/any_instance/expect_chain_chain.rb +35 -0
  289. data/{vendor_lib → rspec-mocks/lib}/rspec/mocks/any_instance/expectation_chain.rb +12 -11
  290. data/{vendor_lib → rspec-mocks/lib}/rspec/mocks/any_instance/message_chains.rb +15 -5
  291. data/rspec-mocks/lib/rspec/mocks/any_instance/proxy.rb +116 -0
  292. data/{vendor_lib → rspec-mocks/lib}/rspec/mocks/any_instance/recorder.rb +105 -38
  293. data/{vendor_lib → rspec-mocks/lib}/rspec/mocks/any_instance/stub_chain.rb +9 -9
  294. data/{vendor_lib → rspec-mocks/lib}/rspec/mocks/any_instance/stub_chain_chain.rb +5 -1
  295. data/rspec-mocks/lib/rspec/mocks/any_instance.rb +10 -0
  296. data/rspec-mocks/lib/rspec/mocks/argument_list_matcher.rb +72 -0
  297. data/rspec-mocks/lib/rspec/mocks/argument_matchers.rb +282 -0
  298. data/{vendor_lib → rspec-mocks/lib}/rspec/mocks/configuration.rb +60 -14
  299. data/{vendor_lib → rspec-mocks/lib}/rspec/mocks/error_generator.rb +93 -43
  300. data/rspec-mocks/lib/rspec/mocks/example_methods.rb +379 -0
  301. data/{vendor_lib → rspec-mocks/lib}/rspec/mocks/instance_method_stasher.rb +30 -7
  302. data/rspec-mocks/lib/rspec/mocks/marshal_extension.rb +41 -0
  303. data/rspec-mocks/lib/rspec/mocks/matchers/expectation_customization.rb +20 -0
  304. data/{vendor_lib → rspec-mocks/lib}/rspec/mocks/matchers/have_received.rb +36 -14
  305. data/{vendor_lib → rspec-mocks/lib}/rspec/mocks/matchers/receive.rb +24 -30
  306. data/rspec-mocks/lib/rspec/mocks/matchers/receive_message_chain.rb +66 -0
  307. data/{vendor_lib → rspec-mocks/lib}/rspec/mocks/matchers/receive_messages.rb +9 -10
  308. data/rspec-mocks/lib/rspec/mocks/message_chain.rb +91 -0
  309. data/{vendor_lib → rspec-mocks/lib}/rspec/mocks/message_expectation.rb +156 -105
  310. data/{vendor_lib → rspec-mocks/lib}/rspec/mocks/method_double.rb +81 -30
  311. data/rspec-mocks/lib/rspec/mocks/method_reference.rb +155 -0
  312. data/{vendor_lib → rspec-mocks/lib}/rspec/mocks/mutate_const.rb +84 -166
  313. data/{vendor_lib → rspec-mocks/lib}/rspec/mocks/object_reference.rb +19 -18
  314. data/{vendor_lib → rspec-mocks/lib}/rspec/mocks/order_group.rb +4 -5
  315. data/rspec-mocks/lib/rspec/mocks/proxy.rb +431 -0
  316. data/rspec-mocks/lib/rspec/mocks/space.rb +221 -0
  317. data/rspec-mocks/lib/rspec/mocks/standalone.rb +3 -0
  318. data/rspec-mocks/lib/rspec/mocks/syntax.rb +329 -0
  319. data/{vendor_lib → rspec-mocks/lib}/rspec/mocks/targets.rb +20 -13
  320. data/rspec-mocks/lib/rspec/mocks/test_double.rb +135 -0
  321. data/{vendor_lib → rspec-mocks/lib}/rspec/mocks/verifying_double.rb +69 -19
  322. data/{vendor_lib → rspec-mocks/lib}/rspec/mocks/verifying_message_expecation.rb +23 -21
  323. data/{vendor_lib → rspec-mocks/lib}/rspec/mocks/verifying_proxy.rb +58 -38
  324. data/rspec-mocks/lib/rspec/mocks/version.rb +9 -0
  325. data/rspec-mocks/lib/rspec/mocks.rb +126 -0
  326. data/rspec-mocks/spec/rspec/mocks/and_call_original_spec.rb +267 -0
  327. data/rspec-mocks/spec/rspec/mocks/and_return_spec.rb +21 -0
  328. data/rspec-mocks/spec/rspec/mocks/and_wrap_original_spec.rb +63 -0
  329. data/rspec-mocks/spec/rspec/mocks/and_yield_spec.rb +161 -0
  330. data/rspec-mocks/spec/rspec/mocks/any_instance/message_chains_spec.rb +39 -0
  331. data/rspec-mocks/spec/rspec/mocks/any_instance_spec.rb +1242 -0
  332. data/rspec-mocks/spec/rspec/mocks/argument_matchers_spec.rb +336 -0
  333. data/rspec-mocks/spec/rspec/mocks/array_including_matcher_spec.rb +39 -0
  334. data/rspec-mocks/spec/rspec/mocks/at_least_spec.rb +147 -0
  335. data/rspec-mocks/spec/rspec/mocks/at_most_spec.rb +113 -0
  336. data/rspec-mocks/spec/rspec/mocks/before_all_spec.rb +75 -0
  337. data/rspec-mocks/spec/rspec/mocks/block_return_value_spec.rb +68 -0
  338. data/rspec-mocks/spec/rspec/mocks/combining_implementation_instructions_spec.rb +196 -0
  339. data/rspec-mocks/spec/rspec/mocks/configuration_spec.rb +175 -0
  340. data/rspec-mocks/spec/rspec/mocks/double_spec.rb +830 -0
  341. data/rspec-mocks/spec/rspec/mocks/example_methods_spec.rb +11 -0
  342. data/rspec-mocks/spec/rspec/mocks/expiration_spec.rb +90 -0
  343. data/rspec-mocks/spec/rspec/mocks/hash_excluding_matcher_spec.rb +65 -0
  344. data/rspec-mocks/spec/rspec/mocks/hash_including_matcher_spec.rb +92 -0
  345. data/rspec-mocks/spec/rspec/mocks/instance_method_stasher_spec.rb +72 -0
  346. data/rspec-mocks/spec/rspec/mocks/marshal_extension_spec.rb +67 -0
  347. data/rspec-mocks/spec/rspec/mocks/matchers/have_received_spec.rb +513 -0
  348. data/rspec-mocks/spec/rspec/mocks/matchers/receive_message_chain_spec.rb +227 -0
  349. data/rspec-mocks/spec/rspec/mocks/matchers/receive_messages_spec.rb +148 -0
  350. data/rspec-mocks/spec/rspec/mocks/matchers/receive_spec.rb +525 -0
  351. data/rspec-mocks/spec/rspec/mocks/methods_spec.rb +24 -0
  352. data/rspec-mocks/spec/rspec/mocks/mock_expectation_error_spec.rb +20 -0
  353. data/rspec-mocks/spec/rspec/mocks/mock_ordering_spec.rb +112 -0
  354. data/rspec-mocks/spec/rspec/mocks/multiple_return_value_spec.rb +130 -0
  355. data/rspec-mocks/spec/rspec/mocks/mutate_const_spec.rb +561 -0
  356. data/rspec-mocks/spec/rspec/mocks/nil_expectation_warning_spec.rb +52 -0
  357. data/rspec-mocks/spec/rspec/mocks/null_object_double_spec.rb +135 -0
  358. data/rspec-mocks/spec/rspec/mocks/once_counts_spec.rb +50 -0
  359. data/rspec-mocks/spec/rspec/mocks/order_group_spec.rb +26 -0
  360. data/rspec-mocks/spec/rspec/mocks/partial_double_spec.rb +379 -0
  361. data/rspec-mocks/spec/rspec/mocks/partial_double_using_mocks_directly_spec.rb +83 -0
  362. data/rspec-mocks/spec/rspec/mocks/precise_counts_spec.rb +66 -0
  363. data/rspec-mocks/spec/rspec/mocks/serialization_spec.rb +89 -0
  364. data/rspec-mocks/spec/rspec/mocks/should_syntax_spec.rb +539 -0
  365. data/rspec-mocks/spec/rspec/mocks/space_spec.rb +242 -0
  366. data/rspec-mocks/spec/rspec/mocks/spy_spec.rb +127 -0
  367. data/rspec-mocks/spec/rspec/mocks/stash_spec.rb +43 -0
  368. data/rspec-mocks/spec/rspec/mocks/stub_chain_spec.rb +166 -0
  369. data/rspec-mocks/spec/rspec/mocks/stub_implementation_spec.rb +98 -0
  370. data/rspec-mocks/spec/rspec/mocks/stub_spec.rb +520 -0
  371. data/rspec-mocks/spec/rspec/mocks/stubbed_message_expectations_spec.rb +56 -0
  372. data/rspec-mocks/spec/rspec/mocks/syntax_agnostic_message_matchers_spec.rb +99 -0
  373. data/rspec-mocks/spec/rspec/mocks/syntax_spec.rb +7 -0
  374. data/rspec-mocks/spec/rspec/mocks/test_double_spec.rb +53 -0
  375. data/rspec-mocks/spec/rspec/mocks/thrice_counts_spec.rb +72 -0
  376. data/rspec-mocks/spec/rspec/mocks/to_ary_spec.rb +52 -0
  377. data/rspec-mocks/spec/rspec/mocks/twice_counts_spec.rb +64 -0
  378. data/rspec-mocks/spec/rspec/mocks/verifying_doubles/class_double_with_class_loaded_spec.rb +118 -0
  379. data/rspec-mocks/spec/rspec/mocks/verifying_doubles/class_double_with_class_not_loaded_spec.rb +58 -0
  380. data/rspec-mocks/spec/rspec/mocks/verifying_doubles/construction_spec.rb +54 -0
  381. data/rspec-mocks/spec/rspec/mocks/verifying_doubles/expected_arg_verification_spec.rb +81 -0
  382. data/rspec-mocks/spec/rspec/mocks/verifying_doubles/instance_double_with_class_loaded_spec.rb +195 -0
  383. data/rspec-mocks/spec/rspec/mocks/verifying_doubles/instance_double_with_class_not_loaded_spec.rb +57 -0
  384. data/rspec-mocks/spec/rspec/mocks/verifying_doubles/method_visibility_spec.rb +129 -0
  385. data/rspec-mocks/spec/rspec/mocks/verifying_doubles/object_double_spec.rb +68 -0
  386. data/rspec-mocks/spec/rspec/mocks_spec.rb +199 -0
  387. data/rspec-mocks/spec/spec_helper.rb +131 -0
  388. data/rspec-mocks/spec/support/before_all_shared_example_group.rb +16 -0
  389. data/rspec-mocks/spec/support/doubled_classes.rb +74 -0
  390. data/rspec-mocks/spec/support/matchers.rb +15 -0
  391. data/rspec-support/benchmarks/caller.rb +81 -0
  392. data/{vendor_lib → rspec-support/lib}/rspec/support/caller_filter.rb +11 -4
  393. data/rspec-support/lib/rspec/support/differ.rb +214 -0
  394. data/rspec-support/lib/rspec/support/directory_maker.rb +61 -0
  395. data/rspec-support/lib/rspec/support/encoded_string.rb +69 -0
  396. data/rspec-support/lib/rspec/support/fuzzy_matcher.rb +48 -0
  397. data/rspec-support/lib/rspec/support/hunk_generator.rb +47 -0
  398. data/rspec-support/lib/rspec/support/matcher_definition.rb +31 -0
  399. data/rspec-support/lib/rspec/support/method_signature_verifier.rb +272 -0
  400. data/rspec-support/lib/rspec/support/os.rb +18 -0
  401. data/rspec-support/lib/rspec/support/recursive_const_methods.rb +76 -0
  402. data/rspec-support/lib/rspec/support/ruby_features.rb +45 -0
  403. data/rspec-support/lib/rspec/support/spec/deprecation_helpers.rb +60 -0
  404. data/rspec-support/lib/rspec/support/spec/formatting_support.rb +9 -0
  405. data/{vendor_lib → rspec-support/lib}/rspec/support/spec/in_sub_process.rb +5 -2
  406. data/rspec-support/lib/rspec/support/spec/prevent_load_time_warnings.rb +44 -0
  407. data/rspec-support/lib/rspec/support/spec/shell_out.rb +69 -0
  408. data/{vendor_lib → rspec-support/lib}/rspec/support/spec/stderr_splitter.rb +7 -5
  409. data/rspec-support/lib/rspec/support/spec/with_isolated_directory.rb +9 -0
  410. data/rspec-support/lib/rspec/support/spec/with_isolated_stderr.rb +13 -0
  411. data/rspec-support/lib/rspec/support/spec.rb +72 -0
  412. data/{vendor_lib → rspec-support/lib}/rspec/support/version.rb +1 -1
  413. data/rspec-support/lib/rspec/support/version_checker.rb +53 -0
  414. data/rspec-support/lib/rspec/support/warnings.rb +39 -0
  415. data/rspec-support/lib/rspec/support.rb +76 -0
  416. data/rspec-support/spec/rspec/support/caller_filter_spec.rb +66 -0
  417. data/rspec-support/spec/rspec/support/differ_spec.rb +322 -0
  418. data/rspec-support/spec/rspec/support/directory_maker_spec.rb +58 -0
  419. data/rspec-support/spec/rspec/support/encoded_string_spec.rb +86 -0
  420. data/rspec-support/spec/rspec/support/fuzzy_matcher_spec.rb +179 -0
  421. data/rspec-support/spec/rspec/support/method_signature_verifier_spec.rb +357 -0
  422. data/rspec-support/spec/rspec/support/os_spec.rb +36 -0
  423. data/rspec-support/spec/rspec/support/recursive_const_methods_spec.rb +49 -0
  424. data/rspec-support/spec/rspec/support/spec/in_sub_process_spec.rb +36 -0
  425. data/rspec-support/spec/rspec/support/spec/prevent_load_time_warnings_spec.rb +10 -0
  426. data/rspec-support/spec/rspec/support/spec/shell_out_spec.rb +44 -0
  427. data/rspec-support/spec/rspec/support/spec/stderr_splitter_spec.rb +60 -0
  428. data/rspec-support/spec/rspec/support/spec/with_isolated_std_err_spec.rb +21 -0
  429. data/rspec-support/spec/rspec/support/version_checker_spec.rb +29 -0
  430. data/rspec-support/spec/rspec/support/warnings_spec.rb +66 -0
  431. data/rspec-support/spec/rspec/support_spec.rb +119 -0
  432. data/rspec-support/spec/spec_helper.rb +2 -0
  433. data/spec/after_hooks_spec.rb +140 -0
  434. data/spec/around_hooks_spec.rb +223 -0
  435. data/spec/async_spec.rb +147 -1
  436. data/spec/before_hooks_spec.rb +183 -0
  437. data/spec/example_spec.rb +11 -0
  438. data/spec/matchers_spec.rb +4 -0
  439. data/spec/skip_pending_spec.rb +43 -0
  440. data/spec/subject_spec.rb +87 -0
  441. data/util/create_requires.rb +45 -0
  442. metadata +443 -147
  443. data/spec/named_subject_spec.rb +0 -11
  444. data/vendor_lib/rspec/core/backtrace_formatter.rb +0 -65
  445. data/vendor_lib/rspec/core/command_line.rb +0 -36
  446. data/vendor_lib/rspec/core/configuration_options.rb +0 -143
  447. data/vendor_lib/rspec/core/drb_command_line.rb +0 -26
  448. data/vendor_lib/rspec/core/drb_options.rb +0 -87
  449. data/vendor_lib/rspec/core/dsl.rb +0 -26
  450. data/vendor_lib/rspec/core/example.rb +0 -312
  451. data/vendor_lib/rspec/core/example_group.rb +0 -540
  452. data/vendor_lib/rspec/core/filter_manager.rb +0 -224
  453. data/vendor_lib/rspec/core/formatters/base_formatter.rb +0 -291
  454. data/vendor_lib/rspec/core/formatters/base_text_formatter.rb +0 -307
  455. data/vendor_lib/rspec/core/formatters/documentation_formatter.rb +0 -67
  456. data/vendor_lib/rspec/core/formatters/json_formatter.rb +0 -99
  457. data/vendor_lib/rspec/core/formatters/progress_formatter.rb +0 -32
  458. data/vendor_lib/rspec/core/formatters.rb +0 -54
  459. data/vendor_lib/rspec/core/hooks.rb +0 -535
  460. data/vendor_lib/rspec/core/metadata.rb +0 -313
  461. data/vendor_lib/rspec/core/mocking/with_absolutely_nothing.rb +0 -11
  462. data/vendor_lib/rspec/core/mocking/with_flexmock.rb +0 -27
  463. data/vendor_lib/rspec/core/mocking/with_rr.rb +0 -27
  464. data/vendor_lib/rspec/core/mocking/with_rspec.rb +0 -27
  465. data/vendor_lib/rspec/core/pending.rb +0 -110
  466. data/vendor_lib/rspec/core/project_initializer.rb +0 -88
  467. data/vendor_lib/rspec/core/rake_task.rb +0 -128
  468. data/vendor_lib/rspec/core/reporter.rb +0 -132
  469. data/vendor_lib/rspec/core/runner.rb +0 -97
  470. data/vendor_lib/rspec/core/shared_example_group/collection.rb +0 -27
  471. data/vendor_lib/rspec/core/shared_example_group.rb +0 -146
  472. data/vendor_lib/rspec/core/version.rb +0 -7
  473. data/vendor_lib/rspec/core/warnings.rb +0 -22
  474. data/vendor_lib/rspec/expectations/differ.rb +0 -154
  475. data/vendor_lib/rspec/expectations/errors.rb +0 -9
  476. data/vendor_lib/rspec/expectations/expectation_target.rb +0 -87
  477. data/vendor_lib/rspec/expectations/extensions/object.rb +0 -29
  478. data/vendor_lib/rspec/expectations/extensions.rb +0 -1
  479. data/vendor_lib/rspec/expectations/fail_with.rb +0 -79
  480. data/vendor_lib/rspec/expectations/handler.rb +0 -68
  481. data/vendor_lib/rspec/expectations/syntax.rb +0 -182
  482. data/vendor_lib/rspec/expectations.rb +0 -75
  483. data/vendor_lib/rspec/matchers/built_in/base_matcher.rb +0 -68
  484. data/vendor_lib/rspec/matchers/built_in/be.rb +0 -213
  485. data/vendor_lib/rspec/matchers/built_in/be_within.rb +0 -55
  486. data/vendor_lib/rspec/matchers/built_in/change.rb +0 -141
  487. data/vendor_lib/rspec/matchers/built_in/eq.rb +0 -22
  488. data/vendor_lib/rspec/matchers/built_in/equal.rb +0 -48
  489. data/vendor_lib/rspec/matchers/built_in/exist.rb +0 -26
  490. data/vendor_lib/rspec/matchers/built_in/has.rb +0 -48
  491. data/vendor_lib/rspec/matchers/built_in/include.rb +0 -61
  492. data/vendor_lib/rspec/matchers/built_in/match.rb +0 -17
  493. data/vendor_lib/rspec/matchers/built_in/match_array.rb +0 -51
  494. data/vendor_lib/rspec/matchers/built_in/start_and_end_with.rb +0 -48
  495. data/vendor_lib/rspec/matchers/built_in/yield.rb +0 -297
  496. data/vendor_lib/rspec/matchers/built_in.rb +0 -39
  497. data/vendor_lib/rspec/matchers/compatibility.rb +0 -14
  498. data/vendor_lib/rspec/matchers/dsl.rb +0 -23
  499. data/vendor_lib/rspec/matchers/method_missing.rb +0 -12
  500. data/vendor_lib/rspec/matchers/operator_matcher.rb +0 -99
  501. data/vendor_lib/rspec/matchers/pretty.rb +0 -70
  502. data/vendor_lib/rspec/matchers/test_unit_integration.rb +0 -11
  503. data/vendor_lib/rspec/mocks/argument_list_matcher.rb +0 -104
  504. data/vendor_lib/rspec/mocks/argument_matchers.rb +0 -264
  505. data/vendor_lib/rspec/mocks/arity_calculator.rb +0 -66
  506. data/vendor_lib/rspec/mocks/errors.rb +0 -12
  507. data/vendor_lib/rspec/mocks/example_methods.rb +0 -201
  508. data/vendor_lib/rspec/mocks/extensions/marshal.rb +0 -17
  509. data/vendor_lib/rspec/mocks/framework.rb +0 -36
  510. data/vendor_lib/rspec/mocks/method_reference.rb +0 -95
  511. data/vendor_lib/rspec/mocks/mock.rb +0 -7
  512. data/vendor_lib/rspec/mocks/proxy.rb +0 -269
  513. data/vendor_lib/rspec/mocks/proxy_for_nil.rb +0 -37
  514. data/vendor_lib/rspec/mocks/space.rb +0 -95
  515. data/vendor_lib/rspec/mocks/standalone.rb +0 -3
  516. data/vendor_lib/rspec/mocks/stub_chain.rb +0 -51
  517. data/vendor_lib/rspec/mocks/syntax.rb +0 -374
  518. data/vendor_lib/rspec/mocks/test_double.rb +0 -109
  519. data/vendor_lib/rspec/mocks/version.rb +0 -7
  520. data/vendor_lib/rspec/mocks.rb +0 -100
  521. data/vendor_lib/rspec/support/spec/deprecation_helpers.rb +0 -29
  522. data/vendor_lib/rspec/support/spec.rb +0 -14
  523. data/vendor_lib/rspec/support/warnings.rb +0 -41
  524. data/vendor_lib/rspec/support.rb +0 -6
  525. data/vendor_lib/rspec-expectations.rb +0 -1
@@ -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