jferris-mocha 0.9.5.0.1240002286

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 (180) hide show
  1. data/COPYING +3 -0
  2. data/MIT-LICENSE +7 -0
  3. data/README +37 -0
  4. data/RELEASE +269 -0
  5. data/Rakefile +217 -0
  6. data/examples/misc.rb +43 -0
  7. data/examples/mocha.rb +25 -0
  8. data/examples/stubba.rb +64 -0
  9. data/lib/mocha/any_instance_method.rb +55 -0
  10. data/lib/mocha/api.rb +232 -0
  11. data/lib/mocha/argument_iterator.rb +21 -0
  12. data/lib/mocha/backtrace_filter.rb +17 -0
  13. data/lib/mocha/cardinality.rb +95 -0
  14. data/lib/mocha/central.rb +27 -0
  15. data/lib/mocha/change_state_side_effect.rb +19 -0
  16. data/lib/mocha/class_method.rb +87 -0
  17. data/lib/mocha/configuration.rb +60 -0
  18. data/lib/mocha/deprecation.rb +22 -0
  19. data/lib/mocha/exception_raiser.rb +17 -0
  20. data/lib/mocha/expectation.rb +484 -0
  21. data/lib/mocha/expectation_error.rb +15 -0
  22. data/lib/mocha/expectation_list.rb +50 -0
  23. data/lib/mocha/in_state_ordering_constraint.rb +19 -0
  24. data/lib/mocha/inspect.rb +67 -0
  25. data/lib/mocha/instance_method.rb +16 -0
  26. data/lib/mocha/integration/bacon/assertion_counter.rb +23 -0
  27. data/lib/mocha/integration/bacon/version_11_and_above.rb +34 -0
  28. data/lib/mocha/integration/bacon.rb +1 -0
  29. data/lib/mocha/integration/mini_test/assertion_counter.rb +23 -0
  30. data/lib/mocha/integration/mini_test/version_131_and_above.rb +49 -0
  31. data/lib/mocha/integration/mini_test.rb +1 -0
  32. data/lib/mocha/integration/test_unit/assertion_counter.rb +23 -0
  33. data/lib/mocha/integration/test_unit/gem_version_200.rb +49 -0
  34. data/lib/mocha/integration/test_unit/gem_version_201_and_above.rb +49 -0
  35. data/lib/mocha/integration/test_unit/ruby_version_185_and_below.rb +48 -0
  36. data/lib/mocha/integration/test_unit/ruby_version_186_and_above.rb +50 -0
  37. data/lib/mocha/integration/test_unit.rb +4 -0
  38. data/lib/mocha/invocation.rb +10 -0
  39. data/lib/mocha/is_a.rb +9 -0
  40. data/lib/mocha/logger.rb +15 -0
  41. data/lib/mocha/metaclass.rb +13 -0
  42. data/lib/mocha/method_matcher.rb +21 -0
  43. data/lib/mocha/mock.rb +200 -0
  44. data/lib/mocha/mockery.rb +189 -0
  45. data/lib/mocha/module_method.rb +16 -0
  46. data/lib/mocha/multiple_yields.rb +20 -0
  47. data/lib/mocha/names.rb +53 -0
  48. data/lib/mocha/no_yields.rb +11 -0
  49. data/lib/mocha/object.rb +187 -0
  50. data/lib/mocha/parameter_matchers/all_of.rb +42 -0
  51. data/lib/mocha/parameter_matchers/any_of.rb +47 -0
  52. data/lib/mocha/parameter_matchers/any_parameters.rb +40 -0
  53. data/lib/mocha/parameter_matchers/anything.rb +33 -0
  54. data/lib/mocha/parameter_matchers/base.rb +15 -0
  55. data/lib/mocha/parameter_matchers/equals.rb +42 -0
  56. data/lib/mocha/parameter_matchers/has_entries.rb +45 -0
  57. data/lib/mocha/parameter_matchers/has_entry.rb +57 -0
  58. data/lib/mocha/parameter_matchers/has_key.rb +42 -0
  59. data/lib/mocha/parameter_matchers/has_value.rb +42 -0
  60. data/lib/mocha/parameter_matchers/includes.rb +40 -0
  61. data/lib/mocha/parameter_matchers/instance_of.rb +42 -0
  62. data/lib/mocha/parameter_matchers/is_a.rb +42 -0
  63. data/lib/mocha/parameter_matchers/kind_of.rb +42 -0
  64. data/lib/mocha/parameter_matchers/not.rb +42 -0
  65. data/lib/mocha/parameter_matchers/object.rb +15 -0
  66. data/lib/mocha/parameter_matchers/optionally.rb +55 -0
  67. data/lib/mocha/parameter_matchers/regexp_matches.rb +43 -0
  68. data/lib/mocha/parameter_matchers/responds_with.rb +43 -0
  69. data/lib/mocha/parameter_matchers/yaml_equivalent.rb +43 -0
  70. data/lib/mocha/parameter_matchers.rb +27 -0
  71. data/lib/mocha/parameters_matcher.rb +37 -0
  72. data/lib/mocha/pretty_parameters.rb +28 -0
  73. data/lib/mocha/return_values.rb +31 -0
  74. data/lib/mocha/sequence.rb +42 -0
  75. data/lib/mocha/single_return_value.rb +17 -0
  76. data/lib/mocha/single_yield.rb +18 -0
  77. data/lib/mocha/state_machine.rb +91 -0
  78. data/lib/mocha/stubbing_error.rb +16 -0
  79. data/lib/mocha/unexpected_invocation.rb +18 -0
  80. data/lib/mocha/yield_parameters.rb +31 -0
  81. data/lib/mocha.rb +69 -0
  82. data/lib/mocha_standalone.rb +2 -0
  83. data/lib/stubba.rb +4 -0
  84. data/test/acceptance/acceptance_test_helper.rb +38 -0
  85. data/test/acceptance/api_test.rb +139 -0
  86. data/test/acceptance/bacon_spec.rb +67 -0
  87. data/test/acceptance/bacon_test.rb +110 -0
  88. data/test/acceptance/bug_18914_test.rb +43 -0
  89. data/test/acceptance/bug_21465_test.rb +34 -0
  90. data/test/acceptance/bug_21563_test.rb +25 -0
  91. data/test/acceptance/expected_invocation_count_test.rb +196 -0
  92. data/test/acceptance/failure_messages_test.rb +64 -0
  93. data/test/acceptance/minitest_test.rb +146 -0
  94. data/test/acceptance/mocha_example_test.rb +98 -0
  95. data/test/acceptance/mocha_test_result_test.rb +84 -0
  96. data/test/acceptance/mock_test.rb +100 -0
  97. data/test/acceptance/mock_with_initializer_block_test.rb +51 -0
  98. data/test/acceptance/mocked_methods_dispatch_test.rb +78 -0
  99. data/test/acceptance/optional_parameters_test.rb +70 -0
  100. data/test/acceptance/parameter_matcher_test.rb +209 -0
  101. data/test/acceptance/partial_mocks_test.rb +47 -0
  102. data/test/acceptance/return_value_test.rb +52 -0
  103. data/test/acceptance/sequence_test.rb +186 -0
  104. data/test/acceptance/spy_test.rb +109 -0
  105. data/test/acceptance/states_test.rb +70 -0
  106. data/test/acceptance/stub_any_instance_method_test.rb +195 -0
  107. data/test/acceptance/stub_class_method_test.rb +203 -0
  108. data/test/acceptance/stub_everything_test.rb +56 -0
  109. data/test/acceptance/stub_instance_method_test.rb +203 -0
  110. data/test/acceptance/stub_module_method_test.rb +163 -0
  111. data/test/acceptance/stub_test.rb +52 -0
  112. data/test/acceptance/stubba_example_test.rb +102 -0
  113. data/test/acceptance/stubba_test.rb +15 -0
  114. data/test/acceptance/stubba_test_result_test.rb +66 -0
  115. data/test/acceptance/stubbing_error_backtrace_test.rb +64 -0
  116. data/test/acceptance/stubbing_method_unnecessarily_test.rb +65 -0
  117. data/test/acceptance/stubbing_non_existent_any_instance_method_test.rb +130 -0
  118. data/test/acceptance/stubbing_non_existent_class_method_test.rb +157 -0
  119. data/test/acceptance/stubbing_non_existent_instance_method_test.rb +147 -0
  120. data/test/acceptance/stubbing_non_public_any_instance_method_test.rb +130 -0
  121. data/test/acceptance/stubbing_non_public_class_method_test.rb +163 -0
  122. data/test/acceptance/stubbing_non_public_instance_method_test.rb +143 -0
  123. data/test/acceptance/stubbing_on_non_mock_object_test.rb +64 -0
  124. data/test/deprecation_disabler.rb +15 -0
  125. data/test/execution_point.rb +36 -0
  126. data/test/matcher_helpers.rb +5 -0
  127. data/test/method_definer.rb +24 -0
  128. data/test/simple_counter.rb +13 -0
  129. data/test/test_helper.rb +16 -0
  130. data/test/test_runner.rb +33 -0
  131. data/test/unit/any_instance_method_test.rb +126 -0
  132. data/test/unit/array_inspect_test.rb +16 -0
  133. data/test/unit/assert_received_test.rb +136 -0
  134. data/test/unit/backtrace_filter_test.rb +19 -0
  135. data/test/unit/cardinality_test.rb +56 -0
  136. data/test/unit/central_test.rb +65 -0
  137. data/test/unit/change_state_side_effect_test.rb +41 -0
  138. data/test/unit/class_method_test.rb +237 -0
  139. data/test/unit/date_time_inspect_test.rb +21 -0
  140. data/test/unit/exception_raiser_test.rb +42 -0
  141. data/test/unit/expectation_list_test.rb +57 -0
  142. data/test/unit/expectation_test.rb +526 -0
  143. data/test/unit/hash_inspect_test.rb +16 -0
  144. data/test/unit/have_received_test.rb +137 -0
  145. data/test/unit/in_state_ordering_constraint_test.rb +43 -0
  146. data/test/unit/invocation_test.rb +17 -0
  147. data/test/unit/metaclass_test.rb +22 -0
  148. data/test/unit/method_matcher_test.rb +23 -0
  149. data/test/unit/mock_test.rb +329 -0
  150. data/test/unit/mockery_test.rb +163 -0
  151. data/test/unit/multiple_yields_test.rb +18 -0
  152. data/test/unit/no_yields_test.rb +18 -0
  153. data/test/unit/object_inspect_test.rb +37 -0
  154. data/test/unit/object_test.rb +82 -0
  155. data/test/unit/parameter_matchers/all_of_test.rb +26 -0
  156. data/test/unit/parameter_matchers/any_of_test.rb +26 -0
  157. data/test/unit/parameter_matchers/anything_test.rb +21 -0
  158. data/test/unit/parameter_matchers/equals_test.rb +25 -0
  159. data/test/unit/parameter_matchers/has_entries_test.rb +51 -0
  160. data/test/unit/parameter_matchers/has_entry_test.rb +82 -0
  161. data/test/unit/parameter_matchers/has_key_test.rb +36 -0
  162. data/test/unit/parameter_matchers/has_value_test.rb +37 -0
  163. data/test/unit/parameter_matchers/includes_test.rb +25 -0
  164. data/test/unit/parameter_matchers/instance_of_test.rb +25 -0
  165. data/test/unit/parameter_matchers/is_a_test.rb +25 -0
  166. data/test/unit/parameter_matchers/kind_of_test.rb +25 -0
  167. data/test/unit/parameter_matchers/not_test.rb +26 -0
  168. data/test/unit/parameter_matchers/regexp_matches_test.rb +25 -0
  169. data/test/unit/parameter_matchers/responds_with_test.rb +25 -0
  170. data/test/unit/parameter_matchers/stub_matcher.rb +27 -0
  171. data/test/unit/parameter_matchers/yaml_equivalent_test.rb +25 -0
  172. data/test/unit/parameters_matcher_test.rb +121 -0
  173. data/test/unit/return_values_test.rb +63 -0
  174. data/test/unit/sequence_test.rb +104 -0
  175. data/test/unit/single_return_value_test.rb +14 -0
  176. data/test/unit/single_yield_test.rb +18 -0
  177. data/test/unit/state_machine_test.rb +98 -0
  178. data/test/unit/string_inspect_test.rb +11 -0
  179. data/test/unit/yield_parameters_test.rb +93 -0
  180. metadata +245 -0
@@ -0,0 +1,98 @@
1
+ require File.join(File.dirname(__FILE__), "..", "test_helper")
2
+ require 'mocha'
3
+
4
+ class MochaExampleTest < Test::Unit::TestCase
5
+
6
+ class Rover
7
+
8
+ def initialize(left_track, right_track, steps_per_metre, steps_per_degree)
9
+ @left_track, @right_track, @steps_per_metre, @steps_per_degree = left_track, right_track, steps_per_metre, steps_per_degree
10
+ end
11
+
12
+ def forward(metres)
13
+ @left_track.step(metres * @steps_per_metre)
14
+ @right_track.step(metres * @steps_per_metre)
15
+ wait
16
+ end
17
+
18
+ def backward(metres)
19
+ forward(-metres)
20
+ end
21
+
22
+ def left(degrees)
23
+ @left_track.step(-degrees * @steps_per_degree)
24
+ @right_track.step(+degrees * @steps_per_degree)
25
+ wait
26
+ end
27
+
28
+ def right(degrees)
29
+ left(-degrees)
30
+ end
31
+
32
+ def wait
33
+ while (@left_track.moving? or @right_track.moving?); end
34
+ end
35
+
36
+ end
37
+
38
+ def test_should_step_both_tracks_forward_ten_steps
39
+ left_track = mock('left_track')
40
+ right_track = mock('right_track')
41
+ steps_per_metre = 5
42
+ rover = Rover.new(left_track, right_track, steps_per_metre, nil)
43
+
44
+ left_track.expects(:step).with(10)
45
+ right_track.expects(:step).with(10)
46
+
47
+ left_track.stubs(:moving?).returns(false)
48
+ right_track.stubs(:moving?).returns(false)
49
+
50
+ rover.forward(2)
51
+ end
52
+
53
+ def test_should_step_both_tracks_backward_ten_steps
54
+ left_track = mock('left_track')
55
+ right_track = mock('right_track')
56
+ steps_per_metre = 5
57
+ rover = Rover.new(left_track, right_track, steps_per_metre, nil)
58
+
59
+ left_track.expects(:step).with(-10)
60
+ right_track.expects(:step).with(-10)
61
+
62
+ left_track.stubs(:moving?).returns(false)
63
+ right_track.stubs(:moving?).returns(false)
64
+
65
+ rover.backward(2)
66
+ end
67
+
68
+ def test_should_step_left_track_forwards_five_steps_and_right_track_backwards_five_steps
69
+ left_track = mock('left_track')
70
+ right_track = mock('right_track')
71
+ steps_per_degree = 5.0 / 90.0
72
+ rover = Rover.new(left_track, right_track, nil, steps_per_degree)
73
+
74
+ left_track.expects(:step).with(+5)
75
+ right_track.expects(:step).with(-5)
76
+
77
+ left_track.stubs(:moving?).returns(false)
78
+ right_track.stubs(:moving?).returns(false)
79
+
80
+ rover.right(90)
81
+ end
82
+
83
+ def test_should_step_left_track_backwards_five_steps_and_right_track_forwards_five_steps
84
+ left_track = mock('left_track')
85
+ right_track = mock('right_track')
86
+ steps_per_degree = 5.0 / 90.0
87
+ rover = Rover.new(left_track, right_track, nil, steps_per_degree)
88
+
89
+ left_track.expects(:step).with(-5)
90
+ right_track.expects(:step).with(+5)
91
+
92
+ left_track.stubs(:moving?).returns(false)
93
+ right_track.stubs(:moving?).returns(false)
94
+
95
+ rover.left(90)
96
+ end
97
+
98
+ end
@@ -0,0 +1,84 @@
1
+ require File.join(File.dirname(__FILE__), "acceptance_test_helper")
2
+ require 'mocha'
3
+ require 'execution_point'
4
+
5
+ class MochaTestResultTest < Test::Unit::TestCase
6
+
7
+ include AcceptanceTest
8
+
9
+ def setup
10
+ setup_acceptance_test
11
+ end
12
+
13
+ def teardown
14
+ teardown_acceptance_test
15
+ end
16
+
17
+ def test_should_include_expectation_verification_in_assertion_count
18
+ test_result = run_as_test do
19
+ object = mock()
20
+ object.expects(:message)
21
+ object.message
22
+ end
23
+ assert_equal 1, test_result.assertion_count
24
+ end
25
+
26
+ def test_should_include_assertions_in_assertion_count
27
+ test_result = run_as_test do
28
+ assert true
29
+ end
30
+ assert_equal 1, test_result.assertion_count
31
+ end
32
+
33
+ def test_should_not_include_stubbing_expectation_verification_in_assertion_count
34
+ test_result = run_as_test do
35
+ object = mock()
36
+ object.stubs(:message)
37
+ object.message
38
+ end
39
+ assert_equal 0, test_result.assertion_count
40
+ end
41
+
42
+ def test_should_include_expectation_verification_failure_in_failure_count
43
+ test_result = run_as_test do
44
+ object = mock()
45
+ object.expects(:message)
46
+ end
47
+ assert_equal 1, test_result.failure_count
48
+ end
49
+
50
+ def test_should_include_unexpected_verification_failure_in_failure_count
51
+ test_result = run_as_test do
52
+ object = mock()
53
+ object.message
54
+ end
55
+ assert_equal 1, test_result.failure_count
56
+ end
57
+
58
+ def test_should_include_assertion_failure_in_failure_count
59
+ test_result = run_as_test do
60
+ flunk
61
+ end
62
+ assert_equal 1, test_result.failure_count
63
+ end
64
+
65
+ def test_should_display_backtrace_indicating_line_number_where_unexpected_method_was_called
66
+ execution_point = nil
67
+ test_result = run_as_test do
68
+ object = mock()
69
+ execution_point = ExecutionPoint.current; object.message
70
+ end
71
+ assert_equal 1, test_result.failure_count
72
+ assert_equal execution_point, ExecutionPoint.new(test_result.failures[0].location)
73
+ end
74
+
75
+ def test_should_display_backtrace_indicating_line_number_where_failing_assertion_was_called
76
+ execution_point = nil
77
+ test_result = run_as_test do
78
+ execution_point = ExecutionPoint.current; flunk
79
+ end
80
+ assert_equal 1, test_result.failure_count
81
+ assert_equal execution_point, ExecutionPoint.new(test_result.failures[0].location)
82
+ end
83
+
84
+ end
@@ -0,0 +1,100 @@
1
+ require File.join(File.dirname(__FILE__), "acceptance_test_helper")
2
+ require 'mocha'
3
+
4
+ class MockTest < Test::Unit::TestCase
5
+
6
+ include AcceptanceTest
7
+
8
+ def setup
9
+ setup_acceptance_test
10
+ end
11
+
12
+ def teardown
13
+ teardown_acceptance_test
14
+ end
15
+
16
+ def test_should_build_mock_and_explicitly_add_an_expectation_which_is_satisfied
17
+ test_result = run_as_test do
18
+ foo = mock()
19
+ foo.expects(:bar)
20
+ foo.bar
21
+ end
22
+ assert_passed(test_result)
23
+ end
24
+
25
+ def test_should_build_mock_and_explicitly_add_an_expectation_which_is_not_satisfied
26
+ test_result = run_as_test do
27
+ foo = mock()
28
+ foo.expects(:bar)
29
+ end
30
+ assert_failed(test_result)
31
+ end
32
+
33
+ def test_should_build_named_mock_and_explicitly_add_an_expectation_which_is_satisfied
34
+ test_result = run_as_test do
35
+ foo = mock('foo')
36
+ foo.expects(:bar)
37
+ foo.bar
38
+ end
39
+ assert_passed(test_result)
40
+ end
41
+
42
+ def test_should_build_named_mock_and_explicitly_add_an_expectation_which_is_not_satisfied
43
+ test_result = run_as_test do
44
+ foo = mock('foo')
45
+ foo.expects(:bar)
46
+ end
47
+ assert_failed(test_result)
48
+ end
49
+
50
+ def test_should_build_mock_incorporating_two_expectations_which_are_satisifed
51
+ test_result = run_as_test do
52
+ foo = mock(:bar => 'bar', :baz => 'baz')
53
+ foo.bar
54
+ foo.baz
55
+ end
56
+ assert_passed(test_result)
57
+ end
58
+
59
+ def test_should_build_mock_incorporating_two_expectations_the_first_of_which_is_not_satisifed
60
+ test_result = run_as_test do
61
+ foo = mock(:bar => 'bar', :baz => 'baz')
62
+ foo.baz
63
+ end
64
+ assert_failed(test_result)
65
+ end
66
+
67
+ def test_should_build_mock_incorporating_two_expectations_the_second_of_which_is_not_satisifed
68
+ test_result = run_as_test do
69
+ foo = mock(:bar => 'bar', :baz => 'baz')
70
+ foo.bar
71
+ end
72
+ assert_failed(test_result)
73
+ end
74
+
75
+ def test_should_build_named_mock_incorporating_two_expectations_which_are_satisifed
76
+ test_result = run_as_test do
77
+ foo = mock('foo', :bar => 'bar', :baz => 'baz')
78
+ foo.bar
79
+ foo.baz
80
+ end
81
+ assert_passed(test_result)
82
+ end
83
+
84
+ def test_should_build_named_mock_incorporating_two_expectations_the_first_of_which_is_not_satisifed
85
+ test_result = run_as_test do
86
+ foo = mock('foo', :bar => 'bar', :baz => 'baz')
87
+ foo.baz
88
+ end
89
+ assert_failed(test_result)
90
+ end
91
+
92
+ def test_should_build_named_mock_incorporating_two_expectations_the_second_of_which_is_not_satisifed
93
+ test_result = run_as_test do
94
+ foo = mock('foo', :bar => 'bar', :baz => 'baz')
95
+ foo.bar
96
+ end
97
+ assert_failed(test_result)
98
+ end
99
+
100
+ end
@@ -0,0 +1,51 @@
1
+ require File.join(File.dirname(__FILE__), "acceptance_test_helper")
2
+ require 'mocha'
3
+
4
+ class MockWithInitializerBlockTest < Test::Unit::TestCase
5
+
6
+ include AcceptanceTest
7
+
8
+ def setup
9
+ setup_acceptance_test
10
+ end
11
+
12
+ def teardown
13
+ teardown_acceptance_test
14
+ end
15
+
16
+ def test_should_expect_two_method_invocations_and_receive_both_of_them
17
+ test_result = run_as_test do
18
+ mock = mock() do
19
+ expects(:method_1)
20
+ expects(:method_2)
21
+ end
22
+ mock.method_1
23
+ mock.method_2
24
+ end
25
+ assert_passed(test_result)
26
+ end
27
+
28
+ def test_should_expect_two_method_invocations_but_receive_only_one_of_them
29
+ test_result = run_as_test do
30
+ mock = mock() do
31
+ expects(:method_1)
32
+ expects(:method_2)
33
+ end
34
+ mock.method_1
35
+ end
36
+ assert_failed(test_result)
37
+ end
38
+
39
+ def test_should_stub_methods
40
+ test_result = run_as_test do
41
+ mock = mock() do
42
+ stubs(:method_1).returns(1)
43
+ stubs(:method_2).returns(2)
44
+ end
45
+ assert_equal 1, mock.method_1
46
+ assert_equal 2, mock.method_2
47
+ end
48
+ assert_passed(test_result)
49
+ end
50
+
51
+ end
@@ -0,0 +1,78 @@
1
+ require File.join(File.dirname(__FILE__), "acceptance_test_helper")
2
+ require 'mocha'
3
+
4
+ class MockedMethodDispatchTest < Test::Unit::TestCase
5
+
6
+ include AcceptanceTest
7
+
8
+ def setup
9
+ setup_acceptance_test
10
+ end
11
+
12
+ def teardown
13
+ teardown_acceptance_test
14
+ end
15
+
16
+ def test_should_find_latest_matching_expectation
17
+ test_result = run_as_test do
18
+ mock = mock()
19
+ mock.stubs(:method).returns(1)
20
+ mock.stubs(:method).returns(2)
21
+ assert_equal 2, mock.method
22
+ assert_equal 2, mock.method
23
+ assert_equal 2, mock.method
24
+ end
25
+ assert_passed(test_result)
26
+ end
27
+
28
+ def test_should_find_latest_expectation_which_has_not_stopped_matching
29
+ test_result = run_as_test do
30
+ mock = mock()
31
+ mock.stubs(:method).returns(1)
32
+ mock.stubs(:method).once.returns(2)
33
+ assert_equal 2, mock.method
34
+ assert_equal 1, mock.method
35
+ assert_equal 1, mock.method
36
+ end
37
+ assert_passed(test_result)
38
+ end
39
+
40
+ def test_should_keep_finding_later_stub_and_so_never_satisfy_earlier_expectation
41
+ test_result = run_as_test do
42
+ mock = mock()
43
+ mock.expects(:method).returns(1)
44
+ mock.stubs(:method).returns(2)
45
+ assert_equal 2, mock.method
46
+ assert_equal 2, mock.method
47
+ assert_equal 2, mock.method
48
+ end
49
+ assert_failed(test_result)
50
+ end
51
+
52
+ def test_should_find_later_expectation_until_it_stops_matching_then_find_earlier_stub
53
+ test_result = run_as_test do
54
+ mock = mock()
55
+ mock.stubs(:method).returns(1)
56
+ mock.expects(:method).returns(2)
57
+ assert_equal 2, mock.method
58
+ assert_equal 1, mock.method
59
+ assert_equal 1, mock.method
60
+ end
61
+ assert_passed(test_result)
62
+ end
63
+
64
+ def test_should_find_latest_expectation_with_range_of_expected_invocation_count_which_has_not_stopped_matching
65
+ test_result = run_as_test do
66
+ mock = mock()
67
+ mock.stubs(:method).returns(1)
68
+ mock.stubs(:method).times(2..3).returns(2)
69
+ assert_equal 2, mock.method
70
+ assert_equal 2, mock.method
71
+ assert_equal 2, mock.method
72
+ assert_equal 1, mock.method
73
+ assert_equal 1, mock.method
74
+ end
75
+ assert_passed(test_result)
76
+ end
77
+
78
+ end
@@ -0,0 +1,70 @@
1
+ require File.join(File.dirname(__FILE__), "acceptance_test_helper")
2
+ require 'mocha'
3
+
4
+ class OptionalParameterMatcherTest < Test::Unit::TestCase
5
+
6
+ include AcceptanceTest
7
+
8
+ def setup
9
+ setup_acceptance_test
10
+ end
11
+
12
+ def teardown
13
+ teardown_acceptance_test
14
+ end
15
+
16
+ def test_should_pass_if_all_required_parameters_match_and_no_optional_parameters_are_supplied
17
+ test_result = run_as_test do
18
+ mock = mock()
19
+ mock.expects(:method).with(1, 2, optionally(3, 4))
20
+ mock.method(1, 2)
21
+ end
22
+ assert_passed(test_result)
23
+ end
24
+
25
+ def test_should_pass_if_all_required_and_optional_parameters_match_and_some_optional_parameters_are_supplied
26
+ test_result = run_as_test do
27
+ mock = mock()
28
+ mock.expects(:method).with(1, 2, optionally(3, 4))
29
+ mock.method(1, 2, 3)
30
+ end
31
+ assert_passed(test_result)
32
+ end
33
+
34
+ def test_should_pass_if_all_required_and_optional_parameters_match_and_all_optional_parameters_are_supplied
35
+ test_result = run_as_test do
36
+ mock = mock()
37
+ mock.expects(:method).with(1, 2, optionally(3, 4))
38
+ mock.method(1, 2, 3, 4)
39
+ end
40
+ assert_passed(test_result)
41
+ end
42
+
43
+ def test_should_fail_if_all_required_and_optional_parameters_match_but_too_many_optional_parameters_are_supplied
44
+ test_result = run_as_test do
45
+ mock = mock()
46
+ mock.expects(:method).with(1, 2, optionally(3, 4))
47
+ mock.method(1, 2, 3, 4, 5)
48
+ end
49
+ assert_failed(test_result)
50
+ end
51
+
52
+ def test_should_fail_if_all_required_parameters_match_but_some_optional_parameters_do_not_match
53
+ test_result = run_as_test do
54
+ mock = mock()
55
+ mock.expects(:method).with(1, 2, optionally(3, 4))
56
+ mock.method(1, 2, 4)
57
+ end
58
+ assert_failed(test_result)
59
+ end
60
+
61
+ def test_should_fail_if_all_required_parameters_match_but_no_optional_parameters_match
62
+ test_result = run_as_test do
63
+ mock = mock()
64
+ mock.expects(:method).with(1, 2, optionally(3, 4))
65
+ mock.method(1, 2, 4, 5)
66
+ end
67
+ assert_failed(test_result)
68
+ end
69
+
70
+ end
@@ -0,0 +1,209 @@
1
+ require File.join(File.dirname(__FILE__), "acceptance_test_helper")
2
+ require 'mocha'
3
+
4
+ class ParameterMatcherTest < Test::Unit::TestCase
5
+
6
+ include AcceptanceTest
7
+
8
+ def setup
9
+ setup_acceptance_test
10
+ end
11
+
12
+ def teardown
13
+ teardown_acceptance_test
14
+ end
15
+
16
+ def test_should_match_hash_parameter_with_specified_key
17
+ test_result = run_as_test do
18
+ mock = mock()
19
+ mock.expects(:method).with(has_key(:key_1))
20
+ mock.method(:key_1 => 'value_1', :key_2 => 'value_2')
21
+ end
22
+ assert_passed(test_result)
23
+ end
24
+
25
+ def test_should_not_match_hash_parameter_with_specified_key
26
+ test_result = run_as_test do
27
+ mock = mock()
28
+ mock.expects(:method).with(has_key(:key_1))
29
+ mock.method(:key_2 => 'value_2')
30
+ end
31
+ assert_failed(test_result)
32
+ end
33
+
34
+ def test_should_match_hash_parameter_with_specified_value
35
+ test_result = run_as_test do
36
+ mock = mock()
37
+ mock.expects(:method).with(has_value('value_1'))
38
+ mock.method(:key_1 => 'value_1', :key_2 => 'value_2')
39
+ end
40
+ assert_passed(test_result)
41
+ end
42
+
43
+ def test_should_not_match_hash_parameter_with_specified_value
44
+ test_result = run_as_test do
45
+ mock = mock()
46
+ mock.expects(:method).with(has_value('value_1'))
47
+ mock.method(:key_2 => 'value_2')
48
+ end
49
+ assert_failed(test_result)
50
+ end
51
+
52
+ def test_should_match_hash_parameter_with_specified_key_value_pair
53
+ test_result = run_as_test do
54
+ mock = mock()
55
+ mock.expects(:method).with(has_entry(:key_1, 'value_1'))
56
+ mock.method(:key_1 => 'value_1', :key_2 => 'value_2')
57
+ end
58
+ assert_passed(test_result)
59
+ end
60
+
61
+ def test_should_not_match_hash_parameter_with_specified_key_value_pair
62
+ test_result = run_as_test do
63
+ mock = mock()
64
+ mock.expects(:method).with(has_entry(:key_1, 'value_2'))
65
+ mock.method(:key_1 => 'value_1', :key_2 => 'value_2')
66
+ end
67
+ assert_failed(test_result)
68
+ end
69
+
70
+ def test_should_match_hash_parameter_with_specified_hash_entry
71
+ test_result = run_as_test do
72
+ mock = mock()
73
+ mock.expects(:method).with(has_entry(:key_1 => 'value_1'))
74
+ mock.method(:key_1 => 'value_1', :key_2 => 'value_2')
75
+ end
76
+ assert_passed(test_result)
77
+ end
78
+
79
+ def test_should_not_match_hash_parameter_with_specified_hash_entry
80
+ test_result = run_as_test do
81
+ mock = mock()
82
+ mock.expects(:method).with(has_entry(:key_1 => 'value_2'))
83
+ mock.method(:key_1 => 'value_1', :key_2 => 'value_2')
84
+ end
85
+ assert_failed(test_result)
86
+ end
87
+
88
+ def test_should_match_hash_parameter_with_specified_entries
89
+ test_result = run_as_test do
90
+ mock = mock()
91
+ mock.expects(:method).with(has_entries(:key_1 => 'value_1', :key_2 => 'value_2'))
92
+ mock.method(:key_1 => 'value_1', :key_2 => 'value_2', :key_3 => 'value_3')
93
+ end
94
+ assert_passed(test_result)
95
+ end
96
+
97
+ def test_should_not_match_hash_parameter_with_specified_entries
98
+ test_result = run_as_test do
99
+ mock = mock()
100
+ mock.expects(:method).with(has_entries(:key_1 => 'value_1', :key_2 => 'value_2'))
101
+ mock.method(:key_1 => 'value_1', :key_2 => 'value_3')
102
+ end
103
+ assert_failed(test_result)
104
+ end
105
+
106
+ def test_should_match_parameter_that_matches_regular_expression
107
+ test_result = run_as_test do
108
+ mock = mock()
109
+ mock.expects(:method).with(regexp_matches(/meter/))
110
+ mock.method('this parameter should match')
111
+ end
112
+ assert_passed(test_result)
113
+ end
114
+
115
+ def test_should_not_match_parameter_that_does_not_match_regular_expression
116
+ test_result = run_as_test do
117
+ mock = mock()
118
+ mock.expects(:method).with(regexp_matches(/something different/))
119
+ mock.method('this parameter should not match')
120
+ end
121
+ assert_failed(test_result)
122
+ end
123
+
124
+ def test_should_match_hash_parameter_with_specified_entries_using_nested_matchers
125
+ test_result = run_as_test do
126
+ mock = mock()
127
+ mock.expects(:method).with(has_entries(:key_1 => regexp_matches(/value_1/), kind_of(Symbol) => 'value_2'))
128
+ mock.method(:key_1 => 'value_1', :key_2 => 'value_2', :key_3 => 'value_3')
129
+ end
130
+ assert_passed(test_result)
131
+ end
132
+
133
+ def test_should_not_match_hash_parameter_with_specified_entries_using_nested_matchers
134
+ test_result = run_as_test do
135
+ mock = mock()
136
+ mock.expects(:method).with(has_entries(:key_1 => regexp_matches(/value_1/), kind_of(String) => 'value_2'))
137
+ mock.method(:key_1 => 'value_2', :key_2 => 'value_3')
138
+ end
139
+ assert_failed(test_result)
140
+ end
141
+
142
+ def test_should_match_parameter_that_matches_any_value
143
+ test_result = run_as_test do
144
+ mock = mock()
145
+ mock.expects(:method).with(any_of('value_1', 'value_2')).times(2)
146
+ mock.method('value_1')
147
+ mock.method('value_2')
148
+ end
149
+ assert_passed(test_result)
150
+ end
151
+
152
+ def test_should_not_match_parameter_that_does_not_match_any_value
153
+ test_result = run_as_test do
154
+ mock = mock()
155
+ mock.expects(:method).with(any_of('value_1', 'value_2'))
156
+ mock.method('value_3')
157
+ end
158
+ assert_failed(test_result)
159
+ end
160
+
161
+ def test_should_match_parameter_that_matches_all_values
162
+ test_result = run_as_test do
163
+ mock = mock()
164
+ mock.expects(:method).with(all_of('value_1', 'value_1'))
165
+ mock.method('value_1')
166
+ end
167
+ assert_passed(test_result)
168
+ end
169
+
170
+ def test_should_not_match_parameter_that_does_not_match_all_values
171
+ test_result = run_as_test do
172
+ mock = mock()
173
+ mock.expects(:method).with(all_of('value_1', 'value_2'))
174
+ mock.method('value_1')
175
+ end
176
+ assert_failed(test_result)
177
+ end
178
+
179
+ def test_should_match_parameter_that_responds_with_specified_value
180
+ klass = Class.new do
181
+ def quack
182
+ 'quack'
183
+ end
184
+ end
185
+ duck = klass.new
186
+ test_result = run_as_test do
187
+ mock = mock()
188
+ mock.expects(:method).with(responds_with(:quack, 'quack'))
189
+ mock.method(duck)
190
+ end
191
+ assert_passed(test_result)
192
+ end
193
+
194
+ def test_should_not_match_parameter_that_does_not_respond_with_specified_value
195
+ klass = Class.new do
196
+ def quack
197
+ 'woof'
198
+ end
199
+ end
200
+ duck = klass.new
201
+ test_result = run_as_test do
202
+ mock = mock()
203
+ mock.expects(:method).with(responds_with(:quack, 'quack'))
204
+ mock.method(duck)
205
+ end
206
+ assert_failed(test_result)
207
+ end
208
+
209
+ end