mocha 1.11.2 → 1.12.0

Sign up to get free protection for your applications and to get access to all the features.
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