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,86 @@
1
+ module Spec
2
+ module Story
3
+ module Extensions
4
+ module Main
5
+ def Story(title, narrative, params = {}, &body)
6
+ ::Spec::Story::Runner.story_runner.Story(title, narrative, params, &body)
7
+ end
8
+
9
+ # Calling this deprecated is silly, since it hasn't been released yet. But, for
10
+ # those who are reading this - this will be deleted before the 1.1 release.
11
+ def run_story(*args, &block)
12
+ runner = Spec::Story::Runner::PlainTextStoryRunner.new(*args)
13
+ runner.instance_eval(&block) if block
14
+ runner.run
15
+ end
16
+
17
+ # Creates (or appends to an existing) a namespaced group of steps for use in Stories
18
+ #
19
+ # == Examples
20
+ #
21
+ # # Creating a new group
22
+ # steps_for :forms do
23
+ # When("user enters $value in the $field field") do ... end
24
+ # When("user submits the $form form") do ... end
25
+ # end
26
+ def steps_for(tag, &block)
27
+ steps = rspec_story_steps[tag]
28
+ steps.instance_eval(&block) if block
29
+ steps
30
+ end
31
+
32
+ # Creates a context for running a Plain Text Story with specific groups of Steps.
33
+ # Also supports adding arbitrary steps that will only be accessible to
34
+ # the Story being run.
35
+ #
36
+ # == Examples
37
+ #
38
+ # # Run a Story with one group of steps
39
+ # with_steps_for :checking_accounts do
40
+ # run File.dirname(__FILE__) + "/withdraw_cash"
41
+ # end
42
+ #
43
+ # # Run a Story, adding steps that are only available for this Story
44
+ # with_steps_for :accounts do
45
+ # Given "user is logged in as account administrator"
46
+ # run File.dirname(__FILE__) + "/reconcile_accounts"
47
+ # end
48
+ #
49
+ # # Run a Story with steps from two groups
50
+ # with_steps_for :checking_accounts, :savings_accounts do
51
+ # run File.dirname(__FILE__) + "/transfer_money"
52
+ # end
53
+ #
54
+ # # Run a Story with a specific Story extension
55
+ # with_steps_for :login, :navigation do
56
+ # run File.dirname(__FILE__) + "/user_changes_password", :type => RailsStory
57
+ # end
58
+ def with_steps_for(*tags, &block)
59
+ steps = Spec::Story::StepGroup.new do
60
+ extend StoryRunnerStepGroupAdapter
61
+ end
62
+ tags.each {|tag| steps << rspec_story_steps[tag]}
63
+ steps.instance_eval(&block) if block
64
+ steps
65
+ end
66
+
67
+ private
68
+
69
+ module StoryRunnerStepGroupAdapter
70
+ def run(path, options={})
71
+ runner = Spec::Story::Runner::PlainTextStoryRunner.new(path, options)
72
+ runner.steps << self
73
+ runner.run
74
+ end
75
+ end
76
+
77
+ def rspec_story_steps # :nodoc:
78
+ $rspec_story_steps ||= Spec::Story::StepGroupHash.new
79
+ end
80
+
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ include Spec::Story::Extensions::Main
@@ -0,0 +1,9 @@
1
+ class Regexp
2
+ def step_name
3
+ self.source.gsub '\\$', '$$'
4
+ end
5
+
6
+ def arg_regexp
7
+ ::Spec::Story::Step::PARAM_OR_GROUP_PATTERN
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class String
2
+ def step_name
3
+ self
4
+ end
5
+
6
+ def arg_regexp
7
+ ::Spec::Story::Step::PARAM_OR_GROUP_PATTERN
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ require 'spec/story/extensions/main'
2
+ require 'spec/story/extensions/string'
3
+ require 'spec/story/extensions/regexp'
@@ -0,0 +1,14 @@
1
+ module Spec
2
+ module Story
3
+ class GivenScenario
4
+ def initialize(name)
5
+ @name = name
6
+ end
7
+
8
+ def perform(instance, ignore_name)
9
+ scenario = Runner::StoryRunner.scenario_from_current_story(@name)
10
+ Runner::ScenarioRunner.new.run(scenario, instance)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,48 @@
1
+ module Spec
2
+ module Story
3
+ module Runner
4
+ class PlainTextStoryRunner
5
+ # You can initialize a PlainTextStoryRunner with the path to the
6
+ # story file or a block, in which you can define the path using load.
7
+ #
8
+ # == Examples
9
+ #
10
+ # PlainTextStoryRunner.new('path/to/file')
11
+ #
12
+ # PlainTextStoryRunner.new do |runner|
13
+ # runner.load 'path/to/file'
14
+ # end
15
+ def initialize(*args)
16
+ @options = Hash === args.last ? args.pop : {}
17
+ @story_file = args.empty? ? nil : args.shift
18
+ yield self if block_given?
19
+ end
20
+
21
+ def []=(key, value)
22
+ @options[key] = value
23
+ end
24
+
25
+ def load(path)
26
+ @story_file = path
27
+ end
28
+
29
+ def run(story_runner=Spec::Story::Runner.story_runner)
30
+ raise "You must set a path to the file with the story. See the RDoc." if @story_file.nil?
31
+ mediator = Spec::Story::Runner::StoryMediator.new(steps, story_runner, @options)
32
+ parser = Spec::Story::Runner::StoryParser.new(mediator)
33
+
34
+ story_text = File.read(@story_file)
35
+ parser.parse(story_text.split("\n"))
36
+
37
+ mediator.run_stories
38
+ end
39
+
40
+ def steps
41
+ @step_group ||= Spec::Story::StepGroup.new
42
+ yield @step_group if block_given?
43
+ @step_group
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,18 @@
1
+ module Spec
2
+ module Story
3
+ module Runner
4
+ class ScenarioCollector
5
+ attr_accessor :scenarios
6
+
7
+ def initialize(story)
8
+ @story = story
9
+ @scenarios = []
10
+ end
11
+
12
+ def Scenario(name, &body)
13
+ @scenarios << Scenario.new(@story, name, &body)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,54 @@
1
+ module Spec
2
+ module Story
3
+ module Runner
4
+ class ScenarioRunner
5
+ def initialize
6
+ @listeners = []
7
+ end
8
+
9
+ def run(scenario, world)
10
+ @listeners.each { |l| l.scenario_started(scenario.story.title, scenario.name) }
11
+ run_story_ignoring_scenarios(scenario.story, world)
12
+
13
+ world.start_collecting_errors
14
+
15
+ unless scenario.body
16
+ @listeners.each { |l| l.scenario_pending(scenario.story.title, scenario.name, '') }
17
+ return true
18
+ end
19
+
20
+ world.instance_eval(&scenario.body)
21
+ if world.errors.empty?
22
+ @listeners.each { |l| l.scenario_succeeded(scenario.story.title, scenario.name) }
23
+ else
24
+ if Spec::Example::ExamplePendingError === (e = world.errors.first)
25
+ @listeners.each { |l| l.scenario_pending(scenario.story.title, scenario.name, e.message) }
26
+ else
27
+ @listeners.each { |l| l.scenario_failed(scenario.story.title, scenario.name, e) }
28
+ return false
29
+ end
30
+ end
31
+ true
32
+ end
33
+
34
+ def add_listener(listener)
35
+ @listeners << listener
36
+ end
37
+
38
+ private
39
+
40
+ def run_story_ignoring_scenarios(story, world)
41
+ class << world
42
+ def Scenario(name, &block)
43
+ # do nothing
44
+ end
45
+ end
46
+ story.run_in(world)
47
+ class << world
48
+ remove_method(:Scenario)
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,137 @@
1
+ module Spec
2
+ module Story
3
+ module Runner
4
+
5
+ class StoryMediator
6
+ def initialize(step_group, runner, options={})
7
+ @step_group = step_group
8
+ @stories = []
9
+ @runner = runner
10
+ @options = options
11
+ end
12
+
13
+ def stories
14
+ @stories.collect { |p| p.to_proc }
15
+ end
16
+
17
+ def create_story(title, narrative)
18
+ @stories << Story.new(title, narrative, @step_group, @options)
19
+ end
20
+
21
+ def create_scenario(title)
22
+ current_story.add_scenario Scenario.new(title)
23
+ end
24
+
25
+ def create_given(name)
26
+ current_scenario.add_step Step.new('Given', name)
27
+ end
28
+
29
+ def create_given_scenario(name)
30
+ current_scenario.add_step Step.new('GivenScenario', name)
31
+ end
32
+
33
+ def create_when(name)
34
+ current_scenario.add_step Step.new('When', name)
35
+ end
36
+
37
+ def create_then(name)
38
+ current_scenario.add_step Step.new('Then', name)
39
+ end
40
+
41
+ def last_step
42
+ current_scenario.last_step
43
+ end
44
+
45
+ def add_to_last(name)
46
+ last_step.name << name
47
+ end
48
+
49
+ def run_stories
50
+ stories.each { |story| @runner.instance_eval(&story) }
51
+ end
52
+
53
+ private
54
+ def current_story
55
+ @stories.last
56
+ end
57
+
58
+ def current_scenario
59
+ current_story.current_scenario
60
+ end
61
+
62
+ class Story
63
+ def initialize(title, narrative, step_group, options)
64
+ @title = title
65
+ @narrative = narrative
66
+ @scenarios = []
67
+ @step_group = step_group
68
+ @options = options
69
+ end
70
+
71
+ def to_proc
72
+ title = @title
73
+ narrative = @narrative
74
+ scenarios = @scenarios.collect { |scenario| scenario.to_proc }
75
+ options = @options.merge(:steps_for => @step_group)
76
+ lambda do
77
+ Story title, narrative, options do
78
+ scenarios.each { |scenario| instance_eval(&scenario) }
79
+ end
80
+ end
81
+ end
82
+
83
+ def add_scenario(scenario)
84
+ @scenarios << scenario
85
+ end
86
+
87
+ def current_scenario
88
+ @scenarios.last
89
+ end
90
+ end
91
+
92
+ class Scenario
93
+ def initialize(name)
94
+ @name = name
95
+ @steps = []
96
+ end
97
+
98
+ def to_proc
99
+ name = @name
100
+ steps = @steps.collect { |step| step.to_proc }
101
+ lambda do
102
+ Scenario name do
103
+ steps.each { |step| instance_eval(&step) }
104
+ end
105
+ end
106
+ end
107
+
108
+ def add_step(step)
109
+ @steps << step
110
+ end
111
+
112
+ def last_step
113
+ @steps.last
114
+ end
115
+ end
116
+
117
+ class Step
118
+ attr_reader :name
119
+
120
+ def initialize(type, name)
121
+ @type = type
122
+ @name = name
123
+ end
124
+
125
+ def to_proc
126
+ type = @type
127
+ name = @name
128
+ lambda do
129
+ send(type, name)
130
+ end
131
+ end
132
+ end
133
+ end
134
+
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,247 @@
1
+ module Spec
2
+ module Story
3
+ module Runner
4
+
5
+ class IllegalStepError < StandardError
6
+ def initialize(state, event)
7
+ super("Illegal attempt to create a #{event} after a #{state}")
8
+ end
9
+ end
10
+
11
+ class StoryParser
12
+ def initialize(story_mediator)
13
+ @story_mediator = story_mediator
14
+ @current_story_lines = []
15
+ transition_to(:starting_state)
16
+ end
17
+
18
+ def parse(lines)
19
+ lines.reject! {|line| line == ""}
20
+ until lines.empty?
21
+ process_line(lines.shift)
22
+ end
23
+ @state.eof
24
+ end
25
+
26
+ def process_line(line)
27
+ line.strip!
28
+ case line
29
+ when /^#/ then @state.comment(line)
30
+ when /^Story: / then @state.story(line)
31
+ when /^Scenario: / then @state.scenario(line)
32
+ when /^Given:? / then @state.given(line)
33
+ when /^GivenScenario:? / then @state.given_scenario(line)
34
+ when /^When:? / then @state.event(line)
35
+ when /^Then:? / then @state.outcome(line)
36
+ when /^And:? / then @state.one_more_of_the_same(line)
37
+ else @state.other(line)
38
+ end
39
+ end
40
+
41
+ def init_story(title)
42
+ @current_story_lines.clear
43
+ add_story_line(title)
44
+ end
45
+
46
+ def add_story_line(line)
47
+ @current_story_lines << line
48
+ end
49
+
50
+ def create_story()
51
+ unless @current_story_lines.empty?
52
+ @story_mediator.create_story(@current_story_lines[0].gsub("Story: ",""), @current_story_lines[1..-1].join("\n"))
53
+ @current_story_lines.clear
54
+ end
55
+ end
56
+
57
+ def create_scenario(title)
58
+ @story_mediator.create_scenario(title.gsub("Scenario: ",""))
59
+ end
60
+
61
+ def create_given(name)
62
+ @story_mediator.create_given(name)
63
+ end
64
+
65
+ def create_given_scenario(name)
66
+ @story_mediator.create_given_scenario(name)
67
+ end
68
+
69
+ def create_when(name)
70
+ @story_mediator.create_when(name)
71
+ end
72
+
73
+ def create_then(name)
74
+ @story_mediator.create_then(name)
75
+ end
76
+
77
+ def add_to_last(line)
78
+ @story_mediator.add_to_last("\n#{line}")
79
+ end
80
+
81
+ def transition_to(key)
82
+ @state = states[key]
83
+ end
84
+
85
+ def states
86
+ @states ||= {
87
+ :starting_state => StartingState.new(self),
88
+ :story_state => StoryState.new(self),
89
+ :scenario_state => ScenarioState.new(self),
90
+ :given_state => GivenState.new(self),
91
+ :when_state => WhenState.new(self),
92
+ :then_state => ThenState.new(self)
93
+ }
94
+ end
95
+
96
+ class State
97
+ def initialize(parser)
98
+ @parser = parser
99
+ end
100
+
101
+ def story(line)
102
+ @parser.init_story(line)
103
+ @parser.transition_to(:story_state)
104
+ end
105
+
106
+ def scenario(line)
107
+ @parser.create_scenario(line)
108
+ @parser.transition_to(:scenario_state)
109
+ end
110
+
111
+ def given(line)
112
+ @parser.create_given(remove_tag_from(:given, line))
113
+ @parser.transition_to(:given_state)
114
+ end
115
+
116
+ def given_scenario(line)
117
+ @parser.create_given_scenario(remove_tag_from(:givenscenario, line))
118
+ @parser.transition_to(:given_state)
119
+ end
120
+
121
+ def event(line)
122
+ @parser.create_when(remove_tag_from(:when, line))
123
+ @parser.transition_to(:when_state)
124
+ end
125
+
126
+ def outcome(line)
127
+ @parser.create_then(remove_tag_from(:then, line))
128
+ @parser.transition_to(:then_state)
129
+ end
130
+
131
+ def remove_tag_from(tag, line)
132
+ tokens = line.split
133
+ # validation of tag can go here
134
+ tokens[0].downcase.match(/#{tag.to_s}:?/) ?
135
+ (tokens[1..-1].join(' ')) : line
136
+ end
137
+
138
+ def eof
139
+ end
140
+
141
+ def other(line)
142
+ # no-op - supports header text before the first story in a file
143
+ end
144
+
145
+ def comment(line)
146
+ end
147
+ end
148
+
149
+ class StartingState < State
150
+ def initialize(parser)
151
+ @parser = parser
152
+ end
153
+ end
154
+
155
+ class StoryState < State
156
+ def one_more_of_the_same(line)
157
+ other(line)
158
+ end
159
+
160
+ def story(line)
161
+ @parser.create_story
162
+ @parser.add_story_line(line)
163
+ end
164
+
165
+ def scenario(line)
166
+ @parser.create_story
167
+ @parser.create_scenario(line)
168
+ @parser.transition_to(:scenario_state)
169
+ end
170
+
171
+ def given(line)
172
+ other(line)
173
+ end
174
+
175
+ def event(line)
176
+ other(line)
177
+ end
178
+
179
+ def outcome(line)
180
+ other(line)
181
+ end
182
+
183
+ def other(line)
184
+ @parser.add_story_line(line)
185
+ end
186
+
187
+ def eof
188
+ @parser.create_story
189
+ end
190
+ end
191
+
192
+ class ScenarioState < State
193
+ def one_more_of_the_same(line)
194
+ raise IllegalStepError.new("Scenario", "And")
195
+ end
196
+
197
+ def scenario(line)
198
+ @parser.create_scenario(line)
199
+ end
200
+ end
201
+
202
+ class GivenState < State
203
+ def one_more_of_the_same(line)
204
+ @parser.create_given(remove_tag_from(:and, line))
205
+ end
206
+
207
+ def given(line)
208
+ @parser.create_given(remove_tag_from(:given, line))
209
+ end
210
+
211
+ def other(line)
212
+ @parser.add_to_last(line)
213
+ end
214
+ end
215
+
216
+ class WhenState < State
217
+ def one_more_of_the_same(line)
218
+ @parser.create_when(remove_tag_from(:and ,line))
219
+ end
220
+
221
+ def event(line)
222
+ @parser.create_when(remove_tag_from(:when ,line))
223
+ end
224
+
225
+ def other(line)
226
+ @parser.add_to_last(line)
227
+ end
228
+ end
229
+
230
+ class ThenState < State
231
+ def one_more_of_the_same(line)
232
+ @parser.create_then(remove_tag_from(:and ,line))
233
+ end
234
+
235
+ def outcome(line)
236
+ @parser.create_then(remove_tag_from(:then ,line))
237
+ end
238
+
239
+ def other(line)
240
+ @parser.add_to_last(line)
241
+ end
242
+ end
243
+
244
+ end
245
+ end
246
+ end
247
+ end