mocha 0.10.5 → 1.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (262) hide show
  1. checksums.yaml +7 -0
  2. data/.github/FUNDING.yml +1 -0
  3. data/.rubocop.yml +61 -0
  4. data/.rubocop_todo.yml +27 -0
  5. data/.yardopts +24 -0
  6. data/CONTRIBUTING.md +7 -0
  7. data/COPYING.md +3 -0
  8. data/Gemfile +2 -2
  9. data/{MIT-LICENSE.rdoc → MIT-LICENSE.md} +1 -1
  10. data/README.md +363 -0
  11. data/{RELEASE.rdoc → RELEASE.md} +436 -35
  12. data/Rakefile +87 -87
  13. data/gemfiles/Gemfile.minitest.latest +2 -2
  14. data/gemfiles/Gemfile.test-unit.latest +6 -2
  15. data/init.rb +1 -3
  16. data/lib/mocha/any_instance_method.rb +12 -45
  17. data/lib/mocha/api.rb +199 -131
  18. data/lib/mocha/argument_iterator.rb +6 -10
  19. data/lib/mocha/backtrace_filter.rb +1 -5
  20. data/lib/mocha/block_matcher.rb +31 -0
  21. data/lib/mocha/cardinality.rb +77 -66
  22. data/lib/mocha/central.rb +27 -18
  23. data/lib/mocha/change_state_side_effect.rb +3 -7
  24. data/lib/mocha/class_methods.rb +62 -0
  25. data/lib/mocha/configuration.rb +399 -46
  26. data/lib/mocha/debug.rb +12 -0
  27. data/lib/mocha/deprecation.rb +11 -12
  28. data/lib/mocha/detection/mini_test.rb +23 -0
  29. data/lib/mocha/detection/test_unit.rb +27 -0
  30. data/lib/mocha/error_with_filtered_backtrace.rb +13 -0
  31. data/lib/mocha/exception_raiser.rb +8 -10
  32. data/lib/mocha/expectation.rb +290 -151
  33. data/lib/mocha/expectation_error.rb +6 -13
  34. data/lib/mocha/expectation_error_factory.rb +35 -0
  35. data/lib/mocha/expectation_list.rb +22 -22
  36. data/lib/mocha/hooks.rb +42 -0
  37. data/lib/mocha/in_state_ordering_constraint.rb +3 -7
  38. data/lib/mocha/inspect.rb +35 -43
  39. data/lib/mocha/instance_method.rb +12 -21
  40. data/lib/mocha/integration/assertion_counter.rb +13 -0
  41. data/lib/mocha/integration/mini_test/adapter.rb +52 -0
  42. data/lib/mocha/integration/mini_test/exception_translation.rb +1 -7
  43. data/lib/mocha/integration/mini_test/nothing.rb +19 -0
  44. data/lib/mocha/integration/mini_test/version_13.rb +35 -25
  45. data/lib/mocha/integration/mini_test/version_140.rb +35 -26
  46. data/lib/mocha/integration/mini_test/version_141.rb +43 -34
  47. data/lib/mocha/integration/mini_test/version_142_to_172.rb +44 -35
  48. data/lib/mocha/integration/mini_test/version_200.rb +45 -36
  49. data/lib/mocha/integration/mini_test/version_201_to_222.rb +44 -35
  50. data/lib/mocha/integration/mini_test/version_2110_to_2111.rb +70 -0
  51. data/lib/mocha/integration/mini_test/version_2112_to_320.rb +73 -0
  52. data/lib/mocha/integration/mini_test/version_230_to_2101.rb +68 -0
  53. data/lib/mocha/integration/mini_test.rb +51 -49
  54. data/lib/mocha/integration/monkey_patcher.rb +24 -0
  55. data/lib/mocha/integration/test_unit/adapter.rb +50 -0
  56. data/lib/mocha/integration/test_unit/gem_version_200.rb +39 -29
  57. data/lib/mocha/integration/test_unit/gem_version_201_to_202.rb +39 -29
  58. data/lib/mocha/integration/test_unit/gem_version_203_to_220.rb +39 -29
  59. data/lib/mocha/integration/test_unit/gem_version_230_to_250.rb +68 -0
  60. data/lib/mocha/integration/test_unit/nothing.rb +19 -0
  61. data/lib/mocha/integration/test_unit/ruby_version_185_and_below.rb +39 -29
  62. data/lib/mocha/integration/test_unit/ruby_version_186_and_above.rb +40 -30
  63. data/lib/mocha/integration/test_unit.rb +45 -51
  64. data/lib/mocha/integration.rb +6 -33
  65. data/lib/mocha/invocation.rb +77 -0
  66. data/lib/mocha/is_a.rb +0 -2
  67. data/lib/mocha/logger.rb +2 -6
  68. data/lib/mocha/macos_version.rb +5 -0
  69. data/lib/mocha/method_matcher.rb +6 -10
  70. data/lib/mocha/minitest.rb +8 -0
  71. data/lib/mocha/mock.rb +266 -79
  72. data/lib/mocha/mockery.rb +104 -106
  73. data/lib/mocha/names.rb +10 -20
  74. data/lib/mocha/not_initialized_error.rb +7 -0
  75. data/lib/mocha/object_methods.rb +169 -0
  76. data/lib/mocha/parameter_matchers/all_of.rb +18 -14
  77. data/lib/mocha/parameter_matchers/any_of.rb +19 -14
  78. data/lib/mocha/parameter_matchers/any_parameters.rb +14 -13
  79. data/lib/mocha/parameter_matchers/anything.rb +17 -14
  80. data/lib/mocha/parameter_matchers/base.rb +33 -31
  81. data/lib/mocha/parameter_matchers/equals.rb +18 -13
  82. data/lib/mocha/parameter_matchers/equivalent_uri.rb +58 -0
  83. data/lib/mocha/parameter_matchers/has_entries.rb +19 -14
  84. data/lib/mocha/parameter_matchers/has_entry.rb +58 -26
  85. data/lib/mocha/parameter_matchers/has_key.rb +18 -13
  86. data/lib/mocha/parameter_matchers/has_keys.rb +53 -0
  87. data/lib/mocha/parameter_matchers/has_value.rb +18 -13
  88. data/lib/mocha/parameter_matchers/includes.rb +80 -19
  89. data/lib/mocha/parameter_matchers/instance_methods.rb +18 -0
  90. data/lib/mocha/parameter_matchers/instance_of.rb +18 -13
  91. data/lib/mocha/parameter_matchers/is_a.rb +20 -14
  92. data/lib/mocha/parameter_matchers/kind_of.rb +20 -13
  93. data/lib/mocha/parameter_matchers/not.rb +19 -14
  94. data/lib/mocha/parameter_matchers/optionally.rb +23 -17
  95. data/lib/mocha/parameter_matchers/regexp_matches.rb +16 -12
  96. data/lib/mocha/parameter_matchers/responds_with.rb +17 -11
  97. data/lib/mocha/parameter_matchers/yaml_equivalent.rb +15 -9
  98. data/lib/mocha/parameter_matchers.rb +4 -5
  99. data/lib/mocha/parameters_matcher.rb +11 -14
  100. data/lib/mocha/raised_exception.rb +11 -0
  101. data/lib/mocha/receivers.rb +45 -0
  102. data/lib/mocha/return_values.rb +11 -15
  103. data/lib/mocha/ruby_version.rb +4 -0
  104. data/lib/mocha/sequence.rb +21 -17
  105. data/lib/mocha/setup.rb +14 -0
  106. data/lib/mocha/single_return_value.rb +5 -8
  107. data/lib/mocha/singleton_class.rb +9 -0
  108. data/lib/mocha/state_machine.rb +69 -67
  109. data/lib/mocha/stubbed_method.rb +125 -0
  110. data/lib/mocha/stubbing_error.rb +6 -14
  111. data/lib/mocha/test_unit.rb +8 -0
  112. data/lib/mocha/thrower.rb +6 -8
  113. data/lib/mocha/thrown_object.rb +12 -0
  114. data/lib/mocha/version.rb +1 -1
  115. data/lib/mocha/yield_parameters.rb +12 -22
  116. data/lib/mocha.rb +8 -3
  117. data/mocha.gemspec +43 -34
  118. data/yard-templates/default/layout/html/google_analytics.erb +8 -0
  119. data/yard-templates/default/layout/html/setup.rb +5 -0
  120. metadata +123 -268
  121. data/COPYING.rdoc +0 -3
  122. data/README.rdoc +0 -54
  123. data/examples/misc.rb +0 -43
  124. data/examples/mocha.rb +0 -25
  125. data/examples/stubba.rb +0 -64
  126. data/gemfiles/Gemfile.minitest.1.3.0 +0 -7
  127. data/gemfiles/Gemfile.minitest.1.4.0 +0 -7
  128. data/gemfiles/Gemfile.minitest.1.4.1 +0 -7
  129. data/gemfiles/Gemfile.minitest.1.4.2 +0 -7
  130. data/gemfiles/Gemfile.minitest.2.0.0 +0 -7
  131. data/gemfiles/Gemfile.minitest.2.0.1 +0 -7
  132. data/gemfiles/Gemfile.minitest.2.3.0 +0 -7
  133. data/gemfiles/Gemfile.test-unit.2.0.0 +0 -8
  134. data/gemfiles/Gemfile.test-unit.2.0.1 +0 -7
  135. data/gemfiles/Gemfile.test-unit.2.0.3 +0 -7
  136. data/lib/mocha/class_method.rb +0 -98
  137. data/lib/mocha/integration/mini_test/assertion_counter.rb +0 -23
  138. data/lib/mocha/integration/mini_test/version_230_to_262.rb +0 -59
  139. data/lib/mocha/integration/test_unit/assertion_counter.rb +0 -23
  140. data/lib/mocha/integration/test_unit/gem_version_230_to_240.rb +0 -58
  141. data/lib/mocha/module_method.rb +0 -16
  142. data/lib/mocha/multiple_yields.rb +0 -20
  143. data/lib/mocha/no_yields.rb +0 -11
  144. data/lib/mocha/object.rb +0 -223
  145. data/lib/mocha/options.rb +0 -1
  146. data/lib/mocha/parameter_matchers/object.rb +0 -15
  147. data/lib/mocha/parameter_matchers/query_string.rb +0 -47
  148. data/lib/mocha/pretty_parameters.rb +0 -28
  149. data/lib/mocha/single_yield.rb +0 -18
  150. data/lib/mocha/standalone.rb +0 -1
  151. data/lib/mocha/unexpected_invocation.rb +0 -18
  152. data/lib/mocha_standalone.rb +0 -2
  153. data/lib/stubba.rb +0 -4
  154. data/test/acceptance/acceptance_test_helper.rb +0 -41
  155. data/test/acceptance/api_test.rb +0 -139
  156. data/test/acceptance/bug_18914_test.rb +0 -43
  157. data/test/acceptance/bug_21465_test.rb +0 -34
  158. data/test/acceptance/bug_21563_test.rb +0 -25
  159. data/test/acceptance/exception_rescue_test.rb +0 -55
  160. data/test/acceptance/expectations_on_multiple_methods_test.rb +0 -55
  161. data/test/acceptance/expected_invocation_count_test.rb +0 -232
  162. data/test/acceptance/failure_messages_test.rb +0 -64
  163. data/test/acceptance/issue_65_test.rb +0 -63
  164. data/test/acceptance/issue_70_test.rb +0 -55
  165. data/test/acceptance/minitest_test.rb +0 -162
  166. data/test/acceptance/mocha_example_test.rb +0 -98
  167. data/test/acceptance/mocha_test_result_test.rb +0 -84
  168. data/test/acceptance/mock_test.rb +0 -100
  169. data/test/acceptance/mock_with_initializer_block_test.rb +0 -51
  170. data/test/acceptance/mocked_methods_dispatch_test.rb +0 -78
  171. data/test/acceptance/multiple_expectations_failure_message_test.rb +0 -68
  172. data/test/acceptance/optional_parameters_test.rb +0 -70
  173. data/test/acceptance/parameter_matcher_test.rb +0 -300
  174. data/test/acceptance/partial_mocks_test.rb +0 -47
  175. data/test/acceptance/raise_exception_test.rb +0 -39
  176. data/test/acceptance/return_value_test.rb +0 -52
  177. data/test/acceptance/sequence_test.rb +0 -192
  178. data/test/acceptance/states_test.rb +0 -70
  179. data/test/acceptance/stub_any_instance_method_test.rb +0 -198
  180. data/test/acceptance/stub_class_method_defined_on_active_record_association_proxy_test.rb +0 -106
  181. data/test/acceptance/stub_class_method_defined_on_class_test.rb +0 -72
  182. data/test/acceptance/stub_class_method_defined_on_module_test.rb +0 -75
  183. data/test/acceptance/stub_class_method_defined_on_superclass_test.rb +0 -75
  184. data/test/acceptance/stub_everything_test.rb +0 -56
  185. data/test/acceptance/stub_instance_method_defined_on_active_record_association_proxy_test.rb +0 -93
  186. data/test/acceptance/stub_instance_method_defined_on_class_and_aliased_test.rb +0 -69
  187. data/test/acceptance/stub_instance_method_defined_on_class_test.rb +0 -66
  188. data/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +0 -75
  189. data/test/acceptance/stub_instance_method_defined_on_module_test.rb +0 -75
  190. data/test/acceptance/stub_instance_method_defined_on_object_class_test.rb +0 -75
  191. data/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb +0 -70
  192. data/test/acceptance/stub_instance_method_defined_on_superclass_test.rb +0 -72
  193. data/test/acceptance/stub_module_method_test.rb +0 -163
  194. data/test/acceptance/stub_test.rb +0 -52
  195. data/test/acceptance/stubba_example_test.rb +0 -102
  196. data/test/acceptance/stubba_test.rb +0 -15
  197. data/test/acceptance/stubba_test_result_test.rb +0 -66
  198. data/test/acceptance/stubbing_error_backtrace_test.rb +0 -64
  199. data/test/acceptance/stubbing_method_unnecessarily_test.rb +0 -65
  200. data/test/acceptance/stubbing_non_existent_any_instance_method_test.rb +0 -130
  201. data/test/acceptance/stubbing_non_existent_class_method_test.rb +0 -157
  202. data/test/acceptance/stubbing_non_existent_instance_method_test.rb +0 -147
  203. data/test/acceptance/stubbing_non_public_any_instance_method_test.rb +0 -130
  204. data/test/acceptance/stubbing_non_public_class_method_test.rb +0 -163
  205. data/test/acceptance/stubbing_non_public_instance_method_test.rb +0 -143
  206. data/test/acceptance/stubbing_on_non_mock_object_test.rb +0 -64
  207. data/test/acceptance/throw_test.rb +0 -45
  208. data/test/acceptance/unstubbing_test.rb +0 -151
  209. data/test/deprecation_disabler.rb +0 -15
  210. data/test/execution_point.rb +0 -36
  211. data/test/method_definer.rb +0 -24
  212. data/test/mini_test_result.rb +0 -83
  213. data/test/simple_counter.rb +0 -13
  214. data/test/test_helper.rb +0 -11
  215. data/test/test_runner.rb +0 -50
  216. data/test/unit/any_instance_method_test.rb +0 -136
  217. data/test/unit/array_inspect_test.rb +0 -16
  218. data/test/unit/backtrace_filter_test.rb +0 -19
  219. data/test/unit/cardinality_test.rb +0 -56
  220. data/test/unit/central_test.rb +0 -100
  221. data/test/unit/change_state_side_effect_test.rb +0 -41
  222. data/test/unit/class_method_test.rb +0 -260
  223. data/test/unit/configuration_test.rb +0 -38
  224. data/test/unit/date_time_inspect_test.rb +0 -21
  225. data/test/unit/exception_raiser_test.rb +0 -42
  226. data/test/unit/expectation_list_test.rb +0 -71
  227. data/test/unit/expectation_test.rb +0 -480
  228. data/test/unit/hash_inspect_test.rb +0 -16
  229. data/test/unit/in_state_ordering_constraint_test.rb +0 -43
  230. data/test/unit/method_matcher_test.rb +0 -23
  231. data/test/unit/mock_test.rb +0 -312
  232. data/test/unit/mockery_test.rb +0 -150
  233. data/test/unit/multiple_yields_test.rb +0 -18
  234. data/test/unit/no_yields_test.rb +0 -18
  235. data/test/unit/object_inspect_test.rb +0 -38
  236. data/test/unit/object_test.rb +0 -87
  237. data/test/unit/parameter_matchers/all_of_test.rb +0 -26
  238. data/test/unit/parameter_matchers/any_of_test.rb +0 -26
  239. data/test/unit/parameter_matchers/anything_test.rb +0 -21
  240. data/test/unit/parameter_matchers/equals_test.rb +0 -25
  241. data/test/unit/parameter_matchers/has_entries_test.rb +0 -51
  242. data/test/unit/parameter_matchers/has_entry_test.rb +0 -96
  243. data/test/unit/parameter_matchers/has_key_test.rb +0 -55
  244. data/test/unit/parameter_matchers/has_value_test.rb +0 -57
  245. data/test/unit/parameter_matchers/includes_test.rb +0 -44
  246. data/test/unit/parameter_matchers/instance_of_test.rb +0 -25
  247. data/test/unit/parameter_matchers/is_a_test.rb +0 -25
  248. data/test/unit/parameter_matchers/kind_of_test.rb +0 -25
  249. data/test/unit/parameter_matchers/not_test.rb +0 -26
  250. data/test/unit/parameter_matchers/regexp_matches_test.rb +0 -46
  251. data/test/unit/parameter_matchers/responds_with_test.rb +0 -25
  252. data/test/unit/parameter_matchers/stub_matcher.rb +0 -27
  253. data/test/unit/parameter_matchers/yaml_equivalent_test.rb +0 -25
  254. data/test/unit/parameters_matcher_test.rb +0 -121
  255. data/test/unit/return_values_test.rb +0 -63
  256. data/test/unit/sequence_test.rb +0 -104
  257. data/test/unit/single_return_value_test.rb +0 -14
  258. data/test/unit/single_yield_test.rb +0 -18
  259. data/test/unit/state_machine_test.rb +0 -98
  260. data/test/unit/string_inspect_test.rb +0 -11
  261. data/test/unit/thrower_test.rb +0 -20
  262. data/test/unit/yield_parameters_test.rb +0 -93
@@ -2,36 +2,33 @@ require 'mocha/inspect'
2
2
  require 'mocha/parameter_matchers'
3
3
 
4
4
  module Mocha
5
-
6
5
  class ParametersMatcher
7
-
8
6
  def initialize(expected_parameters = [ParameterMatchers::AnyParameters.new], &matching_block)
9
- @expected_parameters, @matching_block = expected_parameters, matching_block
7
+ @expected_parameters = expected_parameters
8
+ @matching_block = matching_block
10
9
  end
11
-
10
+
12
11
  def match?(actual_parameters = [])
13
12
  if @matching_block
14
- return @matching_block.call(*actual_parameters)
13
+ @matching_block.call(*actual_parameters)
15
14
  else
16
- return parameters_match?(actual_parameters)
15
+ parameters_match?(actual_parameters)
17
16
  end
18
17
  end
19
-
18
+
20
19
  def parameters_match?(actual_parameters)
21
- matchers.all? { |matcher| matcher.matches?(actual_parameters) } && (actual_parameters.length == 0)
20
+ matchers.all? { |matcher| matcher.matches?(actual_parameters) } && actual_parameters.empty?
22
21
  end
23
-
22
+
24
23
  def mocha_inspect
25
24
  signature = matchers.mocha_inspect
26
25
  signature = signature.gsub(/^\[|\]$/, '')
27
26
  signature = signature.gsub(/^\{|\}$/, '') if matchers.length == 1
28
27
  "(#{signature})"
29
28
  end
30
-
29
+
31
30
  def matchers
32
- @expected_parameters.map { |parameter| parameter.to_matcher }
31
+ @expected_parameters.map(&:to_matcher)
33
32
  end
34
-
35
33
  end
36
-
37
- end
34
+ end
@@ -0,0 +1,11 @@
1
+ module Mocha
2
+ class RaisedException
3
+ def initialize(exception)
4
+ @exception = exception
5
+ end
6
+
7
+ def mocha_inspect
8
+ "raised #{@exception}"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,45 @@
1
+ module Mocha
2
+ class ObjectReceiver
3
+ def initialize(object)
4
+ @object = object
5
+ end
6
+
7
+ def mocks
8
+ object = @object
9
+ mocks = []
10
+ while object
11
+ mocha = object.mocha(false)
12
+ mocks << mocha if mocha
13
+ object = object.is_a?(Class) ? object.superclass : nil
14
+ end
15
+ mocks
16
+ end
17
+ end
18
+
19
+ class AnyInstanceReceiver
20
+ def initialize(klass)
21
+ @klass = klass
22
+ end
23
+
24
+ def mocks
25
+ klass = @klass
26
+ mocks = []
27
+ while klass
28
+ mocha = klass.any_instance.mocha(false)
29
+ mocks << mocha if mocha
30
+ klass = klass.superclass
31
+ end
32
+ mocks
33
+ end
34
+ end
35
+
36
+ class DefaultReceiver
37
+ def initialize(mock)
38
+ @mock = mock
39
+ end
40
+
41
+ def mocks
42
+ [@mock]
43
+ end
44
+ end
45
+ end
@@ -1,31 +1,27 @@
1
1
  require 'mocha/single_return_value'
2
2
 
3
- module Mocha # :nodoc:
4
-
5
- class ReturnValues # :nodoc:
6
-
3
+ module Mocha
4
+ class ReturnValues
7
5
  def self.build(*values)
8
6
  new(*values.map { |value| SingleReturnValue.new(value) })
9
7
  end
10
-
8
+
11
9
  attr_accessor :values
12
-
10
+
13
11
  def initialize(*values)
14
12
  @values = values
15
13
  end
16
-
17
- def next
14
+
15
+ def next(invocation)
18
16
  case @values.length
19
- when 0 then nil
20
- when 1 then @values.first.evaluate
21
- else @values.shift.evaluate
17
+ when 0 then nil
18
+ when 1 then @values.first.evaluate(invocation)
19
+ else @values.shift.evaluate(invocation)
22
20
  end
23
21
  end
24
-
22
+
25
23
  def +(other)
26
24
  self.class.new(*(@values + other.values))
27
25
  end
28
-
29
26
  end
30
-
31
- end
27
+ end
@@ -0,0 +1,4 @@
1
+ module Mocha
2
+ PRE_RUBY_V19 = Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new('1.9')
3
+ RUBY_V2_PLUS = Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new('2')
4
+ end
@@ -1,42 +1,46 @@
1
- module Mocha # :nodoc:
2
-
1
+ module Mocha
2
+ # Used to constrain the order in which expectations can occur.
3
+ #
4
+ # @see API#sequence
5
+ # @see Expectation#in_sequence
3
6
  class Sequence
4
-
7
+ # @private
5
8
  class InSequenceOrderingConstraint
6
-
7
9
  def initialize(sequence, index)
8
- @sequence, @index = sequence, index
10
+ @sequence = sequence
11
+ @index = index
9
12
  end
10
-
13
+
11
14
  def allows_invocation_now?
12
15
  @sequence.satisfied_to_index?(@index)
13
16
  end
14
-
17
+
15
18
  def mocha_inspect
16
19
  "in sequence #{@sequence.mocha_inspect}"
17
20
  end
18
-
19
21
  end
20
-
22
+
23
+ # @private
21
24
  def initialize(name)
22
25
  @name = name
23
26
  @expectations = []
24
27
  end
25
-
28
+
29
+ # @private
26
30
  def constrain_as_next_in_sequence(expectation)
27
31
  index = @expectations.length
28
32
  @expectations << expectation
29
33
  expectation.add_ordering_constraint(InSequenceOrderingConstraint.new(self, index))
30
34
  end
31
-
35
+
36
+ # @private
32
37
  def satisfied_to_index?(index)
33
- @expectations[0...index].all? { |expectation| expectation.satisfied? }
38
+ @expectations[0...index].all?(&:satisfied?)
34
39
  end
35
-
40
+
41
+ # @private
36
42
  def mocha_inspect
37
- "#{@name.mocha_inspect}"
43
+ @name.mocha_inspect.to_s
38
44
  end
39
-
40
45
  end
41
-
42
- end
46
+ end
@@ -0,0 +1,14 @@
1
+ require 'mocha/integration'
2
+ require 'mocha/deprecation'
3
+
4
+ Mocha::Deprecation.warning(
5
+ "Require 'mocha/test_unit', 'mocha/minitest' or 'mocha/api' instead of 'mocha/setup'."
6
+ )
7
+
8
+ module Mocha
9
+ def self.activate
10
+ Integration.activate
11
+ end
12
+ end
13
+
14
+ Mocha.activate
@@ -1,17 +1,14 @@
1
1
  require 'mocha/is_a'
2
2
 
3
- module Mocha # :nodoc:
4
-
5
- class SingleReturnValue # :nodoc:
6
-
3
+ module Mocha
4
+ class SingleReturnValue
7
5
  def initialize(value)
8
6
  @value = value
9
7
  end
10
-
11
- def evaluate
8
+
9
+ def evaluate(invocation)
10
+ invocation.returned(@value)
12
11
  @value
13
12
  end
14
-
15
13
  end
16
-
17
14
  end
@@ -0,0 +1,9 @@
1
+ if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new('1.9.2')
2
+ unless Kernel.method_defined?(:singleton_class)
3
+ module Kernel
4
+ def singleton_class
5
+ class << self; self; end
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,91 +1,93 @@
1
- module Mocha # :nodoc:
2
-
1
+ module Mocha
3
2
  # A state machine that is used to constrain the order of invocations.
4
- # An invocation can be constrained to occur when a state is, or is_not, active.
3
+ # An invocation can be constrained to occur when a state {#is}, or {#is_not}, active.
5
4
  class StateMachine
6
-
7
- class State # :nodoc:
8
-
9
- def initialize(state_machine, state)
10
- @state_machine, @state = state_machine, state
11
- end
12
-
13
- def activate
14
- @state_machine.current_state = @state
5
+ # Provides the ability to determine whether a {StateMachine} is in a specified state at some point in the future.
6
+ class StatePredicate
7
+ # @private
8
+ def initialize(state_machine, state, description, &active_check)
9
+ @state_machine = state_machine
10
+ @state = state
11
+ @description = description
12
+ @active_check = active_check
15
13
  end
16
-
14
+
15
+ # @private
17
16
  def active?
18
- @state_machine.current_state == @state
17
+ @active_check.call(@state_machine.current_state, @state)
19
18
  end
20
-
19
+
20
+ # @private
21
21
  def mocha_inspect
22
- "#{@state_machine.name} is #{@state.mocha_inspect}"
22
+ "#{@state_machine.name} #{@description} #{@state.mocha_inspect}"
23
23
  end
24
-
25
24
  end
26
-
27
- class StatePredicate # :nodoc:
28
-
29
- def initialize(state_machine, state)
30
- @state_machine, @state = state_machine, state
31
- end
32
-
33
- def active?
34
- @state_machine.current_state != @state
35
- end
36
-
37
- def mocha_inspect
38
- "#{@state_machine.name} is not #{@state.mocha_inspect}"
25
+
26
+ # Provides a mechanism to change the state of a {StateMachine} at some point in the future.
27
+ class State < StatePredicate
28
+ # @private
29
+ def activate
30
+ @state_machine.current_state = @state
39
31
  end
40
-
41
32
  end
42
-
43
- attr_reader :name # :nodoc:
44
-
45
- attr_accessor :current_state # :nodoc:
46
-
47
- def initialize(name) # :nodoc:
33
+
34
+ # @private
35
+ attr_reader :name
36
+
37
+ # @private
38
+ attr_accessor :current_state
39
+
40
+ # @private
41
+ def initialize(name)
48
42
  @name = name
49
43
  @current_state = nil
50
44
  end
51
-
52
- # :call-seq: starts_as(initial_state) -> state_machine
45
+
46
+ # Put the {StateMachine} into the state specified by +initial_state_name+.
53
47
  #
54
- # Put the +state_machine+ into the +initial_state+.
55
- def starts_as(initial_state)
56
- become(initial_state)
48
+ # @param [String] initial_state_name name of initial state
49
+ # @return [StateMachine] state machine, thereby allowing invocations of other {StateMachine} methods to be chained.
50
+ def starts_as(initial_state_name)
51
+ become(initial_state_name)
57
52
  self
58
53
  end
59
-
60
- # :call-seq: become(next_state)
54
+
55
+ # Put the {StateMachine} into the +next_state_name+.
61
56
  #
62
- # Put the +state_machine+ into the +next_state+.
63
- def become(next_state)
64
- @current_state = next_state
57
+ # @param [String] next_state_name name of new state
58
+ def become(next_state_name)
59
+ @current_state = next_state_name
65
60
  end
66
-
67
- # :call-seq: is(state)
61
+
62
+ # Provides mechanisms to (a) determine whether the {StateMachine} is in a given state; or (b) to change the {StateMachine} into the given state.
68
63
  #
69
- # Determines whether the +state_machine+ is in the specified +state+.
70
- def is(state)
71
- State.new(self, state)
64
+ # @param [String] state_name name of expected/desired state.
65
+ # @return [StatePredicate,State] (a) state predicate which, when queried, will indicate whether the {StateMachine} is in the given state; or (b) state which, when activated, will change the {StateMachine} into the given state.
66
+ #
67
+ # @overload def is(expected_state_name)
68
+ # Provides a mechanism to determine whether the {StateMachine} is in the state specified by +expected_state_name+ at some point in the future
69
+ # @param [String] expected_state_name name of expected state.
70
+ # @return [StatePredicate] state predicate which, when queried, will indicate whether the {StateMachine} is in the state specified by +expected_state_name+
71
+ #
72
+ # @overload def is(desired_state_name)
73
+ # Provides a mechanism to change the {StateMachine} into the state specified by +desired_state_name+ at some point in the future.
74
+ # @param [String] desired_state_name name of desired new state.
75
+ # @return [State] state which, when activated, will change the {StateMachine} into the state with the specified +desired_state_name+.
76
+ def is(state_name)
77
+ State.new(self, state_name, 'is') { |current, given| current == given }
72
78
  end
73
-
74
- # :call-seq: is_not(state)
79
+
80
+ # Provides a mechanism to determine whether the {StateMachine} is *not* in the state specified by +unexpected_state_name+ at some point in the future.
75
81
  #
76
- # Determines whether the +state_machine+ is not in the specified +state+.
77
- def is_not(state)
78
- StatePredicate.new(self, state)
82
+ # @param [String] unexpected_state_name name of unexpected state.
83
+ # @return [StatePredicate] state predicate which, when queried, will indicate whether the {StateMachine} is *not* in the state specified by +unexpected_state_name+.
84
+ def is_not(unexpected_state_name) # rubocop:disable Naming/PredicateName
85
+ StatePredicate.new(self, unexpected_state_name, 'is not') { |current, given| current != given }
79
86
  end
80
-
81
- def mocha_inspect # :nodoc:
82
- if @current_state
83
- "#{@name} is #{@current_state.mocha_inspect}"
84
- else
85
- "#{@name} has no current state"
86
- end
87
+
88
+ # @private
89
+ def mocha_inspect
90
+ %(#{@name} #{@current_state ? "is #{@current_state.mocha_inspect}" : 'has no current state'})
87
91
  end
88
-
89
92
  end
90
-
91
- end
93
+ end
@@ -0,0 +1,125 @@
1
+ require 'mocha/ruby_version'
2
+ require 'mocha/singleton_class'
3
+
4
+ module Mocha
5
+ class StubbedMethod
6
+ PrependedModule = Class.new(Module)
7
+
8
+ attr_reader :stubbee, :method_name
9
+
10
+ def initialize(stubbee, method_name)
11
+ @stubbee = stubbee
12
+ @original_method = nil
13
+ @original_visibility = nil
14
+ @method_name = PRE_RUBY_V19 ? method_name.to_s : method_name.to_sym
15
+ end
16
+
17
+ def stub
18
+ hide_original_method
19
+ define_new_method
20
+ end
21
+
22
+ def unstub
23
+ remove_new_method
24
+ restore_original_method
25
+ mock.unstub(method_name.to_sym)
26
+ return if mock.any_expectations?
27
+ reset_mocha
28
+ end
29
+
30
+ def mock
31
+ mock_owner.mocha
32
+ end
33
+
34
+ def reset_mocha
35
+ mock_owner.reset_mocha
36
+ end
37
+
38
+ def hide_original_method
39
+ return unless original_method_owner.__method_exists__?(method_name)
40
+ store_original_method_visibility
41
+ if use_prepended_module_for_stub_method?
42
+ use_prepended_module_for_stub_method
43
+ else
44
+ begin
45
+ store_original_method
46
+ # rubocop:disable Lint/HandleExceptions
47
+ rescue NameError
48
+ # deal with nasties like ActiveRecord::Associations::AssociationProxy
49
+ end
50
+ # rubocop:enable Lint/HandleExceptions
51
+ if stub_method_overwrites_original_method?
52
+ remove_original_method_from_stubbee
53
+ end
54
+ end
55
+ end
56
+
57
+ def define_new_method
58
+ self_in_scope = self
59
+ method_name_in_scope = method_name
60
+ stub_method_owner.send(:define_method, method_name) do |*args, &block|
61
+ self_in_scope.mock.method_missing(method_name_in_scope, *args, &block)
62
+ end
63
+ retain_original_visibility(stub_method_owner)
64
+ end
65
+
66
+ def remove_new_method
67
+ stub_method_owner.send(:remove_method, method_name)
68
+ end
69
+
70
+ def store_original_method
71
+ @original_method = stubbee_method(method_name)
72
+ end
73
+
74
+ def restore_original_method
75
+ return if use_prepended_module_for_stub_method?
76
+ if stub_method_overwrites_original_method?
77
+ original_method_owner.send(:define_method, method_name, method_body(@original_method))
78
+ end
79
+ retain_original_visibility(original_method_owner)
80
+ end
81
+
82
+ def matches?(other)
83
+ return false unless other.class == self.class
84
+ (stubbee.object_id == other.stubbee.object_id) && (method_name == other.method_name)
85
+ end
86
+
87
+ alias_method :==, :eql?
88
+
89
+ def to_s
90
+ "#{stubbee}.#{method_name}"
91
+ end
92
+
93
+ private
94
+
95
+ def retain_original_visibility(method_owner)
96
+ return unless @original_visibility
97
+ Module.instance_method(@original_visibility).bind(method_owner).call(method_name)
98
+ end
99
+
100
+ def store_original_method_visibility
101
+ @original_visibility = original_method_owner.__method_visibility__(method_name)
102
+ end
103
+
104
+ def stub_method_overwrites_original_method?
105
+ @original_method && @original_method.owner == original_method_owner
106
+ end
107
+
108
+ def remove_original_method_from_stubbee
109
+ original_method_owner.send(:remove_method, method_name)
110
+ end
111
+
112
+ def use_prepended_module_for_stub_method?
113
+ RUBY_V2_PLUS
114
+ end
115
+
116
+ def use_prepended_module_for_stub_method
117
+ @stub_method_owner = PrependedModule.new
118
+ original_method_owner.__send__ :prepend, @stub_method_owner
119
+ end
120
+
121
+ def stub_method_owner
122
+ @stub_method_owner ||= original_method_owner
123
+ end
124
+ end
125
+ end
@@ -1,16 +1,8 @@
1
- require 'mocha/backtrace_filter'
1
+ require 'mocha/error_with_filtered_backtrace'
2
2
 
3
- module Mocha # :nodoc:
4
-
5
- # Exception raised when an action prevented by Configuration#prevent is attempted.
6
- class StubbingError < StandardError
7
-
8
- def initialize(message = nil, backtrace = []) # :nodoc:
9
- super(message)
10
- filter = BacktraceFilter.new
11
- set_backtrace(filter.filtered(backtrace))
12
- end
13
-
14
- end
15
-
3
+ module Mocha
4
+ # Exception raised when stubbing a particular method is not allowed.
5
+ #
6
+ # @see Configuration.prevent
7
+ class StubbingError < ErrorWithFilteredBacktrace; end
16
8
  end
@@ -0,0 +1,8 @@
1
+ require 'mocha/integration/test_unit'
2
+ require 'mocha/deprecation'
3
+
4
+ unless Mocha::Integration::TestUnit.activate
5
+ Mocha::Deprecation.warning(
6
+ "Test::Unit must be loaded *before* `require 'mocha/test_unit'`."
7
+ )
8
+ end
data/lib/mocha/thrower.rb CHANGED
@@ -1,15 +1,13 @@
1
- module Mocha # :nodoc:
2
-
3
- class Thrower # :nodoc:
4
-
1
+ module Mocha
2
+ class Thrower
5
3
  def initialize(tag, object = nil)
6
- @tag, @object = tag, object
4
+ @tag = tag
5
+ @object = object
7
6
  end
8
7
 
9
- def evaluate
8
+ def evaluate(invocation)
9
+ invocation.threw(@tag, @object)
10
10
  throw @tag, @object
11
11
  end
12
-
13
12
  end
14
-
15
13
  end
@@ -0,0 +1,12 @@
1
+ module Mocha
2
+ class ThrownObject
3
+ def initialize(tag, value = nil)
4
+ @tag = tag
5
+ @value = value
6
+ end
7
+
8
+ def mocha_inspect
9
+ "threw (#{@tag.mocha_inspect}, #{@value.mocha_inspect})"
10
+ end
11
+ end
12
+ end
data/lib/mocha/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Mocha
2
- VERSION = "0.10.5"
2
+ VERSION = '1.13.0'.freeze
3
3
  end
@@ -1,31 +1,21 @@
1
- require 'mocha/no_yields'
2
- require 'mocha/single_yield'
3
- require 'mocha/multiple_yields'
4
-
5
- module Mocha # :nodoc:
6
-
7
- class YieldParameters # :nodoc:
8
-
1
+ module Mocha
2
+ class YieldParameters
9
3
  def initialize
10
4
  @parameter_groups = []
11
5
  end
12
-
6
+
13
7
  def next_invocation
14
8
  case @parameter_groups.length
15
- when 0 then NoYields.new
16
- when 1 then @parameter_groups.first
17
- else @parameter_groups.shift
9
+ when 0 then []
10
+ when 1 then @parameter_groups.first
11
+ else @parameter_groups.shift
18
12
  end
19
13
  end
20
-
21
- def add(*parameters)
22
- @parameter_groups << SingleYield.new(*parameters)
23
- end
24
-
25
- def multiple_add(*parameter_groups)
26
- @parameter_groups << MultipleYields.new(*parameter_groups)
14
+
15
+ def add(*parameter_groups)
16
+ @parameter_groups << parameter_groups.map do |pg|
17
+ pg.is_a?(Array) ? pg : [pg]
18
+ end
27
19
  end
28
-
29
20
  end
30
-
31
- end
21
+ end