floehopper-mocha 0.9.3.20081220175348

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 (162) hide show
  1. data/COPYING +3 -0
  2. data/MIT-LICENSE +7 -0
  3. data/README +35 -0
  4. data/RELEASE +257 -0
  5. data/Rakefile +199 -0
  6. data/examples/misc.rb +44 -0
  7. data/examples/mocha.rb +26 -0
  8. data/examples/stubba.rb +65 -0
  9. data/lib/mocha/any_instance_method.rb +54 -0
  10. data/lib/mocha/argument_iterator.rb +21 -0
  11. data/lib/mocha/backtrace_filter.rb +17 -0
  12. data/lib/mocha/cardinality.rb +95 -0
  13. data/lib/mocha/central.rb +27 -0
  14. data/lib/mocha/change_state_side_effect.rb +19 -0
  15. data/lib/mocha/class_method.rb +86 -0
  16. data/lib/mocha/configuration.rb +60 -0
  17. data/lib/mocha/deprecation.rb +22 -0
  18. data/lib/mocha/exception_raiser.rb +17 -0
  19. data/lib/mocha/expectation.rb +451 -0
  20. data/lib/mocha/expectation_error.rb +15 -0
  21. data/lib/mocha/expectation_list.rb +50 -0
  22. data/lib/mocha/in_state_ordering_constraint.rb +19 -0
  23. data/lib/mocha/inspect.rb +67 -0
  24. data/lib/mocha/instance_method.rb +16 -0
  25. data/lib/mocha/is_a.rb +9 -0
  26. data/lib/mocha/logger.rb +15 -0
  27. data/lib/mocha/metaclass.rb +13 -0
  28. data/lib/mocha/method_matcher.rb +21 -0
  29. data/lib/mocha/mini_test_adapter.rb +50 -0
  30. data/lib/mocha/mock.rb +200 -0
  31. data/lib/mocha/mockery.rb +181 -0
  32. data/lib/mocha/module_method.rb +16 -0
  33. data/lib/mocha/multiple_yields.rb +20 -0
  34. data/lib/mocha/names.rb +53 -0
  35. data/lib/mocha/no_yields.rb +11 -0
  36. data/lib/mocha/object.rb +187 -0
  37. data/lib/mocha/parameter_matchers/all_of.rb +42 -0
  38. data/lib/mocha/parameter_matchers/any_of.rb +47 -0
  39. data/lib/mocha/parameter_matchers/any_parameters.rb +40 -0
  40. data/lib/mocha/parameter_matchers/anything.rb +33 -0
  41. data/lib/mocha/parameter_matchers/base.rb +15 -0
  42. data/lib/mocha/parameter_matchers/equals.rb +42 -0
  43. data/lib/mocha/parameter_matchers/has_entries.rb +45 -0
  44. data/lib/mocha/parameter_matchers/has_entry.rb +56 -0
  45. data/lib/mocha/parameter_matchers/has_key.rb +42 -0
  46. data/lib/mocha/parameter_matchers/has_value.rb +42 -0
  47. data/lib/mocha/parameter_matchers/includes.rb +40 -0
  48. data/lib/mocha/parameter_matchers/instance_of.rb +42 -0
  49. data/lib/mocha/parameter_matchers/is_a.rb +42 -0
  50. data/lib/mocha/parameter_matchers/kind_of.rb +42 -0
  51. data/lib/mocha/parameter_matchers/not.rb +42 -0
  52. data/lib/mocha/parameter_matchers/object.rb +15 -0
  53. data/lib/mocha/parameter_matchers/optionally.rb +55 -0
  54. data/lib/mocha/parameter_matchers/regexp_matches.rb +43 -0
  55. data/lib/mocha/parameter_matchers/responds_with.rb +43 -0
  56. data/lib/mocha/parameter_matchers/yaml_equivalent.rb +43 -0
  57. data/lib/mocha/parameter_matchers.rb +27 -0
  58. data/lib/mocha/parameters_matcher.rb +37 -0
  59. data/lib/mocha/pretty_parameters.rb +28 -0
  60. data/lib/mocha/return_values.rb +31 -0
  61. data/lib/mocha/sequence.rb +42 -0
  62. data/lib/mocha/single_return_value.rb +17 -0
  63. data/lib/mocha/single_yield.rb +18 -0
  64. data/lib/mocha/standalone.rb +166 -0
  65. data/lib/mocha/state_machine.rb +91 -0
  66. data/lib/mocha/stubbing_error.rb +16 -0
  67. data/lib/mocha/test_case_adapter.rb +103 -0
  68. data/lib/mocha/unexpected_invocation.rb +18 -0
  69. data/lib/mocha/yield_parameters.rb +31 -0
  70. data/lib/mocha.rb +47 -0
  71. data/lib/mocha_standalone.rb +2 -0
  72. data/lib/stubba.rb +4 -0
  73. data/test/acceptance/acceptance_test_helper.rb +38 -0
  74. data/test/acceptance/bug_18914_test.rb +43 -0
  75. data/test/acceptance/bug_21465_test.rb +34 -0
  76. data/test/acceptance/bug_21563_test.rb +25 -0
  77. data/test/acceptance/expected_invocation_count_test.rb +196 -0
  78. data/test/acceptance/failure_messages_test.rb +64 -0
  79. data/test/acceptance/minitest_test.rb +130 -0
  80. data/test/acceptance/mocha_example_test.rb +98 -0
  81. data/test/acceptance/mocha_test_result_test.rb +84 -0
  82. data/test/acceptance/mock_test.rb +100 -0
  83. data/test/acceptance/mock_with_initializer_block_test.rb +51 -0
  84. data/test/acceptance/mocked_methods_dispatch_test.rb +78 -0
  85. data/test/acceptance/optional_parameters_test.rb +70 -0
  86. data/test/acceptance/parameter_matcher_test.rb +209 -0
  87. data/test/acceptance/partial_mocks_test.rb +47 -0
  88. data/test/acceptance/return_value_test.rb +52 -0
  89. data/test/acceptance/sequence_test.rb +186 -0
  90. data/test/acceptance/standalone_test.rb +139 -0
  91. data/test/acceptance/states_test.rb +70 -0
  92. data/test/acceptance/stub_any_instance_method_test.rb +195 -0
  93. data/test/acceptance/stub_class_method_test.rb +203 -0
  94. data/test/acceptance/stub_everything_test.rb +56 -0
  95. data/test/acceptance/stub_instance_method_test.rb +203 -0
  96. data/test/acceptance/stub_module_method_test.rb +163 -0
  97. data/test/acceptance/stub_test.rb +52 -0
  98. data/test/acceptance/stubba_example_test.rb +102 -0
  99. data/test/acceptance/stubba_test.rb +15 -0
  100. data/test/acceptance/stubba_test_result_test.rb +66 -0
  101. data/test/acceptance/stubbing_error_backtrace_test.rb +64 -0
  102. data/test/acceptance/stubbing_method_unnecessarily_test.rb +65 -0
  103. data/test/acceptance/stubbing_non_existent_any_instance_method_test.rb +130 -0
  104. data/test/acceptance/stubbing_non_existent_class_method_test.rb +157 -0
  105. data/test/acceptance/stubbing_non_existent_instance_method_test.rb +147 -0
  106. data/test/acceptance/stubbing_non_public_any_instance_method_test.rb +130 -0
  107. data/test/acceptance/stubbing_non_public_class_method_test.rb +163 -0
  108. data/test/acceptance/stubbing_non_public_instance_method_test.rb +143 -0
  109. data/test/acceptance/stubbing_on_non_mock_object_test.rb +64 -0
  110. data/test/deprecation_disabler.rb +15 -0
  111. data/test/execution_point.rb +36 -0
  112. data/test/method_definer.rb +24 -0
  113. data/test/simple_counter.rb +13 -0
  114. data/test/test_helper.rb +11 -0
  115. data/test/test_runner.rb +33 -0
  116. data/test/unit/any_instance_method_test.rb +126 -0
  117. data/test/unit/array_inspect_test.rb +16 -0
  118. data/test/unit/backtrace_filter_test.rb +19 -0
  119. data/test/unit/cardinality_test.rb +56 -0
  120. data/test/unit/central_test.rb +65 -0
  121. data/test/unit/change_state_side_effect_test.rb +41 -0
  122. data/test/unit/class_method_test.rb +237 -0
  123. data/test/unit/date_time_inspect_test.rb +21 -0
  124. data/test/unit/exception_raiser_test.rb +42 -0
  125. data/test/unit/expectation_list_test.rb +57 -0
  126. data/test/unit/expectation_test.rb +459 -0
  127. data/test/unit/hash_inspect_test.rb +16 -0
  128. data/test/unit/in_state_ordering_constraint_test.rb +43 -0
  129. data/test/unit/metaclass_test.rb +22 -0
  130. data/test/unit/method_matcher_test.rb +23 -0
  131. data/test/unit/mock_test.rb +295 -0
  132. data/test/unit/mockery_test.rb +149 -0
  133. data/test/unit/multiple_yields_test.rb +18 -0
  134. data/test/unit/no_yields_test.rb +18 -0
  135. data/test/unit/object_inspect_test.rb +37 -0
  136. data/test/unit/object_test.rb +82 -0
  137. data/test/unit/parameter_matchers/all_of_test.rb +26 -0
  138. data/test/unit/parameter_matchers/any_of_test.rb +26 -0
  139. data/test/unit/parameter_matchers/anything_test.rb +21 -0
  140. data/test/unit/parameter_matchers/equals_test.rb +25 -0
  141. data/test/unit/parameter_matchers/has_entries_test.rb +51 -0
  142. data/test/unit/parameter_matchers/has_entry_test.rb +62 -0
  143. data/test/unit/parameter_matchers/has_key_test.rb +36 -0
  144. data/test/unit/parameter_matchers/has_value_test.rb +37 -0
  145. data/test/unit/parameter_matchers/includes_test.rb +25 -0
  146. data/test/unit/parameter_matchers/instance_of_test.rb +25 -0
  147. data/test/unit/parameter_matchers/is_a_test.rb +25 -0
  148. data/test/unit/parameter_matchers/kind_of_test.rb +25 -0
  149. data/test/unit/parameter_matchers/not_test.rb +26 -0
  150. data/test/unit/parameter_matchers/regexp_matches_test.rb +25 -0
  151. data/test/unit/parameter_matchers/responds_with_test.rb +25 -0
  152. data/test/unit/parameter_matchers/stub_matcher.rb +27 -0
  153. data/test/unit/parameter_matchers/yaml_equivalent_test.rb +25 -0
  154. data/test/unit/parameters_matcher_test.rb +121 -0
  155. data/test/unit/return_values_test.rb +63 -0
  156. data/test/unit/sequence_test.rb +104 -0
  157. data/test/unit/single_return_value_test.rb +14 -0
  158. data/test/unit/single_yield_test.rb +18 -0
  159. data/test/unit/state_machine_test.rb +98 -0
  160. data/test/unit/string_inspect_test.rb +11 -0
  161. data/test/unit/yield_parameters_test.rb +93 -0
  162. metadata +226 -0
@@ -0,0 +1,166 @@
1
+ require 'mocha/parameter_matchers'
2
+ require 'mocha/mockery'
3
+ require 'mocha/sequence'
4
+
5
+ module Mocha # :nodoc:
6
+
7
+ # Methods added to Test::Unit::TestCase or equivalent.
8
+ module Standalone
9
+
10
+ include ParameterMatchers
11
+
12
+ # :call-seq: mock(name, &block) -> mock object
13
+ # mock(expected_methods = {}, &block) -> mock object
14
+ # mock(name, expected_methods = {}, &block) -> mock object
15
+ #
16
+ # Creates a mock object.
17
+ #
18
+ # +name+ is a +String+ identifier for the mock object.
19
+ #
20
+ # +expected_methods+ is a +Hash+ with expected method name symbols as keys and corresponding return values as values.
21
+ #
22
+ # Note that (contrary to expectations set up by #stub) these expectations <b>must</b> be fulfilled during the test.
23
+ # def test_product
24
+ # product = mock('ipod_product', :manufacturer => 'ipod', :price => 100)
25
+ # assert_equal 'ipod', product.manufacturer
26
+ # assert_equal 100, product.price
27
+ # # an error will be raised unless both Product#manufacturer and Product#price have been called
28
+ # end
29
+ #
30
+ # +block+ is an optional block to be evaluated against the mock object instance, giving an alernative way to set up expectations & stubs.
31
+ # def test_product
32
+ # product = mock('ipod_product') do
33
+ # expects(:manufacturer).returns('ipod')
34
+ # expects(:price).returns(100)
35
+ # end
36
+ # assert_equal 'ipod', product.manufacturer
37
+ # assert_equal 100, product.price
38
+ # # an error will be raised unless both Product#manufacturer and Product#price have been called
39
+ # end
40
+ def mock(*arguments, &block)
41
+ name = arguments.shift if arguments.first.is_a?(String)
42
+ expectations = arguments.shift || {}
43
+ mock = name ? Mockery.instance.named_mock(name, &block) : Mockery.instance.unnamed_mock(&block)
44
+ mock.expects(expectations)
45
+ mock
46
+ end
47
+
48
+ # :call-seq: stub(name, &block) -> mock object
49
+ # stub(stubbed_methods = {}, &block) -> mock object
50
+ # stub(name, stubbed_methods = {}, &block) -> mock object
51
+ #
52
+ # Creates a mock object.
53
+ #
54
+ # +name+ is a +String+ identifier for the mock object.
55
+ #
56
+ # +stubbed_methods+ is a +Hash+ with stubbed method name symbols as keys and corresponding return values as values.
57
+ # Note that (contrary to expectations set up by #mock) these expectations <b>need not</b> be fulfilled during the test.
58
+ # def test_product
59
+ # product = stub('ipod_product', :manufacturer => 'ipod', :price => 100)
60
+ # assert_equal 'ipod', product.manufacturer
61
+ # assert_equal 100, product.price
62
+ # # an error will not be raised even if Product#manufacturer and Product#price have not been called
63
+ # end
64
+ #
65
+ # +block+ is an optional block to be evaluated against the mock object instance, giving an alernative way to set up expectations & stubs.
66
+ # def test_product
67
+ # product = stub('ipod_product') do
68
+ # stubs(:manufacturer).returns('ipod')
69
+ # stubs(:price).returns(100)
70
+ # end
71
+ # assert_equal 'ipod', product.manufacturer
72
+ # assert_equal 100, product.price
73
+ # # an error will not be raised even if Product#manufacturer and Product#price have not been called
74
+ # end
75
+ def stub(*arguments, &block)
76
+ name = arguments.shift if arguments.first.is_a?(String)
77
+ expectations = arguments.shift || {}
78
+ stub = name ? Mockery.instance.named_mock(name, &block) : Mockery.instance.unnamed_mock(&block)
79
+ stub.stubs(expectations)
80
+ stub
81
+ end
82
+
83
+ # :call-seq: stub_everything(name, &block) -> mock object
84
+ # stub_everything(stubbed_methods = {}, &block) -> mock object
85
+ # stub_everything(name, stubbed_methods = {}, &block) -> mock object
86
+ #
87
+ # Creates a mock object that accepts calls to any method.
88
+ #
89
+ # By default it will return +nil+ for any method call.
90
+ #
91
+ # +block+ is a block to be evaluated against the mock object instance, giving an alernative way to set up expectations & stubs.
92
+ #
93
+ # +name+ and +stubbed_methods+ work in the same way as for #stub.
94
+ # def test_product
95
+ # product = stub_everything('ipod_product', :price => 100)
96
+ # assert_nil product.manufacturer
97
+ # assert_nil product.any_old_method
98
+ # assert_equal 100, product.price
99
+ # end
100
+ def stub_everything(*arguments, &block)
101
+ name = arguments.shift if arguments.first.is_a?(String)
102
+ expectations = arguments.shift || {}
103
+ stub = name ? Mockery.instance.named_mock(name, &block) : Mockery.instance.unnamed_mock(&block)
104
+ stub.stub_everything
105
+ stub.stubs(expectations)
106
+ stub
107
+ end
108
+
109
+ # :call-seq: sequence(name) -> sequence
110
+ #
111
+ # Returns a new sequence that is used to constrain the order in which expectations can occur.
112
+ #
113
+ # Specify that an expected invocation must occur in within a named +sequence+ by using Expectation#in_sequence.
114
+ #
115
+ # See also Expectation#in_sequence.
116
+ # breakfast = sequence('breakfast')
117
+ #
118
+ # egg = mock('egg')
119
+ # egg.expects(:crack).in_sequence(breakfast)
120
+ # egg.expects(:fry).in_sequence(breakfast)
121
+ # egg.expects(:eat).in_sequence(breakfast)
122
+ def sequence(name)
123
+ Sequence.new(name)
124
+ end
125
+
126
+ # :call-seq: states(name) -> state_machine
127
+ #
128
+ # Returns a new +state_machine+ that is used to constrain the order in which expectations can occur.
129
+ #
130
+ # Specify the initial +state+ of the +state_machine+ by using StateMachine#starts_as.
131
+ #
132
+ # Specify that an expected invocation should change the +state+ of the +state_machine+ by using Expectation#then.
133
+ #
134
+ # Specify that an expected invocation should be constrained to occur within a particular +state+ by using Expectation#when.
135
+ #
136
+ # A test can contain multiple +state_machines+.
137
+ #
138
+ # See also Expectation#then, Expectation#when and StateMachine.
139
+ # power = states('power').starts_as('off')
140
+ #
141
+ # radio = mock('radio')
142
+ # radio.expects(:switch_on).then(power.is('on'))
143
+ # radio.expects(:select_channel).with('BBC Radio 4').when(power.is('on'))
144
+ # radio.expects(:adjust_volume).with(+5).when(power.is('on'))
145
+ # radio.expects(:select_channel).with('BBC World Service').when(power.is('on'))
146
+ # radio.expects(:adjust_volume).with(-5).when(power.is('on'))
147
+ # radio.expects(:switch_off).then(power.is('off'))
148
+ def states(name)
149
+ Mockery.instance.new_state_machine(name)
150
+ end
151
+
152
+ def mocha_setup # :nodoc:
153
+ end
154
+
155
+ def mocha_verify(assertion_counter = nil) # :nodoc:
156
+ Mockery.instance.verify(assertion_counter)
157
+ end
158
+
159
+ def mocha_teardown # :nodoc:
160
+ Mockery.instance.teardown
161
+ Mockery.reset_instance
162
+ end
163
+
164
+ end
165
+
166
+ end
@@ -0,0 +1,91 @@
1
+ module Mocha # :nodoc:
2
+
3
+ # A state machine that is used to constrain the order of invocations.
4
+ # An invocation can be constrained to occur when a state is, or is_not, active.
5
+ class StateMachine
6
+
7
+ class State # :nodoc:
8
+
9
+ def initialize(state_machine, state)
10
+ @state_machine, @state = state_machine, state
11
+ end
12
+
13
+ def activate
14
+ @state_machine.current_state = @state
15
+ end
16
+
17
+ def active?
18
+ @state_machine.current_state == @state
19
+ end
20
+
21
+ def mocha_inspect
22
+ "#{@state_machine.name} is #{@state.mocha_inspect}"
23
+ end
24
+
25
+ end
26
+
27
+ class StatePredicate # :nodoc:
28
+
29
+ def initialize(state_machine, state)
30
+ @state_machine, @state = state_machine, state
31
+ end
32
+
33
+ def active?
34
+ @state_machine.current_state != @state
35
+ end
36
+
37
+ def mocha_inspect
38
+ "#{@state_machine.name} is not #{@state.mocha_inspect}"
39
+ end
40
+
41
+ end
42
+
43
+ attr_reader :name # :nodoc:
44
+
45
+ attr_accessor :current_state # :nodoc:
46
+
47
+ def initialize(name) # :nodoc:
48
+ @name = name
49
+ @current_state = nil
50
+ end
51
+
52
+ # :call-seq: starts_as(initial_state) -> state_machine
53
+ #
54
+ # Put the +state_machine+ into the +initial_state+.
55
+ def starts_as(initial_state)
56
+ become(initial_state)
57
+ self
58
+ end
59
+
60
+ # :call-seq: become(next_state)
61
+ #
62
+ # Put the +state_machine+ into the +next_state+.
63
+ def become(next_state)
64
+ @current_state = next_state
65
+ end
66
+
67
+ # :call-seq: is(state)
68
+ #
69
+ # Determines whether the +state_machine+ is in the specified +state+.
70
+ def is(state)
71
+ State.new(self, state)
72
+ end
73
+
74
+ # :call-seq: is_not(state)
75
+ #
76
+ # Determines whether the +state_machine+ is not in the specified +state+.
77
+ def is_not(state)
78
+ StatePredicate.new(self, state)
79
+ end
80
+
81
+ def mocha_inspect # :nodoc:
82
+ if @current_state
83
+ "#{@name} is #{@current_state.mocha_inspect}"
84
+ else
85
+ "#{@name} has no current state"
86
+ end
87
+ end
88
+
89
+ end
90
+
91
+ end
@@ -0,0 +1,16 @@
1
+ require 'mocha/backtrace_filter'
2
+
3
+ module Mocha # :nodoc:
4
+
5
+ # Exception raised when an action prevented by Configuration#prevent is attempted.
6
+ class StubbingError < StandardError
7
+
8
+ def initialize(message = nil, backtrace = []) # :nodoc:
9
+ super(message)
10
+ filter = BacktraceFilter.new
11
+ set_backtrace(filter.filtered(backtrace))
12
+ end
13
+
14
+ end
15
+
16
+ end
@@ -0,0 +1,103 @@
1
+ require 'mocha/expectation_error'
2
+
3
+ module Mocha
4
+
5
+ module TestCaseAdapter
6
+
7
+ class AssertionCounter
8
+
9
+ def initialize(test_result)
10
+ @test_result = test_result
11
+ end
12
+
13
+ def increment
14
+ @test_result.add_assertion
15
+ end
16
+
17
+ end
18
+
19
+ def self.included(base)
20
+ if RUBY_VERSION < '1.8.6'
21
+ base.class_eval do
22
+
23
+ alias_method :run_before_mocha_test_case_adapter, :run
24
+
25
+ def run(result)
26
+ assertion_counter = AssertionCounter.new(result)
27
+ yield(Test::Unit::TestCase::STARTED, name)
28
+ @_result = result
29
+ begin
30
+ begin
31
+ setup
32
+ __send__(@method_name)
33
+ mocha_verify(assertion_counter)
34
+ rescue Mocha::ExpectationError => e
35
+ add_failure(e.message, e.backtrace)
36
+ rescue Test::Unit::AssertionFailedError => e
37
+ add_failure(e.message, e.backtrace)
38
+ rescue StandardError, ScriptError
39
+ add_error($!)
40
+ ensure
41
+ begin
42
+ teardown
43
+ rescue Test::Unit::AssertionFailedError => e
44
+ add_failure(e.message, e.backtrace)
45
+ rescue StandardError, ScriptError
46
+ add_error($!)
47
+ end
48
+ end
49
+ ensure
50
+ mocha_teardown
51
+ end
52
+ result.add_run
53
+ yield(Test::Unit::TestCase::FINISHED, name)
54
+ end
55
+
56
+ end
57
+ else
58
+ base.class_eval do
59
+
60
+ alias_method :run_before_mocha_test_case_adapter, :run
61
+
62
+ def run(result)
63
+ assertion_counter = AssertionCounter.new(result)
64
+ yield(Test::Unit::TestCase::STARTED, name)
65
+ @_result = result
66
+ begin
67
+ begin
68
+ setup
69
+ __send__(@method_name)
70
+ mocha_verify(assertion_counter)
71
+ rescue Mocha::ExpectationError => e
72
+ add_failure(e.message, e.backtrace)
73
+ rescue Test::Unit::AssertionFailedError => e
74
+ add_failure(e.message, e.backtrace)
75
+ rescue Exception
76
+ raise if Test::Unit::TestCase::PASSTHROUGH_EXCEPTIONS.include? $!.class
77
+ add_error($!)
78
+ ensure
79
+ begin
80
+ teardown
81
+ rescue Test::Unit::AssertionFailedError => e
82
+ add_failure(e.message, e.backtrace)
83
+ rescue Exception
84
+ raise if Test::Unit::TestCase::PASSTHROUGH_EXCEPTIONS.include? $!.class
85
+ add_error($!)
86
+ end
87
+ end
88
+ ensure
89
+ mocha_teardown
90
+ end
91
+ result.add_run
92
+ yield(Test::Unit::TestCase::FINISHED, name)
93
+ end
94
+
95
+ end
96
+
97
+ end
98
+
99
+ end
100
+
101
+ end
102
+
103
+ end
@@ -0,0 +1,18 @@
1
+ module Mocha # :nodoc:
2
+
3
+ class UnexpectedInvocation
4
+
5
+ def initialize(mock, symbol, *arguments)
6
+ @mock = mock
7
+ @method_matcher = MethodMatcher.new(symbol)
8
+ @parameters_matcher = ParametersMatcher.new(arguments)
9
+ end
10
+
11
+ def to_s
12
+ method_signature = "#{@mock.mocha_inspect}.#{@method_matcher.mocha_inspect}#{@parameters_matcher.mocha_inspect}"
13
+ "unexpected invocation: #{method_signature}\n"
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -0,0 +1,31 @@
1
+ require 'mocha/no_yields'
2
+ require 'mocha/single_yield'
3
+ require 'mocha/multiple_yields'
4
+
5
+ module Mocha # :nodoc:
6
+
7
+ class YieldParameters # :nodoc:
8
+
9
+ def initialize
10
+ @parameter_groups = []
11
+ end
12
+
13
+ def next_invocation
14
+ case @parameter_groups.length
15
+ when 0 then NoYields.new
16
+ when 1 then @parameter_groups.first
17
+ else @parameter_groups.shift
18
+ end
19
+ end
20
+
21
+ def add(*parameters)
22
+ @parameter_groups << SingleYield.new(*parameters)
23
+ end
24
+
25
+ def multiple_add(*parameter_groups)
26
+ @parameter_groups << MultipleYields.new(*parameter_groups)
27
+ end
28
+
29
+ end
30
+
31
+ end
data/lib/mocha.rb ADDED
@@ -0,0 +1,47 @@
1
+ require 'mocha_standalone'
2
+ require 'mocha/configuration'
3
+
4
+ if RUBY_VERSION < '1.9'
5
+ begin
6
+ require 'rubygems'
7
+ begin
8
+ gem 'minitest', '>=1.3'
9
+ require 'minitest/unit'
10
+ rescue Gem::LoadError
11
+ # Compatible version of MiniTest gem not available
12
+ end
13
+ rescue LoadError
14
+ # RubyGems not available
15
+ end
16
+ else
17
+ begin
18
+ require 'minitest/unit'
19
+ rescue LoadError
20
+ # MiniTest not available
21
+ end
22
+ end
23
+
24
+ if defined?(MiniTest)
25
+ require 'mocha/mini_test_adapter'
26
+
27
+ module MiniTest
28
+ class Unit
29
+ class TestCase
30
+ include Mocha::Standalone
31
+ include Mocha::MiniTestCaseAdapter
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ require 'mocha/test_case_adapter'
38
+ require 'test/unit/testcase'
39
+
40
+ module Test
41
+ module Unit
42
+ class TestCase
43
+ include Mocha::Standalone
44
+ include Mocha::TestCaseAdapter
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,2 @@
1
+ require 'mocha/standalone'
2
+ require 'mocha/object'
data/lib/stubba.rb ADDED
@@ -0,0 +1,4 @@
1
+ # for backwards compatibility
2
+ require 'mocha'
3
+ require 'mocha/deprecation'
4
+ Mocha::Deprecation.warning "require 'stubba' is no longer needed and stubba.rb will soon be removed"
@@ -0,0 +1,38 @@
1
+ require File.join(File.dirname(__FILE__), "..", "test_helper")
2
+ require 'test_runner'
3
+ require 'mocha/configuration'
4
+
5
+ module AcceptanceTest
6
+
7
+ class FakeLogger
8
+
9
+ attr_reader :warnings
10
+
11
+ def initialize
12
+ @warnings = []
13
+ end
14
+
15
+ def warn(message)
16
+ @warnings << message
17
+ end
18
+
19
+ end
20
+
21
+ attr_reader :logger
22
+
23
+ include TestRunner
24
+
25
+ def setup_acceptance_test
26
+ Mocha::Configuration.reset_configuration
27
+ @logger = FakeLogger.new
28
+ mockery = Mocha::Mockery.instance
29
+ @original_logger = mockery.logger
30
+ mockery.logger = @logger
31
+ end
32
+
33
+ def teardown_acceptance_test
34
+ Mocha::Configuration.reset_configuration
35
+ Mocha::Mockery.instance.logger = @original_logger
36
+ end
37
+
38
+ end
@@ -0,0 +1,43 @@
1
+ require File.join(File.dirname(__FILE__), "acceptance_test_helper")
2
+ require 'mocha'
3
+
4
+ class Bug18914Test < 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
+ class AlwaysEql
17
+
18
+ def my_method
19
+ true
20
+ end
21
+
22
+ def ==(o)
23
+ true
24
+ end
25
+
26
+ def eql?(o)
27
+ true
28
+ end
29
+
30
+ end
31
+
32
+ def test_should_not_allow_stubbing_of_non_mock_instance_disrupted_by_legitimate_overriding_of_eql_method
33
+
34
+ always_eql_1 = AlwaysEql.new
35
+ always_eql_1.stubs(:my_method).returns(false)
36
+
37
+ always_eql_2 = AlwaysEql.new
38
+ always_eql_2.stubs(:my_method).returns(false)
39
+
40
+ assert_equal false, always_eql_2.my_method
41
+ end
42
+
43
+ end
@@ -0,0 +1,34 @@
1
+ require File.join(File.dirname(__FILE__), "acceptance_test_helper")
2
+ require 'mocha'
3
+
4
+ class Bug21465Test < 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_allow_expected_method_name_to_be_a_string
17
+ test_result = run_test do
18
+ mock = mock()
19
+ mock.expects('wibble')
20
+ mock.wibble
21
+ end
22
+ assert_passed(test_result)
23
+ end
24
+
25
+ def test_should_allow_stubbed_method_name_to_be_a_string
26
+ test_result = run_test do
27
+ mock = mock()
28
+ mock.stubs('wibble')
29
+ mock.wibble
30
+ end
31
+ assert_passed(test_result)
32
+ end
33
+
34
+ end
@@ -0,0 +1,25 @@
1
+ require File.join(File.dirname(__FILE__), "acceptance_test_helper")
2
+ require 'mocha'
3
+
4
+ class Bug21563Test < 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_allow_stubbing_of_verified_method
17
+ test_result = run_test do
18
+ object = Object.new
19
+ object.stubs(:verified?).returns(false)
20
+ assert !object.verified?
21
+ end
22
+ assert_passed(test_result)
23
+ end
24
+
25
+ end