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.
- data/COPYING +3 -0
- data/MIT-LICENSE +7 -0
- data/README +37 -0
- data/RELEASE +269 -0
- data/Rakefile +217 -0
- data/examples/misc.rb +43 -0
- data/examples/mocha.rb +25 -0
- data/examples/stubba.rb +64 -0
- data/lib/mocha/any_instance_method.rb +55 -0
- data/lib/mocha/api.rb +232 -0
- data/lib/mocha/argument_iterator.rb +21 -0
- data/lib/mocha/backtrace_filter.rb +17 -0
- data/lib/mocha/cardinality.rb +95 -0
- data/lib/mocha/central.rb +27 -0
- data/lib/mocha/change_state_side_effect.rb +19 -0
- data/lib/mocha/class_method.rb +87 -0
- data/lib/mocha/configuration.rb +60 -0
- data/lib/mocha/deprecation.rb +22 -0
- data/lib/mocha/exception_raiser.rb +17 -0
- data/lib/mocha/expectation.rb +484 -0
- data/lib/mocha/expectation_error.rb +15 -0
- data/lib/mocha/expectation_list.rb +50 -0
- data/lib/mocha/in_state_ordering_constraint.rb +19 -0
- data/lib/mocha/inspect.rb +67 -0
- data/lib/mocha/instance_method.rb +16 -0
- data/lib/mocha/integration/bacon/assertion_counter.rb +23 -0
- data/lib/mocha/integration/bacon/version_11_and_above.rb +34 -0
- data/lib/mocha/integration/bacon.rb +1 -0
- data/lib/mocha/integration/mini_test/assertion_counter.rb +23 -0
- data/lib/mocha/integration/mini_test/version_131_and_above.rb +49 -0
- data/lib/mocha/integration/mini_test.rb +1 -0
- data/lib/mocha/integration/test_unit/assertion_counter.rb +23 -0
- data/lib/mocha/integration/test_unit/gem_version_200.rb +49 -0
- data/lib/mocha/integration/test_unit/gem_version_201_and_above.rb +49 -0
- data/lib/mocha/integration/test_unit/ruby_version_185_and_below.rb +48 -0
- data/lib/mocha/integration/test_unit/ruby_version_186_and_above.rb +50 -0
- data/lib/mocha/integration/test_unit.rb +4 -0
- data/lib/mocha/invocation.rb +10 -0
- data/lib/mocha/is_a.rb +9 -0
- data/lib/mocha/logger.rb +15 -0
- data/lib/mocha/metaclass.rb +13 -0
- data/lib/mocha/method_matcher.rb +21 -0
- data/lib/mocha/mock.rb +200 -0
- data/lib/mocha/mockery.rb +189 -0
- data/lib/mocha/module_method.rb +16 -0
- data/lib/mocha/multiple_yields.rb +20 -0
- data/lib/mocha/names.rb +53 -0
- data/lib/mocha/no_yields.rb +11 -0
- data/lib/mocha/object.rb +187 -0
- data/lib/mocha/parameter_matchers/all_of.rb +42 -0
- data/lib/mocha/parameter_matchers/any_of.rb +47 -0
- data/lib/mocha/parameter_matchers/any_parameters.rb +40 -0
- data/lib/mocha/parameter_matchers/anything.rb +33 -0
- data/lib/mocha/parameter_matchers/base.rb +15 -0
- data/lib/mocha/parameter_matchers/equals.rb +42 -0
- data/lib/mocha/parameter_matchers/has_entries.rb +45 -0
- data/lib/mocha/parameter_matchers/has_entry.rb +57 -0
- data/lib/mocha/parameter_matchers/has_key.rb +42 -0
- data/lib/mocha/parameter_matchers/has_value.rb +42 -0
- data/lib/mocha/parameter_matchers/includes.rb +40 -0
- data/lib/mocha/parameter_matchers/instance_of.rb +42 -0
- data/lib/mocha/parameter_matchers/is_a.rb +42 -0
- data/lib/mocha/parameter_matchers/kind_of.rb +42 -0
- data/lib/mocha/parameter_matchers/not.rb +42 -0
- data/lib/mocha/parameter_matchers/object.rb +15 -0
- data/lib/mocha/parameter_matchers/optionally.rb +55 -0
- data/lib/mocha/parameter_matchers/regexp_matches.rb +43 -0
- data/lib/mocha/parameter_matchers/responds_with.rb +43 -0
- data/lib/mocha/parameter_matchers/yaml_equivalent.rb +43 -0
- data/lib/mocha/parameter_matchers.rb +27 -0
- data/lib/mocha/parameters_matcher.rb +37 -0
- data/lib/mocha/pretty_parameters.rb +28 -0
- data/lib/mocha/return_values.rb +31 -0
- data/lib/mocha/sequence.rb +42 -0
- data/lib/mocha/single_return_value.rb +17 -0
- data/lib/mocha/single_yield.rb +18 -0
- data/lib/mocha/state_machine.rb +91 -0
- data/lib/mocha/stubbing_error.rb +16 -0
- data/lib/mocha/unexpected_invocation.rb +18 -0
- data/lib/mocha/yield_parameters.rb +31 -0
- data/lib/mocha.rb +69 -0
- data/lib/mocha_standalone.rb +2 -0
- data/lib/stubba.rb +4 -0
- data/test/acceptance/acceptance_test_helper.rb +38 -0
- data/test/acceptance/api_test.rb +139 -0
- data/test/acceptance/bacon_spec.rb +67 -0
- data/test/acceptance/bacon_test.rb +110 -0
- data/test/acceptance/bug_18914_test.rb +43 -0
- data/test/acceptance/bug_21465_test.rb +34 -0
- data/test/acceptance/bug_21563_test.rb +25 -0
- data/test/acceptance/expected_invocation_count_test.rb +196 -0
- data/test/acceptance/failure_messages_test.rb +64 -0
- data/test/acceptance/minitest_test.rb +146 -0
- data/test/acceptance/mocha_example_test.rb +98 -0
- data/test/acceptance/mocha_test_result_test.rb +84 -0
- data/test/acceptance/mock_test.rb +100 -0
- data/test/acceptance/mock_with_initializer_block_test.rb +51 -0
- data/test/acceptance/mocked_methods_dispatch_test.rb +78 -0
- data/test/acceptance/optional_parameters_test.rb +70 -0
- data/test/acceptance/parameter_matcher_test.rb +209 -0
- data/test/acceptance/partial_mocks_test.rb +47 -0
- data/test/acceptance/return_value_test.rb +52 -0
- data/test/acceptance/sequence_test.rb +186 -0
- data/test/acceptance/spy_test.rb +109 -0
- data/test/acceptance/states_test.rb +70 -0
- data/test/acceptance/stub_any_instance_method_test.rb +195 -0
- data/test/acceptance/stub_class_method_test.rb +203 -0
- data/test/acceptance/stub_everything_test.rb +56 -0
- data/test/acceptance/stub_instance_method_test.rb +203 -0
- data/test/acceptance/stub_module_method_test.rb +163 -0
- data/test/acceptance/stub_test.rb +52 -0
- data/test/acceptance/stubba_example_test.rb +102 -0
- data/test/acceptance/stubba_test.rb +15 -0
- data/test/acceptance/stubba_test_result_test.rb +66 -0
- data/test/acceptance/stubbing_error_backtrace_test.rb +64 -0
- data/test/acceptance/stubbing_method_unnecessarily_test.rb +65 -0
- data/test/acceptance/stubbing_non_existent_any_instance_method_test.rb +130 -0
- data/test/acceptance/stubbing_non_existent_class_method_test.rb +157 -0
- data/test/acceptance/stubbing_non_existent_instance_method_test.rb +147 -0
- data/test/acceptance/stubbing_non_public_any_instance_method_test.rb +130 -0
- data/test/acceptance/stubbing_non_public_class_method_test.rb +163 -0
- data/test/acceptance/stubbing_non_public_instance_method_test.rb +143 -0
- data/test/acceptance/stubbing_on_non_mock_object_test.rb +64 -0
- data/test/deprecation_disabler.rb +15 -0
- data/test/execution_point.rb +36 -0
- data/test/matcher_helpers.rb +5 -0
- data/test/method_definer.rb +24 -0
- data/test/simple_counter.rb +13 -0
- data/test/test_helper.rb +16 -0
- data/test/test_runner.rb +33 -0
- data/test/unit/any_instance_method_test.rb +126 -0
- data/test/unit/array_inspect_test.rb +16 -0
- data/test/unit/assert_received_test.rb +136 -0
- data/test/unit/backtrace_filter_test.rb +19 -0
- data/test/unit/cardinality_test.rb +56 -0
- data/test/unit/central_test.rb +65 -0
- data/test/unit/change_state_side_effect_test.rb +41 -0
- data/test/unit/class_method_test.rb +237 -0
- data/test/unit/date_time_inspect_test.rb +21 -0
- data/test/unit/exception_raiser_test.rb +42 -0
- data/test/unit/expectation_list_test.rb +57 -0
- data/test/unit/expectation_test.rb +526 -0
- data/test/unit/hash_inspect_test.rb +16 -0
- data/test/unit/have_received_test.rb +137 -0
- data/test/unit/in_state_ordering_constraint_test.rb +43 -0
- data/test/unit/invocation_test.rb +17 -0
- data/test/unit/metaclass_test.rb +22 -0
- data/test/unit/method_matcher_test.rb +23 -0
- data/test/unit/mock_test.rb +329 -0
- data/test/unit/mockery_test.rb +163 -0
- data/test/unit/multiple_yields_test.rb +18 -0
- data/test/unit/no_yields_test.rb +18 -0
- data/test/unit/object_inspect_test.rb +37 -0
- data/test/unit/object_test.rb +82 -0
- data/test/unit/parameter_matchers/all_of_test.rb +26 -0
- data/test/unit/parameter_matchers/any_of_test.rb +26 -0
- data/test/unit/parameter_matchers/anything_test.rb +21 -0
- data/test/unit/parameter_matchers/equals_test.rb +25 -0
- data/test/unit/parameter_matchers/has_entries_test.rb +51 -0
- data/test/unit/parameter_matchers/has_entry_test.rb +82 -0
- data/test/unit/parameter_matchers/has_key_test.rb +36 -0
- data/test/unit/parameter_matchers/has_value_test.rb +37 -0
- data/test/unit/parameter_matchers/includes_test.rb +25 -0
- data/test/unit/parameter_matchers/instance_of_test.rb +25 -0
- data/test/unit/parameter_matchers/is_a_test.rb +25 -0
- data/test/unit/parameter_matchers/kind_of_test.rb +25 -0
- data/test/unit/parameter_matchers/not_test.rb +26 -0
- data/test/unit/parameter_matchers/regexp_matches_test.rb +25 -0
- data/test/unit/parameter_matchers/responds_with_test.rb +25 -0
- data/test/unit/parameter_matchers/stub_matcher.rb +27 -0
- data/test/unit/parameter_matchers/yaml_equivalent_test.rb +25 -0
- data/test/unit/parameters_matcher_test.rb +121 -0
- data/test/unit/return_values_test.rb +63 -0
- data/test/unit/sequence_test.rb +104 -0
- data/test/unit/single_return_value_test.rb +14 -0
- data/test/unit/single_yield_test.rb +18 -0
- data/test/unit/state_machine_test.rb +98 -0
- data/test/unit/string_inspect_test.rb +11 -0
- data/test/unit/yield_parameters_test.rb +93 -0
- metadata +245 -0
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'mocha/parameter_matchers/base'
|
2
|
+
require 'mocha/parameter_matchers/all_of'
|
3
|
+
require 'mocha/parameter_matchers/has_entry'
|
4
|
+
|
5
|
+
module Mocha
|
6
|
+
|
7
|
+
module ParameterMatchers
|
8
|
+
|
9
|
+
# :call-seq: has_entries(entries) -> parameter_matcher
|
10
|
+
#
|
11
|
+
# Matches +Hash+ containing all +entries+.
|
12
|
+
# object = mock()
|
13
|
+
# object.expects(:method_1).with(has_entries('key_1' => 1, 'key_2' => 2))
|
14
|
+
# object.method_1('key_1' => 1, 'key_2' => 2, 'key_3' => 3)
|
15
|
+
# # no error raised
|
16
|
+
#
|
17
|
+
# object = mock()
|
18
|
+
# object.expects(:method_1).with(has_entries('key_1' => 1, 'key_2' => 2))
|
19
|
+
# object.method_1('key_1' => 1, 'key_2' => 99)
|
20
|
+
# # error raised, because method_1 was not called with Hash containing entries: 'key_1' => 1, 'key_2' => 2
|
21
|
+
def has_entries(entries)
|
22
|
+
HasEntries.new(entries)
|
23
|
+
end
|
24
|
+
|
25
|
+
class HasEntries < Base # :nodoc:
|
26
|
+
|
27
|
+
def initialize(entries)
|
28
|
+
@entries = entries
|
29
|
+
end
|
30
|
+
|
31
|
+
def matches?(available_parameters)
|
32
|
+
parameter = available_parameters.shift
|
33
|
+
has_entry_matchers = @entries.map { |key, value| HasEntry.new(key, value) }
|
34
|
+
AllOf.new(*has_entry_matchers).matches?([parameter])
|
35
|
+
end
|
36
|
+
|
37
|
+
def mocha_inspect
|
38
|
+
"has_entries(#{@entries.mocha_inspect})"
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'mocha/parameter_matchers/base'
|
2
|
+
|
3
|
+
module Mocha
|
4
|
+
|
5
|
+
module ParameterMatchers
|
6
|
+
|
7
|
+
# :call-seq: has_entry(key, value) -> parameter_matcher
|
8
|
+
# has_entry(key => value) -> parameter_matcher
|
9
|
+
#
|
10
|
+
# Matches +Hash+ containing entry with +key+ and +value+.
|
11
|
+
# object = mock()
|
12
|
+
# object.expects(:method_1).with(has_entry('key_1', 1))
|
13
|
+
# object.method_1('key_1' => 1, 'key_2' => 2)
|
14
|
+
# # no error raised
|
15
|
+
#
|
16
|
+
# object = mock()
|
17
|
+
# object.expects(:method_1).with(has_entry('key_1' => 1))
|
18
|
+
# object.method_1('key_1' => 1, 'key_2' => 2)
|
19
|
+
# # no error raised
|
20
|
+
#
|
21
|
+
# object = mock()
|
22
|
+
# object.expects(:method_1).with(has_entry('key_1', 1))
|
23
|
+
# object.method_1('key_1' => 2, 'key_2' => 1)
|
24
|
+
# # error raised, because method_1 was not called with Hash containing entry: 'key_1' => 1
|
25
|
+
#
|
26
|
+
# object = mock()
|
27
|
+
# object.expects(:method_1).with(has_entry('key_1' => 1))
|
28
|
+
# object.method_1('key_1' => 2, 'key_2' => 1)
|
29
|
+
# # error raised, because method_1 was not called with Hash containing entry: 'key_1' => 1
|
30
|
+
def has_entry(*options)
|
31
|
+
key, value = options.shift, options.shift
|
32
|
+
key, value = key.to_a[0][0..1] if key.is_a?(Hash)
|
33
|
+
HasEntry.new(key, value)
|
34
|
+
end
|
35
|
+
|
36
|
+
class HasEntry < Base # :nodoc:
|
37
|
+
|
38
|
+
def initialize(key, value)
|
39
|
+
@key, @value = key, value
|
40
|
+
end
|
41
|
+
|
42
|
+
def matches?(available_parameters)
|
43
|
+
parameter = available_parameters.shift
|
44
|
+
return false unless parameter.respond_to?(:keys) && parameter.respond_to?(:[])
|
45
|
+
matching_keys = parameter.keys.select { |key| @key.to_matcher.matches?([key]) }
|
46
|
+
matching_keys.any? { |key| @value.to_matcher.matches?([parameter[key]]) }
|
47
|
+
end
|
48
|
+
|
49
|
+
def mocha_inspect
|
50
|
+
"has_entry(#{@key.mocha_inspect} => #{@value.mocha_inspect})"
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'mocha/parameter_matchers/base'
|
2
|
+
|
3
|
+
module Mocha
|
4
|
+
|
5
|
+
module ParameterMatchers
|
6
|
+
|
7
|
+
# :call-seq: has_key(key) -> parameter_matcher
|
8
|
+
#
|
9
|
+
# Matches +Hash+ containing +key+.
|
10
|
+
# object = mock()
|
11
|
+
# object.expects(:method_1).with(has_key('key_1'))
|
12
|
+
# object.method_1('key_1' => 1, 'key_2' => 2)
|
13
|
+
# # no error raised
|
14
|
+
#
|
15
|
+
# object = mock()
|
16
|
+
# object.expects(:method_1).with(has_key('key_1'))
|
17
|
+
# object.method_1('key_2' => 2)
|
18
|
+
# # error raised, because method_1 was not called with Hash containing key: 'key_1'
|
19
|
+
def has_key(key)
|
20
|
+
HasKey.new(key)
|
21
|
+
end
|
22
|
+
|
23
|
+
class HasKey < Base # :nodoc:
|
24
|
+
|
25
|
+
def initialize(key)
|
26
|
+
@key = key
|
27
|
+
end
|
28
|
+
|
29
|
+
def matches?(available_parameters)
|
30
|
+
parameter = available_parameters.shift
|
31
|
+
parameter.keys.any? { |key| @key.to_matcher.matches?([key]) }
|
32
|
+
end
|
33
|
+
|
34
|
+
def mocha_inspect
|
35
|
+
"has_key(#{@key.mocha_inspect})"
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'mocha/parameter_matchers/base'
|
2
|
+
|
3
|
+
module Mocha
|
4
|
+
|
5
|
+
module ParameterMatchers
|
6
|
+
|
7
|
+
# :call-seq: has_value(value) -> parameter_matcher
|
8
|
+
#
|
9
|
+
# Matches +Hash+ containing +value+.
|
10
|
+
# object = mock()
|
11
|
+
# object.expects(:method_1).with(has_value(1))
|
12
|
+
# object.method_1('key_1' => 1, 'key_2' => 2)
|
13
|
+
# # no error raised
|
14
|
+
#
|
15
|
+
# object = mock()
|
16
|
+
# object.expects(:method_1).with(has_value(1))
|
17
|
+
# object.method_1('key_2' => 2)
|
18
|
+
# # error raised, because method_1 was not called with Hash containing value: 1
|
19
|
+
def has_value(value)
|
20
|
+
HasValue.new(value)
|
21
|
+
end
|
22
|
+
|
23
|
+
class HasValue < Base # :nodoc:
|
24
|
+
|
25
|
+
def initialize(value)
|
26
|
+
@value = value
|
27
|
+
end
|
28
|
+
|
29
|
+
def matches?(available_parameters)
|
30
|
+
parameter = available_parameters.shift
|
31
|
+
parameter.values.any? { |value| @value.to_matcher.matches?([value]) }
|
32
|
+
end
|
33
|
+
|
34
|
+
def mocha_inspect
|
35
|
+
"has_value(#{@value.mocha_inspect})"
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'mocha/parameter_matchers/base'
|
2
|
+
|
3
|
+
module Mocha
|
4
|
+
|
5
|
+
module ParameterMatchers
|
6
|
+
|
7
|
+
# :call-seq: includes(item) -> parameter_matcher
|
8
|
+
#
|
9
|
+
# Matches any object that responds true to include?(item)
|
10
|
+
# object = mock()
|
11
|
+
# object.expects(:method_1).with(includes('foo'))
|
12
|
+
# object.method_1(['foo', 'bar'])
|
13
|
+
# # no error raised
|
14
|
+
#
|
15
|
+
# object.method_1(['baz'])
|
16
|
+
# # error raised, because ['baz'] does not include 'foo'.
|
17
|
+
def includes(item)
|
18
|
+
Includes.new(item)
|
19
|
+
end
|
20
|
+
|
21
|
+
class Includes < Base # :nodoc:
|
22
|
+
|
23
|
+
def initialize(item)
|
24
|
+
@item = item
|
25
|
+
end
|
26
|
+
|
27
|
+
def matches?(available_parameters)
|
28
|
+
parameter = available_parameters.shift
|
29
|
+
return parameter.include?(@item)
|
30
|
+
end
|
31
|
+
|
32
|
+
def mocha_inspect
|
33
|
+
"includes(#{@item.mocha_inspect})"
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'mocha/parameter_matchers/base'
|
2
|
+
|
3
|
+
module Mocha
|
4
|
+
|
5
|
+
module ParameterMatchers
|
6
|
+
|
7
|
+
# :call-seq: instance_of(klass) -> parameter_matcher
|
8
|
+
#
|
9
|
+
# Matches any object that is an instance of +klass+
|
10
|
+
# object = mock()
|
11
|
+
# object.expects(:method_1).with(instance_of(String))
|
12
|
+
# object.method_1('string')
|
13
|
+
# # no error raised
|
14
|
+
#
|
15
|
+
# object = mock()
|
16
|
+
# object.expects(:method_1).with(instance_of(String))
|
17
|
+
# object.method_1(99)
|
18
|
+
# # error raised, because method_1 was not called with an instance of String
|
19
|
+
def instance_of(klass)
|
20
|
+
InstanceOf.new(klass)
|
21
|
+
end
|
22
|
+
|
23
|
+
class InstanceOf < Base # :nodoc:
|
24
|
+
|
25
|
+
def initialize(klass)
|
26
|
+
@klass = klass
|
27
|
+
end
|
28
|
+
|
29
|
+
def matches?(available_parameters)
|
30
|
+
parameter = available_parameters.shift
|
31
|
+
parameter.instance_of?(@klass)
|
32
|
+
end
|
33
|
+
|
34
|
+
def mocha_inspect
|
35
|
+
"instance_of(#{@klass.mocha_inspect})"
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'mocha/parameter_matchers/base'
|
2
|
+
|
3
|
+
module Mocha
|
4
|
+
|
5
|
+
module ParameterMatchers
|
6
|
+
|
7
|
+
# :call-seq: is_a(klass) -> parameter_matcher
|
8
|
+
#
|
9
|
+
# Matches any object that is a +klass+
|
10
|
+
# object = mock()
|
11
|
+
# object.expects(:method_1).with(is_a(Integer))
|
12
|
+
# object.method_1(99)
|
13
|
+
# # no error raised
|
14
|
+
#
|
15
|
+
# object = mock()
|
16
|
+
# object.expects(:method_1).with(is_a(Integer))
|
17
|
+
# object.method_1('string')
|
18
|
+
# # error raised, because method_1 was not called with an Integer
|
19
|
+
def is_a(klass)
|
20
|
+
IsA.new(klass)
|
21
|
+
end
|
22
|
+
|
23
|
+
class IsA < Base # :nodoc:
|
24
|
+
|
25
|
+
def initialize(klass)
|
26
|
+
@klass = klass
|
27
|
+
end
|
28
|
+
|
29
|
+
def matches?(available_parameters)
|
30
|
+
parameter = available_parameters.shift
|
31
|
+
parameter.is_a?(@klass)
|
32
|
+
end
|
33
|
+
|
34
|
+
def mocha_inspect
|
35
|
+
"is_a(#{@klass.mocha_inspect})"
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'mocha/parameter_matchers/base'
|
2
|
+
|
3
|
+
module Mocha
|
4
|
+
|
5
|
+
module ParameterMatchers
|
6
|
+
|
7
|
+
# :call-seq: kind_of(klass) -> parameter_matcher
|
8
|
+
#
|
9
|
+
# Matches any object that is a kind of +klass+
|
10
|
+
# object = mock()
|
11
|
+
# object.expects(:method_1).with(kind_of(Integer))
|
12
|
+
# object.method_1(99)
|
13
|
+
# # no error raised
|
14
|
+
#
|
15
|
+
# object = mock()
|
16
|
+
# object.expects(:method_1).with(kind_of(Integer))
|
17
|
+
# object.method_1('string')
|
18
|
+
# # error raised, because method_1 was not called with a kind of Integer
|
19
|
+
def kind_of(klass)
|
20
|
+
KindOf.new(klass)
|
21
|
+
end
|
22
|
+
|
23
|
+
class KindOf < Base # :nodoc:
|
24
|
+
|
25
|
+
def initialize(klass)
|
26
|
+
@klass = klass
|
27
|
+
end
|
28
|
+
|
29
|
+
def matches?(available_parameters)
|
30
|
+
parameter = available_parameters.shift
|
31
|
+
parameter.kind_of?(@klass)
|
32
|
+
end
|
33
|
+
|
34
|
+
def mocha_inspect
|
35
|
+
"kind_of(#{@klass.mocha_inspect})"
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'mocha/parameter_matchers/base'
|
2
|
+
|
3
|
+
module Mocha
|
4
|
+
|
5
|
+
module ParameterMatchers
|
6
|
+
|
7
|
+
# :call-seq: Not(parameter_matcher) -> parameter_matcher
|
8
|
+
#
|
9
|
+
# Matches if +parameter_matcher+ does not match.
|
10
|
+
# object = mock()
|
11
|
+
# object.expects(:method_1).with(Not(includes(1)))
|
12
|
+
# object.method_1([0, 2, 3])
|
13
|
+
# # no error raised
|
14
|
+
#
|
15
|
+
# object = mock()
|
16
|
+
# object.expects(:method_1).with(Not(includes(1)))
|
17
|
+
# object.method_1([0, 1, 2, 3])
|
18
|
+
# # error raised, because method_1 was not called with object not including 1
|
19
|
+
def Not(matcher)
|
20
|
+
Not.new(matcher)
|
21
|
+
end
|
22
|
+
|
23
|
+
class Not < Base # :nodoc:
|
24
|
+
|
25
|
+
def initialize(matcher)
|
26
|
+
@matcher = matcher
|
27
|
+
end
|
28
|
+
|
29
|
+
def matches?(available_parameters)
|
30
|
+
parameter = available_parameters.shift
|
31
|
+
!@matcher.matches?([parameter])
|
32
|
+
end
|
33
|
+
|
34
|
+
def mocha_inspect
|
35
|
+
"Not(#{@matcher.mocha_inspect})"
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Mocha
|
2
|
+
|
3
|
+
module ParameterMatchers
|
4
|
+
|
5
|
+
# :call-seq: optionally(*parameter_matchers) -> parameter_matcher
|
6
|
+
#
|
7
|
+
# Matches optional parameters if available.
|
8
|
+
# object = mock()
|
9
|
+
# object.expects(:method_1).with(1, 2, optionally(3, 4))
|
10
|
+
# object.method_1(1, 2)
|
11
|
+
# # no error raised
|
12
|
+
#
|
13
|
+
# object = mock()
|
14
|
+
# object.expects(:method_1).with(1, 2, optionally(3, 4))
|
15
|
+
# object.method_1(1, 2, 3)
|
16
|
+
# # no error raised
|
17
|
+
#
|
18
|
+
# object = mock()
|
19
|
+
# object.expects(:method_1).with(1, 2, optionally(3, 4))
|
20
|
+
# object.method_1(1, 2, 3, 4)
|
21
|
+
# # no error raised
|
22
|
+
#
|
23
|
+
# object = mock()
|
24
|
+
# object.expects(:method_1).with(1, 2, optionally(3, 4))
|
25
|
+
# object.method_1(1, 2, 3, 5)
|
26
|
+
# # error raised, because optional parameters did not match
|
27
|
+
def optionally(*matchers)
|
28
|
+
Optionally.new(*matchers)
|
29
|
+
end
|
30
|
+
|
31
|
+
class Optionally < Base # :nodoc:
|
32
|
+
|
33
|
+
def initialize(*parameters)
|
34
|
+
@matchers = parameters.map { |parameter| parameter.to_matcher }
|
35
|
+
end
|
36
|
+
|
37
|
+
def matches?(available_parameters)
|
38
|
+
index = 0
|
39
|
+
while (available_parameters.length > 0) && (index < @matchers.length) do
|
40
|
+
matcher = @matchers[index]
|
41
|
+
return false unless matcher.matches?(available_parameters)
|
42
|
+
index += 1
|
43
|
+
end
|
44
|
+
return true
|
45
|
+
end
|
46
|
+
|
47
|
+
def mocha_inspect
|
48
|
+
"optionally(#{@matchers.map { |matcher| matcher.mocha_inspect }.join(", ") })"
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'mocha/parameter_matchers/base'
|
2
|
+
|
3
|
+
module Mocha
|
4
|
+
|
5
|
+
module ParameterMatchers
|
6
|
+
|
7
|
+
# :call-seq: regexp_matches(regular_expression) -> parameter_matcher
|
8
|
+
#
|
9
|
+
# Matches any object that matches +regular_expression+.
|
10
|
+
# object = mock()
|
11
|
+
# object.expects(:method_1).with(regexp_matches(/e/))
|
12
|
+
# object.method_1('hello')
|
13
|
+
# # no error raised
|
14
|
+
#
|
15
|
+
# object = mock()
|
16
|
+
# object.expects(:method_1).with(regexp_matches(/a/))
|
17
|
+
# object.method_1('hello')
|
18
|
+
# # error raised, because method_1 was not called with a parameter that matched the
|
19
|
+
# # regular expression
|
20
|
+
def regexp_matches(regexp)
|
21
|
+
RegexpMatches.new(regexp)
|
22
|
+
end
|
23
|
+
|
24
|
+
class RegexpMatches < Base # :nodoc:
|
25
|
+
|
26
|
+
def initialize(regexp)
|
27
|
+
@regexp = regexp
|
28
|
+
end
|
29
|
+
|
30
|
+
def matches?(available_parameters)
|
31
|
+
parameter = available_parameters.shift
|
32
|
+
parameter =~ @regexp
|
33
|
+
end
|
34
|
+
|
35
|
+
def mocha_inspect
|
36
|
+
"regexp_matches(#{@regexp.mocha_inspect})"
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'mocha/parameter_matchers/base'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module Mocha
|
5
|
+
|
6
|
+
module ParameterMatchers
|
7
|
+
|
8
|
+
# :call-seq: responds_with(message, result) -> parameter_matcher
|
9
|
+
#
|
10
|
+
# Matches any object that responds to +message+ with +result+. To put it another way, it tests the quack, not the duck.
|
11
|
+
# object = mock()
|
12
|
+
# object.expects(:method_1).with(responds_with(:upcase, "FOO"))
|
13
|
+
# object.method_1("foo")
|
14
|
+
# # no error raised, because "foo".upcase == "FOO"
|
15
|
+
#
|
16
|
+
# object = mock()
|
17
|
+
# object.expects(:method_1).with(responds_with(:upcase, "BAR"))
|
18
|
+
# object.method_1("foo")
|
19
|
+
# # error raised, because "foo".upcase != "BAR"
|
20
|
+
def responds_with(message, result)
|
21
|
+
RespondsWith.new(message, result)
|
22
|
+
end
|
23
|
+
|
24
|
+
class RespondsWith < Base # :nodoc:
|
25
|
+
|
26
|
+
def initialize(message, result)
|
27
|
+
@message, @result = message, result
|
28
|
+
end
|
29
|
+
|
30
|
+
def matches?(available_parameters)
|
31
|
+
parameter = available_parameters.shift
|
32
|
+
parameter.__send__(@message) == @result
|
33
|
+
end
|
34
|
+
|
35
|
+
def mocha_inspect
|
36
|
+
"responds_with(#{@message.mocha_inspect}, #{@result.mocha_inspect})"
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'mocha/parameter_matchers/base'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module Mocha
|
5
|
+
|
6
|
+
module ParameterMatchers
|
7
|
+
|
8
|
+
# :call-seq: yaml_equivalent(object) -> parameter_matcher
|
9
|
+
#
|
10
|
+
# Matches any YAML that represents the specified +object+
|
11
|
+
# object = mock()
|
12
|
+
# object.expects(:method_1).with(yaml_equivalent(1, 2, 3))
|
13
|
+
# object.method_1("--- \n- 1\n- 2\n- 3\n")
|
14
|
+
# # no error raised
|
15
|
+
#
|
16
|
+
# object = mock()
|
17
|
+
# object.expects(:method_1).with(yaml_equivalent(1, 2, 3))
|
18
|
+
# object.method_1("--- \n- 1\n- 2\n")
|
19
|
+
# # error raised, because method_1 was not called with YAML representing the specified Array
|
20
|
+
def yaml_equivalent(object)
|
21
|
+
YamlEquivalent.new(object)
|
22
|
+
end
|
23
|
+
|
24
|
+
class YamlEquivalent < Base # :nodoc:
|
25
|
+
|
26
|
+
def initialize(object)
|
27
|
+
@object = object
|
28
|
+
end
|
29
|
+
|
30
|
+
def matches?(available_parameters)
|
31
|
+
parameter = available_parameters.shift
|
32
|
+
@object == YAML.load(parameter)
|
33
|
+
end
|
34
|
+
|
35
|
+
def mocha_inspect
|
36
|
+
"yaml_equivalent(#{@object.mocha_inspect})"
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Mocha
|
2
|
+
|
3
|
+
# Used as parameters for Expectation#with to restrict the parameter values which will match the expectation. Can be nested.
|
4
|
+
module ParameterMatchers; end
|
5
|
+
|
6
|
+
end
|
7
|
+
|
8
|
+
require 'mocha/parameter_matchers/object'
|
9
|
+
|
10
|
+
require 'mocha/parameter_matchers/all_of'
|
11
|
+
require 'mocha/parameter_matchers/any_of'
|
12
|
+
require 'mocha/parameter_matchers/any_parameters'
|
13
|
+
require 'mocha/parameter_matchers/anything'
|
14
|
+
require 'mocha/parameter_matchers/equals'
|
15
|
+
require 'mocha/parameter_matchers/has_entry'
|
16
|
+
require 'mocha/parameter_matchers/has_entries'
|
17
|
+
require 'mocha/parameter_matchers/has_key'
|
18
|
+
require 'mocha/parameter_matchers/has_value'
|
19
|
+
require 'mocha/parameter_matchers/includes'
|
20
|
+
require 'mocha/parameter_matchers/instance_of'
|
21
|
+
require 'mocha/parameter_matchers/is_a'
|
22
|
+
require 'mocha/parameter_matchers/kind_of'
|
23
|
+
require 'mocha/parameter_matchers/not'
|
24
|
+
require 'mocha/parameter_matchers/optionally'
|
25
|
+
require 'mocha/parameter_matchers/regexp_matches'
|
26
|
+
require 'mocha/parameter_matchers/responds_with'
|
27
|
+
require 'mocha/parameter_matchers/yaml_equivalent'
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'mocha/inspect'
|
2
|
+
require 'mocha/parameter_matchers'
|
3
|
+
|
4
|
+
module Mocha
|
5
|
+
|
6
|
+
class ParametersMatcher
|
7
|
+
|
8
|
+
def initialize(expected_parameters = [ParameterMatchers::AnyParameters.new], &matching_block)
|
9
|
+
@expected_parameters, @matching_block = expected_parameters, matching_block
|
10
|
+
end
|
11
|
+
|
12
|
+
def match?(actual_parameters = [])
|
13
|
+
if @matching_block
|
14
|
+
return @matching_block.call(*actual_parameters)
|
15
|
+
else
|
16
|
+
return parameters_match?(actual_parameters)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def parameters_match?(actual_parameters)
|
21
|
+
matchers.all? { |matcher| matcher.matches?(actual_parameters) } && (actual_parameters.length == 0)
|
22
|
+
end
|
23
|
+
|
24
|
+
def mocha_inspect
|
25
|
+
signature = matchers.mocha_inspect
|
26
|
+
signature = signature.gsub(/^\[|\]$/, '')
|
27
|
+
signature = signature.gsub(/^\{|\}$/, '') if matchers.length == 1
|
28
|
+
"(#{signature})"
|
29
|
+
end
|
30
|
+
|
31
|
+
def matchers
|
32
|
+
@expected_parameters.map { |parameter| parameter.to_matcher }
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|