mocha 1.11.2 → 1.12.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 (200) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +1 -1
  3. data/README.md +28 -30
  4. data/RELEASE.md +25 -0
  5. data/Rakefile +6 -1
  6. data/lib/mocha/cardinality.rb +30 -27
  7. data/lib/mocha/expectation.rb +24 -24
  8. data/lib/mocha/mock.rb +1 -1
  9. data/lib/mocha/mockery.rb +9 -22
  10. data/lib/mocha/state_machine.rb +30 -38
  11. data/lib/mocha/version.rb +1 -1
  12. data/mocha.gemspec +3 -1
  13. metadata +5 -192
  14. data/docs/CNAME +0 -1
  15. data/docs/Mocha.html +0 -254
  16. data/docs/Mocha/API.html +0 -1285
  17. data/docs/Mocha/ClassMethods.html +0 -264
  18. data/docs/Mocha/Configuration.html +0 -1525
  19. data/docs/Mocha/Expectation.html +0 -2862
  20. data/docs/Mocha/ExpectationError.html +0 -152
  21. data/docs/Mocha/ExpectationErrorFactory.html +0 -260
  22. data/docs/Mocha/Hooks.html +0 -370
  23. data/docs/Mocha/Integration.html +0 -125
  24. data/docs/Mocha/Integration/MiniTest.html +0 -123
  25. data/docs/Mocha/Integration/MiniTest/Adapter.html +0 -164
  26. data/docs/Mocha/Integration/TestUnit.html +0 -123
  27. data/docs/Mocha/Integration/TestUnit/Adapter.html +0 -164
  28. data/docs/Mocha/Mock.html +0 -1210
  29. data/docs/Mocha/ObjectMethods.html +0 -765
  30. data/docs/Mocha/ParameterMatchers.html +0 -2949
  31. data/docs/Mocha/ParameterMatchers/AllOf.html +0 -153
  32. data/docs/Mocha/ParameterMatchers/AnyOf.html +0 -153
  33. data/docs/Mocha/ParameterMatchers/AnyParameters.html +0 -153
  34. data/docs/Mocha/ParameterMatchers/Anything.html +0 -153
  35. data/docs/Mocha/ParameterMatchers/Base.html +0 -441
  36. data/docs/Mocha/ParameterMatchers/Equals.html +0 -153
  37. data/docs/Mocha/ParameterMatchers/EquivalentUri.html +0 -153
  38. data/docs/Mocha/ParameterMatchers/HasEntries.html +0 -153
  39. data/docs/Mocha/ParameterMatchers/HasEntry.html +0 -153
  40. data/docs/Mocha/ParameterMatchers/HasKey.html +0 -153
  41. data/docs/Mocha/ParameterMatchers/HasValue.html +0 -153
  42. data/docs/Mocha/ParameterMatchers/Includes.html +0 -153
  43. data/docs/Mocha/ParameterMatchers/InstanceOf.html +0 -153
  44. data/docs/Mocha/ParameterMatchers/IsA.html +0 -153
  45. data/docs/Mocha/ParameterMatchers/KindOf.html +0 -153
  46. data/docs/Mocha/ParameterMatchers/Not.html +0 -153
  47. data/docs/Mocha/ParameterMatchers/Optionally.html +0 -153
  48. data/docs/Mocha/ParameterMatchers/RegexpMatches.html +0 -153
  49. data/docs/Mocha/ParameterMatchers/RespondsWith.html +0 -153
  50. data/docs/Mocha/ParameterMatchers/YamlEquivalent.html +0 -153
  51. data/docs/Mocha/Sequence.html +0 -149
  52. data/docs/Mocha/StateMachine.html +0 -527
  53. data/docs/Mocha/StateMachine/State.html +0 -140
  54. data/docs/Mocha/StateMachine/StatePredicate.html +0 -140
  55. data/docs/Mocha/StubbingError.html +0 -150
  56. data/docs/_index.html +0 -519
  57. data/docs/class_list.html +0 -51
  58. data/docs/css/common.css +0 -1
  59. data/docs/css/full_list.css +0 -58
  60. data/docs/css/style.css +0 -496
  61. data/docs/file.COPYING.html +0 -81
  62. data/docs/file.MIT-LICENSE.html +0 -85
  63. data/docs/file.README.html +0 -448
  64. data/docs/file.RELEASE.html +0 -1028
  65. data/docs/file_list.html +0 -71
  66. data/docs/frames.html +0 -17
  67. data/docs/index.html +0 -448
  68. data/docs/js/app.js +0 -303
  69. data/docs/js/full_list.js +0 -216
  70. data/docs/js/jquery.js +0 -4
  71. data/docs/method_list.html +0 -651
  72. data/docs/top-level-namespace.html +0 -118
  73. data/test/acceptance/acceptance_test_helper.rb +0 -42
  74. data/test/acceptance/bug_18914_test.rb +0 -37
  75. data/test/acceptance/bug_21465_test.rb +0 -31
  76. data/test/acceptance/bug_21563_test.rb +0 -22
  77. data/test/acceptance/display_matching_invocations_alongside_expectations_test.rb +0 -69
  78. data/test/acceptance/exception_rescue_test.rb +0 -53
  79. data/test/acceptance/expectations_on_multiple_methods_test.rb +0 -55
  80. data/test/acceptance/expected_invocation_count_test.rb +0 -229
  81. data/test/acceptance/failure_messages_test.rb +0 -77
  82. data/test/acceptance/issue_272_test.rb +0 -50
  83. data/test/acceptance/issue_457_test.rb +0 -31
  84. data/test/acceptance/issue_65_test.rb +0 -64
  85. data/test/acceptance/issue_70_test.rb +0 -53
  86. data/test/acceptance/mocha_example_test.rb +0 -106
  87. data/test/acceptance/mocha_test_result_test.rb +0 -83
  88. data/test/acceptance/mock_built_with_first_argument_type_being_string_test.rb +0 -98
  89. data/test/acceptance/mock_test.rb +0 -191
  90. data/test/acceptance/mocked_methods_dispatch_test.rb +0 -75
  91. data/test/acceptance/multiple_expectations_failure_message_test.rb +0 -66
  92. data/test/acceptance/multiple_yielding_test.rb +0 -59
  93. data/test/acceptance/optional_parameters_test.rb +0 -67
  94. data/test/acceptance/parameter_matcher_test.rb +0 -299
  95. data/test/acceptance/partial_mocks_test.rb +0 -44
  96. data/test/acceptance/prepend_test.rb +0 -86
  97. data/test/acceptance/prevent_use_of_mocha_outside_test_test.rb +0 -76
  98. data/test/acceptance/raise_exception_test.rb +0 -36
  99. data/test/acceptance/return_value_test.rb +0 -49
  100. data/test/acceptance/sequence_test.rb +0 -189
  101. data/test/acceptance/states_test.rb +0 -71
  102. data/test/acceptance/stub_any_instance_method_defined_on_superclass_test.rb +0 -64
  103. data/test/acceptance/stub_any_instance_method_test.rb +0 -301
  104. data/test/acceptance/stub_class_method_defined_on_active_record_association_proxy_test.rb +0 -105
  105. data/test/acceptance/stub_class_method_defined_on_class_test.rb +0 -78
  106. data/test/acceptance/stub_class_method_defined_on_module_test.rb +0 -73
  107. data/test/acceptance/stub_class_method_defined_on_superclass_test.rb +0 -144
  108. data/test/acceptance/stub_everything_test.rb +0 -53
  109. data/test/acceptance/stub_instance_method_defined_on_active_record_association_proxy_test.rb +0 -91
  110. data/test/acceptance/stub_instance_method_defined_on_class_and_aliased_test.rb +0 -67
  111. data/test/acceptance/stub_instance_method_defined_on_class_test.rb +0 -67
  112. data/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +0 -136
  113. data/test/acceptance/stub_instance_method_defined_on_module_test.rb +0 -76
  114. data/test/acceptance/stub_instance_method_defined_on_object_class_test.rb +0 -75
  115. data/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb +0 -67
  116. data/test/acceptance/stub_instance_method_defined_on_superclass_test.rb +0 -70
  117. data/test/acceptance/stub_method_defined_on_module_and_aliased_test.rb +0 -38
  118. data/test/acceptance/stub_module_method_test.rb +0 -200
  119. data/test/acceptance/stub_test.rb +0 -49
  120. data/test/acceptance/stubba_example_test.rb +0 -103
  121. data/test/acceptance/stubba_test_result_test.rb +0 -71
  122. data/test/acceptance/stubbing_error_backtrace_test.rb +0 -63
  123. data/test/acceptance/stubbing_frozen_object_test.rb +0 -88
  124. data/test/acceptance/stubbing_method_accepting_block_parameter_test.rb +0 -52
  125. data/test/acceptance/stubbing_method_unnecessarily_test.rb +0 -63
  126. data/test/acceptance/stubbing_nil_test.rb +0 -60
  127. data/test/acceptance/stubbing_non_existent_any_instance_method_test.rb +0 -157
  128. data/test/acceptance/stubbing_non_existent_class_method_test.rb +0 -157
  129. data/test/acceptance/stubbing_non_existent_instance_method_test.rb +0 -145
  130. data/test/acceptance/stubbing_non_public_any_instance_method_test.rb +0 -128
  131. data/test/acceptance/stubbing_non_public_class_method_test.rb +0 -163
  132. data/test/acceptance/stubbing_non_public_instance_method_test.rb +0 -141
  133. data/test/acceptance/stubbing_on_non_mock_object_test.rb +0 -70
  134. data/test/acceptance/stubbing_same_class_method_on_parent_and_child_classes_test.rb +0 -33
  135. data/test/acceptance/throw_test.rb +0 -42
  136. data/test/acceptance/unexpected_invocation_test.rb +0 -23
  137. data/test/acceptance/unstubbing_test.rb +0 -194
  138. data/test/acceptance/yielding_test.rb +0 -80
  139. data/test/assertions.rb +0 -8
  140. data/test/deprecation_disabler.rb +0 -15
  141. data/test/execution_point.rb +0 -36
  142. data/test/integration/mini_test_test.rb +0 -8
  143. data/test/integration/shared_tests.rb +0 -178
  144. data/test/integration/test_unit_test.rb +0 -8
  145. data/test/method_definer.rb +0 -16
  146. data/test/mini_test_result.rb +0 -96
  147. data/test/minitest_result.rb +0 -48
  148. data/test/simple_counter.rb +0 -11
  149. data/test/test_helper.rb +0 -58
  150. data/test/test_runner.rb +0 -58
  151. data/test/test_unit_result.rb +0 -22
  152. data/test/unit/any_instance_method_test.rb +0 -175
  153. data/test/unit/array_inspect_test.rb +0 -14
  154. data/test/unit/backtrace_filter_test.rb +0 -17
  155. data/test/unit/cardinality_test.rb +0 -72
  156. data/test/unit/central_test.rb +0 -98
  157. data/test/unit/change_state_side_effect_test.rb +0 -37
  158. data/test/unit/class_methods_test.rb +0 -69
  159. data/test/unit/configuration_test.rb +0 -37
  160. data/test/unit/date_time_inspect_test.rb +0 -19
  161. data/test/unit/exception_raiser_test.rb +0 -45
  162. data/test/unit/expectation_list_test.rb +0 -82
  163. data/test/unit/expectation_test.rb +0 -504
  164. data/test/unit/hash_inspect_test.rb +0 -14
  165. data/test/unit/hooks_test.rb +0 -35
  166. data/test/unit/in_state_ordering_constraint_test.rb +0 -39
  167. data/test/unit/instance_method_test.rb +0 -282
  168. data/test/unit/method_matcher_test.rb +0 -26
  169. data/test/unit/mock_test.rb +0 -372
  170. data/test/unit/mockery_test.rb +0 -171
  171. data/test/unit/module_methods_test.rb +0 -16
  172. data/test/unit/object_inspect_test.rb +0 -60
  173. data/test/unit/object_methods_test.rb +0 -63
  174. data/test/unit/parameter_matchers/all_of_test.rb +0 -24
  175. data/test/unit/parameter_matchers/any_of_test.rb +0 -24
  176. data/test/unit/parameter_matchers/anything_test.rb +0 -19
  177. data/test/unit/parameter_matchers/equals_test.rb +0 -23
  178. data/test/unit/parameter_matchers/equivalent_uri_test.rb +0 -41
  179. data/test/unit/parameter_matchers/has_entries_test.rb +0 -51
  180. data/test/unit/parameter_matchers/has_entry_test.rb +0 -128
  181. data/test/unit/parameter_matchers/has_key_test.rb +0 -54
  182. data/test/unit/parameter_matchers/has_value_test.rb +0 -55
  183. data/test/unit/parameter_matchers/includes_test.rb +0 -106
  184. data/test/unit/parameter_matchers/instance_of_test.rb +0 -23
  185. data/test/unit/parameter_matchers/is_a_test.rb +0 -23
  186. data/test/unit/parameter_matchers/kind_of_test.rb +0 -23
  187. data/test/unit/parameter_matchers/not_test.rb +0 -24
  188. data/test/unit/parameter_matchers/regexp_matches_test.rb +0 -45
  189. data/test/unit/parameter_matchers/responds_with_test.rb +0 -38
  190. data/test/unit/parameter_matchers/stub_matcher.rb +0 -23
  191. data/test/unit/parameter_matchers/yaml_equivalent_test.rb +0 -23
  192. data/test/unit/parameters_matcher_test.rb +0 -119
  193. data/test/unit/receivers_test.rb +0 -96
  194. data/test/unit/return_values_test.rb +0 -66
  195. data/test/unit/sequence_test.rb +0 -100
  196. data/test/unit/single_return_value_test.rb +0 -17
  197. data/test/unit/state_machine_test.rb +0 -96
  198. data/test/unit/string_inspect_test.rb +0 -9
  199. data/test/unit/thrower_test.rb +0 -23
  200. data/test/unit/yield_parameters_test.rb +0 -73
@@ -1,37 +0,0 @@
1
- require File.expand_path('../../test_helper', __FILE__)
2
-
3
- require 'mocha/change_state_side_effect'
4
-
5
- class ChangeStateSideEffectTest < Mocha::TestCase
6
- include Mocha
7
-
8
- class FakeState
9
- attr_reader :active
10
- attr_writer :description
11
-
12
- def activate
13
- @active = true
14
- end
15
-
16
- def mocha_inspect
17
- @description
18
- end
19
- end
20
-
21
- def test_should_activate_the_given_state
22
- state = FakeState.new
23
- side_effect = ChangeStateSideEffect.new(state)
24
-
25
- side_effect.perform
26
-
27
- assert state.active
28
- end
29
-
30
- def test_should_describe_itself_in_terms_of_the_activated_state
31
- state = FakeState.new
32
- state.description = 'the-new-state'
33
- side_effect = ChangeStateSideEffect.new(state)
34
-
35
- assert_equal 'then the-new-state', side_effect.mocha_inspect
36
- end
37
- end
@@ -1,69 +0,0 @@
1
- require File.expand_path('../../test_helper', __FILE__)
2
- require 'mocha/class_methods'
3
- require 'mocha/object_methods'
4
- require 'mocha/mockery'
5
- require 'mocha/names'
6
-
7
- class ClassMethodsTest < Mocha::TestCase
8
- def setup
9
- Mocha::Mockery.setup
10
- @klass = Class.new.extend(Mocha::ClassMethods, Mocha::ObjectMethods)
11
- end
12
-
13
- def teardown
14
- Mocha::Mockery.teardown
15
- end
16
-
17
- def test_should_build_any_instance_object
18
- any_instance = @klass.any_instance
19
- assert_not_nil any_instance
20
- assert any_instance.is_a?(Mocha::ClassMethods::AnyInstance)
21
- end
22
-
23
- def test_should_return_same_any_instance_object
24
- any_instance1 = @klass.any_instance
25
- any_instance2 = @klass.any_instance
26
- assert_equal any_instance1, any_instance2
27
- end
28
-
29
- def test_any_instance_should_build_mocha_referring_to_klass
30
- mocha = @klass.any_instance.mocha
31
- assert_not_nil mocha
32
- assert mocha.is_a?(Mocha::Mock)
33
- expected_name = Mocha::ImpersonatingAnyInstanceName.new(@klass).mocha_inspect
34
- assert_equal expected_name, mocha.mocha_inspect
35
- end
36
-
37
- def test_any_instance_should_not_build_mocha_if_instantiate_is_false
38
- assert_nil @klass.any_instance.mocha(false)
39
- end
40
-
41
- def test_any_instance_should_reuse_existing_mocha
42
- mocha1 = @klass.any_instance.mocha
43
- mocha2 = @klass.any_instance.mocha
44
- assert_equal mocha1, mocha2
45
- end
46
-
47
- def test_any_instance_should_reuse_existing_mocha_even_if_instantiate_is_false
48
- mocha1 = @klass.any_instance.mocha
49
- mocha2 = @klass.any_instance.mocha(false)
50
- assert_equal mocha1, mocha2
51
- end
52
-
53
- def test_should_use_stubba_class_method_for_class
54
- assert_equal Mocha::InstanceMethod, @klass.stubba_method
55
- end
56
-
57
- def test_should_use_stubba_class_method_for_any_instance
58
- assert_equal Mocha::AnyInstanceMethod, @klass.any_instance.stubba_method
59
- end
60
-
61
- def test_should_stub_self_for_class
62
- assert_equal @klass, @klass.stubba_object
63
- end
64
-
65
- def test_should_stub_relevant_class_for_any_instance
66
- any_instance = @klass.any_instance
67
- assert_equal @klass, any_instance.stubba_object
68
- end
69
- end
@@ -1,37 +0,0 @@
1
- require File.expand_path('../../test_helper', __FILE__)
2
- require 'mocha/configuration'
3
-
4
- class ConfigurationTest < Mocha::TestCase
5
- def test_allow_temporarily_changes_config_when_given_block
6
- Mocha.configure { |c| c.stubbing_method_unnecessarily = :warn }
7
- yielded = false
8
- Mocha::Configuration.override(:stubbing_method_unnecessarily => :allow) do
9
- yielded = true
10
- assert_equal :allow, Mocha.configuration.stubbing_method_unnecessarily
11
- end
12
- assert yielded
13
- assert_equal :warn, Mocha.configuration.stubbing_method_unnecessarily
14
- end
15
-
16
- def test_prevent_temporarily_changes_config_when_given_block
17
- Mocha.configure { |c| c.stubbing_method_unnecessarily = :allow }
18
- yielded = false
19
- Mocha::Configuration.override(:stubbing_method_unnecessarily => :prevent) do
20
- yielded = true
21
- assert_equal :prevent, Mocha.configuration.stubbing_method_unnecessarily
22
- end
23
- assert yielded
24
- assert_equal :allow, Mocha.configuration.stubbing_method_unnecessarily
25
- end
26
-
27
- def test_warn_when_temporarily_changes_config_when_given_block
28
- Mocha.configure { |c| c.stubbing_method_unnecessarily = :allow }
29
- yielded = false
30
- Mocha::Configuration.override(:stubbing_method_unnecessarily => :warn) do
31
- yielded = true
32
- assert_equal :warn, Mocha.configuration.stubbing_method_unnecessarily
33
- end
34
- assert yielded
35
- assert_equal :allow, Mocha.configuration.stubbing_method_unnecessarily
36
- end
37
- end
@@ -1,19 +0,0 @@
1
- require File.expand_path('../../test_helper', __FILE__)
2
- require 'mocha/inspect'
3
-
4
- class DateTimeInspectTest < Mocha::TestCase
5
- def test_should_use_include_date_in_seconds
6
- time = Time.now
7
- assert_equal "#{time.inspect} (#{time.to_f} secs)", time.mocha_inspect
8
- end
9
-
10
- def test_should_use_to_s_for_date
11
- date = Date.new(2006, 1, 1)
12
- assert_equal date.to_s, date.mocha_inspect
13
- end
14
-
15
- def test_should_use_to_s_for_datetime
16
- datetime = DateTime.new(2006, 1, 1) # rubocop:disable Style/DateTime
17
- assert_equal datetime.to_s, datetime.mocha_inspect
18
- end
19
- end
@@ -1,45 +0,0 @@
1
- require File.expand_path('../../test_helper', __FILE__)
2
-
3
- require 'mocha/invocation'
4
- require 'mocha/exception_raiser'
5
- require 'timeout'
6
-
7
- class ExceptionRaiserTest < Mocha::TestCase
8
- include Mocha
9
-
10
- def new_invocation
11
- Invocation.new(:irrelevant, :irrelevant)
12
- end
13
-
14
- def test_should_raise_exception_with_specified_class_and_default_message
15
- exception_class = Class.new(StandardError)
16
- raiser = ExceptionRaiser.new(exception_class, nil)
17
- exception = assert_raises(exception_class) { raiser.evaluate(new_invocation) }
18
- assert_equal exception_class.to_s, exception.message
19
- end
20
-
21
- def test_should_raise_exception_with_specified_class_and_message
22
- exception_class = Class.new(StandardError)
23
- raiser = ExceptionRaiser.new(exception_class, 'message')
24
- exception = assert_raises(exception_class) { raiser.evaluate(new_invocation) }
25
- assert_equal 'message', exception.message
26
- end
27
-
28
- def test_should_raise_exception_instance
29
- exception_class = Class.new(StandardError)
30
- raiser = ExceptionRaiser.new(exception_class.new('message'), nil)
31
- exception = assert_raises(exception_class) { raiser.evaluate(new_invocation) }
32
- assert_equal 'message', exception.message
33
- end
34
-
35
- def test_should_raise_interrupt_exception_with_default_message_so_it_works_in_ruby_1_8_6
36
- raiser = ExceptionRaiser.new(Interrupt, nil)
37
- assert_raises(Interrupt) { raiser.evaluate(new_invocation) }
38
- end
39
-
40
- def test_should_raise_subclass_of_interrupt_exception_with_default_message_so_it_works_in_ruby_1_8_6
41
- exception_class = Class.new(Interrupt)
42
- raiser = ExceptionRaiser.new(exception_class, nil)
43
- assert_raises(exception_class) { raiser.evaluate(new_invocation) }
44
- end
45
- end
@@ -1,82 +0,0 @@
1
- require File.expand_path('../../test_helper', __FILE__)
2
- require 'mocha/expectation_list'
3
- require 'mocha/expectation'
4
- require 'mocha/invocation'
5
- require 'set'
6
- require 'method_definer'
7
-
8
- class ExpectationListTest < Mocha::TestCase
9
- include MethodDefiner
10
- include Mocha
11
-
12
- def test_should_return_added_expectation
13
- expectation_list = ExpectationList.new
14
- expectation = Expectation.new(nil, :my_method)
15
- assert_same expectation, expectation_list.add(expectation)
16
- end
17
-
18
- def test_should_find_matching_expectation
19
- expectation_list = ExpectationList.new
20
- expectation1 = Expectation.new(nil, :my_method).with(:argument1, :argument2)
21
- expectation2 = Expectation.new(nil, :my_method).with(:argument3, :argument4)
22
- expectation_list.add(expectation1)
23
- expectation_list.add(expectation2)
24
- assert_same expectation1, expectation_list.match(Invocation.new(:irrelevant, :my_method, :argument1, :argument2))
25
- end
26
-
27
- def test_should_remove_all_expectations_matching_method_name
28
- expectation_list = ExpectationList.new
29
- expectation1 = Expectation.new(nil, :method_one).with(:argument1, :argument2)
30
- expectation2 = Expectation.new(nil, :method_one).with(:argument3, :argument4)
31
- expectation3 = Expectation.new(nil, :method_two)
32
- expectation_list.add(expectation1)
33
- expectation_list.add(expectation2)
34
- expectation_list.add(expectation3)
35
- expectation_list.remove_all_matching_method(:method_one)
36
- assert_nil expectation_list.match(Invocation.new(:irrelevant, :method_one, :argument1, :argument2))
37
- assert_nil expectation_list.match(Invocation.new(:irrelevant, :method_one, :argument3, :argument4))
38
- assert_same expectation3, expectation_list.match(Invocation.new(:irrelevant, :method_two))
39
- end
40
-
41
- def test_should_find_most_recent_matching_expectation
42
- expectation_list = ExpectationList.new
43
- expectation1 = Expectation.new(nil, :my_method).with(:argument1, :argument2)
44
- expectation2 = Expectation.new(nil, :my_method).with(:argument1, :argument2)
45
- expectation_list.add(expectation1)
46
- expectation_list.add(expectation2)
47
- assert_same expectation2, expectation_list.match(Invocation.new(:irrelevant, :my_method, :argument1, :argument2))
48
- end
49
-
50
- def test_should_find_matching_expectation_allowing_invocation
51
- expectation_list = ExpectationList.new
52
- expectation1 = Expectation.new(nil, :my_method).with(:argument1, :argument2)
53
- expectation2 = Expectation.new(nil, :my_method).with(:argument3, :argument4)
54
- define_instance_method(expectation1, :invocations_allowed?) { true }
55
- define_instance_method(expectation2, :invocations_allowed?) { true }
56
- expectation_list.add(expectation1)
57
- expectation_list.add(expectation2)
58
- assert_same expectation1, expectation_list.match_allowing_invocation(Invocation.new(:irrelevant, :my_method, :argument1, :argument2))
59
- end
60
-
61
- def test_should_find_most_recent_matching_expectation_allowing_invocation
62
- expectation_list = ExpectationList.new
63
- expectation1 = Expectation.new(nil, :my_method)
64
- expectation2 = Expectation.new(nil, :my_method)
65
- define_instance_method(expectation1, :invocations_allowed?) { true }
66
- define_instance_method(expectation2, :invocations_allowed?) { false }
67
- expectation_list.add(expectation1)
68
- expectation_list.add(expectation2)
69
- assert_same expectation1, expectation_list.match_allowing_invocation(Invocation.new(:irrelevant, :my_method))
70
- end
71
-
72
- def test_should_combine_two_expectation_lists_into_one
73
- expectation_list1 = ExpectationList.new
74
- expectation_list2 = ExpectationList.new
75
- expectation1 = Expectation.new(nil, :my_method)
76
- expectation2 = Expectation.new(nil, :my_method)
77
- expectation_list1.add(expectation1)
78
- expectation_list2.add(expectation2)
79
- expectation_list = expectation_list1 + expectation_list2
80
- assert_equal [expectation1, expectation2], expectation_list.to_a
81
- end
82
- end
@@ -1,504 +0,0 @@
1
- require File.expand_path('../../test_helper', __FILE__)
2
- require 'mocha/expectation'
3
- require 'mocha/invocation'
4
- require 'mocha/sequence'
5
- require 'mocha/configuration'
6
- require 'mocha/deprecation'
7
- require 'execution_point'
8
- require 'simple_counter'
9
- require 'deprecation_disabler'
10
-
11
- # rubocop:disable Metrics/ClassLength
12
- class ExpectationTest < Mocha::TestCase
13
- include Mocha
14
-
15
- def new_expectation
16
- Expectation.new(nil, :expected_method)
17
- end
18
-
19
- def invoke(expectation, &block)
20
- expectation.invoke(Invocation.new(:irrelevant, :expected_method, &block))
21
- end
22
-
23
- def test_should_match_calls_to_same_method_with_any_parameters
24
- assert new_expectation.match?(Invocation.new(:irrelevant, :expected_method, 1, 2, 3))
25
- end
26
-
27
- def test_should_match_calls_to_same_method_with_exactly_zero_parameters
28
- assert new_expectation.with.match?(Invocation.new(:irrelevant, :expected_method))
29
- end
30
-
31
- def test_should_not_match_calls_to_same_method_with_more_than_zero_parameters
32
- assert !new_expectation.with.match?(Invocation.new(:irrelevant, :expected_method, 1, 2, 3))
33
- end
34
-
35
- def test_should_match_calls_to_same_method_with_expected_parameter_values
36
- assert new_expectation.with(1, 2, 3).match?(Invocation.new(:irrelevant, :expected_method, 1, 2, 3))
37
- end
38
-
39
- def test_should_match_calls_to_same_method_with_parameters_constrained_as_expected
40
- expectation = new_expectation.with { |x, y, z| x + y == z }
41
- assert expectation.match?(Invocation.new(:irrelevant, :expected_method, 1, 2, 3))
42
- end
43
-
44
- def test_should_not_match_calls_to_different_method_with_parameters_constrained_as_expected
45
- expectation = new_expectation.with { |x, y, z| x + y == z }
46
- assert !expectation.match?(Invocation.new(:irrelevant, :different_method, 1, 2, 3))
47
- end
48
-
49
- def test_should_not_match_calls_to_different_methods_with_no_parameters
50
- assert !new_expectation.match?(Invocation.new(:irrelevant, :unexpected_method))
51
- end
52
-
53
- def test_should_not_match_calls_to_same_method_with_too_few_parameters
54
- assert !new_expectation.with(1, 2, 3).match?(Invocation.new(:irrelevant, :expected_method, 1, 2))
55
- end
56
-
57
- def test_should_not_match_calls_to_same_method_with_too_many_parameters
58
- assert !new_expectation.with(1, 2).match?(Invocation.new(:irrelevant, :expected_method, 1, 2, 3))
59
- end
60
-
61
- def test_should_not_match_calls_to_same_method_with_unexpected_parameter_values
62
- assert !new_expectation.with(1, 2, 3).match?(Invocation.new(:irrelevant, :expected_method, 1, 0, 3))
63
- end
64
-
65
- def test_should_not_match_calls_to_same_method_with_parameters_not_constrained_as_expected
66
- expectation = new_expectation.with { |x, y, z| x + y == z }
67
- assert !expectation.match?(Invocation.new(:irrelevant, :expected_method, 1, 0, 3))
68
- end
69
-
70
- def test_should_allow_invocations_until_expected_invocation_count_is_one_and_actual_invocation_count_would_be_two
71
- expectation = new_expectation.times(1)
72
- assert expectation.invocations_allowed?
73
- invoke(expectation)
74
- assert !expectation.invocations_allowed?
75
- end
76
-
77
- def test_should_allow_invocations_until_expected_invocation_count_is_two_and_actual_invocation_count_would_be_three
78
- expectation = new_expectation.times(2)
79
- 2.times do
80
- assert expectation.invocations_allowed?
81
- invoke(expectation)
82
- end
83
- assert !expectation.invocations_allowed?
84
- end
85
-
86
- def test_should_allow_invocations_until_expected_invocation_count_is_a_range_from_two_to_three_and_actual_invocation_count_would_be_four
87
- expectation = new_expectation.times(2..3)
88
- 3.times do
89
- assert expectation.invocations_allowed?
90
- invoke(expectation)
91
- end
92
- assert !expectation.invocations_allowed?
93
- end
94
-
95
- def test_should_store_provided_backtrace
96
- backtrace = Object.new
97
- assert_equal backtrace, Expectation.new(nil, :expected_method, backtrace).backtrace
98
- end
99
-
100
- # rubocop:disable Style/Semicolon
101
- def test_should_default_backtrace_to_caller
102
- execution_point = ExecutionPoint.current; expectation = Expectation.new(nil, :expected_method)
103
- assert_equal execution_point, ExecutionPoint.new(expectation.backtrace)
104
- end
105
- # rubocop:enable Style/Semicolon
106
-
107
- def test_should_not_yield
108
- yielded = false
109
- invoke(new_expectation) { yielded = true }
110
- assert_equal false, yielded
111
- end
112
-
113
- def test_should_yield_no_parameters
114
- yielded_parameters = nil
115
- invoke(new_expectation.yields) { |*parameters| yielded_parameters = parameters }
116
- assert_equal [], yielded_parameters
117
- end
118
-
119
- def test_yield_should_fail_when_the_caller_does_not_provide_a_block_and_behaviour_from_v1_9_not_retained
120
- Mocha::Configuration.override(:reinstate_undocumented_behaviour_from_v1_9 => false) do
121
- assert_raises(LocalJumpError) { invoke(new_expectation.yields(:foo)) }
122
- end
123
- end
124
-
125
- def test_yields_should_display_warning_when_caller_does_not_provide_block
126
- DeprecationDisabler.disable_deprecations do
127
- invoke(new_expectation.yields(:foo, 1, [2, 3]))
128
- end
129
- assert message = Deprecation.messages.last
130
- assert message.include?('Stubbed method was instructed to yield (:foo, 1, [2, 3])')
131
- assert message.include?('but no block was given by invocation: :irrelevant.expected_method()')
132
- assert message.include?('This will raise a LocalJumpError in the future.')
133
- end
134
-
135
- def test_multiple_yields_should_display_warning_when_caller_does_not_provide_block
136
- DeprecationDisabler.disable_deprecations do
137
- invoke(new_expectation.multiple_yields(:foo, 1, [2, 3]))
138
- end
139
- assert message = Deprecation.messages.last
140
- assert message.include?('Stubbed method was instructed to yield (2, 3)')
141
- assert message.include?('but no block was given by invocation: :irrelevant.expected_method()')
142
- assert message.include?('This will raise a LocalJumpError in the future.')
143
- end
144
-
145
- def test_should_yield_with_specified_parameters
146
- yielded_parameters = nil
147
- invoke(new_expectation.yields(1, 2, 3)) { |*parameters| yielded_parameters = parameters }
148
- assert_equal [1, 2, 3], yielded_parameters
149
- end
150
-
151
- def test_should_yield_different_parameters_on_consecutive_invocations
152
- expectation = new_expectation.yields(1, 2, 3).yields(4, 5)
153
- yielded_parameters = []
154
- invoke(expectation) { |*parameters| yielded_parameters << parameters }
155
- invoke(expectation) { |*parameters| yielded_parameters << parameters }
156
- assert_equal [[1, 2, 3], [4, 5]], yielded_parameters
157
- end
158
-
159
- def test_should_yield_multiple_times_for_single_invocation
160
- yielded_parameters = []
161
- invoke(new_expectation.multiple_yields([1, 2, 3], [4, 5])) { |*parameters| yielded_parameters << parameters }
162
- assert_equal [[1, 2, 3], [4, 5]], yielded_parameters
163
- end
164
-
165
- def test_should_yield_multiple_times_for_first_invocation_and_once_for_second_invocation
166
- expectation = new_expectation.multiple_yields([1, 2, 3], [4, 5]).then.yields(6, 7)
167
- yielded_parameters = []
168
- invoke(expectation) { |*parameters| yielded_parameters << parameters }
169
- invoke(expectation) { |*parameters| yielded_parameters << parameters }
170
- assert_equal [[1, 2, 3], [4, 5], [6, 7]], yielded_parameters
171
- end
172
-
173
- def test_should_return_specified_value
174
- assert_equal 99, invoke(new_expectation.returns(99))
175
- end
176
-
177
- def test_should_return_same_specified_value_multiple_times
178
- expectation = new_expectation.returns(99)
179
- assert_equal 99, invoke(expectation)
180
- assert_equal 99, invoke(expectation)
181
- end
182
-
183
- def test_should_return_specified_values_on_consecutive_calls
184
- expectation = new_expectation.returns(99, 100, 101)
185
- assert_equal 99, invoke(expectation)
186
- assert_equal 100, invoke(expectation)
187
- assert_equal 101, invoke(expectation)
188
- end
189
-
190
- def test_should_return_specified_values_on_consecutive_calls_even_if_values_are_modified
191
- values = [99, 100, 101]
192
- expectation = new_expectation.returns(*values)
193
- values.shift
194
- assert_equal 99, invoke(expectation)
195
- assert_equal 100, invoke(expectation)
196
- assert_equal 101, invoke(expectation)
197
- end
198
-
199
- def test_should_return_nil_by_default
200
- assert_nil invoke(new_expectation)
201
- end
202
-
203
- def test_should_return_nil_if_no_value_specified
204
- assert_nil invoke(new_expectation.returns)
205
- end
206
-
207
- def test_should_raise_runtime_exception
208
- assert_raises(RuntimeError) { invoke(new_expectation.raises) }
209
- end
210
-
211
- def test_should_raise_custom_exception
212
- exception = Class.new(Exception)
213
- assert_raises(exception) { invoke(new_expectation.raises(exception)) }
214
- end
215
-
216
- def test_should_raise_same_instance_of_custom_exception
217
- exception_klass = Class.new(StandardError)
218
- expected_exception = exception_klass.new
219
- actual_exception = assert_raises(exception_klass) { invoke(new_expectation.raises(expected_exception)) }
220
- assert_same expected_exception, actual_exception
221
- end
222
-
223
- def test_should_use_the_default_exception_message
224
- exception = assert_raises(Exception) { invoke(new_expectation.raises(Exception)) }
225
- assert_equal Exception.new.message, exception.message
226
- end
227
-
228
- def test_should_raise_custom_exception_with_message
229
- exception_msg = 'exception message'
230
- exception = assert_raises(Exception) { invoke(new_expectation.raises(Exception, exception_msg)) }
231
- assert_equal exception_msg, exception.message
232
- end
233
-
234
- def test_should_return_values_then_raise_exception
235
- expectation = new_expectation.returns(1, 2).then.raises
236
- assert_equal 1, invoke(expectation)
237
- assert_equal 2, invoke(expectation)
238
- assert_raises(RuntimeError) { invoke(expectation) }
239
- end
240
-
241
- def test_should_raise_exception_then_return_values
242
- expectation = new_expectation.raises.then.returns(1, 2)
243
- assert_raises(RuntimeError) { invoke(expectation) }
244
- assert_equal 1, invoke(expectation)
245
- assert_equal 2, invoke(expectation)
246
- end
247
-
248
- def test_should_verify_successfully_if_expected_call_was_made
249
- expectation = new_expectation
250
- invoke(expectation)
251
- assert expectation.verified?
252
- end
253
-
254
- def test_should_not_verify_successfully_if_call_expected_once_but_invoked_twice
255
- expectation = new_expectation.once
256
- invoke(expectation)
257
- invoke(expectation)
258
- assert !expectation.verified?
259
- end
260
-
261
- def test_should_not_verify_successfully_if_call_expected_once_but_not_invoked
262
- assert !new_expectation.once.verified?
263
- end
264
-
265
- def test_should_verify_successfully_if_call_expected_once_and_invoked_once
266
- expectation = new_expectation.once
267
- invoke(expectation)
268
- assert expectation.verified?
269
- end
270
-
271
- def test_should_not_verify_successfully_if_call_expected_twice_and_invoked_three_times
272
- expectation = new_expectation.twice
273
- invoke(expectation)
274
- invoke(expectation)
275
- invoke(expectation)
276
- assert !expectation.verified?
277
- end
278
-
279
- def test_should_not_verify_successfully_if_call_expected_twice_but_invoked_once
280
- expectation = new_expectation.twice
281
- invoke(expectation)
282
- assert !expectation.verified?
283
- end
284
-
285
- def test_should_verify_successfully_if_call_expected_twice_and_invoked_twice
286
- expectation = new_expectation.twice
287
- invoke(expectation)
288
- invoke(expectation)
289
- assert expectation.verified?
290
- end
291
-
292
- def test_should_verify_successfully_if_expected_call_was_made_at_least_once
293
- expectation = new_expectation.at_least_once
294
- 3.times { invoke(expectation) }
295
- assert expectation.verified?
296
- end
297
-
298
- def test_should_not_verify_successfully_if_expected_call_was_not_made_at_least_once
299
- expectation = new_expectation.with(1, 2, 3).at_least_once
300
- assert !expectation.verified?
301
- assert_match(/expected at least once, invoked never/i, expectation.mocha_inspect)
302
- end
303
-
304
- def test_should_verify_successfully_if_expected_call_was_made_expected_number_of_times
305
- expectation = new_expectation.times(2)
306
- 2.times { invoke(expectation) }
307
- assert expectation.verified?
308
- end
309
-
310
- def test_should_not_verify_successfully_if_expected_call_was_made_too_few_times
311
- expectation = new_expectation.times(2)
312
- 1.times { invoke(expectation) }
313
- assert !expectation.verified?
314
- assert_match(/expected exactly twice, invoked once/i, expectation.mocha_inspect)
315
- end
316
-
317
- def test_should_not_verify_successfully_if_expected_call_was_made_too_many_times
318
- expectation = new_expectation.times(2)
319
- 3.times { invoke(expectation) }
320
- assert !expectation.verified?
321
- end
322
-
323
- def test_should_increment_assertion_counter_for_expectation_because_it_does_need_verifyng
324
- expectation = new_expectation
325
- invoke(expectation)
326
- assertion_counter = SimpleCounter.new
327
- expectation.verified?(assertion_counter)
328
- assert_equal 1, assertion_counter.count
329
- end
330
-
331
- def test_should_not_increment_assertion_counter_for_stub_because_it_does_not_need_verifying
332
- assertion_counter = SimpleCounter.new
333
- Expectation.new(nil, :expected_method).at_least(0).verified?(assertion_counter)
334
- assert_equal 0, assertion_counter.count
335
- end
336
-
337
- # rubocop:disable Style/Semicolon
338
- def test_should_store_backtrace_from_point_where_expectation_was_created
339
- execution_point = ExecutionPoint.current; expectation = Expectation.new(nil, :expected_method)
340
- assert_equal execution_point, ExecutionPoint.new(expectation.backtrace)
341
- end
342
- # rubocop:enable Style/Semicolon
343
-
344
- class FakeMock
345
- def initialize(name)
346
- @name = name
347
- end
348
-
349
- def mocha_inspect
350
- @name
351
- end
352
- end
353
-
354
- def test_should_raise_error_with_message_indicating_which_method_was_expected_to_be_called_on_which_mock_object_with_which_parameters_and_in_what_sequences
355
- mock = FakeMock.new('mock')
356
- sequence_one = Sequence.new('one')
357
- sequence_two = Sequence.new('two')
358
- expectation = Expectation.new(mock, :expected_method).with(1, 2, { 'a' => true }, { :b => false }, [1, 2, 3]).in_sequence(sequence_one, sequence_two)
359
- assert !expectation.verified?
360
- assert_match %{mock.expected_method(1, 2, {"a" => true}, {:b => false}, [1, 2, 3]); in sequence "one"; in sequence "two"}, expectation.mocha_inspect
361
- end
362
-
363
- class FakeConstraint
364
- def initialize(allows_invocation_now)
365
- @allows_invocation_now = allows_invocation_now
366
- end
367
-
368
- def allows_invocation_now?
369
- @allows_invocation_now
370
- end
371
- end
372
-
373
- def test_should_be_in_correct_order_if_all_ordering_constraints_allow_invocation_now
374
- constraint_one = FakeConstraint.new(true)
375
- constraint_two = FakeConstraint.new(true)
376
- expectation = Expectation.new(nil, :method_one)
377
- expectation.add_ordering_constraint(constraint_one)
378
- expectation.add_ordering_constraint(constraint_two)
379
- assert expectation.in_correct_order?
380
- end
381
-
382
- def test_should_not_be_in_correct_order_if_one_ordering_constraint_does_not_allow_invocation_now
383
- constraint_one = FakeConstraint.new(true)
384
- constraint_two = FakeConstraint.new(false)
385
- expectation = Expectation.new(nil, :method_one)
386
- expectation.add_ordering_constraint(constraint_one)
387
- expectation.add_ordering_constraint(constraint_two)
388
- assert !expectation.in_correct_order?
389
- end
390
-
391
- def test_should_match_if_all_ordering_constraints_allow_invocation_now
392
- constraint_one = FakeConstraint.new(true)
393
- constraint_two = FakeConstraint.new(true)
394
- expectation = Expectation.new(nil, :method_one)
395
- expectation.add_ordering_constraint(constraint_one)
396
- expectation.add_ordering_constraint(constraint_two)
397
- assert expectation.match?(Invocation.new(:irrelevant, :method_one))
398
- end
399
-
400
- def test_should_not_match_if_one_ordering_constraints_does_not_allow_invocation_now
401
- constraint_one = FakeConstraint.new(true)
402
- constraint_two = FakeConstraint.new(false)
403
- expectation = Expectation.new(nil, :method_one)
404
- expectation.add_ordering_constraint(constraint_one)
405
- expectation.add_ordering_constraint(constraint_two)
406
- assert !expectation.match?(Invocation.new(:irrelevant, :method_one))
407
- end
408
-
409
- def test_should_not_be_satisfied_when_required_invocation_has_not_been_made
410
- assert !Expectation.new(nil, :method_one).times(1).satisfied?
411
- end
412
-
413
- def test_should_be_satisfied_when_required_invocation_has_been_made
414
- expectation = Expectation.new(nil, :method_one).times(1)
415
- invoke(expectation)
416
- assert expectation.satisfied?
417
- end
418
-
419
- def test_should_not_be_satisfied_when_minimum_number_of_invocations_has_not_been_made
420
- expectation = Expectation.new(nil, :method_one).at_least(2)
421
- invoke(expectation)
422
- assert !expectation.satisfied?
423
- end
424
-
425
- def test_should_be_satisfied_when_minimum_number_of_invocations_has_been_made
426
- expectation = Expectation.new(nil, :method_one).at_least(2)
427
- 2.times { invoke(expectation) }
428
- assert expectation.satisfied?
429
- end
430
-
431
- class FakeSequence
432
- attr_reader :expectations
433
-
434
- def initialize
435
- @expectations = []
436
- end
437
-
438
- def constrain_as_next_in_sequence(expectation)
439
- @expectations << expectation
440
- end
441
- end
442
-
443
- def test_should_tell_sequences_to_constrain_expectation_as_next_in_sequence
444
- sequence_one = FakeSequence.new
445
- sequence_two = FakeSequence.new
446
- expectation = Expectation.new(nil, :method_one)
447
- assert_equal expectation, expectation.in_sequence(sequence_one, sequence_two)
448
- assert_equal [expectation], sequence_one.expectations
449
- assert_equal [expectation], sequence_two.expectations
450
- end
451
-
452
- class FakeState
453
- def initialize
454
- @active = false
455
- end
456
-
457
- def activate
458
- @active = true
459
- end
460
-
461
- def active?
462
- @active
463
- end
464
- end
465
-
466
- def test_should_change_state_when_expectation_is_invoked
467
- state = FakeState.new
468
- expectation = Expectation.new(nil, :method_one)
469
-
470
- expectation.then(state)
471
-
472
- invoke(expectation)
473
- assert state.active?
474
- end
475
-
476
- def test_should_match_when_state_is_active
477
- state = FakeState.new
478
- expectation = Expectation.new(nil, :method_one)
479
-
480
- expectation.when(state)
481
- assert !expectation.match?(Invocation.new(:irrelevant, :method_one))
482
-
483
- state.activate
484
- assert expectation.match?(Invocation.new(:irrelevant, :method_one))
485
- end
486
-
487
- def test_should_include_default_representation_of_object_in_inspect
488
- object = Object.new
489
- class << object
490
- define_method(:inspect) { 'mock' }
491
- end
492
- assert_match Regexp.new('^#<Expectation:0x[0-9A-Fa-f]{1,12} .* >$'), Expectation.new(object, :method_one).inspect
493
- end
494
-
495
- def test_should_include_output_of_mocha_inspect_in_inspect
496
- object = Object.new
497
- class << object
498
- define_method(:inspect) { 'mock' }
499
- end
500
- expectation = Expectation.new(object, :method_one)
501
- assert expectation.inspect.include?(expectation.mocha_inspect)
502
- end
503
- end
504
- # rubocop:enable Metrics/ClassLength