rspec 1.0.8 → 1.1.0

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 (301) hide show
  1. data/CHANGES +122 -2
  2. data/README +10 -9
  3. data/Rakefile +22 -49
  4. data/TODO +2 -0
  5. data/bin/spec +1 -1
  6. data/bin/spec_translator +8 -8
  7. data/examples/{auto_spec_description_example.rb → pure/autogenerated_docstrings_example.rb} +0 -0
  8. data/examples/{before_and_after_example.rb → pure/before_and_after_example.rb} +1 -0
  9. data/examples/{behave_as_example.rb → pure/behave_as_example.rb} +0 -0
  10. data/examples/{custom_expectation_matchers.rb → pure/custom_expectation_matchers.rb} +0 -0
  11. data/examples/{custom_formatter.rb → pure/custom_formatter.rb} +1 -0
  12. data/examples/{dynamic_spec.rb → pure/dynamic_spec.rb} +0 -0
  13. data/examples/{file_accessor.rb → pure/file_accessor.rb} +1 -0
  14. data/examples/{file_accessor_spec.rb → pure/file_accessor_spec.rb} +0 -0
  15. data/examples/{greeter_spec.rb → pure/greeter_spec.rb} +1 -0
  16. data/examples/{helper_method_example.rb → pure/helper_method_example.rb} +0 -0
  17. data/examples/{io_processor.rb → pure/io_processor.rb} +0 -0
  18. data/examples/{io_processor_spec.rb → pure/io_processor_spec.rb} +0 -0
  19. data/examples/{legacy_spec.rb → pure/legacy_spec.rb} +1 -0
  20. data/examples/{mocking_example.rb → pure/mocking_example.rb} +0 -0
  21. data/examples/pure/multi_threaded_behaviour_runner.rb +28 -0
  22. data/examples/pure/nested_classes_example.rb +36 -0
  23. data/examples/{partial_mock_example.rb → pure/partial_mock_example.rb} +0 -0
  24. data/examples/{pending_example.rb → pure/pending_example.rb} +0 -0
  25. data/examples/{predicate_example.rb → pure/predicate_example.rb} +0 -0
  26. data/examples/{priority.txt → pure/priority.txt} +0 -0
  27. data/examples/pure/shared_example_group_example.rb +66 -0
  28. data/examples/pure/shared_stack_examples.rb +38 -0
  29. data/examples/pure/spec_helper.rb +3 -0
  30. data/examples/{stack.rb → pure/stack.rb} +0 -0
  31. data/examples/{stack_spec.rb → pure/stack_spec.rb} +1 -35
  32. data/examples/pure/stack_spec_with_nested_example_groups.rb +67 -0
  33. data/examples/{stubbing_example.rb → pure/stubbing_example.rb} +0 -0
  34. data/examples/stories/adder.rb +13 -0
  35. data/examples/stories/addition +34 -0
  36. data/examples/stories/addition.rb +9 -0
  37. data/examples/stories/calculator.rb +65 -0
  38. data/examples/stories/game-of-life/README.txt +21 -0
  39. data/examples/stories/game-of-life/behaviour/everything.rb +6 -0
  40. data/examples/stories/game-of-life/behaviour/examples/examples.rb +3 -0
  41. data/examples/stories/game-of-life/behaviour/examples/game_behaviour.rb +35 -0
  42. data/examples/stories/game-of-life/behaviour/examples/grid_behaviour.rb +66 -0
  43. data/examples/stories/game-of-life/behaviour/stories/CellsWithLessThanTwoNeighboursDie.story +21 -0
  44. data/examples/stories/game-of-life/behaviour/stories/CellsWithMoreThanThreeNeighboursDie.story +21 -0
  45. data/examples/stories/game-of-life/behaviour/stories/EmptySpacesWithThreeNeighboursCreateACell.story +42 -0
  46. data/examples/stories/game-of-life/behaviour/stories/ICanCreateACell.story +42 -0
  47. data/examples/stories/game-of-life/behaviour/stories/ICanKillACell.story +17 -0
  48. data/examples/stories/game-of-life/behaviour/stories/TheGridWraps.story +53 -0
  49. data/examples/stories/game-of-life/behaviour/stories/create_a_cell.rb +52 -0
  50. data/examples/stories/game-of-life/behaviour/stories/helper.rb +6 -0
  51. data/examples/stories/game-of-life/behaviour/stories/kill_a_cell.rb +26 -0
  52. data/examples/stories/game-of-life/behaviour/stories/steps.rb +5 -0
  53. data/examples/stories/game-of-life/behaviour/stories/stories.rb +3 -0
  54. data/examples/stories/game-of-life/behaviour/stories/stories.txt +22 -0
  55. data/examples/stories/game-of-life/life.rb +3 -0
  56. data/examples/stories/game-of-life/life/game.rb +23 -0
  57. data/examples/stories/game-of-life/life/grid.rb +43 -0
  58. data/examples/stories/helper.rb +9 -0
  59. data/examples/stories/steps/addition_steps.rb +18 -0
  60. data/lib/autotest/rspec.rb +1 -2
  61. data/lib/spec.rb +30 -6
  62. data/lib/spec/example.rb +12 -0
  63. data/lib/spec/{dsl → example}/configuration.rb +48 -39
  64. data/lib/spec/{dsl → example}/errors.rb +2 -2
  65. data/lib/spec/example/example_group.rb +16 -0
  66. data/lib/spec/example/example_group_factory.rb +62 -0
  67. data/lib/spec/example/example_group_methods.rb +412 -0
  68. data/lib/spec/example/example_matcher.rb +42 -0
  69. data/lib/spec/example/example_methods.rb +101 -0
  70. data/lib/spec/example/module_reopening_fix.rb +21 -0
  71. data/lib/spec/example/pending.rb +18 -0
  72. data/lib/spec/example/shared_example_group.rb +58 -0
  73. data/lib/spec/expectations/differs/default.rb +15 -10
  74. data/lib/spec/expectations/errors.rb +7 -1
  75. data/lib/spec/expectations/extensions/object.rb +12 -7
  76. data/lib/spec/expectations/handler.rb +13 -4
  77. data/lib/spec/extensions.rb +2 -0
  78. data/lib/spec/extensions/class.rb +24 -0
  79. data/lib/spec/extensions/main.rb +54 -0
  80. data/lib/spec/extensions/object.rb +5 -1
  81. data/lib/spec/interop/test.rb +10 -0
  82. data/lib/spec/interop/test/unit/autorunner.rb +6 -0
  83. data/lib/spec/interop/test/unit/testcase.rb +61 -0
  84. data/lib/spec/interop/test/unit/testresult.rb +6 -0
  85. data/lib/spec/interop/test/unit/testsuite_adapter.rb +34 -0
  86. data/lib/spec/interop/test/unit/ui/console/testrunner.rb +60 -0
  87. data/lib/spec/matchers.rb +11 -15
  88. data/lib/spec/matchers/be.rb +23 -6
  89. data/lib/spec/matchers/change.rb +25 -1
  90. data/lib/spec/matchers/exist.rb +17 -0
  91. data/lib/spec/matchers/operator_matcher.rb +1 -0
  92. data/lib/spec/matchers/simple_matcher.rb +29 -0
  93. data/lib/spec/matchers/throw_symbol.rb +2 -0
  94. data/lib/spec/mocks.rb +5 -2
  95. data/lib/spec/mocks/argument_expectation.rb +1 -1
  96. data/lib/spec/mocks/message_expectation.rb +62 -44
  97. data/lib/spec/mocks/methods.rb +2 -2
  98. data/lib/spec/mocks/mock.rb +24 -3
  99. data/lib/spec/mocks/proxy.rb +26 -23
  100. data/lib/spec/mocks/space.rb +1 -1
  101. data/lib/spec/mocks/spec_methods.rb +20 -12
  102. data/lib/spec/rake/spectask.rb +19 -1
  103. data/lib/spec/rake/verify_rcov.rb +1 -1
  104. data/lib/spec/runner.rb +33 -10
  105. data/lib/spec/runner/backtrace_tweaker.rb +3 -3
  106. data/lib/spec/runner/class_and_arguments_parser.rb +16 -0
  107. data/lib/spec/runner/command_line.rb +18 -12
  108. data/lib/spec/runner/drb_command_line.rb +4 -5
  109. data/lib/spec/runner/example_group_runner.rb +59 -0
  110. data/lib/spec/runner/formatter/base_formatter.rb +10 -8
  111. data/lib/spec/runner/formatter/base_text_formatter.rb +18 -18
  112. data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +31 -0
  113. data/lib/spec/runner/formatter/failing_examples_formatter.rb +3 -5
  114. data/lib/spec/runner/formatter/html_formatter.rb +37 -27
  115. data/lib/spec/runner/formatter/profile_formatter.rb +47 -0
  116. data/lib/spec/runner/formatter/progress_bar_formatter.rb +3 -4
  117. data/lib/spec/runner/formatter/specdoc_formatter.rb +27 -13
  118. data/lib/spec/runner/formatter/story/html_formatter.rb +124 -0
  119. data/lib/spec/runner/formatter/story/plain_text_formatter.rb +123 -0
  120. data/lib/spec/runner/formatter/text_mate_formatter.rb +16 -0
  121. data/lib/spec/runner/heckle_runner.rb +9 -9
  122. data/lib/spec/runner/option_parser.rb +140 -138
  123. data/lib/spec/runner/options.rb +168 -90
  124. data/lib/spec/runner/reporter.rb +58 -40
  125. data/lib/spec/runner/spec_parser.rb +11 -8
  126. data/lib/spec/story.rb +10 -0
  127. data/lib/spec/story/extensions.rb +1 -0
  128. data/lib/spec/story/extensions/main.rb +86 -0
  129. data/lib/spec/story/given_scenario.rb +14 -0
  130. data/lib/spec/story/runner.rb +58 -0
  131. data/lib/spec/story/runner/plain_text_story_runner.rb +48 -0
  132. data/lib/spec/story/runner/scenario_collector.rb +18 -0
  133. data/lib/spec/story/runner/scenario_runner.rb +46 -0
  134. data/lib/spec/story/runner/story_mediator.rb +123 -0
  135. data/lib/spec/story/runner/story_parser.rb +227 -0
  136. data/lib/spec/story/runner/story_runner.rb +67 -0
  137. data/lib/spec/story/scenario.rb +14 -0
  138. data/lib/spec/story/step.rb +48 -0
  139. data/lib/spec/story/step_group.rb +89 -0
  140. data/lib/spec/story/step_mother.rb +37 -0
  141. data/lib/spec/story/story.rb +42 -0
  142. data/lib/spec/story/world.rb +124 -0
  143. data/lib/spec/version.rb +4 -5
  144. data/plugins/mock_frameworks/rspec.rb +1 -1
  145. data/spec/autotest/rspec_spec.rb +13 -7
  146. data/spec/autotest_helper.rb +4 -3
  147. data/spec/rspec_suite.rb +7 -0
  148. data/spec/ruby_forker.rb +13 -0
  149. data/spec/spec/example/configuration_spec.rb +290 -0
  150. data/spec/spec/example/example_group_class_definition_spec.rb +48 -0
  151. data/spec/spec/example/example_group_factory_spec.rb +129 -0
  152. data/spec/spec/example/example_group_methods_spec.rb +465 -0
  153. data/spec/spec/example/example_group_spec.rb +711 -0
  154. data/spec/spec/{dsl → example}/example_matcher_spec.rb +23 -18
  155. data/spec/spec/example/example_methods_spec.rb +75 -0
  156. data/spec/spec/example/example_runner_spec.rb +194 -0
  157. data/spec/spec/example/example_spec.rb +53 -0
  158. data/spec/spec/example/nested_example_group_spec.rb +59 -0
  159. data/spec/spec/example/pending_module_spec.rb +31 -0
  160. data/spec/spec/{dsl → example}/predicate_matcher_spec.rb +1 -1
  161. data/spec/spec/example/shared_example_group_spec.rb +265 -0
  162. data/spec/spec/example/subclassing_example_group_spec.rb +25 -0
  163. data/spec/spec/expectations/differs/default_spec.rb +5 -3
  164. data/spec/spec/expectations/extensions/object_spec.rb +63 -2
  165. data/spec/spec/extensions/main_spec.rb +50 -0
  166. data/spec/spec/interop/test/unit/test_unit_spec_helper.rb +14 -0
  167. data/spec/spec/interop/test/unit/testcase_spec.rb +10 -0
  168. data/spec/spec/interop/test/unit/testcase_spec_with_test_unit.rb +20 -0
  169. data/spec/spec/interop/test/unit/testsuite_adapter_spec.rb +9 -0
  170. data/spec/spec/interop/test/unit/testsuite_adapter_spec_with_test_unit.rb +34 -0
  171. data/spec/spec/matchers/be_spec.rb +15 -0
  172. data/spec/spec/matchers/change_spec.rb +87 -0
  173. data/spec/spec/matchers/description_generation_spec.rb +31 -37
  174. data/spec/spec/matchers/exist_spec.rb +31 -22
  175. data/spec/spec/matchers/handler_spec.rb +42 -1
  176. data/spec/spec/matchers/have_spec.rb +1 -1
  177. data/spec/spec/matchers/mock_constraint_matchers_spec.rb +1 -1
  178. data/spec/spec/matchers/operator_matcher_spec.rb +1 -1
  179. data/spec/spec/matchers/simple_matcher_spec.rb +31 -0
  180. data/spec/spec/matchers/throw_symbol_spec.rb +4 -1
  181. data/spec/spec/mocks/bug_report_10263.rb +24 -0
  182. data/spec/spec/mocks/bug_report_15719_spec.rb +30 -0
  183. data/spec/spec/mocks/bug_report_8165_spec.rb +2 -2
  184. data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +1 -0
  185. data/spec/spec/mocks/mock_spec.rb +200 -102
  186. data/spec/spec/mocks/multiple_return_value_spec.rb +1 -1
  187. data/spec/spec/mocks/options_hash_spec.rb +19 -7
  188. data/spec/spec/mocks/partial_mock_spec.rb +31 -9
  189. data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +6 -0
  190. data/spec/spec/mocks/stub_spec.rb +120 -98
  191. data/spec/spec/package/bin_spec_spec.rb +7 -5
  192. data/spec/spec/runner/class_and_argument_parser_spec.rb +23 -0
  193. data/spec/spec/runner/command_line_spec.rb +140 -27
  194. data/spec/spec/runner/drb_command_line_spec.rb +39 -31
  195. data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +44 -0
  196. data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +16 -11
  197. data/spec/spec/runner/formatter/html_formatter_spec.rb +60 -50
  198. data/spec/spec/runner/formatter/profile_formatter_spec.rb +65 -0
  199. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +29 -13
  200. data/spec/spec/runner/formatter/snippet_extractor_spec.rb +14 -7
  201. data/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +103 -0
  202. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +103 -39
  203. data/spec/spec/runner/formatter/story/html_formatter_spec.rb +56 -0
  204. data/spec/spec/runner/formatter/story/plain_text_formatter_spec.rb +289 -0
  205. data/spec/spec/runner/heckle_runner_spec.rb +29 -14
  206. data/spec/spec/runner/heckler_spec.rb +4 -5
  207. data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +5 -5
  208. data/spec/spec/runner/option_parser_spec.rb +86 -58
  209. data/spec/spec/runner/options_spec.rb +239 -120
  210. data/spec/spec/runner/output_one_time_fixture.rb +7 -0
  211. data/spec/spec/runner/output_one_time_fixture_runner.rb +8 -0
  212. data/spec/spec/runner/output_one_time_spec.rb +16 -0
  213. data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +6 -6
  214. data/spec/spec/runner/reporter_spec.rb +147 -163
  215. data/spec/spec/runner/spec_parser_spec.rb +31 -0
  216. data/spec/spec/runner_spec.rb +11 -0
  217. data/spec/spec/spec_classes.rb +12 -5
  218. data/spec/spec/story/builders.rb +46 -0
  219. data/spec/spec/story/extensions/main_spec.rb +161 -0
  220. data/spec/spec/story/extensions_spec.rb +14 -0
  221. data/spec/spec/story/given_scenario_spec.rb +27 -0
  222. data/spec/spec/story/runner/plain_text_story_runner_spec.rb +92 -0
  223. data/spec/spec/story/runner/scenario_collector_spec.rb +27 -0
  224. data/spec/spec/story/runner/scenario_runner_spec.rb +142 -0
  225. data/spec/spec/story/runner/story_mediator_spec.rb +133 -0
  226. data/spec/spec/story/runner/story_parser_spec.rb +384 -0
  227. data/spec/spec/story/runner/story_runner_spec.rb +219 -0
  228. data/spec/spec/story/runner_spec.rb +106 -0
  229. data/spec/spec/story/scenario_spec.rb +20 -0
  230. data/spec/spec/story/step_group_spec.rb +157 -0
  231. data/spec/spec/story/step_mother_spec.rb +72 -0
  232. data/spec/spec/story/step_spec.rb +147 -0
  233. data/spec/spec/story/story_helper.rb +2 -0
  234. data/spec/spec/story/story_spec.rb +86 -0
  235. data/spec/spec/story/world_spec.rb +416 -0
  236. data/spec/spec/translator_spec.rb +2 -1
  237. data/spec/spec_helper.rb +59 -2
  238. data/stories/all.rb +5 -0
  239. data/stories/example_groups/autogenerated_docstrings +26 -0
  240. data/stories/example_groups/example_group_with_should_methods +17 -0
  241. data/stories/example_groups/nested_groups +17 -0
  242. data/stories/example_groups/output +20 -0
  243. data/stories/example_groups/stories.rb +7 -0
  244. data/stories/helper.rb +6 -0
  245. data/stories/interop/examples_and_tests_together +30 -0
  246. data/stories/interop/stories.rb +7 -0
  247. data/stories/interop/test_case_with_should_methods +17 -0
  248. data/stories/pending_stories/README +3 -0
  249. data/stories/resources/helpers/cmdline.rb +9 -0
  250. data/stories/resources/helpers/story_helper.rb +16 -0
  251. data/stories/resources/matchers/smart_match.rb +37 -0
  252. data/stories/resources/spec/example_group_with_should_methods.rb +12 -0
  253. data/stories/resources/spec/simple_spec.rb +8 -0
  254. data/stories/resources/steps/running_rspec.rb +50 -0
  255. data/stories/resources/test/spec_and_test_together.rb +57 -0
  256. data/stories/resources/test/test_case_with_should_methods.rb +30 -0
  257. metadata +232 -106
  258. data/EXAMPLES.rd +0 -111
  259. data/examples/multi_threaded_behaviour_runner.rb +0 -25
  260. data/examples/shared_behaviours_example.rb +0 -39
  261. data/examples/spec_helper.rb +0 -1
  262. data/examples/test_case_adapter_example.rb +0 -26
  263. data/examples/test_case_spec.rb +0 -65
  264. data/lib/spec/dsl.rb +0 -11
  265. data/lib/spec/dsl/behaviour.rb +0 -220
  266. data/lib/spec/dsl/behaviour_callbacks.rb +0 -82
  267. data/lib/spec/dsl/behaviour_eval.rb +0 -231
  268. data/lib/spec/dsl/behaviour_factory.rb +0 -42
  269. data/lib/spec/dsl/composite_proc_builder.rb +0 -33
  270. data/lib/spec/dsl/description.rb +0 -76
  271. data/lib/spec/dsl/example.rb +0 -135
  272. data/lib/spec/dsl/example_matcher.rb +0 -40
  273. data/lib/spec/dsl/example_should_raise_handler.rb +0 -74
  274. data/lib/spec/runner/behaviour_runner.rb +0 -123
  275. data/lib/spec/runner/extensions/kernel.rb +0 -50
  276. data/lib/spec/runner/extensions/object.rb +0 -32
  277. data/lib/spec/runner/formatter.rb +0 -9
  278. data/lib/spec/runner/formatter/failing_behaviours_formatter.rb +0 -29
  279. data/lib/spec/runner/formatter/rdoc_formatter.rb +0 -24
  280. data/lib/spec/test_case_adapter.rb +0 -10
  281. data/spec/spec/dsl/behaviour_eval_spec.rb +0 -79
  282. data/spec/spec/dsl/behaviour_factory_spec.rb +0 -48
  283. data/spec/spec/dsl/behaviour_spec.rb +0 -661
  284. data/spec/spec/dsl/composite_proc_builder_spec.rb +0 -44
  285. data/spec/spec/dsl/configuration_spec.rb +0 -55
  286. data/spec/spec/dsl/description_spec.rb +0 -89
  287. data/spec/spec/dsl/example_class_spec.rb +0 -24
  288. data/spec/spec/dsl/example_instance_spec.rb +0 -160
  289. data/spec/spec/dsl/example_should_raise_spec.rb +0 -137
  290. data/spec/spec/dsl/shared_behaviour_spec.rb +0 -252
  291. data/spec/spec/runner/behaviour_runner_spec.rb +0 -229
  292. data/spec/spec/runner/context_matching_spec.rb +0 -27
  293. data/spec/spec/runner/extensions/bug_report_10577_spec.rb +0 -35
  294. data/spec/spec/runner/extensions/kernel_spec.rb +0 -36
  295. data/spec/spec/runner/formatter/failing_behaviours_formatter_spec.rb +0 -40
  296. data/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb +0 -20
  297. data/spec/spec/runner/formatter/progress_bar_formatter_failure_dump_spec.rb +0 -36
  298. data/spec/spec/runner/formatter/rdoc_formatter_dry_run_spec.rb +0 -19
  299. data/spec/spec/runner/formatter/rdoc_formatter_spec.rb +0 -46
  300. data/spec/spec/runner/formatter/specdoc_formatter_dry_run_spec.rb +0 -21
  301. data/spec/spec/runner/object_ext_spec.rb +0 -11
@@ -1,6 +1,7 @@
1
1
  module Spec
2
2
  module Matchers
3
3
  class BaseOperatorMatcher
4
+ attr_reader :generated_description
4
5
 
5
6
  def initialize(target)
6
7
  @target = target
@@ -0,0 +1,29 @@
1
+ module Spec
2
+ module Matchers
3
+ class SimpleMatcher
4
+ attr_reader :description
5
+
6
+ def initialize(description, &match_block)
7
+ @description = description
8
+ @match_block = match_block
9
+ end
10
+
11
+ def matches?(actual)
12
+ @actual = actual
13
+ return @match_block.call(@actual)
14
+ end
15
+
16
+ def failure_message()
17
+ return %[expected #{@description.inspect} but got #{@actual.inspect}]
18
+ end
19
+
20
+ def negative_failure_message()
21
+ return %[expected not to get #{@description.inspect}, but got #{@actual.inspect}]
22
+ end
23
+ end
24
+
25
+ def simple_matcher(message, &match_block)
26
+ SimpleMatcher.new(message, &match_block)
27
+ end
28
+ end
29
+ end
@@ -4,12 +4,14 @@ module Spec
4
4
  class ThrowSymbol #:nodoc:
5
5
  def initialize(expected=nil)
6
6
  @expected = expected
7
+ @actual = nil
7
8
  end
8
9
 
9
10
  def matches?(proc)
10
11
  begin
11
12
  proc.call
12
13
  rescue NameError => e
14
+ raise e unless e.message =~ /uncaught throw/
13
15
  @actual = e.name.to_sym
14
16
  ensure
15
17
  if @expected.nil?
@@ -170,7 +170,9 @@ module Spec
170
170
  # #error can be an instantiated object or a class
171
171
  # #if it is a class, it must be instantiable with no args
172
172
  # my_mock.should_receive(:sym).and_throw(:sym)
173
- # my_mock.should_receive(:sym).and_yield([array,of,values,to,yield])
173
+ # my_mock.should_receive(:sym).and_yield(values,to,yield)
174
+ # my_mock.should_receive(:sym).and_yield(values,to,yield).and_yield(some,other,values,this,time)
175
+ # # for methods that yield to a block multiple times
174
176
  #
175
177
  # Any of these responses can be applied to a stub as well, but stubs do
176
178
  # not support any qualifiers about the message received (i.e. you can't specify arguments
@@ -180,7 +182,8 @@ module Spec
180
182
  # my_mock.stub!(:sym).and_return(value1, value2, value3)
181
183
  # my_mock.stub!(:sym).and_raise(error)
182
184
  # my_mock.stub!(:sym).and_throw(:sym)
183
- # my_mock.stub!(:sym).and_yield([array,of,values,to,yield])
185
+ # my_mock.stub!(:sym).and_yield(values,to,yield)
186
+ # my_mock.stub!(:sym).and_yield(values,to,yield).and_yield(some,other,values,this,time)
184
187
  #
185
188
  # == Arbitrary Handling
186
189
  #
@@ -138,7 +138,7 @@ module Spec
138
138
  end
139
139
 
140
140
  def warn_deprecated(deprecated_method, instead)
141
- STDERR.puts "The #{deprecated_method} constraint is deprecated. Use #{instead} instead."
141
+ Kernel.warn "The #{deprecated_method} constraint is deprecated. Use #{instead} instead."
142
142
  end
143
143
 
144
144
  def convert_constraint(constraint)
@@ -10,8 +10,8 @@ module Spec
10
10
  @expected_from = expected_from
11
11
  @sym = sym
12
12
  @method_block = method_block
13
- @return_block = lambda {}
14
- @received_count = 0
13
+ @return_block = nil
14
+ @actual_received_count = 0
15
15
  @expected_received_count = expected_received_count
16
16
  @args_expectation = ArgumentExpectation.new([AnyArgsConstraint.new])
17
17
  @consecutive = false
@@ -20,7 +20,7 @@ module Spec
20
20
  @order_group = expectation_ordering
21
21
  @at_least = nil
22
22
  @at_most = nil
23
- @args_to_yield = nil
23
+ @args_to_yield = []
24
24
  end
25
25
 
26
26
  def expected_args
@@ -29,14 +29,13 @@ module Spec
29
29
 
30
30
  def and_return(*values, &return_block)
31
31
  Kernel::raise AmbiguousReturnError unless @method_block.nil?
32
- if values.size == 0
33
- value = nil
34
- elsif values.size == 1
35
- value = values[0]
32
+ case values.size
33
+ when 0 then value = nil
34
+ when 1 then value = values[0]
36
35
  else
37
36
  value = values
38
37
  @consecutive = true
39
- @expected_received_count = values.size if @expected_received_count != :any &&
38
+ @expected_received_count = values.size if !ignoring_args? &&
40
39
  @expected_received_count < values.size
41
40
  end
42
41
  @return_block = block_given? ? return_block : lambda { value }
@@ -62,7 +61,8 @@ module Spec
62
61
  end
63
62
 
64
63
  def and_yield(*args)
65
- @args_to_yield = args
64
+ @args_to_yield << args
65
+ self
66
66
  end
67
67
 
68
68
  def matches(sym, args)
@@ -73,25 +73,26 @@ module Spec
73
73
  @order_group.handle_order_constraint self
74
74
 
75
75
  begin
76
- if @exception_to_raise.class == Class
77
- @exception_instance_to_raise = @exception_to_raise.new
78
- else
79
- @exception_instance_to_raise = @exception_to_raise
80
- end
81
76
  Kernel::raise @exception_to_raise unless @exception_to_raise.nil?
82
77
  Kernel::throw @symbol_to_throw unless @symbol_to_throw.nil?
83
-
78
+
84
79
  if !@method_block.nil?
85
- return invoke_method_block(args)
86
- elsif !@args_to_yield.nil?
87
- return invoke_with_yield(block)
88
- elsif @consecutive
89
- return invoke_consecutive_return_block(args, block)
80
+ default_return_val = invoke_method_block(args)
81
+ elsif @args_to_yield.size > 0
82
+ default_return_val = invoke_with_yield(block)
90
83
  else
84
+ default_return_val = nil
85
+ end
86
+
87
+ if @consecutive
88
+ return invoke_consecutive_return_block(args, block)
89
+ elsif @return_block
91
90
  return invoke_return_block(args, block)
91
+ else
92
+ return default_return_val
92
93
  end
93
94
  ensure
94
- @received_count += 1
95
+ @actual_received_count += 1
95
96
  end
96
97
  end
97
98
 
@@ -109,17 +110,19 @@ module Spec
109
110
  if block.nil?
110
111
  @error_generator.raise_missing_block_error @args_to_yield
111
112
  end
112
- if block.arity > -1 && @args_to_yield.length != block.arity
113
- @error_generator.raise_wrong_arity_error @args_to_yield, block.arity
113
+ @args_to_yield.each do |args_to_yield_this_time|
114
+ if block.arity > -1 && args_to_yield_this_time.length != block.arity
115
+ @error_generator.raise_wrong_arity_error args_to_yield_this_time, block.arity
116
+ end
117
+ block.call(*args_to_yield_this_time)
114
118
  end
115
- block.call(*@args_to_yield)
116
119
  end
117
120
 
118
121
  def invoke_consecutive_return_block(args, block)
119
122
  args << block unless block.nil?
120
123
  value = @return_block.call(*args)
121
124
 
122
- index = [@received_count, value.size-1].min
125
+ index = [@actual_received_count, value.size-1].min
123
126
  value[index]
124
127
  end
125
128
 
@@ -138,17 +141,33 @@ module Spec
138
141
  end
139
142
 
140
143
  def verify_messages_received
141
- return if @expected_received_count == :any
142
- return if (@at_least) && (@received_count >= @expected_received_count)
143
- return if (@at_most) && (@received_count <= @expected_received_count)
144
- return if @expected_received_count == @received_count
144
+ return if ignoring_args? || matches_exact_count? ||
145
+ matches_at_least_count? || matches_at_most_count?
145
146
 
146
- begin
147
- @error_generator.raise_expectation_error(@sym, @expected_received_count, @received_count, *@args_expectation.args)
148
- rescue => error
149
- error.backtrace.insert(0, @expected_from)
150
- Kernel::raise error
151
- end
147
+ generate_error
148
+ rescue Spec::Mocks::MockExpectationError => error
149
+ error.backtrace.insert(0, @expected_from)
150
+ Kernel::raise error
151
+ end
152
+
153
+ def ignoring_args?
154
+ @expected_received_count == :any
155
+ end
156
+
157
+ def matches_at_least_count?
158
+ @at_least && @actual_received_count >= @expected_received_count
159
+ end
160
+
161
+ def matches_at_most_count?
162
+ @at_most && @actual_received_count <= @expected_received_count
163
+ end
164
+
165
+ def matches_exact_count?
166
+ @expected_received_count == @actual_received_count
167
+ end
168
+
169
+ def generate_error
170
+ @error_generator.raise_expectation_error(@sym, @expected_received_count, @actual_received_count, *@args_expectation.args)
152
171
  end
153
172
 
154
173
  def with(*args, &block)
@@ -215,9 +234,14 @@ module Spec
215
234
  def set_expected_received_count(relativity, n)
216
235
  @at_least = (relativity == :at_least)
217
236
  @at_most = (relativity == :at_most)
218
- @expected_received_count = 1 if n == :once
219
- @expected_received_count = 2 if n == :twice
220
- @expected_received_count = n if n.kind_of? Numeric
237
+ @expected_received_count = case n
238
+ when Numeric
239
+ n
240
+ when :once
241
+ 1
242
+ when :twice
243
+ 2
244
+ end
221
245
  end
222
246
 
223
247
  end
@@ -232,11 +256,5 @@ module Spec
232
256
  end
233
257
  end
234
258
 
235
- class MethodStub < BaseExpectation
236
- def initialize(message, expectation_ordering, expected_from, sym, method_block)
237
- super(message, expectation_ordering, expected_from, sym, method_block, 0)
238
- @expected_received_count = :any
239
- end
240
- end
241
259
  end
242
260
  end
@@ -9,8 +9,8 @@ module Spec
9
9
  __mock_proxy.add_negative_message_expectation(caller(1)[0], sym.to_sym, &block)
10
10
  end
11
11
 
12
- def stub!(sym)
13
- __mock_proxy.add_stub(caller(1)[0], sym.to_sym)
12
+ def stub!(sym, opts={})
13
+ __mock_proxy.add_stub(caller(1)[0], sym.to_sym, opts)
14
14
  end
15
15
 
16
16
  def received_message?(sym, *args, &block) #:nodoc:
@@ -6,9 +6,18 @@ module Spec
6
6
  # Creates a new mock with a +name+ (that will be used in error messages only)
7
7
  # == Options:
8
8
  # * <tt>:null_object</tt> - if true, the mock object acts as a forgiving null object allowing any message to be sent to it.
9
- def initialize(name, options={})
9
+ def initialize(name, stubs_and_options={})
10
10
  @name = name
11
- @options = options
11
+ @options = parse_options(stubs_and_options)
12
+ assign_stubs(stubs_and_options)
13
+ end
14
+
15
+ # This allows for comparing the mock to other objects that proxy
16
+ # such as ActiveRecords belongs_to proxy objects
17
+ # By making the other object run the comparison, we're sure the call gets delegated to the proxy target
18
+ # This is an unfortunate side effect from ActiveRecord, but this should be safe unless the RHS redefines == in a nonsensical manner
19
+ def ==(other)
20
+ other == __mock_proxy
12
21
  end
13
22
 
14
23
  def method_missing(sym, *args, &block)
@@ -16,7 +25,7 @@ module Spec
16
25
  begin
17
26
  return self if __mock_proxy.null_object?
18
27
  super(sym, *args, &block)
19
- rescue NoMethodError
28
+ rescue NameError
20
29
  __mock_proxy.raise_unexpected_message_error sym, *args
21
30
  end
22
31
  end
@@ -24,6 +33,18 @@ module Spec
24
33
  def inspect
25
34
  "#<#{self.class}:#{sprintf '0x%x', self.object_id} @name=#{@name.inspect}>"
26
35
  end
36
+
37
+ private
38
+
39
+ def parse_options(options)
40
+ options.has_key?(:null_object) ? {:null_object => options.delete(:null_object)} : {}
41
+ end
42
+
43
+ def assign_stubs(stubs)
44
+ stubs.each_pair do |message, response|
45
+ stub!(message).and_return(response)
46
+ end
47
+ end
27
48
  end
28
49
  end
29
50
  end
@@ -22,29 +22,27 @@ module Spec
22
22
  end
23
23
 
24
24
  def add_message_expectation(expected_from, sym, opts={}, &block)
25
- __add sym, block
25
+ __add sym
26
26
  @expectations << MessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, block_given? ? block : nil, 1, opts)
27
27
  @expectations.last
28
28
  end
29
29
 
30
30
  def add_negative_message_expectation(expected_from, sym, &block)
31
- __add sym, block
31
+ __add sym
32
32
  @expectations << NegativeMessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, block_given? ? block : nil)
33
33
  @expectations.last
34
34
  end
35
35
 
36
- def add_stub(expected_from, sym)
37
- __add sym, nil
38
- @stubs.unshift MethodStub.new(@error_generator, @expectation_ordering, expected_from, sym, nil)
36
+ def add_stub(expected_from, sym, opts={})
37
+ __add sym
38
+ @stubs.unshift MessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, nil, :any, opts)
39
39
  @stubs.first
40
40
  end
41
41
 
42
42
  def verify #:nodoc:
43
- begin
44
- verify_expectations
45
- ensure
46
- reset
47
- end
43
+ verify_expectations
44
+ ensure
45
+ reset
48
46
  end
49
47
 
50
48
  def reset
@@ -55,8 +53,7 @@ module Spec
55
53
  end
56
54
 
57
55
  def received_message?(sym, *args, &block)
58
- return true if @messages_received.find {|array| array == [sym, args, block]}
59
- return false
56
+ @messages_received.any? {|array| array == [sym, args, block]}
60
57
  end
61
58
 
62
59
  def has_negative_expectation?(sym)
@@ -66,7 +63,7 @@ module Spec
66
63
  def message_received(sym, *args, &block)
67
64
  if expectation = find_matching_expectation(sym, *args)
68
65
  expectation.invoke(args, block)
69
- elsif stub = find_matching_method_stub(sym)
66
+ elsif stub = find_matching_method_stub(sym, *args)
70
67
  stub.invoke([], block)
71
68
  elsif expectation = find_almost_matching_expectation(sym, *args)
72
69
  raise_unexpected_message_args_error(expectation, *args) unless has_negative_expectation?(sym) unless null_object?
@@ -85,14 +82,17 @@ module Spec
85
82
 
86
83
  private
87
84
 
88
- def __add(sym, block)
85
+ def __add(sym)
89
86
  $rspec_mocks.add(@target) unless $rspec_mocks.nil?
90
87
  define_expected_method(sym)
91
88
  end
92
89
 
93
90
  def define_expected_method(sym)
94
- if target_responds_to?(sym) && !@proxied_methods.include?(sym)
95
- metaclass.__send__(:alias_method, munge(sym), sym) if metaclass.instance_methods.include?(sym.to_s)
91
+ if target_responds_to?(sym) && !metaclass.method_defined?(munge(sym))
92
+ munged_sym = munge(sym)
93
+ metaclass.instance_eval do
94
+ alias_method munged_sym, sym if method_defined?(sym.to_s)
95
+ end
96
96
  @proxied_methods << sym
97
97
  end
98
98
 
@@ -141,11 +141,14 @@ module Spec
141
141
 
142
142
  def reset_proxied_methods
143
143
  @proxied_methods.each do |sym|
144
- if metaclass.instance_methods.include?(munge(sym).to_s)
145
- metaclass.__send__(:alias_method, sym, munge(sym))
146
- metaclass.__send__(:undef_method, munge(sym))
147
- else
148
- metaclass.__send__(:undef_method, sym)
144
+ munged_sym = munge(sym)
145
+ metaclass.instance_eval do
146
+ if method_defined?(munged_sym.to_s)
147
+ alias_method sym, munged_sym
148
+ undef_method munged_sym
149
+ else
150
+ undef_method sym
151
+ end
149
152
  end
150
153
  end
151
154
  end
@@ -158,8 +161,8 @@ module Spec
158
161
  @expectations.find {|expectation| expectation.matches_name_but_not_args(sym, args)}
159
162
  end
160
163
 
161
- def find_matching_method_stub(sym)
162
- @stubs.find {|stub| stub.matches(sym, [])}
164
+ def find_matching_method_stub(sym, *args)
165
+ @stubs.find {|stub| stub.matches(sym, args)}
163
166
  end
164
167
 
165
168
  end
@@ -2,7 +2,7 @@ module Spec
2
2
  module Mocks
3
3
  class Space
4
4
  def add(obj)
5
- mocks << obj unless mocks.include?(obj)
5
+ mocks << obj unless mocks.detect {|m| m.equal? obj}
6
6
  end
7
7
 
8
8
  def verify_all
@@ -1,30 +1,38 @@
1
1
  module Spec
2
2
  module Mocks
3
- module SpecMethods
3
+ module ExampleMethods
4
4
  include Spec::Mocks::ArgumentConstraintMatchers
5
5
 
6
6
  # Shortcut for creating an instance of Spec::Mocks::Mock.
7
- def mock(name, options={})
8
- Spec::Mocks::Mock.new(name, options)
9
- end
10
-
11
- # Shortcut for creating an instance of Spec::Mocks::Mock with
12
- # predefined method stubs.
7
+ #
8
+ # +name+ is used for failure reporting, so you should use the
9
+ # role that the mock is playing in the example.
10
+ #
11
+ # +stubs_and_options+ lets you assign options and stub values
12
+ # at the same time. The only option available is :null_object.
13
+ # Anything else is treated as a stub value.
13
14
  #
14
15
  # == Examples
15
16
  #
16
- # stub_thing = stub("thing", :a => "A")
17
+ # stub_thing = mock("thing", :a => "A")
17
18
  # stub_thing.a == "A" => true
18
19
  #
19
20
  # stub_person = stub("thing", :name => "Joe", :email => "joe@domain.com")
20
21
  # stub_person.name => "Joe"
21
22
  # stub_person.email => "joe@domain.com"
22
- def stub(name, stubs={})
23
- object_stub = mock(name)
24
- stubs.each { |key, value| object_stub.stub!(key).and_return(value) }
25
- object_stub
23
+ def mock(name, stubs_and_options={})
24
+ Spec::Mocks::Mock.new(name, stubs_and_options)
26
25
  end
27
26
 
27
+ alias :stub :mock
28
+
29
+ # Shortcut for creating a mock object that will return itself in response
30
+ # to any message it receives that it hasn't been explicitly instructed
31
+ # to respond to.
32
+ def stub_everything(name = 'stub')
33
+ mock(name, :null_object => true)
34
+ end
35
+
28
36
  end
29
37
  end
30
38
  end