mocha 1.2.1 → 1.16.1

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