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,28 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module Matchers
5
+ describe Eql do
6
+ it "should match when actual.eql?(expected)" do
7
+ Eql.new(1).matches?(1).should be_true
8
+ end
9
+ it "should not match when !actual.eql?(expected)" do
10
+ Eql.new(1).matches?(2).should be_false
11
+ end
12
+ it "should describe itself" do
13
+ matcher = Eql.new(1)
14
+ matcher.description.should == "eql 1"
15
+ end
16
+ it "should provide message, expected and actual on #failure_message" do
17
+ matcher = Eql.new("1")
18
+ matcher.matches?(1)
19
+ matcher.failure_message.should == ["expected \"1\", got 1 (using .eql?)", "1", 1]
20
+ end
21
+ it "should provide message, expected and actual on #negative_failure_message" do
22
+ matcher = Eql.new(1)
23
+ matcher.matches?(1)
24
+ matcher.negative_failure_message.should == ["expected 1 not to equal 1 (using .eql?)", 1, 1]
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,28 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module Matchers
5
+ describe Equal do
6
+ it "should match when actual.equal?(expected)" do
7
+ Equal.new(1).matches?(1).should be_true
8
+ end
9
+ it "should not match when !actual.equal?(expected)" do
10
+ Equal.new("1").matches?("1").should be_false
11
+ end
12
+ it "should describe itself" do
13
+ matcher = Equal.new(1)
14
+ matcher.description.should == "equal 1"
15
+ end
16
+ it "should provide message, expected and actual on #failure_message" do
17
+ matcher = Equal.new("1")
18
+ matcher.matches?(1)
19
+ matcher.failure_message.should == ["expected \"1\", got 1 (using .equal?)", "1", 1]
20
+ end
21
+ it "should provide message, expected and actual on #negative_failure_message" do
22
+ matcher = Equal.new(1)
23
+ matcher.matches?(1)
24
+ matcher.negative_failure_message.should == ["expected 1 not to equal 1 (using .equal?)", 1, 1]
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,57 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ class Substance
4
+ def initialize exists, description
5
+ @exists = exists
6
+ @description = description
7
+ end
8
+ def exist?
9
+ @exists
10
+ end
11
+ def inspect
12
+ @description
13
+ end
14
+ end
15
+
16
+ class SubstanceTester
17
+ include Spec::Matchers
18
+ def initialize substance
19
+ @substance = substance
20
+ end
21
+ def should_exist
22
+ @substance.should exist
23
+ end
24
+ end
25
+
26
+ describe "should exist," do
27
+
28
+ before(:each) do
29
+ @real = Substance.new true, 'something real'
30
+ @imaginary = Substance.new false, 'something imaginary'
31
+ end
32
+
33
+ describe "within an example group" do
34
+
35
+ it "should pass if target exists" do
36
+ @real.should exist
37
+ end
38
+
39
+ it "should fail if target does not exist" do
40
+ lambda { @imaginary.should exist }.should fail
41
+ end
42
+
43
+ it "should pass if target doesn't exist" do
44
+ lambda { @real.should_not exist }.should fail
45
+ end
46
+ end
47
+
48
+ describe "outside of an example group" do
49
+
50
+ it "should pass if target exists" do
51
+ real_tester = SubstanceTester.new @real
52
+ real_tester.should_exist
53
+ end
54
+
55
+ end
56
+
57
+ end
@@ -0,0 +1,150 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module ExampleExpectations
4
+
5
+ class ArbitraryMatcher
6
+ def initialize(*args, &block)
7
+ if args.last.is_a? Hash
8
+ @expected = args.last[:expected]
9
+ end
10
+ if block_given?
11
+ @expected = block.call
12
+ end
13
+ @block = block
14
+ end
15
+
16
+ def matches?(target)
17
+ @target = target
18
+ return @expected == target
19
+ end
20
+
21
+ def with(new_value)
22
+ @expected = new_value
23
+ self
24
+ end
25
+
26
+ def failure_message
27
+ "expected #{@expected}, got #{@target}"
28
+ end
29
+
30
+ def negative_failure_message
31
+ "expected not #{@expected}, got #{@target}"
32
+ end
33
+ end
34
+
35
+ class PositiveOnlyMatcher < ArbitraryMatcher
36
+ undef negative_failure_message rescue nil
37
+ end
38
+
39
+ def arbitrary_matcher(*args, &block)
40
+ ArbitraryMatcher.new(*args, &block)
41
+ end
42
+
43
+ def positive_only_matcher(*args, &block)
44
+ PositiveOnlyMatcher.new(*args, &block)
45
+ end
46
+
47
+ end
48
+
49
+ module Spec
50
+ module Expectations
51
+ describe ExpectationMatcherHandler do
52
+ describe "#handle_matcher" do
53
+ it "should ask the matcher if it matches" do
54
+ matcher = mock("matcher")
55
+ actual = Object.new
56
+ matcher.should_receive(:matches?).with(actual).and_return(true)
57
+ ExpectationMatcherHandler.handle_matcher(actual, matcher)
58
+ end
59
+
60
+ it "should explain when the matcher parameter is not a matcher" do
61
+ begin
62
+ nonmatcher = mock("nonmatcher")
63
+ actual = Object.new
64
+ ExpectationMatcherHandler.handle_matcher(actual, nonmatcher)
65
+ rescue Spec::Expectations::InvalidMatcherError => e
66
+ end
67
+
68
+ e.message.should =~ /^Expected a matcher, got /
69
+ end
70
+
71
+ it "should return the match value" do
72
+ matcher = mock("matcher")
73
+ actual = Object.new
74
+ matcher.should_receive(:matches?).with(actual).and_return(:this_value)
75
+ ExpectationMatcherHandler.handle_matcher(actual, matcher).should == :this_value
76
+ end
77
+ end
78
+ end
79
+
80
+ describe NegativeExpectationMatcherHandler do
81
+ describe "#handle_matcher" do
82
+ it "should explain when matcher does not support should_not" do
83
+ matcher = mock("matcher")
84
+ matcher.stub!(:matches?)
85
+ actual = Object.new
86
+ lambda {
87
+ NegativeExpectationMatcherHandler.handle_matcher(actual, matcher)
88
+ }.should fail_with(/Matcher does not support should_not.\n/)
89
+ end
90
+
91
+ it "should ask the matcher if it matches" do
92
+ matcher = mock("matcher")
93
+ actual = Object.new
94
+ matcher.stub!(:negative_failure_message)
95
+ matcher.should_receive(:matches?).with(actual).and_return(false)
96
+ NegativeExpectationMatcherHandler.handle_matcher(actual, matcher)
97
+ end
98
+
99
+ it "should explain when the matcher parameter is not a matcher" do
100
+ begin
101
+ nonmatcher = mock("nonmatcher")
102
+ actual = Object.new
103
+ NegativeExpectationMatcherHandler.handle_matcher(actual, nonmatcher)
104
+ rescue Spec::Expectations::InvalidMatcherError => e
105
+ end
106
+
107
+ e.message.should =~ /^Expected a matcher, got /
108
+ end
109
+
110
+
111
+ it "should return the match value" do
112
+ matcher = mock("matcher")
113
+ actual = Object.new
114
+ matcher.should_receive(:matches?).with(actual).and_return(false)
115
+ matcher.stub!(:negative_failure_message).and_return("ignore")
116
+ NegativeExpectationMatcherHandler.handle_matcher(actual, matcher).should be_false
117
+ end
118
+ end
119
+ end
120
+
121
+ describe ExpectationMatcherHandler do
122
+ include ExampleExpectations
123
+
124
+ it "should handle submitted args" do
125
+ 5.should arbitrary_matcher(:expected => 5)
126
+ 5.should arbitrary_matcher(:expected => "wrong").with(5)
127
+ lambda { 5.should arbitrary_matcher(:expected => 4) }.should fail_with("expected 4, got 5")
128
+ lambda { 5.should arbitrary_matcher(:expected => 5).with(4) }.should fail_with("expected 4, got 5")
129
+ 5.should_not arbitrary_matcher(:expected => 4)
130
+ 5.should_not arbitrary_matcher(:expected => 5).with(4)
131
+ lambda { 5.should_not arbitrary_matcher(:expected => 5) }.should fail_with("expected not 5, got 5")
132
+ lambda { 5.should_not arbitrary_matcher(:expected => 4).with(5) }.should fail_with("expected not 5, got 5")
133
+ end
134
+
135
+ it "should handle the submitted block" do
136
+ 5.should arbitrary_matcher { 5 }
137
+ 5.should arbitrary_matcher(:expected => 4) { 5 }
138
+ 5.should arbitrary_matcher(:expected => 4).with(5) { 3 }
139
+ end
140
+
141
+ it "should explain when matcher does not support should_not" do
142
+ lambda {
143
+ 5.should_not positive_only_matcher(:expected => 5)
144
+ }.should fail_with(/Matcher does not support should_not.\n/)
145
+ end
146
+
147
+
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,63 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ describe "should have_sym(*args)" do
4
+ it "should pass if #has_sym?(*args) returns true" do
5
+ {:a => "A"}.should have_key(:a)
6
+ end
7
+
8
+ it "should fail if #has_sym?(*args) returns false" do
9
+ lambda {
10
+ {:b => "B"}.should have_key(:a)
11
+ }.should fail_with("expected #has_key?(:a) to return true, got false")
12
+ end
13
+
14
+ it "should fail if target does not respond to #has_sym?" do
15
+ lambda {
16
+ Object.new.should have_key(:a)
17
+ }.should raise_error(NoMethodError)
18
+ end
19
+
20
+ it "should reraise an exception thrown in #has_sym?(*args)" do
21
+ o = Object.new
22
+ def o.has_sym?(*args)
23
+ raise "Funky exception"
24
+ end
25
+ lambda { o.should have_sym(:foo) }.should raise_error("Funky exception")
26
+ end
27
+ end
28
+
29
+ describe "should_not have_sym(*args)" do
30
+ it "should pass if #has_sym?(*args) returns false" do
31
+ {:a => "A"}.should_not have_key(:b)
32
+ end
33
+
34
+ it "should fail if #has_sym?(*args) returns true" do
35
+ lambda {
36
+ {:a => "A"}.should_not have_key(:a)
37
+ }.should fail_with("expected #has_key?(:a) to return false, got true")
38
+ end
39
+
40
+ it "should fail if target does not respond to #has_sym?" do
41
+ lambda {
42
+ Object.new.should have_key(:a)
43
+ }.should raise_error(NoMethodError)
44
+ end
45
+
46
+ it "should reraise an exception thrown in #has_sym?(*args)" do
47
+ o = Object.new
48
+ def o.has_sym?(*args)
49
+ raise "Funky exception"
50
+ end
51
+ lambda { o.should_not have_sym(:foo) }.should raise_error("Funky exception")
52
+ end
53
+ end
54
+
55
+ describe Spec::Matchers::Has do
56
+ it "should work when the target implements #send" do
57
+ o = {:a => "A"}
58
+ def o.send(*args); raise "DOH! Library developers shouldn't use #send!" end
59
+ lambda {
60
+ o.should have_key(:a)
61
+ }.should_not raise_error
62
+ end
63
+ end
@@ -0,0 +1,394 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module HaveSpecHelper
4
+ def create_collection_owner_with(n)
5
+ owner = Spec::Expectations::Helper::CollectionOwner.new
6
+ (1..n).each do |n|
7
+ owner.add_to_collection_with_length_method(n)
8
+ owner.add_to_collection_with_size_method(n)
9
+ end
10
+ owner
11
+ end
12
+ end
13
+
14
+ describe "should have(n).items" do
15
+ include HaveSpecHelper
16
+
17
+ it "should pass if target has a collection of items with n members" do
18
+ owner = create_collection_owner_with(3)
19
+ owner.should have(3).items_in_collection_with_length_method
20
+ owner.should have(3).items_in_collection_with_size_method
21
+ end
22
+
23
+ it "should convert :no to 0" do
24
+ owner = create_collection_owner_with(0)
25
+ owner.should have(:no).items_in_collection_with_length_method
26
+ owner.should have(:no).items_in_collection_with_size_method
27
+ end
28
+
29
+ it "should fail if target has a collection of items with < n members" do
30
+ owner = create_collection_owner_with(3)
31
+ lambda {
32
+ owner.should have(4).items_in_collection_with_length_method
33
+ }.should fail_with("expected 4 items_in_collection_with_length_method, got 3")
34
+ lambda {
35
+ owner.should have(4).items_in_collection_with_size_method
36
+ }.should fail_with("expected 4 items_in_collection_with_size_method, got 3")
37
+ end
38
+
39
+ it "should fail if target has a collection of items with > n members" do
40
+ owner = create_collection_owner_with(3)
41
+ lambda {
42
+ owner.should have(2).items_in_collection_with_length_method
43
+ }.should fail_with("expected 2 items_in_collection_with_length_method, got 3")
44
+ lambda {
45
+ owner.should have(2).items_in_collection_with_size_method
46
+ }.should fail_with("expected 2 items_in_collection_with_size_method, got 3")
47
+ end
48
+ end
49
+
50
+ describe 'should have(1).item when ActiveSupport::Inflector is defined' do
51
+ include HaveSpecHelper
52
+
53
+ before(:each) do
54
+ unless defined?(ActiveSupport::Inflector)
55
+ @active_support_was_not_defined
56
+ module ActiveSupport
57
+ class Inflector
58
+ def self.pluralize(string)
59
+ string.to_s + 's'
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ it 'should pluralize the collection name' do
67
+ owner = create_collection_owner_with(1)
68
+ owner.should have(1).item
69
+ end
70
+
71
+ after(:each) do
72
+ if @active_support_was_not_defined
73
+ Object.send :remove_const, :ActiveSupport
74
+ end
75
+ end
76
+ end
77
+
78
+ describe 'should have(1).item when Inflector is defined' do
79
+ include HaveSpecHelper
80
+
81
+ before(:each) do
82
+ unless defined?(Inflector)
83
+ @inflector_was_not_defined
84
+ class Inflector
85
+ def self.pluralize(string)
86
+ string.to_s + 's'
87
+ end
88
+ end
89
+ end
90
+ end
91
+
92
+ it 'should pluralize the collection name' do
93
+ owner = create_collection_owner_with(1)
94
+ owner.should have(1).item
95
+ end
96
+
97
+ after(:each) do
98
+ if @inflector_was_not_defined
99
+ Object.send :remove_const, :Inflector
100
+ end
101
+ end
102
+ end
103
+
104
+ describe "should have(n).items where result responds to items but returns something other than a collection" do
105
+ it "should provide a meaningful error" do
106
+ owner = Class.new do
107
+ def items
108
+ Object.new
109
+ end
110
+ end.new
111
+ lambda do
112
+ owner.should have(3).items
113
+ end.should raise_error("expected items to be a collection but it does not respond to #length or #size")
114
+ end
115
+ end
116
+
117
+ describe "should_not have(n).items" do
118
+ include HaveSpecHelper
119
+
120
+ it "should pass if target has a collection of items with < n members" do
121
+ owner = create_collection_owner_with(3)
122
+ owner.should_not have(4).items_in_collection_with_length_method
123
+ owner.should_not have(4).items_in_collection_with_size_method
124
+ end
125
+
126
+ it "should pass if target has a collection of items with > n members" do
127
+ owner = create_collection_owner_with(3)
128
+ owner.should_not have(2).items_in_collection_with_length_method
129
+ owner.should_not have(2).items_in_collection_with_size_method
130
+ end
131
+
132
+ it "should fail if target has a collection of items with n members" do
133
+ owner = create_collection_owner_with(3)
134
+ lambda {
135
+ owner.should_not have(3).items_in_collection_with_length_method
136
+ }.should fail_with("expected target not to have 3 items_in_collection_with_length_method, got 3")
137
+ lambda {
138
+ owner.should_not have(3).items_in_collection_with_size_method
139
+ }.should fail_with("expected target not to have 3 items_in_collection_with_size_method, got 3")
140
+ end
141
+ end
142
+
143
+ describe "should have_exactly(n).items" do
144
+ include HaveSpecHelper
145
+
146
+ it "should pass if target has a collection of items with n members" do
147
+ owner = create_collection_owner_with(3)
148
+ owner.should have_exactly(3).items_in_collection_with_length_method
149
+ owner.should have_exactly(3).items_in_collection_with_size_method
150
+ end
151
+
152
+ it "should convert :no to 0" do
153
+ owner = create_collection_owner_with(0)
154
+ owner.should have_exactly(:no).items_in_collection_with_length_method
155
+ owner.should have_exactly(:no).items_in_collection_with_size_method
156
+ end
157
+
158
+ it "should fail if target has a collection of items with < n members" do
159
+ owner = create_collection_owner_with(3)
160
+ lambda {
161
+ owner.should have_exactly(4).items_in_collection_with_length_method
162
+ }.should fail_with("expected 4 items_in_collection_with_length_method, got 3")
163
+ lambda {
164
+ owner.should have_exactly(4).items_in_collection_with_size_method
165
+ }.should fail_with("expected 4 items_in_collection_with_size_method, got 3")
166
+ end
167
+
168
+ it "should fail if target has a collection of items with > n members" do
169
+ owner = create_collection_owner_with(3)
170
+ lambda {
171
+ owner.should have_exactly(2).items_in_collection_with_length_method
172
+ }.should fail_with("expected 2 items_in_collection_with_length_method, got 3")
173
+ lambda {
174
+ owner.should have_exactly(2).items_in_collection_with_size_method
175
+ }.should fail_with("expected 2 items_in_collection_with_size_method, got 3")
176
+ end
177
+ end
178
+
179
+ describe "should have_at_least(n).items" do
180
+ include HaveSpecHelper
181
+
182
+ it "should pass if target has a collection of items with n members" do
183
+ owner = create_collection_owner_with(3)
184
+ owner.should have_at_least(3).items_in_collection_with_length_method
185
+ owner.should have_at_least(3).items_in_collection_with_size_method
186
+ end
187
+
188
+ it "should pass if target has a collection of items with > n members" do
189
+ owner = create_collection_owner_with(3)
190
+ owner.should have_at_least(2).items_in_collection_with_length_method
191
+ owner.should have_at_least(2).items_in_collection_with_size_method
192
+ end
193
+
194
+ it "should fail if target has a collection of items with < n members" do
195
+ owner = create_collection_owner_with(3)
196
+ lambda {
197
+ owner.should have_at_least(4).items_in_collection_with_length_method
198
+ }.should fail_with("expected at least 4 items_in_collection_with_length_method, got 3")
199
+ lambda {
200
+ owner.should have_at_least(4).items_in_collection_with_size_method
201
+ }.should fail_with("expected at least 4 items_in_collection_with_size_method, got 3")
202
+ end
203
+
204
+ it "should provide educational negative failure messages" do
205
+ #given
206
+ owner = create_collection_owner_with(3)
207
+ length_matcher = have_at_least(3).items_in_collection_with_length_method
208
+ size_matcher = have_at_least(3).items_in_collection_with_size_method
209
+
210
+ #when
211
+ length_matcher.matches?(owner)
212
+ size_matcher.matches?(owner)
213
+
214
+ #then
215
+ length_matcher.negative_failure_message.should == <<-EOF
216
+ Isn't life confusing enough?
217
+ Instead of having to figure out the meaning of this:
218
+ should_not have_at_least(3).items_in_collection_with_length_method
219
+ We recommend that you use this instead:
220
+ should have_at_most(2).items_in_collection_with_length_method
221
+ EOF
222
+
223
+ size_matcher.negative_failure_message.should == <<-EOF
224
+ Isn't life confusing enough?
225
+ Instead of having to figure out the meaning of this:
226
+ should_not have_at_least(3).items_in_collection_with_size_method
227
+ We recommend that you use this instead:
228
+ should have_at_most(2).items_in_collection_with_size_method
229
+ EOF
230
+ end
231
+ end
232
+
233
+ describe "should have_at_most(n).items" do
234
+ include HaveSpecHelper
235
+
236
+ it "should pass if target has a collection of items with n members" do
237
+ owner = create_collection_owner_with(3)
238
+ owner.should have_at_most(3).items_in_collection_with_length_method
239
+ owner.should have_at_most(3).items_in_collection_with_size_method
240
+ end
241
+
242
+ it "should fail if target has a collection of items with > n members" do
243
+ owner = create_collection_owner_with(3)
244
+ lambda {
245
+ owner.should have_at_most(2).items_in_collection_with_length_method
246
+ }.should fail_with("expected at most 2 items_in_collection_with_length_method, got 3")
247
+ lambda {
248
+ owner.should have_at_most(2).items_in_collection_with_size_method
249
+ }.should fail_with("expected at most 2 items_in_collection_with_size_method, got 3")
250
+ end
251
+
252
+ it "should pass if target has a collection of items with < n members" do
253
+ owner = create_collection_owner_with(3)
254
+ owner.should have_at_most(4).items_in_collection_with_length_method
255
+ owner.should have_at_most(4).items_in_collection_with_size_method
256
+ end
257
+
258
+ it "should provide educational negative failure messages" do
259
+ #given
260
+ owner = create_collection_owner_with(3)
261
+ length_matcher = have_at_most(3).items_in_collection_with_length_method
262
+ size_matcher = have_at_most(3).items_in_collection_with_size_method
263
+
264
+ #when
265
+ length_matcher.matches?(owner)
266
+ size_matcher.matches?(owner)
267
+
268
+ #then
269
+ length_matcher.negative_failure_message.should == <<-EOF
270
+ Isn't life confusing enough?
271
+ Instead of having to figure out the meaning of this:
272
+ should_not have_at_most(3).items_in_collection_with_length_method
273
+ We recommend that you use this instead:
274
+ should have_at_least(4).items_in_collection_with_length_method
275
+ EOF
276
+
277
+ size_matcher.negative_failure_message.should == <<-EOF
278
+ Isn't life confusing enough?
279
+ Instead of having to figure out the meaning of this:
280
+ should_not have_at_most(3).items_in_collection_with_size_method
281
+ We recommend that you use this instead:
282
+ should have_at_least(4).items_in_collection_with_size_method
283
+ EOF
284
+ end
285
+ end
286
+
287
+ describe "have(n).items(args, block)" do
288
+ it "should pass args to target" do
289
+ target = mock("target")
290
+ target.should_receive(:items).with("arg1","arg2").and_return([1,2,3])
291
+ target.should have(3).items("arg1","arg2")
292
+ end
293
+
294
+ it "should pass block to target" do
295
+ target = mock("target")
296
+ block = lambda { 5 }
297
+ target.should_receive(:items).with("arg1","arg2", block).and_return([1,2,3])
298
+ target.should have(3).items("arg1","arg2", block)
299
+ end
300
+ end
301
+
302
+ describe "have(n).items where target IS a collection" do
303
+ it "should reference the number of items IN the collection" do
304
+ [1,2,3].should have(3).items
305
+ end
306
+
307
+ it "should fail when the number of items IN the collection is not as expected" do
308
+ lambda { [1,2,3].should have(7).items }.should fail_with("expected 7 items, got 3")
309
+ end
310
+ end
311
+
312
+ describe "have(n).characters where target IS a String" do
313
+ it "should pass if the length is correct" do
314
+ "this string".should have(11).characters
315
+ end
316
+
317
+ it "should fail if the length is incorrect" do
318
+ lambda { "this string".should have(12).characters }.should fail_with("expected 12 characters, got 11")
319
+ end
320
+ end
321
+
322
+ describe "have(n).things on an object which is not a collection nor contains one" do
323
+ it "should fail" do
324
+ lambda { Object.new.should have(2).things }.should raise_error(NoMethodError, /undefined method `things' for #<Object:/)
325
+ end
326
+ end
327
+
328
+ describe Spec::Matchers::Have, "for a collection owner that implements #send" do
329
+ include HaveSpecHelper
330
+
331
+ before(:each) do
332
+ @collection = Object.new
333
+ def @collection.floozles; [1,2] end
334
+ def @collection.send(*args); raise "DOH! Library developers shouldn't use #send!" end
335
+ end
336
+
337
+ it "should work in the straightforward case" do
338
+ lambda {
339
+ @collection.should have(2).floozles
340
+ }.should_not raise_error
341
+ end
342
+
343
+ it "should work when doing automatic pluralization" do
344
+ lambda {
345
+ @collection.should have_at_least(1).floozle
346
+ }.should_not raise_error
347
+ end
348
+
349
+ it "should blow up when the owner doesn't respond to that method" do
350
+ lambda {
351
+ @collection.should have(99).problems
352
+ }.should raise_error(NoMethodError, /problems/)
353
+ end
354
+ end
355
+
356
+ module Spec
357
+ module Matchers
358
+ describe Have do
359
+ it "should have method_missing as private" do
360
+ Have.private_instance_methods.should include("method_missing")
361
+ end
362
+
363
+ describe "respond_to?" do
364
+ before :each do
365
+ @have = Have.new(:foo)
366
+ @a_method_which_have_defines = Have.instance_methods.first
367
+ @a_method_which_object_defines = Object.instance_methods.first
368
+ end
369
+
370
+ it "should be true for a method which Have defines" do
371
+ @have.should respond_to(@a_method_which_have_defines)
372
+ end
373
+
374
+ it "should be true for a method that it's superclass (Object) defines" do
375
+ @have.should respond_to(@a_method_which_object_defines)
376
+ end
377
+
378
+ it "should be false for a method which neither Object nor nor Have defines" do
379
+ @have.should_not respond_to(:foo_bar_baz)
380
+ end
381
+
382
+ it "should be false if the owner doesn't respond to the method" do
383
+ have = Have.new(99)
384
+ have.should_not respond_to(:problems)
385
+ end
386
+
387
+ it "should be true if the owner responds to the method" do
388
+ have = Have.new(:a_symbol)
389
+ have.should respond_to(:to_sym)
390
+ end
391
+ end
392
+ end
393
+ end
394
+ end