mocha 1.1.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (266) hide show
  1. checksums.yaml +5 -5
  2. data/.github/FUNDING.yml +1 -0
  3. data/.rubocop.yml +53 -0
  4. data/.rubocop_todo.yml +27 -0
  5. data/.yardopts +1 -1
  6. data/CONTRIBUTING.md +4 -9
  7. data/COPYING.md +2 -2
  8. data/Gemfile +27 -0
  9. data/MIT-LICENSE.md +1 -1
  10. data/README.md +120 -30
  11. data/RELEASE.md +393 -1
  12. data/Rakefile +61 -50
  13. data/gemfiles/Gemfile.minitest.latest +1 -0
  14. data/gemfiles/Gemfile.test-unit.latest +1 -0
  15. data/lib/mocha/any_instance_method.rb +9 -74
  16. data/lib/mocha/api.rb +85 -69
  17. data/lib/mocha/argument_iterator.rb +4 -8
  18. data/lib/mocha/backtrace_filter.rb +3 -7
  19. data/lib/mocha/block_matcher.rb +31 -0
  20. data/lib/mocha/cardinality.rb +60 -49
  21. data/lib/mocha/central.rb +21 -12
  22. data/lib/mocha/change_state_side_effect.rb +0 -4
  23. data/lib/mocha/class_methods.rb +19 -20
  24. data/lib/mocha/configuration.rb +317 -52
  25. data/lib/mocha/debug.rb +2 -4
  26. data/lib/mocha/deprecation.rb +8 -11
  27. data/lib/mocha/detection/mini_test.rb +0 -2
  28. data/lib/mocha/detection/test_unit.rb +3 -5
  29. data/lib/mocha/error_with_filtered_backtrace.rb +13 -0
  30. data/lib/mocha/exception_raiser.rb +4 -6
  31. data/lib/mocha/expectation.rb +186 -95
  32. data/lib/mocha/expectation_error.rb +1 -1
  33. data/lib/mocha/expectation_error_factory.rb +0 -1
  34. data/lib/mocha/expectation_list.rb +7 -11
  35. data/lib/mocha/hooks.rb +1 -3
  36. data/lib/mocha/in_state_ordering_constraint.rb +0 -4
  37. data/lib/mocha/inspect.rb +30 -38
  38. data/lib/mocha/instance_method.rb +11 -8
  39. data/lib/mocha/integration/mini_test/adapter.rb +3 -5
  40. data/lib/mocha/integration/mini_test/exception_translation.rb +1 -1
  41. data/lib/mocha/integration/mini_test.rb +10 -31
  42. data/lib/mocha/integration/monkey_patcher.rb +8 -2
  43. data/lib/mocha/integration/test_unit/adapter.rb +8 -9
  44. data/lib/mocha/integration/test_unit.rb +10 -26
  45. data/lib/mocha/invocation.rb +73 -0
  46. data/lib/mocha/is_a.rb +0 -2
  47. data/lib/mocha/logger.rb +0 -4
  48. data/lib/mocha/macos_version.rb +5 -0
  49. data/lib/mocha/method_matcher.rb +1 -5
  50. data/lib/mocha/minitest.rb +6 -0
  51. data/lib/mocha/mock.rb +105 -57
  52. data/lib/mocha/mockery.rb +70 -98
  53. data/lib/mocha/names.rb +2 -12
  54. data/lib/mocha/not_initialized_error.rb +7 -0
  55. data/lib/mocha/object_methods.rb +25 -31
  56. data/lib/mocha/parameter_matchers/all_of.rb +2 -8
  57. data/lib/mocha/parameter_matchers/any_of.rb +2 -8
  58. data/lib/mocha/parameter_matchers/any_parameters.rb +3 -9
  59. data/lib/mocha/parameter_matchers/anything.rb +2 -8
  60. data/lib/mocha/parameter_matchers/base.rb +7 -13
  61. data/lib/mocha/parameter_matchers/equals.rb +1 -7
  62. data/lib/mocha/parameter_matchers/{query_string.rb → equivalent_uri.rb} +14 -15
  63. data/lib/mocha/parameter_matchers/has_entries.rb +2 -7
  64. data/lib/mocha/parameter_matchers/has_entry.rb +26 -21
  65. data/lib/mocha/parameter_matchers/has_key.rb +2 -7
  66. data/lib/mocha/parameter_matchers/has_keys.rb +53 -0
  67. data/lib/mocha/parameter_matchers/has_value.rb +2 -7
  68. data/lib/mocha/parameter_matchers/includes.rb +50 -8
  69. data/lib/mocha/parameter_matchers/instance_methods.rb +27 -0
  70. data/lib/mocha/parameter_matchers/instance_of.rb +0 -6
  71. data/lib/mocha/parameter_matchers/is_a.rb +2 -7
  72. data/lib/mocha/parameter_matchers/kind_of.rb +2 -6
  73. data/lib/mocha/parameter_matchers/not.rb +2 -7
  74. data/lib/mocha/parameter_matchers/optionally.rb +4 -10
  75. data/lib/mocha/parameter_matchers/positional_or_keyword_hash.rb +64 -0
  76. data/lib/mocha/parameter_matchers/regexp_matches.rb +0 -6
  77. data/lib/mocha/parameter_matchers/responds_with.rb +3 -8
  78. data/lib/mocha/parameter_matchers/yaml_equivalent.rb +2 -6
  79. data/lib/mocha/parameter_matchers.rb +3 -4
  80. data/lib/mocha/parameters_matcher.rb +8 -11
  81. data/lib/mocha/raised_exception.rb +11 -0
  82. data/lib/mocha/receivers.rb +10 -14
  83. data/lib/mocha/return_values.rb +4 -8
  84. data/lib/mocha/ruby_version.rb +3 -0
  85. data/lib/mocha/sequence.rb +4 -9
  86. data/lib/mocha/single_return_value.rb +2 -5
  87. data/lib/mocha/state_machine.rb +33 -46
  88. data/lib/mocha/stubbed_method.rb +88 -0
  89. data/lib/mocha/stubbing_error.rb +2 -13
  90. data/lib/mocha/test_unit.rb +5 -2
  91. data/lib/mocha/thrower.rb +4 -6
  92. data/lib/mocha/thrown_object.rb +12 -0
  93. data/lib/mocha/version.rb +1 -1
  94. data/lib/mocha/yield_parameters.rb +7 -17
  95. data/mocha.gemspec +16 -43
  96. metadata +38 -248
  97. data/bin/build-matrix +0 -71
  98. data/gemfiles/Gemfile.minitest.1.3.0 +0 -7
  99. data/gemfiles/Gemfile.minitest.1.4.0 +0 -7
  100. data/gemfiles/Gemfile.minitest.1.4.1 +0 -7
  101. data/gemfiles/Gemfile.minitest.1.4.2 +0 -7
  102. data/gemfiles/Gemfile.minitest.2.0.0 +0 -7
  103. data/gemfiles/Gemfile.minitest.2.0.1 +0 -7
  104. data/gemfiles/Gemfile.minitest.2.11.0 +0 -7
  105. data/gemfiles/Gemfile.minitest.2.11.2 +0 -7
  106. data/gemfiles/Gemfile.minitest.2.3.0 +0 -7
  107. data/gemfiles/Gemfile.test-unit.2.0.0 +0 -7
  108. data/gemfiles/Gemfile.test-unit.2.0.1 +0 -7
  109. data/gemfiles/Gemfile.test-unit.2.0.3 +0 -7
  110. data/init.rb +0 -3
  111. data/lib/mocha/class_method.rb +0 -127
  112. data/lib/mocha/integration/mini_test/nothing.rb +0 -19
  113. data/lib/mocha/integration/mini_test/version_13.rb +0 -51
  114. data/lib/mocha/integration/mini_test/version_140.rb +0 -51
  115. data/lib/mocha/integration/mini_test/version_141.rb +0 -62
  116. data/lib/mocha/integration/mini_test/version_142_to_172.rb +0 -62
  117. data/lib/mocha/integration/mini_test/version_200.rb +0 -63
  118. data/lib/mocha/integration/mini_test/version_201_to_222.rb +0 -63
  119. data/lib/mocha/integration/mini_test/version_2110_to_2111.rb +0 -67
  120. data/lib/mocha/integration/mini_test/version_2112_to_320.rb +0 -70
  121. data/lib/mocha/integration/mini_test/version_230_to_2101.rb +0 -65
  122. data/lib/mocha/integration/test_unit/gem_version_200.rb +0 -59
  123. data/lib/mocha/integration/test_unit/gem_version_201_to_202.rb +0 -59
  124. data/lib/mocha/integration/test_unit/gem_version_203_to_220.rb +0 -59
  125. data/lib/mocha/integration/test_unit/gem_version_230_to_250.rb +0 -65
  126. data/lib/mocha/integration/test_unit/nothing.rb +0 -19
  127. data/lib/mocha/integration/test_unit/ruby_version_185_and_below.rb +0 -58
  128. data/lib/mocha/integration/test_unit/ruby_version_186_and_above.rb +0 -60
  129. data/lib/mocha/integration.rb +0 -14
  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/setup.rb +0 -9
  138. data/lib/mocha/single_yield.rb +0 -18
  139. data/lib/mocha/standalone.rb +0 -4
  140. data/lib/mocha/unexpected_invocation.rb +0 -26
  141. data/lib/mocha_standalone.rb +0 -4
  142. data/test/acceptance/acceptance_test_helper.rb +0 -41
  143. data/test/acceptance/bug_18914_test.rb +0 -43
  144. data/test/acceptance/bug_21465_test.rb +0 -34
  145. data/test/acceptance/bug_21563_test.rb +0 -25
  146. data/test/acceptance/exception_rescue_test.rb +0 -55
  147. data/test/acceptance/expectations_on_multiple_methods_test.rb +0 -55
  148. data/test/acceptance/expected_invocation_count_test.rb +0 -232
  149. data/test/acceptance/failure_messages_test.rb +0 -64
  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 -88
  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 -238
  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 -75
  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_module_method_test.rb +0 -163
  182. data/test/acceptance/stub_test.rb +0 -52
  183. data/test/acceptance/stubba_example_test.rb +0 -102
  184. data/test/acceptance/stubba_test_result_test.rb +0 -66
  185. data/test/acceptance/stubbing_error_backtrace_test.rb +0 -64
  186. data/test/acceptance/stubbing_frozen_object_test.rb +0 -88
  187. data/test/acceptance/stubbing_method_accepting_block_parameter_test.rb +0 -48
  188. data/test/acceptance/stubbing_method_unnecessarily_test.rb +0 -65
  189. data/test/acceptance/stubbing_nil_test.rb +0 -59
  190. data/test/acceptance/stubbing_non_existent_any_instance_method_test.rb +0 -130
  191. data/test/acceptance/stubbing_non_existent_class_method_test.rb +0 -157
  192. data/test/acceptance/stubbing_non_existent_instance_method_test.rb +0 -147
  193. data/test/acceptance/stubbing_non_public_any_instance_method_test.rb +0 -130
  194. data/test/acceptance/stubbing_non_public_class_method_test.rb +0 -163
  195. data/test/acceptance/stubbing_non_public_instance_method_test.rb +0 -143
  196. data/test/acceptance/stubbing_on_non_mock_object_test.rb +0 -64
  197. data/test/acceptance/stubbing_same_class_method_on_parent_and_child_classes_test.rb +0 -35
  198. data/test/acceptance/throw_test.rb +0 -45
  199. data/test/acceptance/unexpected_invocation_test.rb +0 -25
  200. data/test/acceptance/unstubbing_test.rb +0 -168
  201. data/test/assertions.rb +0 -6
  202. data/test/deprecation_disabler.rb +0 -15
  203. data/test/execution_point.rb +0 -36
  204. data/test/integration/mini_test_test.rb +0 -8
  205. data/test/integration/shared_tests.rb +0 -174
  206. data/test/integration/test_unit_test.rb +0 -8
  207. data/test/method_definer.rb +0 -24
  208. data/test/mini_test_result.rb +0 -90
  209. data/test/minitest_result.rb +0 -49
  210. data/test/simple_counter.rb +0 -13
  211. data/test/test_helper.rb +0 -50
  212. data/test/test_runner.rb +0 -58
  213. data/test/test_unit_result.rb +0 -20
  214. data/test/unit/any_instance_method_test.rb +0 -132
  215. data/test/unit/array_inspect_test.rb +0 -16
  216. data/test/unit/backtrace_filter_test.rb +0 -19
  217. data/test/unit/cardinality_test.rb +0 -56
  218. data/test/unit/central_test.rb +0 -100
  219. data/test/unit/change_state_side_effect_test.rb +0 -41
  220. data/test/unit/class_method_test.rb +0 -223
  221. data/test/unit/class_methods_test.rb +0 -40
  222. data/test/unit/configuration_test.rb +0 -38
  223. data/test/unit/date_time_inspect_test.rb +0 -21
  224. data/test/unit/exception_raiser_test.rb +0 -42
  225. data/test/unit/expectation_list_test.rb +0 -82
  226. data/test/unit/expectation_test.rb +0 -497
  227. data/test/unit/hash_inspect_test.rb +0 -16
  228. data/test/unit/hooks_test.rb +0 -29
  229. data/test/unit/in_state_ordering_constraint_test.rb +0 -43
  230. data/test/unit/method_matcher_test.rb +0 -28
  231. data/test/unit/mock_test.rb +0 -341
  232. data/test/unit/mockery_test.rb +0 -151
  233. data/test/unit/module_methods_test.rb +0 -19
  234. data/test/unit/multiple_yields_test.rb +0 -18
  235. data/test/unit/no_yields_test.rb +0 -18
  236. data/test/unit/object_inspect_test.rb +0 -38
  237. data/test/unit/object_methods_test.rb +0 -46
  238. data/test/unit/parameter_matchers/all_of_test.rb +0 -26
  239. data/test/unit/parameter_matchers/any_of_test.rb +0 -26
  240. data/test/unit/parameter_matchers/anything_test.rb +0 -21
  241. data/test/unit/parameter_matchers/equals_test.rb +0 -25
  242. data/test/unit/parameter_matchers/has_entries_test.rb +0 -51
  243. data/test/unit/parameter_matchers/has_entry_test.rb +0 -129
  244. data/test/unit/parameter_matchers/has_key_test.rb +0 -55
  245. data/test/unit/parameter_matchers/has_value_test.rb +0 -57
  246. data/test/unit/parameter_matchers/includes_test.rb +0 -59
  247. data/test/unit/parameter_matchers/instance_of_test.rb +0 -25
  248. data/test/unit/parameter_matchers/is_a_test.rb +0 -25
  249. data/test/unit/parameter_matchers/kind_of_test.rb +0 -25
  250. data/test/unit/parameter_matchers/not_test.rb +0 -26
  251. data/test/unit/parameter_matchers/regexp_matches_test.rb +0 -46
  252. data/test/unit/parameter_matchers/responds_with_test.rb +0 -32
  253. data/test/unit/parameter_matchers/stub_matcher.rb +0 -27
  254. data/test/unit/parameter_matchers/yaml_equivalent_test.rb +0 -25
  255. data/test/unit/parameters_matcher_test.rb +0 -121
  256. data/test/unit/receivers_test.rb +0 -66
  257. data/test/unit/return_values_test.rb +0 -63
  258. data/test/unit/sequence_test.rb +0 -104
  259. data/test/unit/single_return_value_test.rb +0 -14
  260. data/test/unit/single_yield_test.rb +0 -18
  261. data/test/unit/state_machine_test.rb +0 -98
  262. data/test/unit/string_inspect_test.rb +0 -11
  263. data/test/unit/thrower_test.rb +0 -20
  264. data/test/unit/yield_parameters_test.rb +0 -93
  265. data/yard-templates/default/layout/html/google_analytics.erb +0 -11
  266. data/yard-templates/default/layout/html/setup.rb +0 -6
@@ -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
@@ -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,88 @@
1
+ require 'ruby2_keywords'
2
+ require 'mocha/ruby_version'
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 = 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
+ 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
+ use_prepended_module_for_stub_method
41
+ end
42
+
43
+ def define_new_method
44
+ self_in_scope = self
45
+ method_name_in_scope = method_name
46
+ stub_method_owner.send(:define_method, method_name) do |*args, &block|
47
+ self_in_scope.mock.handle_method_call(method_name_in_scope, args, block)
48
+ end
49
+ stub_method_owner.send(:ruby2_keywords, method_name)
50
+ retain_original_visibility(stub_method_owner)
51
+ end
52
+
53
+ def remove_new_method
54
+ stub_method_owner.send(:remove_method, method_name)
55
+ end
56
+
57
+ def matches?(other)
58
+ return false unless other.class == self.class
59
+ (stubbee.object_id == other.stubbee.object_id) && (method_name == other.method_name)
60
+ end
61
+
62
+ alias_method :==, :eql?
63
+
64
+ def to_s
65
+ "#{stubbee}.#{method_name}"
66
+ end
67
+
68
+ private
69
+
70
+ def retain_original_visibility(method_owner)
71
+ return unless @original_visibility
72
+ Module.instance_method(@original_visibility).bind(method_owner).call(method_name)
73
+ end
74
+
75
+ def store_original_method_visibility
76
+ @original_visibility = original_method_owner.__method_visibility__(method_name)
77
+ end
78
+
79
+ def use_prepended_module_for_stub_method
80
+ @stub_method_owner = PrependedModule.new
81
+ original_method_owner.__send__ :prepend, @stub_method_owner
82
+ end
83
+
84
+ def stub_method_owner
85
+ @stub_method_owner ||= original_method_owner
86
+ end
87
+ end
88
+ 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,6 @@
1
- require "mocha/integration/test_unit"
1
+ require 'mocha/ruby_version'
2
+ require 'mocha/integration/test_unit'
2
3
 
3
- Mocha::Integration::TestUnit.activate
4
+ unless Mocha::Integration::TestUnit.activate
5
+ raise "Test::Unit must be loaded *before* `require 'mocha/test_unit'`."
6
+ 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.1.0"
2
+ VERSION = '2.1.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
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
data/mocha.gemspec CHANGED
@@ -1,53 +1,26 @@
1
- # -*- encoding: utf-8 -*-
2
1
  lib = File.expand_path('../lib/', __FILE__)
3
2
  $LOAD_PATH.unshift lib unless $LOAD_PATH.include?(lib)
4
- require "mocha/version"
3
+ require 'mocha/version'
5
4
 
6
5
  Gem::Specification.new do |s|
7
- s.name = "mocha"
6
+ s.name = 'mocha'
8
7
  s.version = Mocha::VERSION
8
+ s.licenses = ['MIT', 'BSD-2-Clause']
9
+ s.required_ruby_version = '>= 2.0'
9
10
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["James Mead"]
12
- s.description = "Mocking and stubbing library with JMock/SchMock syntax, which allows mocking and stubbing of methods on real (non-mock) classes."
13
- s.email = "mocha-developer@googlegroups.com"
11
+ s.authors = ['James Mead']
12
+ s.description = 'Mocking and stubbing library with JMock/SchMock syntax, which allows mocking and stubbing of methods on real (non-mock) classes.'
13
+ s.email = 'mocha-developer@googlegroups.com'
14
14
 
15
- s.files = `git ls-files`.split("\n")
16
- s.files.delete(".travis.yml")
17
- s.files.delete(".gitignore")
18
-
19
- s.homepage = "http://gofreerange.com/mocha/docs"
20
- s.require_paths = ["lib"]
21
- s.rubyforge_project = "mocha"
22
- s.summary = "Mocking and stubbing library"
23
- s.has_rdoc = "yard"
15
+ s.files = Dir.chdir(File.expand_path('..', __FILE__)) do
16
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(docs|test)/}) }
17
+ end
18
+ s.files.delete('.circleci/config.yml')
19
+ s.files.delete('.gitignore')
24
20
 
25
- s.add_dependency("metaclass", "~> 0.0.1")
26
- if s.respond_to? :specification_version then
27
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
28
- s.specification_version = 3
21
+ s.homepage = 'https://mocha.jamesmead.org'
22
+ s.require_paths = ['lib']
23
+ s.summary = 'Mocking and stubbing library'
29
24
 
30
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
31
- s.add_development_dependency("rake", ">= 0")
32
- s.add_development_dependency("introspection", "~> 0.0.1")
33
- unless ENV["MOCHA_NO_DOCS"]
34
- s.add_development_dependency("yard")
35
- s.add_development_dependency("redcarpet", "~> 1")
36
- end
37
- else
38
- s.add_dependency("rake", ">= 0")
39
- s.add_dependency("introspection", "~> 0.0.1")
40
- unless ENV["MOCHA_NO_DOCS"]
41
- s.add_dependency("yard")
42
- s.add_dependency("redcarpet", "~> 1")
43
- end
44
- end
45
- else
46
- s.add_dependency("rake", ">= 0")
47
- s.add_dependency("introspection", "~> 0.0.1")
48
- unless ENV["MOCHA_NO_DOCS"]
49
- s.add_dependency("yard")
50
- s.add_dependency("redcarpet", "~> 1")
51
- end
52
- end
25
+ s.add_runtime_dependency 'ruby2_keywords', '>= 0.0.5'
53
26
  end