delegate_matcher 0.3 → 0.4
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.
- checksums.yaml +4 -4
- data/Gemfile.lock +3 -3
- data/README.md +101 -8
- data/README.md.erb +216 -0
- data/Rakefile +6 -1
- data/delegate_matcher.gemspec +1 -1
- data/lib/delegate_matcher/delegate.rb +5 -12
- data/lib/delegate_matcher/delegate_matcher.rb +5 -14
- data/lib/delegate_matcher/delegation.rb +32 -23
- data/lib/delegate_matcher/dispatcher.rb +4 -1
- data/lib/delegate_matcher/expected.rb +31 -18
- data/lib/delegate_matcher/nil_delegate.rb +3 -2
- data/lib/delegate_matcher/stub_delegate.rb +7 -3
- data/lib/delegate_matcher/version.rb +1 -1
- data/spec/{lib → examples}/active_support_delegation_spec.rb +11 -2
- data/spec/{lib → examples}/forwardable_delegation_spec.rb +11 -2
- data/spec/shared/author.rb +23 -0
- data/spec/{lib/shared/a_simple_delegator.rb → shared/basic.rb} +4 -6
- data/spec/{lib/shared → shared}/nil_check.rb +15 -15
- data/spec/shared/post_delegation.rb +42 -0
- data/spec/shared/post_methods.rb +15 -0
- data/spec/spec_helper.rb +1 -1
- data/spec/to_a_class_method_spec.rb +37 -0
- data/spec/to_a_class_variable_spec.rb +38 -0
- data/spec/to_a_constant_spec.rb +37 -0
- data/spec/to_an_instance_method_spec.rb +39 -0
- data/spec/to_an_instance_variable_spec.rb +35 -0
- data/spec/to_an_object_spec.rb +45 -0
- data/spec/to_multiple_targets_spec.rb +34 -0
- data/spec/with_args_spec.rb +151 -0
- data/spec/with_as_spec.rb +25 -0
- data/spec/with_block_spec.rb +75 -0
- data/spec/with_prefix_spec.rb +37 -0
- data/spec/with_return_value_spec.rb +46 -0
- data/spec/with_to_spec.rb +53 -0
- metadata +45 -43
- data/.bundle/config +0 -3
- data/spec/lib/aggregate_delegate_matcher_spec.rb +0 -62
- data/spec/lib/class_method_spec.rb +0 -84
- data/spec/lib/class_variable_spec.rb +0 -85
- data/spec/lib/constant_spec.rb +0 -86
- data/spec/lib/delegate_spec.rb +0 -15
- data/spec/lib/instance_method_spec.rb +0 -84
- data/spec/lib/instance_variable_spec.rb +0 -102
- data/spec/lib/object_spec.rb +0 -103
- data/spec/lib/shared/args.rb +0 -24
- data/spec/lib/shared/args_and_a_block.rb +0 -6
- data/spec/lib/shared/author.rb +0 -10
- data/spec/lib/shared/block.rb +0 -71
- data/spec/lib/shared/different_method_name.rb +0 -12
- data/spec/lib/shared/different_return_value.rb +0 -19
- data/spec/lib/shared/prefix.rb +0 -16
@@ -4,6 +4,7 @@ require 'proc_extensions'
|
|
4
4
|
module RSpec
|
5
5
|
module Matchers
|
6
6
|
module DelegateMatcher
|
7
|
+
# rubocop:disable Metrics/ClassLength
|
7
8
|
class Delegation
|
8
9
|
attr_accessor :expected
|
9
10
|
attr_accessor :dispatcher
|
@@ -12,12 +13,12 @@ module RSpec
|
|
12
13
|
def initialize(expected)
|
13
14
|
self.expected = expected
|
14
15
|
self.dispatcher = DelegateMatcher::Dispatcher.new(expected)
|
15
|
-
self.delegate = StubDelegate.new(expected)
|
16
|
+
self.delegate = expected.to.map { |to| StubDelegate.new(expected, to) }
|
16
17
|
end
|
17
18
|
|
18
19
|
def delegation_ok?
|
19
20
|
dispatcher.call
|
20
|
-
delegate.received
|
21
|
+
delegate.all?(&:received)
|
21
22
|
end
|
22
23
|
|
23
24
|
def ok?
|
@@ -28,7 +29,7 @@ module RSpec
|
|
28
29
|
return true if expected.allow_nil.nil?
|
29
30
|
|
30
31
|
begin
|
31
|
-
NilDelegate.new(expected) { dispatcher.call }
|
32
|
+
expected.to.each { |to| NilDelegate.new(expected, to) { dispatcher.call } }
|
32
33
|
allow_nil = true
|
33
34
|
rescue NoMethodError
|
34
35
|
allow_nil = false
|
@@ -38,7 +39,8 @@ module RSpec
|
|
38
39
|
end
|
39
40
|
|
40
41
|
def arguments_ok?
|
41
|
-
|
42
|
+
args_matcher = Mocks::ArgumentListMatcher.new(*expected.as_args)
|
43
|
+
delegate.all? { |delegate| args_matcher.args_match?(*delegate.args) }
|
42
44
|
end
|
43
45
|
|
44
46
|
# rubocop:disable Metrics/AbcSize
|
@@ -47,22 +49,27 @@ module RSpec
|
|
47
49
|
when expected.block.nil?
|
48
50
|
true
|
49
51
|
when expected.block == false
|
50
|
-
delegate.block.nil?
|
52
|
+
delegate.all? { |d| d.block.nil? }
|
51
53
|
when expected.block == true
|
52
|
-
delegate.block == dispatcher.block
|
54
|
+
delegate.all? { |d| d.block == dispatcher.block }
|
53
55
|
else
|
54
|
-
delegate.block_source == expected.block_source
|
56
|
+
delegate.all? { |d| d.block_source == expected.block_source }
|
55
57
|
end
|
56
58
|
end
|
57
59
|
|
58
60
|
def return_value_ok?
|
59
|
-
|
61
|
+
case
|
62
|
+
when !expected.check_return then true
|
63
|
+
when expected.return_value.nil? then dispatcher.return_value == delegate_return_value
|
64
|
+
else dispatcher.return_value == expected.return_value
|
65
|
+
end
|
60
66
|
end
|
61
67
|
|
62
|
-
def
|
63
|
-
|
64
|
-
|
68
|
+
def delegate_return_value
|
69
|
+
delegate.length == 1 ? delegate[0].return_value : delegate.map(&:return_value)
|
70
|
+
end
|
65
71
|
|
72
|
+
def failure_message(negated)
|
66
73
|
message = [
|
67
74
|
argument_failure_message(negated),
|
68
75
|
block_failure_message(negated),
|
@@ -77,29 +84,34 @@ module RSpec
|
|
77
84
|
when expected.as_args.nil? || negated ^ arguments_ok?
|
78
85
|
''
|
79
86
|
else
|
80
|
-
"was called with #{delegate.argument_description}"
|
87
|
+
"was called with #{delegate[0].argument_description}"
|
81
88
|
end
|
82
89
|
end
|
83
90
|
|
84
91
|
def block_failure_message(negated)
|
92
|
+
proc_source = ProcSource.new(delegate[0].block)
|
85
93
|
case
|
86
|
-
when expected.block.nil? ||
|
94
|
+
when expected.block.nil? || negated ^ block_ok?
|
87
95
|
''
|
88
96
|
when negated
|
89
97
|
"a block was #{expected.block ? '' : 'not '}passed"
|
90
98
|
when expected.block
|
91
|
-
delegate.block.nil? ? 'a block was not passed' : "a different block '#{
|
99
|
+
delegate.all? { |d| d.block.nil? } ? 'a block was not passed' : "a different block '#{proc_source}' was passed"
|
92
100
|
else
|
93
|
-
|
101
|
+
%(a block #{proc_source} was passed)
|
94
102
|
end
|
95
103
|
end
|
96
104
|
|
97
|
-
def return_value_failure_message(
|
105
|
+
def return_value_failure_message(negated)
|
98
106
|
case
|
99
|
-
when !delegate.received || return_value_ok?
|
107
|
+
when !delegate.any?(&:received) || negated ^ return_value_ok?
|
108
|
+
''
|
109
|
+
when negated
|
100
110
|
''
|
111
|
+
when !expected.return_value.nil?
|
112
|
+
"a value of \"#{dispatcher.return_value}\" was returned instead of \"#{expected.return_value}\""
|
101
113
|
else
|
102
|
-
|
114
|
+
"a value of \"#{dispatcher.return_value}\" was returned instead of \"#{delegate_return_value}\""
|
103
115
|
end
|
104
116
|
end
|
105
117
|
|
@@ -108,15 +120,12 @@ module RSpec
|
|
108
120
|
when expected.allow_nil.nil? || negated ^ allow_nil_ok?
|
109
121
|
''
|
110
122
|
when negated
|
111
|
-
"#{expected.
|
123
|
+
%("#{expected.to_description}" was #{expected.allow_nil ? '' : 'not '}allowed to be nil)
|
112
124
|
else
|
113
|
-
"#{expected.
|
125
|
+
%("#{expected.to_description}" was #{expected.allow_nil ? 'not ' : ''}allowed to be nil)
|
114
126
|
end
|
115
127
|
end
|
116
128
|
end
|
117
129
|
end
|
118
130
|
end
|
119
131
|
end
|
120
|
-
|
121
|
-
# TODO: use default prefix with constants - lower case method prefix
|
122
|
-
# TODO: How to handle delegation is delegate_double is called with something else
|
@@ -9,7 +9,10 @@ module RSpec
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def call
|
12
|
-
|
12
|
+
args = expected.args
|
13
|
+
args = [] if args && args[0].is_a?(Mocks::ArgumentMatchers::NoArgsMatcher)
|
14
|
+
|
15
|
+
self.return_value = expected.subject.send(expected.delegator_method_name, *args, &block)
|
13
16
|
end
|
14
17
|
|
15
18
|
def block
|
@@ -4,11 +4,12 @@ module RSpec
|
|
4
4
|
class Expected
|
5
5
|
include Block
|
6
6
|
|
7
|
-
attr_accessor :subject, :to, :method_name, :as, :allow_nil, :check_return
|
7
|
+
attr_accessor :subject, :to, :method_name, :as, :allow_nil, :check_return, :return_value
|
8
8
|
attr_reader :args
|
9
9
|
|
10
10
|
def initialize
|
11
11
|
self.check_return = true
|
12
|
+
# @args = [Mocks::ArgumentMatchers::NoArgsMatcher::INSTANCE]
|
12
13
|
end
|
13
14
|
|
14
15
|
def prefix=(prefix)
|
@@ -22,8 +23,8 @@ module RSpec
|
|
22
23
|
''
|
23
24
|
when @prefix
|
24
25
|
"#{@prefix}_"
|
25
|
-
when to.is_a?(String) || to.is_a?(Symbol)
|
26
|
-
to.to_s.delete('@').downcase + '_'
|
26
|
+
when to[0].is_a?(String) || to[0].is_a?(Symbol)
|
27
|
+
to[0].to_s.delete('@').downcase + '_'
|
27
28
|
else
|
28
29
|
''
|
29
30
|
end
|
@@ -50,6 +51,10 @@ module RSpec
|
|
50
51
|
"delegate #{delegator_description} to #{delegate_description}#{options_description}"
|
51
52
|
end
|
52
53
|
|
54
|
+
def to_description
|
55
|
+
to.join(',')
|
56
|
+
end
|
57
|
+
|
53
58
|
private
|
54
59
|
|
55
60
|
def delegator_description
|
@@ -57,22 +62,23 @@ module RSpec
|
|
57
62
|
end
|
58
63
|
|
59
64
|
def delegate_description
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
def as_argument_description
|
71
|
-
argument_description(as_args)
|
65
|
+
%("#{to_description}") +
|
66
|
+
case
|
67
|
+
when !args.eql?(as_args)
|
68
|
+
".#{as}#{argument_description(as_args)}"
|
69
|
+
when as.to_s.eql?(delegator_method_name)
|
70
|
+
''
|
71
|
+
else
|
72
|
+
".#{as}"
|
73
|
+
end
|
72
74
|
end
|
73
75
|
|
74
76
|
def argument_description(arguments = args)
|
75
|
-
|
77
|
+
if arguments
|
78
|
+
"(#{arguments.map { |a| a.respond_to?(:description) ? a.description : a.inspect }.join(', ')})"
|
79
|
+
else
|
80
|
+
''
|
81
|
+
end
|
76
82
|
end
|
77
83
|
|
78
84
|
def options_description
|
@@ -99,12 +105,19 @@ module RSpec
|
|
99
105
|
when block == false
|
100
106
|
' without a block'
|
101
107
|
else
|
102
|
-
" with block
|
108
|
+
" with block \"#{block_source}\""
|
103
109
|
end
|
104
110
|
end
|
105
111
|
|
106
112
|
def return_value_description
|
107
|
-
|
113
|
+
case
|
114
|
+
when return_value
|
115
|
+
" and return \"#{return_value}\""
|
116
|
+
when !check_return
|
117
|
+
' without using delegate return value'
|
118
|
+
else
|
119
|
+
''
|
120
|
+
end
|
108
121
|
end
|
109
122
|
end
|
110
123
|
end
|
@@ -2,7 +2,7 @@ module RSpec
|
|
2
2
|
module Matchers
|
3
3
|
module DelegateMatcher
|
4
4
|
class NilDelegate < Delegate
|
5
|
-
def initialize(expected, &block)
|
5
|
+
def initialize(expected, to, &block)
|
6
6
|
super
|
7
7
|
original_receiver = receiver
|
8
8
|
self.receiver = nil
|
@@ -24,7 +24,7 @@ module RSpec
|
|
24
24
|
silence_warnings { subject.class.const_set(name, value) }
|
25
25
|
when a_method?
|
26
26
|
allow(subject).to receive(name) { value }
|
27
|
-
else #
|
27
|
+
else # an object
|
28
28
|
fail 'cannot verify "allow_nil" expectations when delegating to an object' if value.nil?
|
29
29
|
end
|
30
30
|
end
|
@@ -33,6 +33,7 @@ module RSpec
|
|
33
33
|
warn_level = $VERBOSE
|
34
34
|
$VERBOSE = nil
|
35
35
|
block.call
|
36
|
+
ensure
|
36
37
|
$VERBOSE = warn_level
|
37
38
|
end
|
38
39
|
end
|
@@ -4,14 +4,18 @@ module RSpec
|
|
4
4
|
class StubDelegate < Delegate
|
5
5
|
RSpec::Mocks::Syntax.enable_expect(self)
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
attr_reader :return_value
|
8
|
+
|
9
|
+
def initialize(expected, to)
|
10
|
+
super
|
11
|
+
self.return_value = receiver.send(expected.as, *expected.args)
|
10
12
|
stub_receiver
|
11
13
|
end
|
12
14
|
|
13
15
|
private
|
14
16
|
|
17
|
+
attr_writer :return_value
|
18
|
+
|
15
19
|
def stub_receiver
|
16
20
|
allow(receiver).to receive(expected.as) do |*args, &block|
|
17
21
|
self.args = args
|
@@ -20,11 +20,19 @@ module ActiveSupportDelegation
|
|
20
20
|
def initialize
|
21
21
|
@author = Author.new
|
22
22
|
end
|
23
|
+
|
24
|
+
def inspect
|
25
|
+
'post'
|
26
|
+
end
|
23
27
|
end
|
24
28
|
|
25
29
|
class Author
|
26
|
-
def
|
27
|
-
@name
|
30
|
+
def initialize
|
31
|
+
@name = 'Catherine Asaro'
|
32
|
+
end
|
33
|
+
|
34
|
+
def name(*)
|
35
|
+
@name
|
28
36
|
end
|
29
37
|
end
|
30
38
|
|
@@ -41,6 +49,7 @@ module ActiveSupportDelegation
|
|
41
49
|
it { should delegate(:name).to(:author).with_prefix(:writer) }
|
42
50
|
it { should delegate(:name).to(:author).with_block }
|
43
51
|
it { should delegate(:name).to(:author).with('Ms.') }
|
52
|
+
it { should delegate(:name).to(:author).with('Ms.').with_block }
|
44
53
|
|
45
54
|
it { should delegate(:name).to(:class).with_prefix }
|
46
55
|
it { should delegate(:count).to(:@@authors) }
|
@@ -15,11 +15,19 @@ module ForwardableDelegation
|
|
15
15
|
def_delegator :author, :name, :writer
|
16
16
|
|
17
17
|
def_delegator :'author.name', :length, :name_length
|
18
|
+
|
19
|
+
def inspect
|
20
|
+
'post'
|
21
|
+
end
|
18
22
|
end
|
19
23
|
|
20
24
|
class Author
|
21
|
-
def
|
22
|
-
@name
|
25
|
+
def initialize
|
26
|
+
@name = 'Catherine Asaro'
|
27
|
+
end
|
28
|
+
|
29
|
+
def name(*)
|
30
|
+
@name
|
23
31
|
end
|
24
32
|
end
|
25
33
|
|
@@ -33,6 +41,7 @@ module ForwardableDelegation
|
|
33
41
|
it { should delegate(:name).to(:author) }
|
34
42
|
it { should delegate(:name).to(:author).with('Ms.') }
|
35
43
|
it { should delegate(:name).to(:author).with_block }
|
44
|
+
it { should delegate(:name).to(:author).with('Ms.').with_block }
|
36
45
|
it { should delegate(:name).to(:author).with_prefix }
|
37
46
|
it { should delegate(:writer).to(:author).as(:name) }
|
38
47
|
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module RSpec
|
2
|
+
module Matchers
|
3
|
+
module DelegateMatcher
|
4
|
+
class Author
|
5
|
+
def initialize(name = 'Catherine Asaro')
|
6
|
+
@name = name
|
7
|
+
end
|
8
|
+
|
9
|
+
def other_name
|
10
|
+
'Other Name'
|
11
|
+
end
|
12
|
+
|
13
|
+
def name(*args, &_)
|
14
|
+
"#{args.join}#{@name}"
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_s
|
18
|
+
"Author: #{@name}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -1,17 +1,15 @@
|
|
1
|
-
shared_examples 'a
|
1
|
+
shared_examples 'a basic delegator' do
|
2
2
|
it { should delegate(:name).to(receiver) }
|
3
3
|
it { should delegate(:name.to_s).to(receiver) }
|
4
4
|
|
5
5
|
it { should_not delegate(:to_s).to(receiver) }
|
6
6
|
|
7
|
-
include_examples 'a delegator without a block'
|
8
|
-
|
9
7
|
describe 'description' do
|
10
8
|
let(:matcher) { delegate(:name).to(receiver) }
|
11
9
|
before { matcher.matches? subject }
|
12
10
|
|
13
|
-
it { expect(matcher.description).to eq
|
14
|
-
it { expect(matcher.failure_message).to match(/expected .* to delegate name to #{receiver}/) }
|
15
|
-
it { expect(matcher.failure_message_when_negated).to match(/expected .* not to delegate name to #{receiver}/) }
|
11
|
+
it { expect(matcher.description).to eq %(delegate name to "#{receiver}") }
|
12
|
+
it { expect(matcher.failure_message).to match(/expected .* to delegate name to "#{receiver}"/) }
|
13
|
+
it { expect(matcher.failure_message_when_negated).to match(/expected .* not to delegate name to "#{receiver}"/) }
|
16
14
|
end
|
17
15
|
end
|
@@ -1,27 +1,27 @@
|
|
1
1
|
shared_examples 'a delegator with a nil check' do
|
2
|
-
it { should delegate(:
|
3
|
-
it { should delegate(:
|
4
|
-
it { should_not delegate(:
|
2
|
+
it { should delegate(:name_allow_nil).to(receiver).as(:name).allow_nil }
|
3
|
+
it { should delegate(:name_allow_nil).to(receiver).as(:name).allow_nil(true) }
|
4
|
+
it { should_not delegate(:name_allow_nil).to(receiver).as(:name).allow_nil(false) }
|
5
5
|
|
6
6
|
describe 'description' do
|
7
7
|
before { matcher.matches? subject }
|
8
8
|
|
9
9
|
context 'with allow nil at default' do
|
10
|
-
let(:matcher) { delegate(:
|
11
|
-
it { expect(matcher.description).to
|
12
|
-
it { expect(matcher.failure_message_when_negated).to match(
|
10
|
+
let(:matcher) { delegate(:name_allow_nil).to(receiver).as(:name).allow_nil }
|
11
|
+
it { expect(matcher.description).to match(/with nil allowed/) }
|
12
|
+
it { expect(matcher.failure_message_when_negated).to match(/ was allowed to be nil/) }
|
13
13
|
end
|
14
14
|
|
15
15
|
context 'with allow nil true' do
|
16
|
-
let(:matcher) { delegate(:
|
17
|
-
it { expect(matcher.description).to
|
18
|
-
it { expect(matcher.failure_message_when_negated).to match(
|
16
|
+
let(:matcher) { delegate(:name_allow_nil).to(receiver).as(:name).allow_nil(true) }
|
17
|
+
it { expect(matcher.description).to match(/with nil allowed/) }
|
18
|
+
it { expect(matcher.failure_message_when_negated).to match(/ was allowed to be nil/) }
|
19
19
|
end
|
20
20
|
|
21
21
|
context 'with allow nil false' do
|
22
|
-
let(:matcher) { delegate(:
|
23
|
-
it { expect(matcher.description).to
|
24
|
-
it { expect(matcher.failure_message).to match(
|
22
|
+
let(:matcher) { delegate(:name_allow_nil).to(receiver).as(:name).allow_nil(false) }
|
23
|
+
it { expect(matcher.description).to match(/ with nil not allowed/) }
|
24
|
+
it { expect(matcher.failure_message).to match(/ was allowed to be nil/) }
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
@@ -36,17 +36,17 @@ shared_examples 'a delegator without a nil check' do
|
|
36
36
|
|
37
37
|
context 'with allow nil at default' do
|
38
38
|
let(:matcher) { delegate(:name).to(receiver).allow_nil }
|
39
|
-
it { expect(matcher.failure_message).to match(
|
39
|
+
it { expect(matcher.failure_message).to match(/"#{receiver}" was not allowed to be nil/) }
|
40
40
|
end
|
41
41
|
|
42
42
|
context 'with allow nil true' do
|
43
43
|
let(:matcher) { delegate(:name).to(receiver).allow_nil(true) }
|
44
|
-
it { expect(matcher.failure_message).to match(
|
44
|
+
it { expect(matcher.failure_message).to match(/"#{receiver}" was not allowed to be nil/) }
|
45
45
|
end
|
46
46
|
|
47
47
|
context 'with allow nil false' do
|
48
48
|
let(:matcher) { delegate(:name).to(receiver).allow_nil(false) }
|
49
|
-
it { expect(matcher.failure_message_when_negated).to match(
|
49
|
+
it { expect(matcher.failure_message_when_negated).to match(/"#{receiver}" was not allowed to be nil/) }
|
50
50
|
end
|
51
51
|
end
|
52
52
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module RSpec
|
4
|
+
module Matchers
|
5
|
+
module DelegateMatcher
|
6
|
+
shared_context 'Post delegation' do
|
7
|
+
subject { klass.new }
|
8
|
+
|
9
|
+
let(:klass) do
|
10
|
+
Class.new do
|
11
|
+
include PostMethods
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@author = Author.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def name
|
18
|
+
@author.name
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
before do
|
24
|
+
klass.class_eval method_definition
|
25
|
+
matcher.matches? subject
|
26
|
+
end
|
27
|
+
|
28
|
+
def method_definition
|
29
|
+
klass = self.class
|
30
|
+
while klass != Object
|
31
|
+
return klass.description if klass.respond_to?(:description) && klass.description =~ /def \w*name/
|
32
|
+
klass = klass.parent
|
33
|
+
end
|
34
|
+
|
35
|
+
'# Could not find "def \w*name..." method definition'
|
36
|
+
end
|
37
|
+
|
38
|
+
let(:matcher) { delegate(:name).to(:@author) }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -15,7 +15,7 @@ Coveralls.wear! if Coveralls.will_run?
|
|
15
15
|
|
16
16
|
require 'delegate_matcher'
|
17
17
|
|
18
|
-
Dir[File.dirname(__FILE__) + '/
|
18
|
+
Dir[File.dirname(__FILE__) + '/shared/*.rb'].each { |f| require f }
|
19
19
|
|
20
20
|
RSpec.configure do |config|
|
21
21
|
config.color = true
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module RSpec
|
4
|
+
module Matchers
|
5
|
+
module DelegateMatcher
|
6
|
+
describe 'class delegation' do
|
7
|
+
let(:klass) do
|
8
|
+
Class.new do
|
9
|
+
include PostMethods
|
10
|
+
|
11
|
+
class << self
|
12
|
+
def author
|
13
|
+
@author ||= Author.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def name
|
17
|
+
author.name
|
18
|
+
end
|
19
|
+
|
20
|
+
def name_allow_nil
|
21
|
+
author.name if author
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
subject { klass }
|
28
|
+
|
29
|
+
let(:receiver) { :author }
|
30
|
+
|
31
|
+
it_behaves_like 'a basic delegator'
|
32
|
+
it_behaves_like 'a delegator without a nil check'
|
33
|
+
it_behaves_like 'a delegator with a nil check'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module RSpec
|
4
|
+
module Matchers
|
5
|
+
module DelegateMatcher
|
6
|
+
describe 'delegation to a class variable' do
|
7
|
+
# Note that defining Post as an anonymous class caused the class variable @@author to not be available,
|
8
|
+
# so we create an explicit Post class and remove it after all specs are run
|
9
|
+
before(:all) do
|
10
|
+
class Post
|
11
|
+
include PostMethods
|
12
|
+
|
13
|
+
# rubocop:disable Style/ClassVars
|
14
|
+
@@author = Author.new
|
15
|
+
|
16
|
+
def name
|
17
|
+
@@author.name
|
18
|
+
end
|
19
|
+
|
20
|
+
def name_allow_nil
|
21
|
+
@@author.name if @@author
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
subject { Post.new }
|
27
|
+
|
28
|
+
let(:receiver) { :@@author }
|
29
|
+
|
30
|
+
it_behaves_like 'a basic delegator'
|
31
|
+
it_behaves_like 'a delegator without a nil check'
|
32
|
+
it_behaves_like 'a delegator with a nil check'
|
33
|
+
|
34
|
+
after(:all) { DelegateMatcher.module_eval { remove_const :Post } }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module RSpec
|
4
|
+
module Matchers
|
5
|
+
module DelegateMatcher
|
6
|
+
describe 'class delegation' do
|
7
|
+
# Note that defining Post as an anonymous class caused the constant AUTHOR to not be available,
|
8
|
+
# so we create an explicit Post class and remove it after all specs are run
|
9
|
+
before(:all) do
|
10
|
+
class Post
|
11
|
+
include PostMethods
|
12
|
+
|
13
|
+
AUTHOR = Author.new
|
14
|
+
|
15
|
+
def name
|
16
|
+
AUTHOR.name
|
17
|
+
end
|
18
|
+
|
19
|
+
def name_allow_nil
|
20
|
+
AUTHOR.name if AUTHOR
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
subject { Post.new }
|
26
|
+
|
27
|
+
let(:receiver) { :AUTHOR }
|
28
|
+
|
29
|
+
it_behaves_like 'a basic delegator'
|
30
|
+
it_behaves_like 'a delegator without a nil check'
|
31
|
+
it_behaves_like 'a delegator with a nil check'
|
32
|
+
|
33
|
+
after(:all) { DelegateMatcher.module_eval { remove_const :Post } }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|