newbamboo-rspec 1.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. data/.autotest +4 -0
  2. data/History.txt +1263 -0
  3. data/License.txt +22 -0
  4. data/Manifest.txt +327 -0
  5. data/README.txt +57 -0
  6. data/Rakefile +104 -0
  7. data/TODO.txt +18 -0
  8. data/bin/autospec +4 -0
  9. data/bin/spec +4 -0
  10. data/examples/failing/README.txt +7 -0
  11. data/examples/failing/diffing_spec.rb +36 -0
  12. data/examples/failing/failing_autogenerated_docstrings_example.rb +19 -0
  13. data/examples/failing/failure_in_after.rb +10 -0
  14. data/examples/failing/failure_in_before.rb +10 -0
  15. data/examples/failing/mocking_example.rb +40 -0
  16. data/examples/failing/mocking_with_flexmock.rb +26 -0
  17. data/examples/failing/mocking_with_mocha.rb +25 -0
  18. data/examples/failing/mocking_with_rr.rb +27 -0
  19. data/examples/failing/partial_mock_example.rb +20 -0
  20. data/examples/failing/predicate_example.rb +34 -0
  21. data/examples/failing/raising_example.rb +47 -0
  22. data/examples/failing/spec_helper.rb +3 -0
  23. data/examples/failing/syntax_error_example.rb +7 -0
  24. data/examples/failing/team_spec.rb +44 -0
  25. data/examples/failing/timeout_behaviour.rb +7 -0
  26. data/examples/passing/autogenerated_docstrings_example.rb +25 -0
  27. data/examples/passing/before_and_after_example.rb +40 -0
  28. data/examples/passing/behave_as_example.rb +45 -0
  29. data/examples/passing/custom_expectation_matchers.rb +54 -0
  30. data/examples/passing/custom_formatter.rb +12 -0
  31. data/examples/passing/dynamic_spec.rb +9 -0
  32. data/examples/passing/file_accessor.rb +19 -0
  33. data/examples/passing/file_accessor_spec.rb +38 -0
  34. data/examples/passing/greeter_spec.rb +31 -0
  35. data/examples/passing/helper_method_example.rb +14 -0
  36. data/examples/passing/io_processor.rb +8 -0
  37. data/examples/passing/io_processor_spec.rb +21 -0
  38. data/examples/passing/legacy_spec.rb +11 -0
  39. data/examples/passing/mocking_example.rb +27 -0
  40. data/examples/passing/multi_threaded_example_group_runner.rb +26 -0
  41. data/examples/passing/nested_classes_example.rb +36 -0
  42. data/examples/passing/partial_mock_example.rb +29 -0
  43. data/examples/passing/pending_example.rb +20 -0
  44. data/examples/passing/predicate_example.rb +27 -0
  45. data/examples/passing/priority.txt +1 -0
  46. data/examples/passing/shared_example_group_example.rb +81 -0
  47. data/examples/passing/shared_stack_examples.rb +36 -0
  48. data/examples/passing/simple_matcher_example.rb +31 -0
  49. data/examples/passing/spec_helper.rb +3 -0
  50. data/examples/passing/stack.rb +36 -0
  51. data/examples/passing/stack_spec.rb +64 -0
  52. data/examples/passing/stack_spec_with_nested_example_groups.rb +67 -0
  53. data/examples/passing/stubbing_example.rb +69 -0
  54. data/examples/passing/yielding_example.rb +33 -0
  55. data/examples/ruby1.9.compatibility/access_to_constants_spec.rb +86 -0
  56. data/features/before_and_after_blocks/before_and_after_blocks.feature +168 -0
  57. data/features/example_groups/autogenerated_docstrings.feature +45 -0
  58. data/features/example_groups/example_group_with_should_methods.feature +17 -0
  59. data/features/example_groups/nested_groups.feature +17 -0
  60. data/features/example_groups/output.feature +20 -0
  61. data/features/interop/examples_and_tests_together.feature +31 -0
  62. data/features/interop/test_but_not_test_unit.feature +14 -0
  63. data/features/interop/test_case_with_should_methods.feature +17 -0
  64. data/features/mock_framework_integration/use_flexmock.feature +27 -0
  65. data/features/step_definitions/running_rspec.rb +54 -0
  66. data/features/support/env.rb +26 -0
  67. data/features/support/helpers/cmdline.rb +9 -0
  68. data/features/support/matchers/smart_match.rb +37 -0
  69. data/init.rb +9 -0
  70. data/lib/adapters/mock_frameworks/flexmock.rb +24 -0
  71. data/lib/adapters/mock_frameworks/mocha.rb +20 -0
  72. data/lib/adapters/mock_frameworks/rr.rb +22 -0
  73. data/lib/adapters/mock_frameworks/rspec.rb +20 -0
  74. data/lib/autotest/discover.rb +3 -0
  75. data/lib/autotest/rspec.rb +47 -0
  76. data/lib/spec/dsl/main.rb +87 -0
  77. data/lib/spec/dsl.rb +1 -0
  78. data/lib/spec/example/before_and_after_hooks.rb +99 -0
  79. data/lib/spec/example/errors.rb +30 -0
  80. data/lib/spec/example/example_group.rb +26 -0
  81. data/lib/spec/example/example_group_factory.rb +98 -0
  82. data/lib/spec/example/example_group_methods.rb +376 -0
  83. data/lib/spec/example/example_matcher.rb +44 -0
  84. data/lib/spec/example/example_methods.rb +137 -0
  85. data/lib/spec/example/module_reopening_fix.rb +21 -0
  86. data/lib/spec/example/pending.rb +18 -0
  87. data/lib/spec/example/shared_example_group.rb +59 -0
  88. data/lib/spec/example.rb +187 -0
  89. data/lib/spec/expectations/differs/default.rb +66 -0
  90. data/lib/spec/expectations/errors.rb +12 -0
  91. data/lib/spec/expectations/extensions/object.rb +63 -0
  92. data/lib/spec/expectations/extensions/string_and_symbol.rb +17 -0
  93. data/lib/spec/expectations/extensions.rb +2 -0
  94. data/lib/spec/expectations/handler.rb +32 -0
  95. data/lib/spec/expectations.rb +60 -0
  96. data/lib/spec/interop/test/unit/autorunner.rb +6 -0
  97. data/lib/spec/interop/test/unit/testcase.rb +73 -0
  98. data/lib/spec/interop/test/unit/testresult.rb +6 -0
  99. data/lib/spec/interop/test/unit/testsuite_adapter.rb +34 -0
  100. data/lib/spec/interop/test/unit/ui/console/testrunner.rb +61 -0
  101. data/lib/spec/interop/test.rb +12 -0
  102. data/lib/spec/matchers/be.rb +208 -0
  103. data/lib/spec/matchers/be_close.rb +21 -0
  104. data/lib/spec/matchers/change.rb +148 -0
  105. data/lib/spec/matchers/eql.rb +25 -0
  106. data/lib/spec/matchers/equal.rb +25 -0
  107. data/lib/spec/matchers/errors.rb +5 -0
  108. data/lib/spec/matchers/exist.rb +16 -0
  109. data/lib/spec/matchers/generated_descriptions.rb +48 -0
  110. data/lib/spec/matchers/has.rb +15 -0
  111. data/lib/spec/matchers/have.rb +150 -0
  112. data/lib/spec/matchers/include.rb +80 -0
  113. data/lib/spec/matchers/match.rb +22 -0
  114. data/lib/spec/matchers/match_array.rb +79 -0
  115. data/lib/spec/matchers/method_missing.rb +9 -0
  116. data/lib/spec/matchers/operator_matcher.rb +70 -0
  117. data/lib/spec/matchers/raise_error.rb +128 -0
  118. data/lib/spec/matchers/respond_to.rb +71 -0
  119. data/lib/spec/matchers/satisfy.rb +47 -0
  120. data/lib/spec/matchers/simple_matcher.rb +132 -0
  121. data/lib/spec/matchers/throw_symbol.rb +106 -0
  122. data/lib/spec/matchers/wrap_expectation.rb +55 -0
  123. data/lib/spec/matchers.rb +141 -0
  124. data/lib/spec/mocks/argument_expectation.rb +49 -0
  125. data/lib/spec/mocks/argument_matchers.rb +237 -0
  126. data/lib/spec/mocks/error_generator.rb +82 -0
  127. data/lib/spec/mocks/errors.rb +10 -0
  128. data/lib/spec/mocks/extensions/object.rb +3 -0
  129. data/lib/spec/mocks/extensions.rb +1 -0
  130. data/lib/spec/mocks/framework.rb +15 -0
  131. data/lib/spec/mocks/message_expectation.rb +331 -0
  132. data/lib/spec/mocks/methods.rb +51 -0
  133. data/lib/spec/mocks/mock.rb +55 -0
  134. data/lib/spec/mocks/order_group.rb +29 -0
  135. data/lib/spec/mocks/proxy.rb +230 -0
  136. data/lib/spec/mocks/space.rb +28 -0
  137. data/lib/spec/mocks/spec_methods.rb +55 -0
  138. data/lib/spec/mocks.rb +200 -0
  139. data/lib/spec/rake/spectask.rb +225 -0
  140. data/lib/spec/rake/verify_rcov.rb +52 -0
  141. data/lib/spec/ruby.rb +9 -0
  142. data/lib/spec/runner/backtrace_tweaker.rb +58 -0
  143. data/lib/spec/runner/class_and_arguments_parser.rb +14 -0
  144. data/lib/spec/runner/command_line.rb +35 -0
  145. data/lib/spec/runner/configuration.rb +166 -0
  146. data/lib/spec/runner/drb_command_line.rb +20 -0
  147. data/lib/spec/runner/example_group_runner.rb +70 -0
  148. data/lib/spec/runner/formatter/base_formatter.rb +79 -0
  149. data/lib/spec/runner/formatter/base_text_formatter.rb +127 -0
  150. data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +27 -0
  151. data/lib/spec/runner/formatter/failing_examples_formatter.rb +20 -0
  152. data/lib/spec/runner/formatter/html_formatter.rb +340 -0
  153. data/lib/spec/runner/formatter/nested_text_formatter.rb +65 -0
  154. data/lib/spec/runner/formatter/profile_formatter.rb +51 -0
  155. data/lib/spec/runner/formatter/progress_bar_formatter.rb +34 -0
  156. data/lib/spec/runner/formatter/snippet_extractor.rb +52 -0
  157. data/lib/spec/runner/formatter/specdoc_formatter.rb +39 -0
  158. data/lib/spec/runner/formatter/text_mate_formatter.rb +16 -0
  159. data/lib/spec/runner/heckle_runner.rb +74 -0
  160. data/lib/spec/runner/heckle_runner_unsupported.rb +10 -0
  161. data/lib/spec/runner/option_parser.rb +204 -0
  162. data/lib/spec/runner/options.rb +320 -0
  163. data/lib/spec/runner/reporter.rb +167 -0
  164. data/lib/spec/runner/spec_parser.rb +73 -0
  165. data/lib/spec/runner.rb +88 -0
  166. data/lib/spec/version.rb +15 -0
  167. data/lib/spec.rb +7 -0
  168. data/resources/rake/examples.rake +7 -0
  169. data/resources/rake/examples_with_rcov.rake +9 -0
  170. data/resources/rake/failing_examples_with_html.rake +9 -0
  171. data/resources/rake/verify_rcov.rake +7 -0
  172. data/resources/spec/example_group_with_should_methods.rb +12 -0
  173. data/resources/spec/simple_spec.rb +8 -0
  174. data/resources/test/spec_and_test_together.rb +57 -0
  175. data/resources/test/spec_including_test_but_not_unit.rb +11 -0
  176. data/resources/test/test_case_with_should_methods.rb +30 -0
  177. data/rspec.gemspec +32 -0
  178. data/spec/README.jruby +15 -0
  179. data/spec/autotest/autotest_helper.rb +6 -0
  180. data/spec/autotest/autotest_matchers.rb +47 -0
  181. data/spec/autotest/discover_spec.rb +8 -0
  182. data/spec/autotest/failed_results_re_spec.rb +24 -0
  183. data/spec/autotest/rspec_spec.rb +114 -0
  184. data/spec/rspec_suite.rb +6 -0
  185. data/spec/ruby_forker.rb +13 -0
  186. data/spec/spec/dsl/main_spec.rb +88 -0
  187. data/spec/spec/example/example_group_class_definition_spec.rb +49 -0
  188. data/spec/spec/example/example_group_factory_spec.rb +224 -0
  189. data/spec/spec/example/example_group_methods_spec.rb +653 -0
  190. data/spec/spec/example/example_group_spec.rb +661 -0
  191. data/spec/spec/example/example_matcher_spec.rb +79 -0
  192. data/spec/spec/example/example_methods_spec.rb +204 -0
  193. data/spec/spec/example/helper_method_spec.rb +24 -0
  194. data/spec/spec/example/nested_example_group_spec.rb +71 -0
  195. data/spec/spec/example/pending_module_spec.rb +139 -0
  196. data/spec/spec/example/predicate_matcher_spec.rb +21 -0
  197. data/spec/spec/example/shared_example_group_spec.rb +257 -0
  198. data/spec/spec/example/subclassing_example_group_spec.rb +25 -0
  199. data/spec/spec/expectations/differs/default_spec.rb +127 -0
  200. data/spec/spec/expectations/extensions/object_spec.rb +45 -0
  201. data/spec/spec/expectations/fail_with_spec.rb +71 -0
  202. data/spec/spec/expectations/wrap_expectation_spec.rb +30 -0
  203. data/spec/spec/interop/test/unit/resources/spec_that_fails.rb +10 -0
  204. data/spec/spec/interop/test/unit/resources/spec_that_passes.rb +10 -0
  205. data/spec/spec/interop/test/unit/resources/spec_with_errors.rb +10 -0
  206. data/spec/spec/interop/test/unit/resources/spec_with_options_hash.rb +13 -0
  207. data/spec/spec/interop/test/unit/resources/test_case_that_fails.rb +10 -0
  208. data/spec/spec/interop/test/unit/resources/test_case_that_passes.rb +10 -0
  209. data/spec/spec/interop/test/unit/resources/test_case_with_errors.rb +10 -0
  210. data/spec/spec/interop/test/unit/resources/testsuite_adapter_spec_with_test_unit.rb +38 -0
  211. data/spec/spec/interop/test/unit/spec_spec.rb +48 -0
  212. data/spec/spec/interop/test/unit/test_unit_spec_helper.rb +18 -0
  213. data/spec/spec/interop/test/unit/testcase_spec.rb +49 -0
  214. data/spec/spec/interop/test/unit/testsuite_adapter_spec.rb +9 -0
  215. data/spec/spec/matchers/be_close_spec.rb +41 -0
  216. data/spec/spec/matchers/be_spec.rb +303 -0
  217. data/spec/spec/matchers/change_spec.rb +329 -0
  218. data/spec/spec/matchers/description_generation_spec.rb +172 -0
  219. data/spec/spec/matchers/eql_spec.rb +29 -0
  220. data/spec/spec/matchers/equal_spec.rb +29 -0
  221. data/spec/spec/matchers/exist_spec.rb +57 -0
  222. data/spec/spec/matchers/handler_spec.rb +111 -0
  223. data/spec/spec/matchers/has_spec.rb +63 -0
  224. data/spec/spec/matchers/have_spec.rb +399 -0
  225. data/spec/spec/matchers/include_spec.rb +88 -0
  226. data/spec/spec/matchers/match_array_spec.rb +83 -0
  227. data/spec/spec/matchers/match_spec.rb +37 -0
  228. data/spec/spec/matchers/matcher_methods_spec.rb +66 -0
  229. data/spec/spec/matchers/operator_matcher_spec.rb +191 -0
  230. data/spec/spec/matchers/raise_error_spec.rb +333 -0
  231. data/spec/spec/matchers/respond_to_spec.rb +116 -0
  232. data/spec/spec/matchers/satisfy_spec.rb +36 -0
  233. data/spec/spec/matchers/simple_matcher_spec.rb +93 -0
  234. data/spec/spec/matchers/throw_symbol_spec.rb +96 -0
  235. data/spec/spec/mocks/any_number_of_times_spec.rb +36 -0
  236. data/spec/spec/mocks/argument_expectation_spec.rb +23 -0
  237. data/spec/spec/mocks/at_least_spec.rb +97 -0
  238. data/spec/spec/mocks/at_most_spec.rb +93 -0
  239. data/spec/spec/mocks/bug_report_10260_spec.rb +8 -0
  240. data/spec/spec/mocks/bug_report_10263_spec.rb +24 -0
  241. data/spec/spec/mocks/bug_report_11545_spec.rb +32 -0
  242. data/spec/spec/mocks/bug_report_15719_spec.rb +30 -0
  243. data/spec/spec/mocks/bug_report_496.rb +19 -0
  244. data/spec/spec/mocks/bug_report_600_spec.rb +22 -0
  245. data/spec/spec/mocks/bug_report_7611_spec.rb +19 -0
  246. data/spec/spec/mocks/bug_report_7805_spec.rb +22 -0
  247. data/spec/spec/mocks/bug_report_8165_spec.rb +31 -0
  248. data/spec/spec/mocks/bug_report_8302_spec.rb +26 -0
  249. data/spec/spec/mocks/failing_argument_matchers_spec.rb +95 -0
  250. data/spec/spec/mocks/hash_including_matcher_spec.rb +90 -0
  251. data/spec/spec/mocks/hash_not_including_matcher_spec.rb +67 -0
  252. data/spec/spec/mocks/mock_ordering_spec.rb +84 -0
  253. data/spec/spec/mocks/mock_space_spec.rb +54 -0
  254. data/spec/spec/mocks/mock_spec.rb +579 -0
  255. data/spec/spec/mocks/multiple_return_value_spec.rb +113 -0
  256. data/spec/spec/mocks/nil_expectation_warning_spec.rb +53 -0
  257. data/spec/spec/mocks/null_object_mock_spec.rb +54 -0
  258. data/spec/spec/mocks/once_counts_spec.rb +53 -0
  259. data/spec/spec/mocks/options_hash_spec.rb +35 -0
  260. data/spec/spec/mocks/partial_mock_spec.rb +149 -0
  261. data/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +66 -0
  262. data/spec/spec/mocks/passing_argument_matchers_spec.rb +145 -0
  263. data/spec/spec/mocks/precise_counts_spec.rb +52 -0
  264. data/spec/spec/mocks/record_messages_spec.rb +26 -0
  265. data/spec/spec/mocks/stub_spec.rb +194 -0
  266. data/spec/spec/mocks/stubbed_message_expectations_spec.rb +14 -0
  267. data/spec/spec/mocks/twice_counts_spec.rb +67 -0
  268. data/spec/spec/package/bin_spec_spec.rb +22 -0
  269. data/spec/spec/runner/class_and_argument_parser_spec.rb +23 -0
  270. data/spec/spec/runner/command_line_spec.rb +141 -0
  271. data/spec/spec/runner/configuration_spec.rb +301 -0
  272. data/spec/spec/runner/drb_command_line_spec.rb +97 -0
  273. data/spec/spec/runner/empty_file.txt +0 -0
  274. data/spec/spec/runner/example_group_runner_spec.rb +33 -0
  275. data/spec/spec/runner/examples.txt +2 -0
  276. data/spec/spec/runner/failed.txt +3 -0
  277. data/spec/spec/runner/formatter/base_formatter_spec.rb +23 -0
  278. data/spec/spec/runner/formatter/base_text_formatter_spec.rb +23 -0
  279. data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +45 -0
  280. data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +33 -0
  281. data/spec/spec/runner/formatter/html_formatted-1.8.4.html +365 -0
  282. data/spec/spec/runner/formatter/html_formatted-1.8.5-jruby.html +387 -0
  283. data/spec/spec/runner/formatter/html_formatted-1.8.5.html +371 -0
  284. data/spec/spec/runner/formatter/html_formatted-1.8.6-jruby.html +381 -0
  285. data/spec/spec/runner/formatter/html_formatted-1.8.6.html +379 -0
  286. data/spec/spec/runner/formatter/html_formatted-1.8.7.html +379 -0
  287. data/spec/spec/runner/formatter/html_formatted-1.9.1.html +379 -0
  288. data/spec/spec/runner/formatter/html_formatter_spec.rb +62 -0
  289. data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +318 -0
  290. data/spec/spec/runner/formatter/profile_formatter_spec.rb +65 -0
  291. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +145 -0
  292. data/spec/spec/runner/formatter/snippet_extractor_spec.rb +18 -0
  293. data/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +104 -0
  294. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +159 -0
  295. data/spec/spec/runner/formatter/text_mate_formatted-1.8.4.html +365 -0
  296. data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +373 -0
  297. data/spec/spec/runner/formatter/text_mate_formatted-1.8.7.html +373 -0
  298. data/spec/spec/runner/formatter/text_mate_formatted-1.9.1.html +373 -0
  299. data/spec/spec/runner/heckle_runner_spec.rb +78 -0
  300. data/spec/spec/runner/heckler_spec.rb +20 -0
  301. data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +45 -0
  302. data/spec/spec/runner/option_parser_spec.rb +396 -0
  303. data/spec/spec/runner/options_spec.rb +469 -0
  304. data/spec/spec/runner/output_one_time_fixture.rb +7 -0
  305. data/spec/spec/runner/output_one_time_fixture_runner.rb +8 -0
  306. data/spec/spec/runner/output_one_time_spec.rb +16 -0
  307. data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +62 -0
  308. data/spec/spec/runner/reporter_spec.rb +238 -0
  309. data/spec/spec/runner/resources/a_bar.rb +0 -0
  310. data/spec/spec/runner/resources/a_foo.rb +0 -0
  311. data/spec/spec/runner/resources/a_spec.rb +1 -0
  312. data/spec/spec/runner/resources/custom_example_group_runner.rb +14 -0
  313. data/spec/spec/runner/resources/utf8_encoded.rb +7 -0
  314. data/spec/spec/runner/spec.opts +2 -0
  315. data/spec/spec/runner/spec_drb.opts +1 -0
  316. data/spec/spec/runner/spec_parser/spec_parser_fixture.rb +70 -0
  317. data/spec/spec/runner/spec_parser_spec.rb +91 -0
  318. data/spec/spec/runner/spec_spaced.opts +2 -0
  319. data/spec/spec/runner_spec.rb +11 -0
  320. data/spec/spec/spec_classes.rb +133 -0
  321. data/spec/spec/spec_spec.rb +21 -0
  322. data/spec/spec.opts +6 -0
  323. data/spec/spec_helper.rb +107 -0
  324. metadata +388 -0
@@ -0,0 +1,376 @@
1
+ module Spec
2
+ module Example
3
+
4
+ module ExampleGroupMethods
5
+ class << self
6
+ attr_accessor :matcher_class
7
+
8
+ def description_text(*args)
9
+ text = args.inject("") do |description, arg|
10
+ description << " " unless (description == "" || arg.to_s =~ /^(\s|\.|#)/)
11
+ description << arg.to_s
12
+ end
13
+ text == "" ? nil : text
14
+ end
15
+
16
+ def example_group_creation_listeners
17
+ @example_group_creation_listeners ||= []
18
+ end
19
+ end
20
+
21
+ include Spec::Example::BeforeAndAfterHooks
22
+ include Spec::Example::Subject::ExampleGroupMethods
23
+
24
+ attr_reader :description_options, :spec_path
25
+ alias :options :description_options
26
+
27
+ def inherited(klass)
28
+ super
29
+ register_example_group(klass)
30
+ end
31
+
32
+ def register_example_group(klass)
33
+ ExampleGroupMethods.example_group_creation_listeners.each do |listener|
34
+ listener.register_example_group(klass)
35
+ end
36
+ end
37
+
38
+ # Provides the backtrace up to where this example_group was declared.
39
+ def backtrace
40
+ @backtrace
41
+ end
42
+
43
+ # Deprecated - use +backtrace()+
44
+ def example_group_backtrace
45
+ Kernel.warn <<-WARNING
46
+ ExampleGroupMethods#example_group_backtrace is deprecated and will be removed
47
+ from a future version. Please use ExampleGroupMethods#backtrace instead.
48
+ WARNING
49
+ backtrace
50
+ end
51
+
52
+ def description_args
53
+ @description_args ||= []
54
+ end
55
+
56
+ # Makes the describe/it syntax available from a class. For example:
57
+ #
58
+ # class StackSpec < Spec::ExampleGroup
59
+ # describe Stack, "with no elements"
60
+ #
61
+ # before
62
+ # @stack = Stack.new
63
+ # end
64
+ #
65
+ # it "should raise on pop" do
66
+ # lambda{ @stack.pop }.should raise_error
67
+ # end
68
+ # end
69
+ #
70
+ def describe(*args, &example_group_block)
71
+ if example_group_block
72
+ Spec::Example::add_spec_path_to(args)
73
+ options = args.last
74
+ if options[:shared]
75
+ create_shared_example_group(*args, &example_group_block)
76
+ else
77
+ create_example_group_subclass(*args, &example_group_block)
78
+ end
79
+ else
80
+ set_description(*args)
81
+ end
82
+ end
83
+ alias :context :describe
84
+
85
+ def create_shared_example_group(*args, &example_group_block) # :nodoc:
86
+ SharedExampleGroup.register(*args, &example_group_block)
87
+ end
88
+
89
+ # Creates a new subclass of self, with a name "under" our own name.
90
+ # Example:
91
+ #
92
+ # x = Foo::Bar.subclass('Zap'){}
93
+ # x.name # => Foo::Bar::Zap_1
94
+ # x.superclass.name # => Foo::Bar
95
+ def create_example_group_subclass(*args, &example_group_block) # :nodoc:
96
+ @class_count ||= 0
97
+ @class_count += 1
98
+ klass = const_set("Subclass_#{@class_count}", Class.new(self))
99
+ klass.set_description(*args)
100
+ example_group_block = ExampleGroupFactory.include_constants_in(args.last[:scope], &example_group_block)
101
+ klass.module_eval(&example_group_block)
102
+ klass
103
+ end
104
+
105
+ # Use this to pull in examples from shared example groups.
106
+ def it_should_behave_like(*shared_example_groups)
107
+ shared_example_groups.each do |group|
108
+ include_shared_example_group(group)
109
+ end
110
+ end
111
+
112
+ # :call-seq:
113
+ # predicate_matchers[matcher_name] = method_on_object
114
+ # predicate_matchers[matcher_name] = [method1_on_object, method2_on_object]
115
+ #
116
+ # Dynamically generates a custom matcher that will match
117
+ # a predicate on your class. RSpec provides a couple of these
118
+ # out of the box:
119
+ #
120
+ # exist (for state expectations)
121
+ # File.should exist("path/to/file")
122
+ #
123
+ # an_instance_of (for mock argument matchers)
124
+ # mock.should_receive(:message).with(an_instance_of(String))
125
+ #
126
+ # == Examples
127
+ #
128
+ # class Fish
129
+ # def can_swim?
130
+ # true
131
+ # end
132
+ # end
133
+ #
134
+ # describe Fish do
135
+ # predicate_matchers[:swim] = :can_swim?
136
+ # it "should swim" do
137
+ # Fish.new.should swim
138
+ # end
139
+ # end
140
+ def predicate_matchers
141
+ @predicate_matchers ||= {}
142
+ end
143
+
144
+ # Creates an instance of the current example group class and adds it to
145
+ # a collection of examples of the current example group.
146
+ def example(description=nil, options={}, &implementation)
147
+ e = new(description, options, &implementation)
148
+ example_objects << e
149
+ e
150
+ end
151
+
152
+ alias_method :it, :example
153
+ alias_method :specify, :example
154
+
155
+ # Use this to temporarily disable an example.
156
+ def xexample(description=nil, opts={}, &block)
157
+ Kernel.warn("Example disabled: #{description}")
158
+ end
159
+
160
+ alias_method :xit, :xexample
161
+ alias_method :xspecify, :xexample
162
+
163
+ def run(run_options)
164
+ examples = examples_to_run(run_options)
165
+ run_options.reporter.add_example_group(self) unless examples.empty?
166
+ return true if examples.empty?
167
+ return dry_run(examples, run_options) if run_options.dry_run?
168
+
169
+ plugin_mock_framework(run_options)
170
+ define_methods_from_predicate_matchers(run_options)
171
+
172
+ success, before_all_instance_variables = run_before_all(run_options)
173
+ success, after_all_instance_variables = execute_examples(success, before_all_instance_variables, examples, run_options)
174
+ success = run_after_all(success, after_all_instance_variables, run_options)
175
+ end
176
+
177
+ def description
178
+ @description ||= ExampleGroupMethods.description_text(*description_parts) || to_s
179
+ end
180
+
181
+ def described_type
182
+ @described_type ||= description_parts.reverse.find {|part| part.is_a?(Module)}
183
+ end
184
+
185
+ def described_class
186
+ Class === described_type ? described_type : nil
187
+ end
188
+
189
+ def description_parts #:nodoc:
190
+ @description_parts ||= example_group_hierarchy.inject([]) do |parts, example_group_class|
191
+ [parts << example_group_class.description_args].flatten
192
+ end
193
+ end
194
+
195
+ def set_description(*args)
196
+ args, options = Spec::Example.args_and_options(*args)
197
+ @description_args = args
198
+ @description_options = options
199
+ @description_text = ExampleGroupMethods.description_text(*args)
200
+ @backtrace = caller(1)
201
+ @spec_path = File.expand_path(options[:spec_path]) if options[:spec_path]
202
+ self
203
+ end
204
+
205
+ def examples(run_options=nil) #:nodoc:
206
+ examples = example_objects.dup
207
+ add_method_examples(examples)
208
+ (run_options && run_options.reverse) ? examples.reverse : examples
209
+ end
210
+
211
+ def number_of_examples #:nodoc:
212
+ examples.length
213
+ end
214
+
215
+ def run_before_each(example)
216
+ example.eval_each_fail_fast(all_before_each_parts)
217
+ end
218
+
219
+ def all_before_each_parts
220
+ unless @all_before_each_parts
221
+ @all_before_each_parts = []
222
+ example_group_hierarchy.each do |example_group_class|
223
+ @all_before_each_parts += example_group_class.before_each_parts
224
+ end
225
+ end
226
+ @all_before_each_parts
227
+ end
228
+
229
+ def run_after_each(example)
230
+ example_group_hierarchy.reverse.each do |example_group_class|
231
+ example.eval_each_fail_slow(example_group_class.after_each_parts)
232
+ end
233
+ end
234
+
235
+ private
236
+ def dry_run(examples, run_options)
237
+ examples.each do |example|
238
+ run_options.reporter.example_started(example)
239
+ run_options.reporter.example_finished(example)
240
+ end
241
+ end
242
+
243
+ def run_before_all(run_options)
244
+ before_all = new("before(:all)")
245
+ begin
246
+ example_group_hierarchy.each do |example_group_class|
247
+ before_all.eval_each_fail_fast(example_group_class.before_all_parts)
248
+ end
249
+ return [true, before_all.instance_variable_hash]
250
+ rescue Exception => e
251
+ run_options.reporter.failure(before_all, e)
252
+ return [false, before_all.instance_variable_hash]
253
+ end
254
+ end
255
+
256
+ def execute_examples(success, instance_variables, examples, run_options)
257
+ return [success, instance_variables] unless success
258
+
259
+ after_all_instance_variables = instance_variables
260
+ examples.each do |example_group_instance|
261
+ success &= example_group_instance.execute(run_options, instance_variables)
262
+ after_all_instance_variables = example_group_instance.instance_variable_hash
263
+ end
264
+ return [success, after_all_instance_variables]
265
+ end
266
+
267
+ def run_after_all(success, instance_variables, run_options)
268
+ after_all = new("after(:all)")
269
+ after_all.set_instance_variables_from_hash(instance_variables)
270
+ example_group_hierarchy.reverse.each do |example_group_class|
271
+ after_all.eval_each_fail_slow(example_group_class.after_all_parts)
272
+ end
273
+ return success
274
+ rescue Exception => e
275
+ run_options.reporter.failure(after_all, e)
276
+ return false
277
+ end
278
+
279
+ def examples_to_run(run_options)
280
+ all_examples = examples(run_options)
281
+ return all_examples unless specified_examples?(run_options)
282
+ all_examples.reject do |example|
283
+ matcher = ExampleGroupMethods.matcher_class.
284
+ new(description.to_s, example.description)
285
+ !matcher.matches?(run_options.examples)
286
+ end
287
+ end
288
+
289
+ def specified_examples?(run_options)
290
+ run_options.examples && !run_options.examples.empty?
291
+ end
292
+
293
+ def example_objects
294
+ @example_objects ||= []
295
+ end
296
+
297
+ class ExampleGroupHierarchy < Array
298
+ def initialize(example_group_class)
299
+ current_class = example_group_class
300
+ while current_class.kind_of?(ExampleGroupMethods)
301
+ unshift(current_class)
302
+ break unless current_class.respond_to? :superclass
303
+ current_class = current_class.superclass
304
+ end
305
+ end
306
+ end
307
+
308
+ def example_group_hierarchy
309
+ @example_group_hierarchy ||= ExampleGroupHierarchy.new(self)
310
+ end
311
+
312
+ def plugin_mock_framework(run_options)
313
+ case mock_framework = run_options.mock_framework
314
+ when Module
315
+ include mock_framework
316
+ else
317
+ require mock_framework
318
+ include Spec::Adapters::MockFramework
319
+ end
320
+ end
321
+
322
+ def define_methods_from_predicate_matchers(run_options) # :nodoc:
323
+ all_predicate_matchers = predicate_matchers.merge(
324
+ run_options.predicate_matchers
325
+ )
326
+ all_predicate_matchers.each_pair do |matcher_method, method_on_object|
327
+ define_method matcher_method do |*args|
328
+ eval("be_#{method_on_object.to_s.gsub('?','')}(*args)")
329
+ end
330
+ end
331
+ end
332
+
333
+ def add_method_examples(examples)
334
+ example_methods.each do |method_name|
335
+ examples << new(method_name) do
336
+ __send__(method_name)
337
+ end
338
+ end
339
+ end
340
+
341
+ def method_added(name)
342
+ example_methods << name.to_s if example_method?(name.to_s)
343
+ end
344
+
345
+ def example_methods
346
+ @example_methods ||= []
347
+ end
348
+
349
+ def example_method?(method_name)
350
+ should_method?(method_name)
351
+ end
352
+
353
+ def should_method?(method_name)
354
+ !(method_name =~ /^should(_not)?$/) &&
355
+ method_name =~ /^should/ && (
356
+ [-1,0].include?(instance_method(method_name).arity)
357
+ )
358
+ end
359
+
360
+ def include_shared_example_group(shared_example_group)
361
+ case shared_example_group
362
+ when SharedExampleGroup
363
+ include shared_example_group
364
+ else
365
+ example_group = SharedExampleGroup.find(shared_example_group)
366
+ unless example_group
367
+ raise RuntimeError.new("Shared Example Group '#{shared_example_group}' can not be found")
368
+ end
369
+ include(example_group)
370
+ end
371
+ end
372
+
373
+ end
374
+
375
+ end
376
+ end
@@ -0,0 +1,44 @@
1
+ module Spec
2
+ module Example
3
+ class ExampleMatcher
4
+ def initialize(example_group_description, example_name)
5
+ @example_group_description = example_group_description
6
+ @example_name = example_name
7
+ end
8
+
9
+ def matches?(specified_examples)
10
+ specified_examples.each do |specified_example|
11
+ return true if matches_literal_example?(specified_example) || matches_example_not_considering_modules?(specified_example)
12
+ end
13
+ false
14
+ end
15
+
16
+ protected
17
+ def matches_literal_example?(specified_example)
18
+ specified_example =~ /(^#{example_group_regex} #{example_regexp}$|^#{example_group_regex}$|^#{example_group_with_before_all_regexp}$|^#{example_regexp}$)/
19
+ end
20
+
21
+ def matches_example_not_considering_modules?(specified_example)
22
+ specified_example =~ /(^#{example_group_regex_not_considering_modules} #{example_regexp}$|^#{example_group_regex_not_considering_modules}$|^#{example_regexp}$)/
23
+ end
24
+
25
+ def example_group_regex
26
+ Regexp.escape(@example_group_description)
27
+ end
28
+
29
+ def example_group_with_before_all_regexp
30
+ Regexp.escape("#{@example_group_description} before(:all)")
31
+ end
32
+
33
+ def example_group_regex_not_considering_modules
34
+ Regexp.escape(@example_group_description.split('::').last)
35
+ end
36
+
37
+ def example_regexp
38
+ Regexp.escape(@example_name)
39
+ end
40
+ end
41
+
42
+ ExampleGroupMethods.matcher_class = ExampleMatcher
43
+ end
44
+ end
@@ -0,0 +1,137 @@
1
+ module Spec
2
+ module Example
3
+ module ExampleMethods
4
+
5
+ extend Spec::Example::ModuleReopeningFix
6
+ include Spec::Example::Subject::ExampleMethods
7
+
8
+
9
+ def violated(message="")
10
+ raise Spec::Expectations::ExpectationNotMetError.new(message)
11
+ end
12
+
13
+ # Declared description for this example:
14
+ #
15
+ # describe Account do
16
+ # it "should start with a balance of 0" do
17
+ # ...
18
+ #
19
+ # description
20
+ # => "should start with a balance of 0"
21
+ def description
22
+ @_defined_description || ::Spec::Matchers.generated_description || "NO NAME"
23
+ end
24
+
25
+ # Concats the class description with the example description.
26
+ #
27
+ # describe Account do
28
+ # it "should start with a balance of 0" do
29
+ # ...
30
+ #
31
+ # full_description
32
+ # => "Account should start with a balance of 0"
33
+ def full_description
34
+ "#{self.class.description} #{self.description}"
35
+ end
36
+
37
+ def options # :nodoc:
38
+ @_options
39
+ end
40
+
41
+ def execute(options, instance_variables) # :nodoc:
42
+ options.reporter.example_started(self)
43
+ set_instance_variables_from_hash(instance_variables)
44
+
45
+ execution_error = nil
46
+ Timeout.timeout(options.timeout) do
47
+ begin
48
+ before_each_example
49
+ eval_block
50
+ rescue Exception => e
51
+ execution_error ||= e
52
+ end
53
+ begin
54
+ after_each_example
55
+ rescue Exception => e
56
+ execution_error ||= e
57
+ end
58
+ end
59
+
60
+ options.reporter.example_finished(self, execution_error)
61
+ success = execution_error.nil? || ExamplePendingError === execution_error
62
+ end
63
+
64
+ def instance_variable_hash # :nodoc:
65
+ instance_variables.inject({}) do |variable_hash, variable_name|
66
+ variable_hash[variable_name] = instance_variable_get(variable_name)
67
+ variable_hash
68
+ end
69
+ end
70
+
71
+ def eval_each_fail_fast(blocks) # :nodoc:
72
+ blocks.each do |block|
73
+ instance_eval(&block)
74
+ end
75
+ end
76
+
77
+ def eval_each_fail_slow(blocks) # :nodoc:
78
+ first_exception = nil
79
+ blocks.each do |block|
80
+ begin
81
+ instance_eval(&block)
82
+ rescue Exception => e
83
+ first_exception ||= e
84
+ end
85
+ end
86
+ raise first_exception if first_exception
87
+ end
88
+
89
+ def set_instance_variables_from_hash(ivars) # :nodoc:
90
+ ivars.each do |variable_name, value|
91
+ # Ruby 1.9 requires variable.to_s on the next line
92
+ unless ['@_implementation', '@_defined_description', '@_matcher_description', '@method_name'].include?(variable_name.to_s)
93
+ instance_variable_set variable_name, value
94
+ end
95
+ end
96
+ end
97
+
98
+ def eval_block # :nodoc:
99
+ instance_eval(&@_implementation)
100
+ end
101
+
102
+ # Provides the backtrace up to where this example was declared.
103
+ def backtrace
104
+ @_backtrace
105
+ end
106
+
107
+ # Deprecated - use +backtrace()+
108
+ def implementation_backtrace
109
+ Kernel.warn <<-WARNING
110
+ ExampleMethods#implementation_backtrace is deprecated and will be removed
111
+ from a future version. Please use ExampleMethods#backtrace instead.
112
+ WARNING
113
+ backtrace
114
+ end
115
+
116
+ private
117
+ include Matchers
118
+ include Pending
119
+
120
+ def before_each_example # :nodoc:
121
+ setup_mocks_for_rspec
122
+ self.class.run_before_each(self)
123
+ end
124
+
125
+ def after_each_example # :nodoc:
126
+ self.class.run_after_each(self)
127
+ verify_mocks_for_rspec
128
+ ensure
129
+ teardown_mocks_for_rspec
130
+ end
131
+
132
+ def described_class # :nodoc:
133
+ self.class.described_class
134
+ end
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,21 @@
1
+ module Spec
2
+ module Example
3
+ # This is a fix for ...Something in Ruby 1.8.6??... (Someone fill in here please - Aslak)
4
+ module ModuleReopeningFix
5
+ def child_modules
6
+ @child_modules ||= []
7
+ end
8
+
9
+ def included(mod)
10
+ child_modules << mod
11
+ end
12
+
13
+ def include(mod)
14
+ super
15
+ child_modules.each do |child_module|
16
+ child_module.__send__(:include, mod)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,18 @@
1
+ module Spec
2
+ module Example
3
+ module Pending
4
+ def pending(message = "TODO")
5
+ if block_given?
6
+ begin
7
+ yield
8
+ rescue Exception => e
9
+ raise Spec::Example::ExamplePendingError.new(message)
10
+ end
11
+ raise Spec::Example::PendingExampleFixedError.new("Expected pending '#{message}' to fail. No Error was raised.")
12
+ else
13
+ raise Spec::Example::ExamplePendingError.new(message)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,59 @@
1
+ module Spec
2
+ module Example
3
+ class SharedExampleGroup < Module
4
+ module ClassMethods
5
+ def register(*args, &block)
6
+ new_example_group = new(*args, &block)
7
+ shared_example_groups << new_example_group unless already_registered?(new_example_group)
8
+ new_example_group
9
+ end
10
+
11
+ def find(example_group_description)
12
+ shared_example_groups.find {|b| b.description == example_group_description}
13
+ end
14
+
15
+ def clear
16
+ shared_example_groups.clear
17
+ end
18
+
19
+ def include?(group)
20
+ shared_example_groups.include?(group)
21
+ end
22
+
23
+ def count
24
+ shared_example_groups.length
25
+ end
26
+
27
+ private
28
+
29
+ def shared_example_groups
30
+ @shared_example_groups ||= []
31
+ end
32
+
33
+ def already_registered?(new_example_group)
34
+ existing_example_group = find(new_example_group.description)
35
+ return false unless existing_example_group
36
+ return true if new_example_group.equal?(existing_example_group)
37
+ return true if expanded_path(new_example_group) == expanded_path(existing_example_group)
38
+ raise ArgumentError.new("Shared Example '#{existing_example_group.description}' already exists")
39
+ end
40
+
41
+ def expanded_path(example_group)
42
+ File.expand_path(example_group.spec_path)
43
+ end
44
+ end
45
+
46
+ extend ClassMethods
47
+ include ExampleGroupMethods
48
+
49
+ def initialize(*args, &example_group_block)
50
+ set_description(*args)
51
+ @example_group_block = example_group_block
52
+ end
53
+
54
+ def included(mod) # :nodoc:
55
+ mod.module_eval(&@example_group_block)
56
+ end
57
+ end
58
+ end
59
+ end