rspec 1.0.8 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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