mocha 0.10.5 → 0.11.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 (229) hide show
  1. data/COPYING.rdoc +1 -1
  2. data/README.rdoc +6 -4
  3. data/RELEASE.rdoc +12 -0
  4. data/Rakefile +29 -60
  5. data/doc/Mocha.html +112 -0
  6. data/doc/Mocha/API.html +898 -0
  7. data/doc/Mocha/ClassMethods.html +246 -0
  8. data/doc/Mocha/Configuration.html +471 -0
  9. data/doc/Mocha/Expectation.html +2570 -0
  10. data/doc/Mocha/Mock.html +830 -0
  11. data/doc/Mocha/ObjectMethods.html +668 -0
  12. data/doc/Mocha/ParameterMatchers.html +2715 -0
  13. data/doc/Mocha/ParameterMatchers/AllOf.html +137 -0
  14. data/doc/Mocha/ParameterMatchers/AnyOf.html +137 -0
  15. data/doc/Mocha/ParameterMatchers/AnyParameters.html +136 -0
  16. data/doc/Mocha/ParameterMatchers/Anything.html +136 -0
  17. data/doc/Mocha/ParameterMatchers/Base.html +419 -0
  18. data/doc/Mocha/ParameterMatchers/Equals.html +137 -0
  19. data/doc/Mocha/ParameterMatchers/HasEntries.html +137 -0
  20. data/doc/Mocha/ParameterMatchers/HasEntry.html +137 -0
  21. data/doc/Mocha/ParameterMatchers/HasKey.html +137 -0
  22. data/doc/Mocha/ParameterMatchers/HasValue.html +137 -0
  23. data/doc/Mocha/ParameterMatchers/Includes.html +137 -0
  24. data/doc/Mocha/ParameterMatchers/InstanceOf.html +137 -0
  25. data/doc/Mocha/ParameterMatchers/IsA.html +136 -0
  26. data/doc/Mocha/ParameterMatchers/KindOf.html +137 -0
  27. data/doc/Mocha/ParameterMatchers/Not.html +137 -0
  28. data/doc/Mocha/ParameterMatchers/Optionally.html +136 -0
  29. data/doc/Mocha/ParameterMatchers/QueryStringMatches.html +136 -0
  30. data/doc/Mocha/ParameterMatchers/RegexpMatches.html +137 -0
  31. data/doc/Mocha/ParameterMatchers/RespondsWith.html +137 -0
  32. data/doc/Mocha/ParameterMatchers/YamlEquivalent.html +137 -0
  33. data/doc/Mocha/Sequence.html +133 -0
  34. data/doc/Mocha/StateMachine.html +510 -0
  35. data/doc/Mocha/StateMachine/State.html +125 -0
  36. data/doc/Mocha/StateMachine/StatePredicate.html +125 -0
  37. data/doc/Mocha/StubbingError.html +134 -0
  38. data/doc/Mocha/UnexpectedInvocation.html +124 -0
  39. data/doc/_index.html +481 -0
  40. data/doc/class_list.html +47 -0
  41. data/doc/css/common.css +1 -0
  42. data/doc/css/full_list.css +55 -0
  43. data/doc/css/style.css +322 -0
  44. data/doc/file.COPYING.html +72 -0
  45. data/doc/file.MIT-LICENSE.html +86 -0
  46. data/doc/file.README.html +153 -0
  47. data/doc/file.RELEASE.html +933 -0
  48. data/doc/file.misc.html +108 -0
  49. data/doc/file.mocha.html +90 -0
  50. data/doc/file.stubba.html +129 -0
  51. data/doc/file_list.html +67 -0
  52. data/doc/frames.html +13 -0
  53. data/doc/index.html +153 -0
  54. data/doc/js/app.js +205 -0
  55. data/doc/js/full_list.js +173 -0
  56. data/doc/js/jquery.js +16 -0
  57. data/doc/method_list.html +510 -0
  58. data/doc/top-level-namespace.html +105 -0
  59. data/lib/mocha/any_instance_method.rb +16 -11
  60. data/lib/mocha/api.rb +120 -106
  61. data/lib/mocha/argument_iterator.rb +6 -6
  62. data/lib/mocha/backtrace_filter.rb +1 -1
  63. data/lib/mocha/cardinality.rb +21 -21
  64. data/lib/mocha/central.rb +8 -8
  65. data/lib/mocha/change_state_side_effect.rb +5 -5
  66. data/lib/mocha/class_method.rb +14 -19
  67. data/lib/mocha/configuration.rb +47 -37
  68. data/lib/mocha/deprecation.rb +8 -8
  69. data/lib/mocha/exception_raiser.rb +7 -7
  70. data/lib/mocha/expectation.rb +173 -77
  71. data/lib/mocha/expectation_error.rb +2 -2
  72. data/lib/mocha/expectation_list.rb +11 -11
  73. data/lib/mocha/in_state_ordering_constraint.rb +5 -5
  74. data/lib/mocha/inspect.rb +8 -8
  75. data/lib/mocha/instance_method.rb +1 -17
  76. data/lib/mocha/integration.rb +9 -9
  77. data/lib/mocha/integration/mini_test/assertion_counter.rb +9 -9
  78. data/lib/mocha/integration/mini_test/exception_translation.rb +6 -6
  79. data/lib/mocha/integration/mini_test/version_13.rb +6 -6
  80. data/lib/mocha/integration/mini_test/version_140.rb +6 -6
  81. data/lib/mocha/integration/mini_test/version_141.rb +6 -6
  82. data/lib/mocha/integration/mini_test/version_142_to_172.rb +7 -7
  83. data/lib/mocha/integration/mini_test/version_200.rb +7 -7
  84. data/lib/mocha/integration/test_unit/assertion_counter.rb +10 -10
  85. data/lib/mocha/integration/test_unit/gem_version_200.rb +6 -6
  86. data/lib/mocha/integration/test_unit/gem_version_201_to_202.rb +6 -6
  87. data/lib/mocha/integration/test_unit/ruby_version_185_and_below.rb +6 -6
  88. data/lib/mocha/integration/test_unit/ruby_version_186_and_above.rb +6 -6
  89. data/lib/mocha/is_a.rb +1 -1
  90. data/lib/mocha/logger.rb +6 -6
  91. data/lib/mocha/method_matcher.rb +7 -7
  92. data/lib/mocha/mock.rb +85 -48
  93. data/lib/mocha/mockery.rb +47 -33
  94. data/lib/mocha/module_method.rb +2 -2
  95. data/lib/mocha/multiple_yields.rb +9 -9
  96. data/lib/mocha/names.rb +18 -18
  97. data/lib/mocha/no_yields.rb +7 -7
  98. data/lib/mocha/object.rb +104 -75
  99. data/lib/mocha/parameter_matchers.rb +3 -3
  100. data/lib/mocha/parameter_matchers/all_of.rb +22 -12
  101. data/lib/mocha/parameter_matchers/any_of.rb +23 -12
  102. data/lib/mocha/parameter_matchers/any_parameters.rb +15 -8
  103. data/lib/mocha/parameter_matchers/anything.rb +20 -11
  104. data/lib/mocha/parameter_matchers/base.rb +35 -27
  105. data/lib/mocha/parameter_matchers/equals.rb +23 -12
  106. data/lib/mocha/parameter_matchers/has_entries.rb +22 -12
  107. data/lib/mocha/parameter_matchers/has_entry.rb +31 -13
  108. data/lib/mocha/parameter_matchers/has_key.rb +21 -11
  109. data/lib/mocha/parameter_matchers/has_value.rb +21 -11
  110. data/lib/mocha/parameter_matchers/includes.rb +15 -5
  111. data/lib/mocha/parameter_matchers/instance_of.rb +23 -12
  112. data/lib/mocha/parameter_matchers/is_a.rb +23 -12
  113. data/lib/mocha/parameter_matchers/kind_of.rb +23 -12
  114. data/lib/mocha/parameter_matchers/not.rb +22 -12
  115. data/lib/mocha/parameter_matchers/object.rb +5 -3
  116. data/lib/mocha/parameter_matchers/optionally.rb +24 -12
  117. data/lib/mocha/parameter_matchers/query_string.rb +14 -3
  118. data/lib/mocha/parameter_matchers/regexp_matches.rb +21 -11
  119. data/lib/mocha/parameter_matchers/responds_with.rb +17 -6
  120. data/lib/mocha/parameter_matchers/yaml_equivalent.rb +16 -6
  121. data/lib/mocha/parameters_matcher.rb +8 -8
  122. data/lib/mocha/pretty_parameters.rb +7 -7
  123. data/lib/mocha/return_values.rb +11 -11
  124. data/lib/mocha/sequence.rb +23 -14
  125. data/lib/mocha/single_return_value.rb +7 -7
  126. data/lib/mocha/single_yield.rb +9 -9
  127. data/lib/mocha/standalone.rb +1 -1
  128. data/lib/mocha/state_machine.rb +61 -46
  129. data/lib/mocha/stubbing_error.rb +8 -5
  130. data/lib/mocha/thrower.rb +2 -2
  131. data/lib/mocha/unexpected_invocation.rb +9 -6
  132. data/lib/mocha/version.rb +1 -1
  133. data/lib/mocha/yield_parameters.rb +10 -10
  134. data/lib/mocha_standalone.rb +1 -1
  135. data/mocha.gemspec +4 -7
  136. data/test/acceptance/acceptance_test_helper.rb +10 -10
  137. data/test/acceptance/api_test.rb +20 -20
  138. data/test/acceptance/bug_18914_test.rb +12 -12
  139. data/test/acceptance/bug_21465_test.rb +6 -6
  140. data/test/acceptance/bug_21563_test.rb +5 -5
  141. data/test/acceptance/exception_rescue_test.rb +1 -1
  142. data/test/acceptance/expected_invocation_count_test.rb +17 -17
  143. data/test/acceptance/failure_messages_test.rb +13 -13
  144. data/test/acceptance/minitest_test.rb +39 -39
  145. data/test/acceptance/mocha_example_test.rb +26 -26
  146. data/test/acceptance/mocha_test_result_test.rb +13 -13
  147. data/test/acceptance/mock_test.rb +5 -5
  148. data/test/acceptance/mock_with_initializer_block_test.rb +5 -5
  149. data/test/acceptance/mocked_methods_dispatch_test.rb +4 -4
  150. data/test/acceptance/multiple_expectations_failure_message_test.rb +2 -2
  151. data/test/acceptance/optional_parameters_test.rb +5 -5
  152. data/test/acceptance/parameter_matcher_test.rb +18 -18
  153. data/test/acceptance/partial_mocks_test.rb +9 -9
  154. data/test/acceptance/raise_exception_test.rb +1 -1
  155. data/test/acceptance/return_value_test.rb +5 -5
  156. data/test/acceptance/sequence_test.rb +29 -29
  157. data/test/acceptance/states_test.rb +17 -17
  158. data/test/acceptance/stub_any_instance_method_test.rb +13 -13
  159. data/test/acceptance/stub_class_method_defined_on_active_record_association_proxy_test.rb +7 -7
  160. data/test/acceptance/stub_everything_test.rb +5 -5
  161. data/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb +1 -1
  162. data/test/acceptance/stub_module_method_test.rb +17 -17
  163. data/test/acceptance/stub_test.rb +5 -5
  164. data/test/acceptance/stubba_example_test.rb +24 -24
  165. data/test/acceptance/stubba_test_result_test.rb +11 -11
  166. data/test/acceptance/stubbing_error_backtrace_test.rb +6 -6
  167. data/test/acceptance/stubbing_frozen_object_test.rb +88 -0
  168. data/test/acceptance/stubbing_method_unnecessarily_test.rb +9 -9
  169. data/test/acceptance/stubbing_nil_test.rb +59 -0
  170. data/test/acceptance/stubbing_non_existent_any_instance_method_test.rb +13 -13
  171. data/test/acceptance/stubbing_non_existent_class_method_test.rb +15 -15
  172. data/test/acceptance/stubbing_non_existent_instance_method_test.rb +14 -14
  173. data/test/acceptance/stubbing_non_public_any_instance_method_test.rb +13 -13
  174. data/test/acceptance/stubbing_non_public_class_method_test.rb +12 -12
  175. data/test/acceptance/stubbing_non_public_instance_method_test.rb +12 -12
  176. data/test/acceptance/stubbing_on_non_mock_object_test.rb +9 -9
  177. data/test/acceptance/stubbing_same_class_method_on_parent_and_child_classes_test.rb +35 -0
  178. data/test/acceptance/throw_test.rb +1 -1
  179. data/test/deprecation_disabler.rb +1 -1
  180. data/test/execution_point.rb +7 -7
  181. data/test/method_definer.rb +1 -1
  182. data/test/mini_test_result.rb +21 -21
  183. data/test/simple_counter.rb +5 -5
  184. data/test/test_helper.rb +1 -1
  185. data/test/test_runner.rb +22 -24
  186. data/test/test_unit_result.rb +20 -0
  187. data/test/unit/any_instance_method_test.rb +28 -32
  188. data/test/unit/array_inspect_test.rb +3 -3
  189. data/test/unit/backtrace_filter_test.rb +3 -3
  190. data/test/unit/cardinality_test.rb +12 -12
  191. data/test/unit/central_test.rb +18 -18
  192. data/test/unit/change_state_side_effect_test.rb +12 -12
  193. data/test/unit/class_method_test.rb +33 -91
  194. data/test/unit/date_time_inspect_test.rb +4 -4
  195. data/test/unit/exception_raiser_test.rb +5 -5
  196. data/test/unit/expectation_list_test.rb +7 -7
  197. data/test/unit/expectation_test.rb +66 -66
  198. data/test/unit/hash_inspect_test.rb +4 -4
  199. data/test/unit/in_state_ordering_constraint_test.rb +13 -13
  200. data/test/unit/method_matcher_test.rb +3 -3
  201. data/test/unit/mock_test.rb +40 -40
  202. data/test/unit/mockery_test.rb +25 -25
  203. data/test/unit/multiple_yields_test.rb +2 -2
  204. data/test/unit/no_yields_test.rb +2 -2
  205. data/test/unit/object_inspect_test.rb +4 -4
  206. data/test/unit/object_test.rb +15 -15
  207. data/test/unit/parameter_matchers/all_of_test.rb +6 -6
  208. data/test/unit/parameter_matchers/any_of_test.rb +6 -6
  209. data/test/unit/parameter_matchers/anything_test.rb +5 -5
  210. data/test/unit/parameter_matchers/has_entries_test.rb +10 -10
  211. data/test/unit/parameter_matchers/has_entry_test.rb +13 -13
  212. data/test/unit/parameter_matchers/has_key_test.rb +11 -11
  213. data/test/unit/parameter_matchers/has_value_test.rb +12 -12
  214. data/test/unit/parameter_matchers/includes_test.rb +4 -4
  215. data/test/unit/parameter_matchers/not_test.rb +6 -6
  216. data/test/unit/parameter_matchers/regexp_matches_test.rb +9 -9
  217. data/test/unit/parameter_matchers/responds_with_test.rb +6 -6
  218. data/test/unit/parameter_matchers/stub_matcher.rb +4 -4
  219. data/test/unit/parameter_matchers/yaml_equivalent_test.rb +6 -6
  220. data/test/unit/parameters_matcher_test.rb +16 -16
  221. data/test/unit/return_values_test.rb +5 -5
  222. data/test/unit/sequence_test.rb +10 -10
  223. data/test/unit/single_return_value_test.rb +3 -3
  224. data/test/unit/single_yield_test.rb +2 -2
  225. data/test/unit/state_machine_test.rb +19 -19
  226. data/test/unit/string_inspect_test.rb +2 -2
  227. data/test/unit/thrower_test.rb +1 -1
  228. data/test/unit/yield_parameters_test.rb +11 -11
  229. metadata +113 -101
@@ -1,7 +1,7 @@
1
1
  module Mocha
2
2
 
3
3
  class BacktraceFilter
4
-
4
+
5
5
  LIB_DIRECTORY = File.expand_path(File.join(File.dirname(__FILE__), "..")) + File::SEPARATOR
6
6
 
7
7
  def initialize(lib_directory = LIB_DIRECTORY)
@@ -1,60 +1,60 @@
1
1
  module Mocha
2
2
 
3
3
  class Cardinality
4
-
4
+
5
5
  INFINITY = 1 / 0.0
6
-
6
+
7
7
  class << self
8
-
8
+
9
9
  def exactly(count)
10
10
  new(count, count)
11
11
  end
12
-
12
+
13
13
  def at_least(count)
14
14
  new(count, INFINITY)
15
15
  end
16
-
16
+
17
17
  def at_most(count)
18
18
  new(0, count)
19
19
  end
20
-
20
+
21
21
  def times(range_or_count)
22
22
  case range_or_count
23
23
  when Range then new(range_or_count.first, range_or_count.last)
24
24
  else new(range_or_count, range_or_count)
25
25
  end
26
26
  end
27
-
27
+
28
28
  end
29
-
29
+
30
30
  def initialize(required, maximum)
31
31
  @required, @maximum = required, maximum
32
32
  end
33
-
33
+
34
34
  def invocations_allowed?(invocation_count)
35
35
  invocation_count < maximum
36
36
  end
37
-
37
+
38
38
  def satisfied?(invocations_so_far)
39
39
  invocations_so_far >= required
40
40
  end
41
-
41
+
42
42
  def needs_verifying?
43
43
  !allowed_any_number_of_times?
44
44
  end
45
-
45
+
46
46
  def verified?(invocation_count)
47
47
  (invocation_count >= required) && (invocation_count <= maximum)
48
48
  end
49
-
49
+
50
50
  def allowed_any_number_of_times?
51
51
  required == 0 && infinite?(maximum)
52
52
  end
53
-
53
+
54
54
  def used?(invocation_count)
55
55
  (invocation_count > 0) || (maximum == 0)
56
56
  end
57
-
57
+
58
58
  def mocha_inspect
59
59
  if allowed_any_number_of_times?
60
60
  "allowed any number of times"
@@ -72,11 +72,11 @@ module Mocha
72
72
  end
73
73
  end
74
74
  end
75
-
75
+
76
76
  protected
77
-
77
+
78
78
  attr_reader :required, :maximum
79
-
79
+
80
80
  def times(number)
81
81
  case number
82
82
  when 0 then "no times"
@@ -85,11 +85,11 @@ module Mocha
85
85
  else "#{number} times"
86
86
  end
87
87
  end
88
-
88
+
89
89
  def infinite?(number)
90
90
  number.respond_to?(:infinite?) && number.infinite?
91
91
  end
92
-
92
+
93
93
  end
94
-
94
+
95
95
  end
@@ -1,27 +1,27 @@
1
1
  module Mocha
2
-
2
+
3
3
  class Central
4
-
4
+
5
5
  attr_accessor :stubba_methods
6
-
6
+
7
7
  def initialize
8
8
  self.stubba_methods = []
9
9
  end
10
-
10
+
11
11
  def stub(method)
12
12
  unless stubba_methods.detect { |m| m.matches?(method) }
13
- method.stub
13
+ method.stub
14
14
  stubba_methods.push(method)
15
15
  end
16
16
  end
17
-
17
+
18
18
  def unstub(method)
19
19
  if existing = stubba_methods.detect { |m| m.matches?(method) }
20
20
  existing.unstub
21
21
  stubba_methods.delete(existing)
22
22
  end
23
23
  end
24
-
24
+
25
25
  def unstub_all
26
26
  while stubba_methods.any? do
27
27
  unstub(stubba_methods.first)
@@ -30,4 +30,4 @@ module Mocha
30
30
 
31
31
  end
32
32
 
33
- end
33
+ end
@@ -1,19 +1,19 @@
1
1
  module Mocha
2
2
 
3
3
  class ChangeStateSideEffect
4
-
4
+
5
5
  def initialize(state)
6
6
  @state = state
7
7
  end
8
-
8
+
9
9
  def perform
10
10
  @state.activate
11
11
  end
12
-
12
+
13
13
  def mocha_inspect
14
14
  "then #{@state.mocha_inspect}"
15
15
  end
16
-
16
+
17
17
  end
18
18
 
19
- end
19
+ end
@@ -7,7 +7,7 @@ module Mocha
7
7
  attr_reader :stubbee, :method
8
8
 
9
9
  def initialize(stubbee, method)
10
- @stubbee = stubbee
10
+ @stubbee, @original_method = stubbee, nil
11
11
  @method = RUBY_VERSION < '1.9' ? method.to_s : method.to_sym
12
12
  end
13
13
 
@@ -36,7 +36,16 @@ module Mocha
36
36
  def hide_original_method
37
37
  if method_exists?(method)
38
38
  begin
39
- stubbee.__metaclass__.send(:alias_method, hidden_method, method)
39
+ @original_method = stubbee.method(method)
40
+ if @original_method && @original_method.owner == stubbee.__metaclass__
41
+ @original_visibility = :public
42
+ if stubbee.__metaclass__.protected_instance_methods.include?(method)
43
+ @original_visibility = :protected
44
+ elsif stubbee.__metaclass__.private_instance_methods.include?(method)
45
+ @original_visibility = :private
46
+ end
47
+ stubbee.__metaclass__.send(:remove_method, method)
48
+ end
40
49
  rescue NameError
41
50
  # deal with nasties like ActiveRecord::Associations::AssociationProxy
42
51
  end
@@ -56,24 +65,10 @@ module Mocha
56
65
  end
57
66
 
58
67
  def restore_original_method
59
- if method_exists?(hidden_method)
60
- begin
61
- stubbee.__metaclass__.send(:alias_method, method, hidden_method)
62
- stubbee.__metaclass__.send(:remove_method, hidden_method)
63
- rescue NameError
64
- # deal with nasties like ActiveRecord::Associations::AssociationProxy
65
- end
66
- end
67
- end
68
-
69
- def hidden_method
70
- if RUBY_VERSION < '1.9'
71
- method_name = method.to_s.gsub(/\W/) { |s| "_substituted_character_#{s[0]}_" }
72
- else
73
- method_name = method.to_s.gsub(/\W/) { |s| "_substituted_character_#{s.ord}_" }
68
+ if @original_method && @original_method.owner == stubbee.__metaclass__
69
+ stubbee.__metaclass__.send(:define_method, method, @original_method.to_proc)
70
+ stubbee.__metaclass__.send(@original_visibility, method)
74
71
  end
75
- hidden_method = "__stubba__#{method_name}__stubba__"
76
- RUBY_VERSION < '1.9' ? hidden_method.to_s : hidden_method.to_sym
77
72
  end
78
73
 
79
74
  def matches?(other)
@@ -1,62 +1,71 @@
1
- module Mocha # :nodoc:
2
-
3
- # Configuration settings
1
+ module Mocha
2
+
3
+ # Configuration settings.
4
4
  class Configuration
5
-
6
- DEFAULTS = { :stubbing_method_unnecessarily => :allow, :stubbing_method_on_non_mock_object => :allow, :stubbing_non_existent_method => :allow, :stubbing_non_public_method => :allow }
7
-
5
+
6
+ DEFAULTS = {
7
+ :stubbing_method_unnecessarily => :allow,
8
+ :stubbing_method_on_non_mock_object => :allow,
9
+ :stubbing_non_existent_method => :allow,
10
+ :stubbing_non_public_method => :allow,
11
+ :stubbing_method_on_nil => :prevent,
12
+ }
13
+
8
14
  class << self
9
-
10
- # :call-seq: allow(action, &block)
15
+
16
+ # Allow the specified +action+.
11
17
  #
12
- # Allow the specified <tt>action</tt> (as a symbol).
13
- # The <tt>actions</tt> currently available are <tt>:stubbing_method_unnecessarily, :stubbing_method_on_non_mock_object, :stubbing_non_existent_method, :stubbing_non_public_method</tt>.
14
- # If given a block, the configuration for the action will only be changed for the duration of the block, and will then be restored to the previous value.
18
+ # @param [Symbol] action one of +:stubbing_method_unnecessarily+, +:stubbing_method_on_non_mock_object+, +:stubbing_non_existent_method+, +:stubbing_non_public_method+, +:stubbing_method_on_nil+.
19
+ # @yield optional block during which the configuration change will be changed before being returned to its original value at the end of the block.
15
20
  def allow(action, &block)
16
21
  change_config action, :allow, &block
17
22
  end
18
-
19
- def allow?(action) # :nodoc:
23
+
24
+ # @private
25
+ def allow?(action)
20
26
  configuration[action] == :allow
21
27
  end
22
-
23
- # :call-seq: warn_when(action, &block)
28
+
29
+ # Warn if the specified +action+ is attempted.
24
30
  #
25
- # Warn if the specified <tt>action</tt> (as a symbol) is attempted.
26
- # The <tt>actions</tt> currently available are <tt>:stubbing_method_unnecessarily, :stubbing_method_on_non_mock_object, :stubbing_non_existent_method, :stubbing_non_public_method</tt>.
27
- # If given a block, the configuration for the action will only be changed for the duration of the block, and will then be restored to the previous value.
31
+ # @param [Symbol] action one of +:stubbing_method_unnecessarily+, +:stubbing_method_on_non_mock_object+, +:stubbing_non_existent_method+, +:stubbing_non_public_method+, +:stubbing_method_on_nil+.
32
+ # @yield optional block during which the configuration change will be changed before being returned to its original value at the end of the block.
28
33
  def warn_when(action, &block)
29
34
  change_config action, :warn, &block
30
35
  end
31
-
32
- def warn_when?(action) # :nodoc:
36
+
37
+ # @private
38
+ def warn_when?(action)
33
39
  configuration[action] == :warn
34
40
  end
35
-
36
- # :call-seq: prevent(action, &block)
41
+
42
+ # Raise a {StubbingError} if if the specified +action+ is attempted.
37
43
  #
38
- # Raise a StubbingError if the specified <tt>action</tt> (as a symbol) is attempted.
39
- # The <tt>actions</tt> currently available are <tt>:stubbing_method_unnecessarily, :stubbing_method_on_non_mock_object, :stubbing_non_existent_method, :stubbing_non_public_method</tt>.
40
- # If given a block, the configuration for the action will only be changed for the duration of the block, and will then be restored to the previous value.
44
+ # @param [Symbol] action one of +:stubbing_method_unnecessarily+, +:stubbing_method_on_non_mock_object+, +:stubbing_non_existent_method+, +:stubbing_non_public_method+, +:stubbing_method_on_nil+.
45
+ # @yield optional block during which the configuration change will be changed before being returned to its original value at the end of the block.
41
46
  def prevent(action, &block)
42
47
  change_config action, :prevent, &block
43
48
  end
44
-
45
- def prevent?(action) # :nodoc:
49
+
50
+ # @private
51
+ def prevent?(action)
46
52
  configuration[action] == :prevent
47
53
  end
48
-
49
- def reset_configuration # :nodoc:
54
+
55
+ # @private
56
+ def reset_configuration
50
57
  @configuration = nil
51
58
  end
52
-
59
+
53
60
  private
54
-
55
- def configuration # :nodoc:
61
+
62
+ # @private
63
+ def configuration
56
64
  @configuration ||= DEFAULTS.dup
57
65
  end
58
66
 
59
- def change_config(action, new_value, &block) # :nodoc:
67
+ # @private
68
+ def change_config(action, new_value, &block)
60
69
  if block_given?
61
70
  temporarily_change_config action, new_value, &block
62
71
  else
@@ -64,16 +73,17 @@ module Mocha # :nodoc:
64
73
  end
65
74
  end
66
75
 
67
- def temporarily_change_config(action, new_value, &block) # :nodoc:
76
+ # @private
77
+ def temporarily_change_config(action, new_value, &block)
68
78
  original_value = configuration[action]
69
79
  configuration[action] = new_value
70
80
  yield
71
81
  ensure
72
82
  configuration[action] = original_value
73
83
  end
74
-
84
+
75
85
  end
76
-
86
+
77
87
  end
78
-
88
+
79
89
  end
@@ -1,11 +1,11 @@
1
1
  module Mocha
2
-
2
+
3
3
  class Deprecation
4
-
4
+
5
5
  class << self
6
-
6
+
7
7
  attr_accessor :mode, :messages
8
-
8
+
9
9
  def warning(message)
10
10
  @messages << message
11
11
  $stderr.puts "Mocha deprecation warning: #{message}" unless mode == :disabled
@@ -13,10 +13,10 @@ module Mocha
13
13
  end
14
14
 
15
15
  end
16
-
16
+
17
17
  self.mode = :enabled
18
18
  self.messages = []
19
-
19
+
20
20
  end
21
-
22
- end
21
+
22
+ end
@@ -1,17 +1,17 @@
1
- module Mocha # :nodoc:
2
-
3
- class ExceptionRaiser # :nodoc:
4
-
1
+ module Mocha
2
+
3
+ class ExceptionRaiser
4
+
5
5
  def initialize(exception, message)
6
6
  @exception, @message = exception, message
7
7
  end
8
-
8
+
9
9
  def evaluate
10
10
  raise @exception, @exception.to_s if @exception.is_a?(Module) && @exception.ancestors.include?(Interrupt)
11
11
  raise @exception, @message if @message
12
12
  raise @exception
13
13
  end
14
-
14
+
15
15
  end
16
-
16
+
17
17
  end
@@ -10,16 +10,17 @@ require 'mocha/in_state_ordering_constraint'
10
10
  require 'mocha/change_state_side_effect'
11
11
  require 'mocha/cardinality'
12
12
 
13
- module Mocha # :nodoc:
13
+ module Mocha
14
14
 
15
- # Methods on expectations returned from Mock#expects, Mock#stubs, Object#expects and Object#stubs.
15
+ # Methods on expectations returned from {Mock#expects}, {Mock#stubs}, {ObjectMethods#expects} and {ObjectMethods#stubs}.
16
16
  class Expectation
17
17
 
18
- # :call-seq: times(range) -> expectation
19
- #
20
18
  # Modifies expectation so that the number of calls to the expected method must be within a specific +range+.
21
19
  #
22
- # +range+ can be specified as an exact integer or as a range of integers
20
+ # @param [Range,Integer] range specifies the allowable range in the number of expected invocations.
21
+ # @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
22
+ #
23
+ # @example Specifying a specific number of expected invocations.
23
24
  # object = mock()
24
25
  # object.expects(:expected_method).times(3)
25
26
  # 3.times { object.expected_method }
@@ -30,6 +31,7 @@ module Mocha # :nodoc:
30
31
  # 2.times { object.expected_method }
31
32
  # # => verify fails
32
33
  #
34
+ # @example Specifying a range in the number of expected invocations.
33
35
  # object = mock()
34
36
  # object.expects(:expected_method).times(2..4)
35
37
  # 3.times { object.expected_method }
@@ -44,9 +46,11 @@ module Mocha # :nodoc:
44
46
  self
45
47
  end
46
48
 
47
- # :call-seq: twice() -> expectation
48
- #
49
49
  # Modifies expectation so that the expected method must be called exactly twice.
50
+ #
51
+ # @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
52
+ #
53
+ # @example Expected method must be invoked exactly twice.
50
54
  # object = mock()
51
55
  # object.expects(:expected_method).twice
52
56
  # object.expected_method
@@ -57,8 +61,7 @@ module Mocha # :nodoc:
57
61
  # object.expects(:expected_method).twice
58
62
  # object.expected_method
59
63
  # object.expected_method
60
- # object.expected_method
61
- # # => verify fails
64
+ # object.expected_method # => unexpected invocation
62
65
  #
63
66
  # object = mock()
64
67
  # object.expects(:expected_method).twice
@@ -69,10 +72,13 @@ module Mocha # :nodoc:
69
72
  self
70
73
  end
71
74
 
72
- # :call-seq: once() -> expectation
73
- #
74
75
  # Modifies expectation so that the expected method must be called exactly once.
76
+ #
75
77
  # Note that this is the default behaviour for an expectation, but you may wish to use it for clarity/emphasis.
78
+ #
79
+ # @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
80
+ #
81
+ # @example Expected method must be invoked exactly once.
76
82
  # object = mock()
77
83
  # object.expects(:expected_method).once
78
84
  # object.expected_method
@@ -81,8 +87,7 @@ module Mocha # :nodoc:
81
87
  # object = mock()
82
88
  # object.expects(:expected_method).once
83
89
  # object.expected_method
84
- # object.expected_method
85
- # # => verify fails
90
+ # object.expected_method # => unexpected invocation
86
91
  #
87
92
  # object = mock()
88
93
  # object.expects(:expected_method).once
@@ -92,13 +97,14 @@ module Mocha # :nodoc:
92
97
  self
93
98
  end
94
99
 
95
- # :call-seq: never() -> expectation
96
- #
97
100
  # Modifies expectation so that the expected method must never be called.
101
+ #
102
+ # @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
103
+ #
104
+ # @example Expected method must never be called.
98
105
  # object = mock()
99
106
  # object.expects(:expected_method).never
100
- # object.expected_method
101
- # # => verify fails
107
+ # object.expected_method # => unexpected invocation
102
108
  #
103
109
  # object = mock()
104
110
  # object.expects(:expected_method).never
@@ -108,9 +114,12 @@ module Mocha # :nodoc:
108
114
  self
109
115
  end
110
116
 
111
- # :call-seq: at_least(minimum_number_of_times) -> expectation
112
- #
113
117
  # Modifies expectation so that the expected method must be called at least a +minimum_number_of_times+.
118
+ #
119
+ # @param [Integer] minimum_number_of_times minimum number of expected invocations.
120
+ # @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
121
+ #
122
+ # @example Expected method must be called at least twice.
114
123
  # object = mock()
115
124
  # object.expects(:expected_method).at_least(2)
116
125
  # 3.times { object.expected_method }
@@ -125,9 +134,11 @@ module Mocha # :nodoc:
125
134
  self
126
135
  end
127
136
 
128
- # :call-seq: at_least_once() -> expectation
129
- #
130
137
  # Modifies expectation so that the expected method must be called at least once.
138
+ #
139
+ # @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
140
+ #
141
+ # @example Expected method must be called at least once.
131
142
  # object = mock()
132
143
  # object.expects(:expected_method).at_least_once
133
144
  # object.expected_method
@@ -141,9 +152,12 @@ module Mocha # :nodoc:
141
152
  self
142
153
  end
143
154
 
144
- # :call-seq: at_most(maximum_number_of_times) -> expectation
145
- #
146
155
  # Modifies expectation so that the expected method must be called at most a +maximum_number_of_times+.
156
+ #
157
+ # @param [Integer] maximum_number_of_times maximum number of expected invocations.
158
+ # @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
159
+ #
160
+ # @example Expected method must be called at most twice.
147
161
  # object = mock()
148
162
  # object.expects(:expected_method).at_most(2)
149
163
  # 2.times { object.expected_method }
@@ -151,16 +165,17 @@ module Mocha # :nodoc:
151
165
  #
152
166
  # object = mock()
153
167
  # object.expects(:expected_method).at_most(2)
154
- # 3.times { object.expected_method }
155
- # # => verify fails
168
+ # 3.times { object.expected_method } # => unexpected invocation
156
169
  def at_most(maximum_number_of_times)
157
170
  @cardinality = Cardinality.at_most(maximum_number_of_times)
158
171
  self
159
172
  end
160
173
 
161
- # :call-seq: at_most_once() -> expectation
162
- #
163
174
  # Modifies expectation so that the expected method must be called at most once.
175
+ #
176
+ # @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
177
+ #
178
+ # @example Expected method must be called at most once.
164
179
  # object = mock()
165
180
  # object.expects(:expected_method).at_most_once
166
181
  # object.expected_method
@@ -168,16 +183,23 @@ module Mocha # :nodoc:
168
183
  #
169
184
  # object = mock()
170
185
  # object.expects(:expected_method).at_most_once
171
- # 2.times { object.expected_method }
172
- # # => verify fails
186
+ # 2.times { object.expected_method } # => unexpected invocation
173
187
  def at_most_once()
174
188
  at_most(1)
175
189
  self
176
190
  end
177
191
 
178
- # :call-seq: with(*expected_parameters, &matching_block) -> expectation
179
- #
180
192
  # Modifies expectation so that the expected method must be called with +expected_parameters+.
193
+ #
194
+ # May be used with parameter matchers in {ParameterMatchers}.
195
+ #
196
+ # @param [*Array] expected_parameters parameters expected.
197
+ # @yield optional block specifying custom matching.
198
+ # @yieldparam [*Array] actual_parameters parameters with which expected method was invoked.
199
+ # @yieldreturn [Boolean] +true+ if +actual_parameters+ are acceptable.
200
+ # @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
201
+ #
202
+ # @example Expected method must be called with expected parameters.
181
203
  # object = mock()
182
204
  # object.expects(:expected_method).with(:param1, :param2)
183
205
  # object.expected_method(:param1, :param2)
@@ -187,10 +209,8 @@ module Mocha # :nodoc:
187
209
  # object.expects(:expected_method).with(:param1, :param2)
188
210
  # object.expected_method(:param3)
189
211
  # # => verify fails
190
- # May be used with parameter matchers in Mocha::ParameterMatchers.
191
212
  #
192
- # If a +matching_block+ is given, the block is called with the parameters passed to the expected method.
193
- # The expectation is matched if the block evaluates to +true+.
213
+ # @example Expected method must be called with a value divisible by 4.
194
214
  # object = mock()
195
215
  # object.expects(:expected_method).with() { |value| value % 4 == 0 }
196
216
  # object.expected_method(16)
@@ -205,15 +225,22 @@ module Mocha # :nodoc:
205
225
  self
206
226
  end
207
227
 
208
- # :call-seq: yields(*parameters) -> expectation
209
- #
210
228
  # Modifies expectation so that when the expected method is called, it yields with the specified +parameters+.
229
+ #
230
+ # May be called multiple times on the same expectation for consecutive invocations.
231
+ #
232
+ # @param [*Array] parameters parameters to be yielded.
233
+ # @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
234
+ # @see #then
235
+ #
236
+ # @example Yield parameters when expected method is invoked.
211
237
  # object = mock()
212
238
  # object.expects(:expected_method).yields('result')
213
239
  # yielded_value = nil
214
240
  # object.expected_method { |value| yielded_value = value }
215
241
  # yielded_value # => 'result'
216
- # May be called multiple times on the same expectation for consecutive invocations. Also see Expectation#then.
242
+ #
243
+ # @example Yield different parameters on different invocations of the expected method.
217
244
  # object = mock()
218
245
  # object.stubs(:expected_method).yields(1).then.yields(2)
219
246
  # yielded_values_from_first_invocation = []
@@ -227,18 +254,20 @@ module Mocha # :nodoc:
227
254
  self
228
255
  end
229
256
 
230
- # :call-seq: multiple_yields(*parameter_groups) -> expectation
231
- #
232
257
  # Modifies expectation so that when the expected method is called, it yields multiple times per invocation with the specified +parameter_groups+.
233
258
  #
234
- # Note that each +parameter_group+ should be an Array representing the parameters to be passed to the block for a single yield. In the following example when the expected_method is called, the stub will invoke the block twice, the first time it passes 'result_1', 'result_2' as the parameters, and the second time it passes 'result_3' as the parameters.
259
+ # @param [*Array<Array>] parameter_groups each element of +parameter_groups+ should iself be an +Array+ representing the parameters to be passed to the block for a single yield.
260
+ # @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
261
+ # @see #then
235
262
  #
263
+ # @example When the +expected_method+ is called, the stub will invoke the block twice, the first time it passes +'result_1'+, +'result_2'+ as the parameters, and the second time it passes 'result_3' as the parameters.
236
264
  # object = mock()
237
265
  # object.expects(:expected_method).multiple_yields(['result_1', 'result_2'], ['result_3'])
238
266
  # yielded_values = []
239
267
  # object.expected_method { |*values| yielded_values << values }
240
268
  # yielded_values # => [['result_1', 'result_2'], ['result_3]]
241
- # May be called multiple times on the same expectation for consecutive invocations. Also see Expectation#then.
269
+ #
270
+ # @example Yield different groups of parameters on different invocations of the expected method.
242
271
  # object = mock()
243
272
  # object.stubs(:expected_method).multiple_yields([1, 2], [3]).then.multiple_yields([4], [5, 6])
244
273
  # yielded_values_from_first_invocation = []
@@ -252,32 +281,43 @@ module Mocha # :nodoc:
252
281
  self
253
282
  end
254
283
 
255
- # :call-seq: returns(value) -> expectation
256
- # returns(*values) -> expectation
257
- #
258
284
  # Modifies expectation so that when the expected method is called, it returns the specified +value+.
285
+ #
286
+ # @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
287
+ # @see #then
288
+ #
289
+ # @overload def returns(value)
290
+ # @param [Object] value value to return on invocation of expected method.
291
+ # @overload def returns(*values)
292
+ # @param [*Array] values values to return on consecutive invocations of expected method.
293
+ #
294
+ # @example Return the same value on every invocation.
259
295
  # object = mock()
260
296
  # object.stubs(:stubbed_method).returns('result')
261
297
  # object.stubbed_method # => 'result'
262
298
  # object.stubbed_method # => 'result'
263
- # If multiple +values+ are given, these are returned in turn on consecutive calls to the method.
299
+ #
300
+ # @example Return a different value on consecutive invocations.
264
301
  # object = mock()
265
302
  # object.stubs(:stubbed_method).returns(1, 2)
266
303
  # object.stubbed_method # => 1
267
304
  # object.stubbed_method # => 2
268
- # May be called multiple times on the same expectation. Also see Expectation#then.
305
+ #
306
+ # @example Alternative way to return a different value on consecutive invocations.
269
307
  # object = mock()
270
308
  # object.stubs(:expected_method).returns(1, 2).then.returns(3)
271
309
  # object.expected_method # => 1
272
310
  # object.expected_method # => 2
273
311
  # object.expected_method # => 3
274
- # May be called in conjunction with Expectation#raises on the same expectation.
312
+ #
313
+ # @example May be called in conjunction with {#raises} on the same expectation.
275
314
  # object = mock()
276
315
  # object.stubs(:expected_method).returns(1, 2).then.raises(Exception)
277
316
  # object.expected_method # => 1
278
317
  # object.expected_method # => 2
279
318
  # object.expected_method # => raises exception of class Exception1
280
- # Note that in Ruby a method returning multiple values is exactly equivalent to a method returning an Array of those values.
319
+ #
320
+ # @example Note that in Ruby a method returning multiple values is exactly equivalent to a method returning an +Array+ of those values.
281
321
  # object = mock()
282
322
  # object.stubs(:expected_method).returns([1, 2])
283
323
  # x, y = object.expected_method
@@ -288,22 +328,36 @@ module Mocha # :nodoc:
288
328
  self
289
329
  end
290
330
 
291
- # :call-seq: raises(exception = RuntimeError, message = nil) -> expectation
331
+ # Modifies expectation so that when the expected method is called, it raises the specified +exception+ with the specified +message+ i.e. calls +Kernel#raise(exception, message)+.
332
+ #
333
+ # @param [Class,Exception,String,#exception] exception exception to be raised or message to be passed to RuntimeError.
334
+ # @param [String] message exception message.
335
+ # @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
336
+ #
337
+ # @see Kernel#raise
338
+ # @see #then
292
339
  #
293
- # Modifies expectation so that when the expected method is called, it raises the specified +exception+ with the specified +message+ i.e. calls Kernel#raise(exception, message).
340
+ # @overload def raises
341
+ # @overload def raises(exception)
342
+ # @overload def raises(exception, message)
343
+ #
344
+ # @example Raise specified exception if expected method is invoked.
294
345
  # object = stub()
295
346
  # object.stubs(:expected_method).raises(Exception, 'message')
296
347
  # object.expected_method # => raises exception of class Exception and with message 'message'
297
- # Note that if you have a custom exception class with extra constructor parameters, you can pass in an instance of the exception (just as you can for Kernel#raise).
348
+ #
349
+ # @example Raise custom exception with extra constructor parameters by passing in an instance of the exception.
298
350
  # object = stub()
299
351
  # object.stubs(:expected_method).raises(MyException.new('message', 1, 2, 3))
300
352
  # object.expected_method # => raises the specified instance of MyException
301
- # May be called multiple times on the same expectation. Also see Expectation#then.
353
+ #
354
+ # @example Raise different exceptions on consecutive invocations of the expected method.
302
355
  # object = stub()
303
356
  # object.stubs(:expected_method).raises(Exception1).then.raises(Exception2)
304
357
  # object.expected_method # => raises exception of class Exception1
305
358
  # object.expected_method # => raises exception of class Exception2
306
- # May be called in conjunction with Expectation#returns on the same expectation.
359
+ #
360
+ # @example Raise an exception on first invocation of expected method and then return values on subsequent invocations.
307
361
  # object = stub()
308
362
  # object.stubs(:expected_method).raises(Exception).then.returns(2, 3)
309
363
  # object.expected_method # => raises exception of class Exception1
@@ -314,22 +368,35 @@ module Mocha # :nodoc:
314
368
  self
315
369
  end
316
370
 
317
- # :call-seq: throws(tag, object = nil) -> expectation
371
+ # Modifies expectation so that when the expected method is called, it throws the specified +tag+ with the specific return value +object+ i.e. calls +Kernel#throw(tag, object)+.
372
+ #
373
+ # @param [Symbol,String] tag tag to throw to transfer control to the active catch block.
374
+ # @param [Object] object return value for the catch block.
375
+ # @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
318
376
  #
319
- # Modifies expectation so that when the expected method is called, it throws the specified +tag+ with the specific return value +object+ i.e. calls Kernel#throw(tag, object).
377
+ # @see Kernel#throw
378
+ # @see #then
379
+ #
380
+ # @overload def throw(tag)
381
+ # @overload def throw(tag, object)
382
+ #
383
+ # @example Throw tag when expected method is invoked.
320
384
  # object = stub()
321
385
  # object.stubs(:expected_method).throws(:done)
322
386
  # object.expected_method # => throws tag :done
323
- # Note you can also pass in an optional return value +object+ (just as you can for Kernel#throw).
387
+ #
388
+ # @example Throw tag with return value +object+ c.f. +Kernel#throw+.
324
389
  # object = stub()
325
390
  # object.stubs(:expected_method).throws(:done, 'result')
326
391
  # object.expected_method # => throws tag :done and causes catch block to return 'result'
327
- # May be called multiple times on the same expectation. Also see Expectation#then.
392
+ #
393
+ # @example Throw different tags on consecutive invocations of the expected method.
328
394
  # object = stub()
329
395
  # object.stubs(:expected_method).throws(:done).then.throws(:continue)
330
396
  # object.expected_method # => throws :done
331
397
  # object.expected_method # => throws :continue
332
- # May be called in conjunction with Expectation#returns on the same expectation.
398
+ #
399
+ # @example Throw tag on first invocation of expected method and then return values for subsequent invocations.
333
400
  # object = stub()
334
401
  # object.stubs(:expected_method).throws(:done).then.returns(2, 3)
335
402
  # object.expected_method # => throws :done
@@ -340,10 +407,19 @@ module Mocha # :nodoc:
340
407
  self
341
408
  end
342
409
 
343
- # :call-seq: then() -> expectation
344
- # then(state_machine.is(state)) -> expectation
410
+ # @overload def then
411
+ # Used as syntactic sugar to improve readability. It has no effect on state of the expectation.
412
+ # @overload def then(state_machine.is(state_name))
413
+ # Used to change the +state_machine+ to the state specified by +state_name+ when the expected invocation occurs.
414
+ # @param [StateMachine::State] state_machine.is(state_name) provides a mechanism to change the +state_machine+ into the state specified by +state_name+ when the expected method is invoked.
415
+ #
416
+ # @see API#states
417
+ # @see StateMachine
418
+ # @see #when
419
+ #
420
+ # @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
345
421
  #
346
- # <tt>then()</tt> is used as syntactic sugar to improve readability. It has no effect on state of the expectation.
422
+ # @example Using {#then} as syntactic sugar when specifying values to be returned and exceptions to be raised on consecutive invocations of the expected method.
347
423
  # object = mock()
348
424
  # object.stubs(:expected_method).returns(1, 2).then.raises(Exception).then.returns(4)
349
425
  # object.expected_method # => 1
@@ -351,9 +427,7 @@ module Mocha # :nodoc:
351
427
  # object.expected_method # => raises exception of class Exception
352
428
  # object.expected_method # => 4
353
429
  #
354
- # <tt>then(state_machine.is(state))</tt> is used to change the +state_machine+ to the specified +state+ when the invocation occurs.
355
- #
356
- # See also API#states, StateMachine and Expectation#when.
430
+ # @example Using {#then} to change the +state+ of a +state_machine+ on the invocation of an expected method.
357
431
  # power = states('power').starts_as('off')
358
432
  #
359
433
  # radio = mock('radio')
@@ -371,11 +445,16 @@ module Mocha # :nodoc:
371
445
  self
372
446
  end
373
447
 
374
- # :call-seq: when(state_machine.is(state)) -> exception
448
+ # Constrains the expectation to occur only when the +state_machine+ is in the state specified by +state_name+.
449
+ #
450
+ # @param [StateMachine::StatePredicate] state_machine.is(state_name) provides a mechanism to determine whether the +state_machine+ is in the state specified by +state_name+ when the expected method is invoked.
451
+ # @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
375
452
  #
376
- # Constrains the expectation to occur only when the +state_machine+ is in the named +state+.
453
+ # @see API#states
454
+ # @see StateMachine
455
+ # @see #then
377
456
  #
378
- # See also API#states, StateMachine#starts_as and Expectation#then.
457
+ # @example Using {#when} to only allow invocation of methods when "power" state machine is in the "on" state.
379
458
  # power = states('power').starts_as('off')
380
459
  #
381
460
  # radio = mock('radio')
@@ -390,17 +469,22 @@ module Mocha # :nodoc:
390
469
  self
391
470
  end
392
471
 
393
- # :call-seq: in_sequence(*sequences) -> expectation
472
+ # Constrains the expectation so that it must be invoked at the current point in the +sequence+.
394
473
  #
395
- # Constrains this expectation so that it must be invoked at the current point in the sequence.
474
+ # To expect a sequence of invocations, write the expectations in order and add the +in_sequence(sequence)+ clause to each one.
396
475
  #
397
- # To expect a sequence of invocations, write the expectations in order and add the in_sequence(sequence) clause to each one.
476
+ # Expectations in a +sequence+ can have any invocation count.
398
477
  #
399
- # Expectations in a sequence can have any invocation count.
478
+ # If an expectation in a sequence is stubbed, rather than expected, it can be skipped in the +sequence+.
400
479
  #
401
- # If an expectation in a sequence is stubbed, rather than expected, it can be skipped in the sequence.
480
+ # An expected method can appear in multiple sequences.
402
481
  #
403
- # See also API#sequence.
482
+ # @param [*Array<Sequence>] sequences sequences in which expected method should appear.
483
+ # @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
484
+ #
485
+ # @see API#sequence
486
+ #
487
+ # @example Ensure methods are invoked in a specified order.
404
488
  # breakfast = sequence('breakfast')
405
489
  #
406
490
  # egg = mock('egg')
@@ -412,10 +496,10 @@ module Mocha # :nodoc:
412
496
  self
413
497
  end
414
498
 
415
- # :stopdoc:
416
-
499
+ # @private
417
500
  attr_reader :backtrace
418
501
 
502
+ # @private
419
503
  def initialize(mock, expected_method_name, backtrace = nil)
420
504
  @mock = mock
421
505
  @method_matcher = MethodMatcher.new(expected_method_name.to_sym)
@@ -428,42 +512,52 @@ module Mocha # :nodoc:
428
512
  @backtrace = backtrace || caller
429
513
  end
430
514
 
515
+ # @private
431
516
  def add_ordering_constraint(ordering_constraint)
432
517
  @ordering_constraints << ordering_constraint
433
518
  end
434
519
 
520
+ # @private
435
521
  def add_in_sequence_ordering_constraint(sequence)
436
522
  sequence.constrain_as_next_in_sequence(self)
437
523
  end
438
524
 
525
+ # @private
439
526
  def add_side_effect(side_effect)
440
527
  @side_effects << side_effect
441
528
  end
442
529
 
530
+ # @private
443
531
  def perform_side_effects
444
532
  @side_effects.each { |side_effect| side_effect.perform }
445
533
  end
446
534
 
535
+ # @private
447
536
  def in_correct_order?
448
537
  @ordering_constraints.all? { |ordering_constraint| ordering_constraint.allows_invocation_now? }
449
538
  end
450
539
 
540
+ # @private
451
541
  def matches_method?(method_name)
452
542
  @method_matcher.match?(method_name)
453
543
  end
454
544
 
545
+ # @private
455
546
  def match?(actual_method_name, *actual_parameters)
456
547
  @method_matcher.match?(actual_method_name) && @parameters_matcher.match?(actual_parameters) && in_correct_order?
457
548
  end
458
549
 
550
+ # @private
459
551
  def invocations_allowed?
460
552
  @cardinality.invocations_allowed?(@invocation_count)
461
553
  end
462
554
 
555
+ # @private
463
556
  def satisfied?
464
557
  @cardinality.satisfied?(@invocation_count)
465
558
  end
466
559
 
560
+ # @private
467
561
  def invoke
468
562
  @invocation_count += 1
469
563
  perform_side_effects()
@@ -475,15 +569,18 @@ module Mocha # :nodoc:
475
569
  @return_values.next
476
570
  end
477
571
 
572
+ # @private
478
573
  def verified?(assertion_counter = nil)
479
574
  assertion_counter.increment if assertion_counter && @cardinality.needs_verifying?
480
575
  @cardinality.verified?(@invocation_count)
481
576
  end
482
577
 
578
+ # @private
483
579
  def used?
484
580
  @cardinality.used?(@invocation_count)
485
581
  end
486
582
 
583
+ # @private
487
584
  def mocha_inspect
488
585
  message = "#{@cardinality.mocha_inspect}, "
489
586
  message << case @invocation_count
@@ -498,12 +595,11 @@ module Mocha # :nodoc:
498
595
  message
499
596
  end
500
597
 
598
+ # @private
501
599
  def method_signature
502
600
  "#{@mock.mocha_inspect}.#{@method_matcher.mocha_inspect}#{@parameters_matcher.mocha_inspect}"
503
601
  end
504
602
 
505
- # :startdoc:
506
-
507
603
  end
508
604
 
509
605
  end