dchelimsky-rspec 1.1.10

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 (404) hide show
  1. data/History.txt +1192 -0
  2. data/License.txt +22 -0
  3. data/Manifest.txt +403 -0
  4. data/README.txt +39 -0
  5. data/Rakefile +90 -0
  6. data/TODO.txt +10 -0
  7. data/bin/autospec +4 -0
  8. data/bin/spec +4 -0
  9. data/examples/pure/autogenerated_docstrings_example.rb +19 -0
  10. data/examples/pure/before_and_after_example.rb +40 -0
  11. data/examples/pure/behave_as_example.rb +45 -0
  12. data/examples/pure/custom_expectation_matchers.rb +54 -0
  13. data/examples/pure/custom_formatter.rb +12 -0
  14. data/examples/pure/dynamic_spec.rb +9 -0
  15. data/examples/pure/file_accessor.rb +19 -0
  16. data/examples/pure/file_accessor_spec.rb +38 -0
  17. data/examples/pure/greeter_spec.rb +31 -0
  18. data/examples/pure/helper_method_example.rb +14 -0
  19. data/examples/pure/io_processor.rb +8 -0
  20. data/examples/pure/io_processor_spec.rb +21 -0
  21. data/examples/pure/legacy_spec.rb +11 -0
  22. data/examples/pure/mocking_example.rb +27 -0
  23. data/examples/pure/multi_threaded_behaviour_runner.rb +28 -0
  24. data/examples/pure/nested_classes_example.rb +36 -0
  25. data/examples/pure/partial_mock_example.rb +29 -0
  26. data/examples/pure/pending_example.rb +20 -0
  27. data/examples/pure/predicate_example.rb +27 -0
  28. data/examples/pure/priority.txt +1 -0
  29. data/examples/pure/shared_example_group_example.rb +81 -0
  30. data/examples/pure/shared_stack_examples.rb +38 -0
  31. data/examples/pure/spec_helper.rb +3 -0
  32. data/examples/pure/stack.rb +36 -0
  33. data/examples/pure/stack_spec.rb +63 -0
  34. data/examples/pure/stack_spec_with_nested_example_groups.rb +67 -0
  35. data/examples/pure/stubbing_example.rb +69 -0
  36. data/examples/pure/yielding_example.rb +33 -0
  37. data/examples/stories/adder.rb +13 -0
  38. data/examples/stories/addition +34 -0
  39. data/examples/stories/addition.rb +9 -0
  40. data/examples/stories/calculator.rb +65 -0
  41. data/examples/stories/game-of-life/.loadpath +5 -0
  42. data/examples/stories/game-of-life/README.txt +21 -0
  43. data/examples/stories/game-of-life/behaviour/everything.rb +6 -0
  44. data/examples/stories/game-of-life/behaviour/examples/examples.rb +3 -0
  45. data/examples/stories/game-of-life/behaviour/examples/game_behaviour.rb +35 -0
  46. data/examples/stories/game-of-life/behaviour/examples/grid_behaviour.rb +66 -0
  47. data/examples/stories/game-of-life/behaviour/stories/CellsWithLessThanTwoNeighboursDie.story +21 -0
  48. data/examples/stories/game-of-life/behaviour/stories/CellsWithMoreThanThreeNeighboursDie.story +21 -0
  49. data/examples/stories/game-of-life/behaviour/stories/EmptySpacesWithThreeNeighboursCreateACell.story +42 -0
  50. data/examples/stories/game-of-life/behaviour/stories/ICanCreateACell.story +42 -0
  51. data/examples/stories/game-of-life/behaviour/stories/ICanKillACell.story +17 -0
  52. data/examples/stories/game-of-life/behaviour/stories/TheGridWraps.story +53 -0
  53. data/examples/stories/game-of-life/behaviour/stories/create_a_cell.rb +52 -0
  54. data/examples/stories/game-of-life/behaviour/stories/helper.rb +6 -0
  55. data/examples/stories/game-of-life/behaviour/stories/kill_a_cell.rb +26 -0
  56. data/examples/stories/game-of-life/behaviour/stories/steps.rb +5 -0
  57. data/examples/stories/game-of-life/behaviour/stories/stories.rb +3 -0
  58. data/examples/stories/game-of-life/behaviour/stories/stories.txt +22 -0
  59. data/examples/stories/game-of-life/life/game.rb +23 -0
  60. data/examples/stories/game-of-life/life/grid.rb +43 -0
  61. data/examples/stories/game-of-life/life.rb +3 -0
  62. data/examples/stories/helper.rb +9 -0
  63. data/examples/stories/steps/addition_steps.rb +18 -0
  64. data/failing_examples/README.txt +7 -0
  65. data/failing_examples/diffing_spec.rb +36 -0
  66. data/failing_examples/failing_autogenerated_docstrings_example.rb +19 -0
  67. data/failing_examples/failure_in_setup.rb +10 -0
  68. data/failing_examples/failure_in_teardown.rb +10 -0
  69. data/failing_examples/mocking_example.rb +40 -0
  70. data/failing_examples/mocking_with_flexmock.rb +26 -0
  71. data/failing_examples/mocking_with_mocha.rb +25 -0
  72. data/failing_examples/mocking_with_rr.rb +27 -0
  73. data/failing_examples/partial_mock_example.rb +20 -0
  74. data/failing_examples/predicate_example.rb +29 -0
  75. data/failing_examples/raising_example.rb +47 -0
  76. data/failing_examples/spec_helper.rb +3 -0
  77. data/failing_examples/syntax_error_example.rb +7 -0
  78. data/failing_examples/team_spec.rb +44 -0
  79. data/failing_examples/timeout_behaviour.rb +7 -0
  80. data/init.rb +9 -0
  81. data/lib/autotest/discover.rb +3 -0
  82. data/lib/autotest/rspec.rb +46 -0
  83. data/lib/spec/adapters/ruby_engine/mri.rb +8 -0
  84. data/lib/spec/adapters/ruby_engine/rubinius.rb +8 -0
  85. data/lib/spec/adapters/ruby_engine.rb +26 -0
  86. data/lib/spec/adapters.rb +1 -0
  87. data/lib/spec/example/before_and_after_hooks.rb +93 -0
  88. data/lib/spec/example/configuration.rb +167 -0
  89. data/lib/spec/example/errors.rb +30 -0
  90. data/lib/spec/example/example_group.rb +25 -0
  91. data/lib/spec/example/example_group_factory.rb +81 -0
  92. data/lib/spec/example/example_group_methods.rb +368 -0
  93. data/lib/spec/example/example_matcher.rb +44 -0
  94. data/lib/spec/example/example_methods.rb +105 -0
  95. data/lib/spec/example/module_reopening_fix.rb +21 -0
  96. data/lib/spec/example/pending.rb +18 -0
  97. data/lib/spec/example/shared_example_group.rb +52 -0
  98. data/lib/spec/example.rb +12 -0
  99. data/lib/spec/expectations/differs/default.rb +66 -0
  100. data/lib/spec/expectations/errors.rb +12 -0
  101. data/lib/spec/expectations/extensions/object.rb +63 -0
  102. data/lib/spec/expectations/extensions/string_and_symbol.rb +17 -0
  103. data/lib/spec/expectations/extensions.rb +2 -0
  104. data/lib/spec/expectations/handler.rb +52 -0
  105. data/lib/spec/expectations.rb +56 -0
  106. data/lib/spec/extensions/class.rb +24 -0
  107. data/lib/spec/extensions/main.rb +87 -0
  108. data/lib/spec/extensions/metaclass.rb +7 -0
  109. data/lib/spec/extensions/object.rb +6 -0
  110. data/lib/spec/extensions.rb +4 -0
  111. data/lib/spec/interop/test/unit/autorunner.rb +6 -0
  112. data/lib/spec/interop/test/unit/testcase.rb +71 -0
  113. data/lib/spec/interop/test/unit/testresult.rb +6 -0
  114. data/lib/spec/interop/test/unit/testsuite_adapter.rb +34 -0
  115. data/lib/spec/interop/test/unit/ui/console/testrunner.rb +61 -0
  116. data/lib/spec/interop/test.rb +12 -0
  117. data/lib/spec/matchers/be.rb +221 -0
  118. data/lib/spec/matchers/be_close.rb +37 -0
  119. data/lib/spec/matchers/change.rb +148 -0
  120. data/lib/spec/matchers/eql.rb +43 -0
  121. data/lib/spec/matchers/equal.rb +43 -0
  122. data/lib/spec/matchers/exist.rb +22 -0
  123. data/lib/spec/matchers/has.rb +34 -0
  124. data/lib/spec/matchers/have.rb +150 -0
  125. data/lib/spec/matchers/include.rb +77 -0
  126. data/lib/spec/matchers/match.rb +41 -0
  127. data/lib/spec/matchers/operator_matcher.rb +79 -0
  128. data/lib/spec/matchers/raise_error.rb +132 -0
  129. data/lib/spec/matchers/respond_to.rb +46 -0
  130. data/lib/spec/matchers/satisfy.rb +47 -0
  131. data/lib/spec/matchers/simple_matcher.rb +132 -0
  132. data/lib/spec/matchers/throw_symbol.rb +74 -0
  133. data/lib/spec/matchers.rb +162 -0
  134. data/lib/spec/mocks/argument_constraints.rb +165 -0
  135. data/lib/spec/mocks/argument_expectation.rb +49 -0
  136. data/lib/spec/mocks/error_generator.rb +84 -0
  137. data/lib/spec/mocks/errors.rb +10 -0
  138. data/lib/spec/mocks/extensions/object.rb +3 -0
  139. data/lib/spec/mocks/extensions.rb +1 -0
  140. data/lib/spec/mocks/framework.rb +15 -0
  141. data/lib/spec/mocks/message_expectation.rb +331 -0
  142. data/lib/spec/mocks/methods.rb +51 -0
  143. data/lib/spec/mocks/mock.rb +56 -0
  144. data/lib/spec/mocks/order_group.rb +29 -0
  145. data/lib/spec/mocks/proxy.rb +224 -0
  146. data/lib/spec/mocks/space.rb +28 -0
  147. data/lib/spec/mocks/spec_methods.rb +46 -0
  148. data/lib/spec/mocks.rb +200 -0
  149. data/lib/spec/rake/spectask.rb +227 -0
  150. data/lib/spec/rake/verify_rcov.rb +52 -0
  151. data/lib/spec/runner/backtrace_tweaker.rb +56 -0
  152. data/lib/spec/runner/class_and_arguments_parser.rb +16 -0
  153. data/lib/spec/runner/command_line.rb +17 -0
  154. data/lib/spec/runner/drb_command_line.rb +20 -0
  155. data/lib/spec/runner/example_group_runner.rb +59 -0
  156. data/lib/spec/runner/formatter/base_formatter.rb +79 -0
  157. data/lib/spec/runner/formatter/base_text_formatter.rb +126 -0
  158. data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +27 -0
  159. data/lib/spec/runner/formatter/failing_examples_formatter.rb +20 -0
  160. data/lib/spec/runner/formatter/html_formatter.rb +337 -0
  161. data/lib/spec/runner/formatter/nested_text_formatter.rb +65 -0
  162. data/lib/spec/runner/formatter/profile_formatter.rb +51 -0
  163. data/lib/spec/runner/formatter/progress_bar_formatter.rb +34 -0
  164. data/lib/spec/runner/formatter/snippet_extractor.rb +52 -0
  165. data/lib/spec/runner/formatter/specdoc_formatter.rb +39 -0
  166. data/lib/spec/runner/formatter/story/html_formatter.rb +174 -0
  167. data/lib/spec/runner/formatter/story/plain_text_formatter.rb +194 -0
  168. data/lib/spec/runner/formatter/story/progress_bar_formatter.rb +42 -0
  169. data/lib/spec/runner/formatter/text_mate_formatter.rb +16 -0
  170. data/lib/spec/runner/heckle_runner.rb +72 -0
  171. data/lib/spec/runner/heckle_runner_unsupported.rb +10 -0
  172. data/lib/spec/runner/option_parser.rb +205 -0
  173. data/lib/spec/runner/options.rb +320 -0
  174. data/lib/spec/runner/reporter.rb +167 -0
  175. data/lib/spec/runner/spec_parser.rb +71 -0
  176. data/lib/spec/runner.rb +213 -0
  177. data/lib/spec/story/extensions/main.rb +86 -0
  178. data/lib/spec/story/extensions/regexp.rb +9 -0
  179. data/lib/spec/story/extensions/string.rb +9 -0
  180. data/lib/spec/story/extensions.rb +3 -0
  181. data/lib/spec/story/given_scenario.rb +14 -0
  182. data/lib/spec/story/runner/plain_text_story_runner.rb +48 -0
  183. data/lib/spec/story/runner/scenario_collector.rb +18 -0
  184. data/lib/spec/story/runner/scenario_runner.rb +54 -0
  185. data/lib/spec/story/runner/story_mediator.rb +137 -0
  186. data/lib/spec/story/runner/story_parser.rb +247 -0
  187. data/lib/spec/story/runner/story_runner.rb +70 -0
  188. data/lib/spec/story/runner.rb +59 -0
  189. data/lib/spec/story/scenario.rb +14 -0
  190. data/lib/spec/story/step.rb +70 -0
  191. data/lib/spec/story/step_group.rb +89 -0
  192. data/lib/spec/story/step_mother.rb +38 -0
  193. data/lib/spec/story/story.rb +39 -0
  194. data/lib/spec/story/world.rb +128 -0
  195. data/lib/spec/story.rb +10 -0
  196. data/lib/spec/version.rb +13 -0
  197. data/lib/spec.rb +32 -0
  198. data/plugins/mock_frameworks/flexmock.rb +23 -0
  199. data/plugins/mock_frameworks/mocha.rb +19 -0
  200. data/plugins/mock_frameworks/rr.rb +21 -0
  201. data/plugins/mock_frameworks/rspec.rb +20 -0
  202. data/rake_tasks/examples.rake +7 -0
  203. data/rake_tasks/examples_with_rcov.rake +9 -0
  204. data/rake_tasks/failing_examples_with_html.rake +9 -0
  205. data/rake_tasks/verify_rcov.rake +7 -0
  206. data/rspec.gemspec +42 -0
  207. data/spec/README.jruby +15 -0
  208. data/spec/autotest/autotest_helper.rb +6 -0
  209. data/spec/autotest/autotest_matchers.rb +47 -0
  210. data/spec/autotest/discover_spec.rb +19 -0
  211. data/spec/autotest/rspec_spec.rb +150 -0
  212. data/spec/rspec_suite.rb +6 -0
  213. data/spec/ruby_forker.rb +13 -0
  214. data/spec/spec/adapters/ruby_engine_spec.rb +16 -0
  215. data/spec/spec/example/configuration_spec.rb +296 -0
  216. data/spec/spec/example/example_group_class_definition_spec.rb +48 -0
  217. data/spec/spec/example/example_group_factory_spec.rb +165 -0
  218. data/spec/spec/example/example_group_methods_spec.rb +584 -0
  219. data/spec/spec/example/example_group_spec.rb +683 -0
  220. data/spec/spec/example/example_matcher_spec.rb +96 -0
  221. data/spec/spec/example/example_methods_spec.rb +169 -0
  222. data/spec/spec/example/example_runner_spec.rb +194 -0
  223. data/spec/spec/example/nested_example_group_spec.rb +71 -0
  224. data/spec/spec/example/pending_module_spec.rb +145 -0
  225. data/spec/spec/example/predicate_matcher_spec.rb +21 -0
  226. data/spec/spec/example/shared_example_group_spec.rb +281 -0
  227. data/spec/spec/example/subclassing_example_group_spec.rb +25 -0
  228. data/spec/spec/expectations/differs/default_spec.rb +127 -0
  229. data/spec/spec/expectations/extensions/object_spec.rb +95 -0
  230. data/spec/spec/expectations/fail_with_spec.rb +71 -0
  231. data/spec/spec/extensions/main_spec.rb +71 -0
  232. data/spec/spec/interop/test/unit/resources/spec_that_fails.rb +10 -0
  233. data/spec/spec/interop/test/unit/resources/spec_that_passes.rb +10 -0
  234. data/spec/spec/interop/test/unit/resources/spec_with_errors.rb +10 -0
  235. data/spec/spec/interop/test/unit/resources/spec_with_options_hash.rb +13 -0
  236. data/spec/spec/interop/test/unit/resources/test_case_that_fails.rb +10 -0
  237. data/spec/spec/interop/test/unit/resources/test_case_that_passes.rb +10 -0
  238. data/spec/spec/interop/test/unit/resources/test_case_with_errors.rb +10 -0
  239. data/spec/spec/interop/test/unit/resources/testsuite_adapter_spec_with_test_unit.rb +38 -0
  240. data/spec/spec/interop/test/unit/spec_spec.rb +52 -0
  241. data/spec/spec/interop/test/unit/test_unit_spec_helper.rb +14 -0
  242. data/spec/spec/interop/test/unit/testcase_spec.rb +49 -0
  243. data/spec/spec/interop/test/unit/testsuite_adapter_spec.rb +9 -0
  244. data/spec/spec/matchers/be_close_spec.rb +39 -0
  245. data/spec/spec/matchers/be_spec.rb +248 -0
  246. data/spec/spec/matchers/change_spec.rb +329 -0
  247. data/spec/spec/matchers/description_generation_spec.rb +153 -0
  248. data/spec/spec/matchers/eql_spec.rb +28 -0
  249. data/spec/spec/matchers/equal_spec.rb +28 -0
  250. data/spec/spec/matchers/exist_spec.rb +57 -0
  251. data/spec/spec/matchers/handler_spec.rb +150 -0
  252. data/spec/spec/matchers/has_spec.rb +63 -0
  253. data/spec/spec/matchers/have_spec.rb +394 -0
  254. data/spec/spec/matchers/include_spec.rb +64 -0
  255. data/spec/spec/matchers/match_spec.rb +37 -0
  256. data/spec/spec/matchers/matcher_methods_spec.rb +78 -0
  257. data/spec/spec/matchers/mock_constraint_matchers_spec.rb +24 -0
  258. data/spec/spec/matchers/operator_matcher_spec.rb +191 -0
  259. data/spec/spec/matchers/raise_error_spec.rb +315 -0
  260. data/spec/spec/matchers/respond_to_spec.rb +54 -0
  261. data/spec/spec/matchers/satisfy_spec.rb +36 -0
  262. data/spec/spec/matchers/simple_matcher_spec.rb +93 -0
  263. data/spec/spec/matchers/throw_symbol_spec.rb +54 -0
  264. data/spec/spec/mocks/any_number_of_times_spec.rb +36 -0
  265. data/spec/spec/mocks/argument_expectation_spec.rb +23 -0
  266. data/spec/spec/mocks/at_least_spec.rb +97 -0
  267. data/spec/spec/mocks/at_most_spec.rb +93 -0
  268. data/spec/spec/mocks/bug_report_10260_spec.rb +8 -0
  269. data/spec/spec/mocks/bug_report_10263_spec.rb +24 -0
  270. data/spec/spec/mocks/bug_report_11545_spec.rb +33 -0
  271. data/spec/spec/mocks/bug_report_15719_spec.rb +30 -0
  272. data/spec/spec/mocks/bug_report_496.rb +17 -0
  273. data/spec/spec/mocks/bug_report_7611_spec.rb +19 -0
  274. data/spec/spec/mocks/bug_report_7805_spec.rb +22 -0
  275. data/spec/spec/mocks/bug_report_8165_spec.rb +31 -0
  276. data/spec/spec/mocks/bug_report_8302_spec.rb +26 -0
  277. data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +95 -0
  278. data/spec/spec/mocks/hash_including_matcher_spec.rb +53 -0
  279. data/spec/spec/mocks/mock_ordering_spec.rb +84 -0
  280. data/spec/spec/mocks/mock_space_spec.rb +54 -0
  281. data/spec/spec/mocks/mock_spec.rb +555 -0
  282. data/spec/spec/mocks/multiple_return_value_spec.rb +113 -0
  283. data/spec/spec/mocks/nil_expectation_warning_spec.rb +53 -0
  284. data/spec/spec/mocks/null_object_mock_spec.rb +54 -0
  285. data/spec/spec/mocks/once_counts_spec.rb +53 -0
  286. data/spec/spec/mocks/options_hash_spec.rb +35 -0
  287. data/spec/spec/mocks/partial_mock_spec.rb +149 -0
  288. data/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +66 -0
  289. data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +130 -0
  290. data/spec/spec/mocks/precise_counts_spec.rb +52 -0
  291. data/spec/spec/mocks/record_messages_spec.rb +26 -0
  292. data/spec/spec/mocks/stub_spec.rb +188 -0
  293. data/spec/spec/mocks/twice_counts_spec.rb +67 -0
  294. data/spec/spec/package/bin_spec_spec.rb +22 -0
  295. data/spec/spec/runner/class_and_argument_parser_spec.rb +23 -0
  296. data/spec/spec/runner/command_line_spec.rb +141 -0
  297. data/spec/spec/runner/drb_command_line_spec.rb +97 -0
  298. data/spec/spec/runner/empty_file.txt +0 -0
  299. data/spec/spec/runner/examples.txt +2 -0
  300. data/spec/spec/runner/failed.txt +3 -0
  301. data/spec/spec/runner/formatter/base_formatter_spec.rb +112 -0
  302. data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +45 -0
  303. data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +33 -0
  304. data/spec/spec/runner/formatter/html_formatted-1.8.4.html +365 -0
  305. data/spec/spec/runner/formatter/html_formatted-1.8.5-jruby.html +387 -0
  306. data/spec/spec/runner/formatter/html_formatted-1.8.5.html +371 -0
  307. data/spec/spec/runner/formatter/html_formatted-1.8.6-jruby.html +381 -0
  308. data/spec/spec/runner/formatter/html_formatted-1.8.6.html +370 -0
  309. data/spec/spec/runner/formatter/html_formatter_spec.rb +61 -0
  310. data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +318 -0
  311. data/spec/spec/runner/formatter/profile_formatter_spec.rb +65 -0
  312. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +155 -0
  313. data/spec/spec/runner/formatter/snippet_extractor_spec.rb +18 -0
  314. data/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +103 -0
  315. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +159 -0
  316. data/spec/spec/runner/formatter/story/html_formatter_spec.rb +135 -0
  317. data/spec/spec/runner/formatter/story/plain_text_formatter_spec.rb +600 -0
  318. data/spec/spec/runner/formatter/story/progress_bar_formatter_spec.rb +82 -0
  319. data/spec/spec/runner/formatter/text_mate_formatted-1.8.4.html +365 -0
  320. data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +370 -0
  321. data/spec/spec/runner/heckle_runner_spec.rb +78 -0
  322. data/spec/spec/runner/heckler_spec.rb +13 -0
  323. data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +45 -0
  324. data/spec/spec/runner/option_parser_spec.rb +421 -0
  325. data/spec/spec/runner/options_spec.rb +450 -0
  326. data/spec/spec/runner/output_one_time_fixture.rb +7 -0
  327. data/spec/spec/runner/output_one_time_fixture_runner.rb +8 -0
  328. data/spec/spec/runner/output_one_time_spec.rb +16 -0
  329. data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +62 -0
  330. data/spec/spec/runner/reporter_spec.rb +238 -0
  331. data/spec/spec/runner/resources/a_bar.rb +0 -0
  332. data/spec/spec/runner/resources/a_foo.rb +0 -0
  333. data/spec/spec/runner/resources/a_spec.rb +1 -0
  334. data/spec/spec/runner/spec.opts +2 -0
  335. data/spec/spec/runner/spec_drb.opts +1 -0
  336. data/spec/spec/runner/spec_parser/spec_parser_fixture.rb +70 -0
  337. data/spec/spec/runner/spec_parser_spec.rb +85 -0
  338. data/spec/spec/runner/spec_spaced.opts +2 -0
  339. data/spec/spec/runner_spec.rb +11 -0
  340. data/spec/spec/spec_classes.rb +133 -0
  341. data/spec/spec/story/builders.rb +46 -0
  342. data/spec/spec/story/extensions/main_spec.rb +161 -0
  343. data/spec/spec/story/extensions_spec.rb +14 -0
  344. data/spec/spec/story/given_scenario_spec.rb +27 -0
  345. data/spec/spec/story/runner/plain_text_story_runner_spec.rb +90 -0
  346. data/spec/spec/story/runner/scenario_collector_spec.rb +27 -0
  347. data/spec/spec/story/runner/scenario_runner_spec.rb +214 -0
  348. data/spec/spec/story/runner/story_mediator_spec.rb +143 -0
  349. data/spec/spec/story/runner/story_parser_spec.rb +401 -0
  350. data/spec/spec/story/runner/story_runner_spec.rb +294 -0
  351. data/spec/spec/story/runner_spec.rb +93 -0
  352. data/spec/spec/story/scenario_spec.rb +18 -0
  353. data/spec/spec/story/step_group_spec.rb +157 -0
  354. data/spec/spec/story/step_mother_spec.rb +84 -0
  355. data/spec/spec/story/step_spec.rb +272 -0
  356. data/spec/spec/story/story_helper.rb +2 -0
  357. data/spec/spec/story/story_spec.rb +84 -0
  358. data/spec/spec/story/world_spec.rb +423 -0
  359. data/spec/spec.opts +6 -0
  360. data/spec/spec_helper.rb +77 -0
  361. data/stories/all.rb +5 -0
  362. data/stories/configuration/before_blocks.story +21 -0
  363. data/stories/configuration/stories.rb +7 -0
  364. data/stories/example_groups/autogenerated_docstrings +45 -0
  365. data/stories/example_groups/example_group_with_should_methods +17 -0
  366. data/stories/example_groups/nested_groups +17 -0
  367. data/stories/example_groups/output +25 -0
  368. data/stories/example_groups/stories.rb +7 -0
  369. data/stories/helper.rb +6 -0
  370. data/stories/interop/examples_and_tests_together +30 -0
  371. data/stories/interop/stories.rb +7 -0
  372. data/stories/interop/test_case_with_should_methods +17 -0
  373. data/stories/mock_framework_integration/stories.rb +7 -0
  374. data/stories/mock_framework_integration/use_flexmock.story +9 -0
  375. data/stories/pending_stories/README +3 -0
  376. data/stories/resources/helpers/cmdline.rb +9 -0
  377. data/stories/resources/helpers/story_helper.rb +16 -0
  378. data/stories/resources/matchers/smart_match.rb +37 -0
  379. data/stories/resources/spec/before_blocks_example.rb +32 -0
  380. data/stories/resources/spec/example_group_with_should_methods.rb +12 -0
  381. data/stories/resources/spec/simple_spec.rb +8 -0
  382. data/stories/resources/spec/spec_with_flexmock.rb +18 -0
  383. data/stories/resources/steps/running_rspec.rb +50 -0
  384. data/stories/resources/stories/failing_story.rb +15 -0
  385. data/stories/resources/test/spec_and_test_together.rb +57 -0
  386. data/stories/resources/test/test_case_with_should_methods.rb +30 -0
  387. data/stories/stories/multiline_steps.story +23 -0
  388. data/stories/stories/steps/multiline_steps.rb +13 -0
  389. data/stories/stories/stories.rb +6 -0
  390. data/story_server/prototype/javascripts/builder.js +136 -0
  391. data/story_server/prototype/javascripts/controls.js +972 -0
  392. data/story_server/prototype/javascripts/dragdrop.js +976 -0
  393. data/story_server/prototype/javascripts/effects.js +1117 -0
  394. data/story_server/prototype/javascripts/prototype.js +4140 -0
  395. data/story_server/prototype/javascripts/rspec.js +149 -0
  396. data/story_server/prototype/javascripts/scriptaculous.js +58 -0
  397. data/story_server/prototype/javascripts/slider.js +276 -0
  398. data/story_server/prototype/javascripts/sound.js +55 -0
  399. data/story_server/prototype/javascripts/unittest.js +568 -0
  400. data/story_server/prototype/lib/server.rb +24 -0
  401. data/story_server/prototype/stories.html +176 -0
  402. data/story_server/prototype/stylesheets/rspec.css +136 -0
  403. data/story_server/prototype/stylesheets/test.css +90 -0
  404. metadata +495 -0
@@ -0,0 +1,70 @@
1
+ module Spec
2
+ module Story
3
+ module Runner
4
+ class StoryRunner
5
+ class << self
6
+ attr_accessor :current_story_runner
7
+
8
+ def scenario_from_current_story(scenario_name)
9
+ current_story_runner.scenario_from_current_story(scenario_name)
10
+ end
11
+ end
12
+
13
+ attr_accessor :stories, :scenarios, :current_story
14
+
15
+ def initialize(scenario_runner, world_creator = World)
16
+ StoryRunner.current_story_runner = self
17
+ @scenario_runner = scenario_runner
18
+ @world_creator = world_creator
19
+ @stories = []
20
+ @scenarios_by_story = {}
21
+ @scenarios = []
22
+ @listeners = []
23
+ end
24
+
25
+ def Story(title, narrative, params = {}, &body)
26
+ story = Story.new(title, narrative, params, &body)
27
+ @stories << story
28
+
29
+ # collect scenarios
30
+ collector = ScenarioCollector.new(story)
31
+ story.run_in(collector)
32
+ @scenarios += collector.scenarios
33
+ @scenarios_by_story[story.title] = collector.scenarios
34
+ end
35
+
36
+ def run_stories
37
+ return if @stories.empty?
38
+ @listeners.each { |l| l.run_started(scenarios.size) }
39
+ success = true
40
+ @stories.each do |story|
41
+ story.assign_steps_to(World)
42
+ @current_story = story
43
+ @listeners.each { |l| l.story_started(story.title, story.narrative) }
44
+ scenarios = @scenarios_by_story[story.title]
45
+ scenarios.each do |scenario|
46
+ type = story[:type] || Object
47
+ args = story[:args] || []
48
+ world = @world_creator.create(type, *args)
49
+ success = success & @scenario_runner.run(scenario, world)
50
+ end
51
+ @listeners.each { |l| l.story_ended(story.title, story.narrative) }
52
+ World.step_mother.clear
53
+ end
54
+ unique_steps = (World.step_names.collect {|n| Regexp === n ? n.source : n.to_s}).uniq.sort
55
+ @listeners.each { |l| l.collected_steps(unique_steps) }
56
+ @listeners.each { |l| l.run_ended }
57
+ return success
58
+ end
59
+
60
+ def add_listener(listener)
61
+ @listeners << listener
62
+ end
63
+
64
+ def scenario_from_current_story(scenario_name)
65
+ @scenarios_by_story[@current_story.title].find {|s| s.name == scenario_name }
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec/story/runner/scenario_collector.rb'
2
+ require 'spec/story/runner/scenario_runner.rb'
3
+ require 'spec/story/runner/story_runner.rb'
4
+ require 'spec/story/runner/story_parser.rb'
5
+ require 'spec/story/runner/story_mediator.rb'
6
+ require 'spec/story/runner/plain_text_story_runner.rb'
7
+
8
+ module Spec
9
+ module Story
10
+ module Runner
11
+ class << self
12
+ def run_options # :nodoc:
13
+ Spec::Runner.options
14
+ end
15
+
16
+ def story_runner # :nodoc:
17
+ unless @story_runner
18
+ @story_runner = create_story_runner
19
+ run_options.story_formatters.each do |formatter|
20
+ register_listener(formatter)
21
+ end
22
+ self.register_exit_hook
23
+ end
24
+ @story_runner
25
+ end
26
+
27
+ def scenario_runner # :nodoc:
28
+ @scenario_runner ||= ScenarioRunner.new
29
+ end
30
+
31
+ def world_creator # :nodoc:
32
+ @world_creator ||= World
33
+ end
34
+
35
+ def create_story_runner
36
+ Runner::StoryRunner.new(scenario_runner, world_creator)
37
+ end
38
+
39
+ # Use this to register a customer output formatter.
40
+ def register_listener(listener)
41
+ story_runner.add_listener(listener) # run_started, story_started, story_ended, #run_ended
42
+ world_creator.add_listener(listener) # found_scenario, step_succeeded, step_failed, step_failed
43
+ scenario_runner.add_listener(listener) # scenario_started, scenario_succeeded, scenario_pending, scenario_failed
44
+ end
45
+
46
+ def register_exit_hook # :nodoc:
47
+ at_exit do
48
+ exit Runner.story_runner.run_stories unless $!
49
+ end
50
+ end
51
+
52
+ def dry_run
53
+ run_options.dry_run
54
+ end
55
+
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,14 @@
1
+
2
+ module Spec
3
+ module Story
4
+ class Scenario
5
+ attr_accessor :name, :body, :story
6
+
7
+ def initialize(story, name, &body)
8
+ @story = story
9
+ @name = name
10
+ @body = body
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,70 @@
1
+ module Spec
2
+ module Story
3
+ class Step
4
+ PARAM_PATTERN = /([^\\]|^)(\$(?!\$)\w*)/
5
+ PARAM_OR_GROUP_PATTERN = /(\$(?!\$)\w*)|\(.*?\)/
6
+
7
+ attr_reader :name
8
+
9
+ def initialize(name, &block)
10
+ init_name(name)
11
+ init_expression(name)
12
+ block_given? ? init_module(name, &block) : set_pending
13
+ end
14
+
15
+ def perform(instance, *args)
16
+ raise Spec::Example::ExamplePendingError.new("Not Yet Implemented") if pending?
17
+ instance.extend(@mod)
18
+ instance.__send__(sanitize(@name), *args)
19
+ end
20
+
21
+ def matches?(name)
22
+ !(name.strip =~ @expression).nil?
23
+ end
24
+
25
+ def parse_args(name)
26
+ name.strip.match(@expression)[1..-1]
27
+ end
28
+
29
+ private
30
+
31
+ def sanitize(a_string_or_regexp)
32
+ return a_string_or_regexp.source if Regexp == a_string_or_regexp
33
+ a_string_or_regexp.to_s
34
+ end
35
+
36
+ def init_module(name, &block)
37
+ sanitized_name = sanitize(name)
38
+ @mod = Module.new do
39
+ define_method(sanitized_name, &block)
40
+ end
41
+ end
42
+
43
+ def set_pending
44
+ @pending = true
45
+ end
46
+
47
+ def pending?
48
+ @pending == true
49
+ end
50
+
51
+ def init_name(name)
52
+ @name = name
53
+ end
54
+
55
+ def init_expression(string_or_regexp)
56
+ if String === string_or_regexp
57
+ expression = string_or_regexp.dup
58
+ %w<? ( ) [ ] { } ^ !>.each {|c| expression.gsub! c, "\\#{c}"}
59
+ elsif Regexp === string_or_regexp
60
+ expression = string_or_regexp.source
61
+ end
62
+ while expression =~ PARAM_PATTERN
63
+ expression.sub!($2, "(.*?)")
64
+ end
65
+ @expression = Regexp.new("\\A#{expression}\\Z", Regexp::MULTILINE)
66
+ end
67
+
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,89 @@
1
+ module Spec
2
+ module Story
3
+
4
+ class StepGroupHash < Hash
5
+ def initialize
6
+ super do |h,k|
7
+ h[k] = Spec::Story::StepGroup.new
8
+ end
9
+ end
10
+ end
11
+
12
+ class StepGroup
13
+ def self.steps(&block)
14
+ @step_group ||= StepGroup.new(false)
15
+ @step_group.instance_eval(&block) if block
16
+ @step_group
17
+ end
18
+
19
+ def initialize(init_defaults=true, &block)
20
+ @hash_of_lists_of_steps = Hash.new {|h, k| h[k] = []}
21
+ if init_defaults
22
+ self.class.steps.add_to(self)
23
+ end
24
+ instance_eval(&block) if block
25
+ end
26
+
27
+ def find(type, name)
28
+ @hash_of_lists_of_steps[type].each do |step|
29
+ return step if step.matches?(name)
30
+ end
31
+ return nil
32
+ end
33
+
34
+ def GivenScenario(name, &block)
35
+ create_matcher(:given_scenario, name, &block)
36
+ end
37
+
38
+ def Given(name, &block)
39
+ create_matcher(:given, name, &block)
40
+ end
41
+
42
+ def When(name, &block)
43
+ create_matcher(:when, name, &block)
44
+ end
45
+
46
+ def Then(name, &block)
47
+ create_matcher(:then, name, &block)
48
+ end
49
+
50
+ alias :given_scenario :GivenScenario
51
+ alias :given :Given
52
+ alias :when :When
53
+ alias :then :Then
54
+
55
+ def add(type, steps)
56
+ (@hash_of_lists_of_steps[type] << steps).flatten!
57
+ end
58
+
59
+ def clear
60
+ @hash_of_lists_of_steps.clear
61
+ end
62
+
63
+ def empty?
64
+ [:given_scenario, :given, :when, :then].each do |type|
65
+ return false unless @hash_of_lists_of_steps[type].empty?
66
+ end
67
+ return true
68
+ end
69
+
70
+ def add_to(other_step_matchers)
71
+ [:given_scenario, :given, :when, :then].each do |type|
72
+ other_step_matchers.add(type, @hash_of_lists_of_steps[type])
73
+ end
74
+ end
75
+
76
+ def <<(other_step_matchers)
77
+ other_step_matchers.add_to(self) if other_step_matchers.respond_to?(:add_to)
78
+ end
79
+
80
+ # TODO - make me private
81
+ def create_matcher(type, name, &block)
82
+ matcher = Step.new(name, &block)
83
+ @hash_of_lists_of_steps[type] << matcher
84
+ matcher
85
+ end
86
+
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,38 @@
1
+ module Spec
2
+ module Story
3
+ class StepMother
4
+ def initialize
5
+ @steps = StepGroup.new
6
+ end
7
+
8
+ def use(new_step_group)
9
+ @steps << new_step_group
10
+ end
11
+
12
+ def store(type, step)
13
+ @steps.add(type, step)
14
+ end
15
+
16
+ def find(type, unstripped_name)
17
+ name = unstripped_name.strip
18
+ if @steps.find(type, name).nil?
19
+ @steps.add(type,
20
+ Step.new(name) do
21
+ raise Spec::Example::ExamplePendingError.new("Unimplemented step: #{name}")
22
+ end
23
+ )
24
+ end
25
+ @steps.find(type, name)
26
+ end
27
+
28
+ def clear
29
+ @steps.clear
30
+ end
31
+
32
+ def empty?
33
+ @steps.empty?
34
+ end
35
+
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,39 @@
1
+ module Spec
2
+ module Story
3
+ class Story
4
+ attr_reader :title, :narrative
5
+
6
+ def initialize(title, narrative, params = {}, &body)
7
+ @body = body
8
+ @title = title
9
+ @narrative = narrative
10
+ @params = params
11
+ end
12
+
13
+ def [](key)
14
+ @params[key]
15
+ end
16
+
17
+ def run_in(obj)
18
+ obj.instance_eval(&@body)
19
+ end
20
+
21
+ def assign_steps_to(assignee)
22
+ if steps=@params[:steps_for]
23
+ steps = [steps] unless steps.is_a?(Array)
24
+ steps.each do |step|
25
+ if step.is_a?(StepGroup)
26
+ assignee.use(step)
27
+ else
28
+ assignee.use(steps_for(step))
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ def steps_for(key)
35
+ $rspec_story_steps[key]
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,128 @@
1
+ require 'spec/expectations'
2
+ require 'spec/matchers'
3
+ require 'spec/example/pending'
4
+
5
+ module Spec
6
+ module Story
7
+ =begin
8
+ A World represents the actual instance a scenario will run in.
9
+
10
+ The runner ensures any instance variables and methods defined anywhere
11
+ in a story block are available to all the scenarios. This includes
12
+ variables that are created or referenced inside Given, When and Then
13
+ blocks.
14
+ =end
15
+ module World
16
+ include ::Spec::Example::Pending
17
+ include ::Spec::Matchers
18
+ # store steps and listeners in the singleton metaclass.
19
+ # This serves both to keep them out of the way of runtime Worlds
20
+ # and to make them available to all instances.
21
+ class << self
22
+ def create(cls = Object, *args)
23
+ cls.new(*args).extend(World)
24
+ end
25
+
26
+ def listeners
27
+ @listeners ||= []
28
+ end
29
+
30
+ def add_listener(listener)
31
+ listeners() << listener
32
+ end
33
+
34
+ def step_mother
35
+ @step_mother ||= StepMother.new
36
+ end
37
+
38
+ def use(steps)
39
+ step_mother.use(steps)
40
+ end
41
+
42
+ def step_names
43
+ @step_names ||= []
44
+ end
45
+
46
+ def run_given_scenario_with_suspended_listeners(world, type, name, scenario)
47
+ current_listeners = Array.new(listeners)
48
+ begin
49
+ listeners.each { |l| l.found_scenario(type, name) }
50
+ @listeners.clear
51
+ scenario.perform(world, name) unless dry_run
52
+ ensure
53
+ @listeners.replace(current_listeners)
54
+ end
55
+ end
56
+
57
+ def store_and_call(world, type, name, *args, &block)
58
+ if block_given?
59
+ step_mother.store(type, Step.new(name, &block))
60
+ end
61
+ step = step_mother.find(type, name)
62
+
63
+ step_name = step.name
64
+ step_names << step_name
65
+
66
+ # It's important to have access to the parsed args here, so
67
+ # we can give them to the listeners. The HTML reporter needs
68
+ # the args so it can style them. See the generated output in
69
+ # story_server/prototype/rspec_stories.html (generated by rake stories)
70
+ args = step.parse_args(name) if args.empty?
71
+ begin
72
+ listeners.each { |l| l.step_upcoming(type, step_name, *args) }
73
+ step.perform(world, *args) unless dry_run
74
+ listeners.each { |l| l.step_succeeded(type, step_name, *args) }
75
+ rescue Exception => e
76
+ case e
77
+ when Spec::Example::ExamplePendingError
78
+ @listeners.each { |l| l.step_pending(type, step_name, *args) }
79
+ else
80
+ @listeners.each { |l| l.step_failed(type, step_name, *args) }
81
+ end
82
+ errors << e
83
+ end
84
+ end
85
+
86
+ def errors
87
+ @errors ||= []
88
+ end
89
+
90
+ def dry_run
91
+ ::Spec::Story::Runner.dry_run
92
+ end
93
+ end # end of class << self
94
+
95
+ def start_collecting_errors
96
+ errors.clear
97
+ end
98
+
99
+ def errors
100
+ World.errors
101
+ end
102
+
103
+ def GivenScenario(name)
104
+ World.run_given_scenario_with_suspended_listeners(self, :'given scenario', name, GivenScenario.new(name))
105
+ @__previous_step = :given
106
+ end
107
+
108
+ def Given(name, *args, &block)
109
+ World.store_and_call self, :given, name, *args, &block
110
+ @__previous_step = :given
111
+ end
112
+
113
+ def When(name, *args, &block)
114
+ World.store_and_call self, :when, name, *args, &block
115
+ @__previous_step = :when
116
+ end
117
+
118
+ def Then(name, *args, &block)
119
+ World.store_and_call self, :then, name, *args, &block
120
+ @__previous_step = :then
121
+ end
122
+
123
+ def And(name, *args, &block)
124
+ World.store_and_call self, @__previous_step, name, *args, &block
125
+ end
126
+ end
127
+ end
128
+ end