surrogate 0.4.3 → 0.5.0
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/Readme.md +52 -10
- data/lib/surrogate/hatchling.rb +28 -25
- data/lib/surrogate/invocation.rb +17 -0
- data/lib/surrogate/options.rb +2 -2
- data/lib/surrogate/rspec/abstract_failure_message.rb +59 -0
- data/lib/surrogate/rspec/have_been_asked_for_its.rb +78 -0
- data/lib/surrogate/rspec/have_been_initialized_with.rb +12 -0
- data/lib/surrogate/rspec/have_been_told_to.rb +77 -0
- data/lib/surrogate/rspec/invocation_matcher.rb +81 -0
- data/lib/surrogate/rspec/{substitutability_matchers.rb → substitute_for.rb} +0 -0
- data/lib/surrogate/rspec/times_predicate.rb +19 -0
- data/lib/surrogate/rspec/with_filter.rb +123 -0
- data/lib/surrogate/rspec.rb +25 -2
- data/lib/surrogate/values.rb +23 -30
- data/lib/surrogate/version.rb +1 -1
- data/lib/surrogate.rb +1 -0
- data/spec/acceptance_spec.rb +5 -5
- data/spec/defining_api_methods_spec.rb +19 -42
- data/spec/rspec/block_support_spec.rb +129 -0
- data/spec/rspec/messages_spec.rb +13 -10
- data/surrogate.gemspec +1 -1
- metadata +18 -9
- data/lib/surrogate/rspec/api_method_matchers.rb +0 -229
@@ -1,229 +0,0 @@
|
|
1
|
-
require 'erb'
|
2
|
-
|
3
|
-
|
4
|
-
class Surrogate
|
5
|
-
module RSpec
|
6
|
-
module MessagesFor
|
7
|
-
|
8
|
-
MESSAGES = {
|
9
|
-
verb: {
|
10
|
-
should: {
|
11
|
-
default: "was never told to <%= subject %>",
|
12
|
-
with: "should have been told to <%= subject %> with <%= inspect_arguments expected_arguments %>, but <%= actual_invocation %>",
|
13
|
-
times: "should have been told to <%= subject %> <%= times_msg expected_times_invoked %> but was told to <%= subject %> <%= times_msg times_invoked %>",
|
14
|
-
with_times: "should have been told to <%= subject %> <%= times_msg expected_times_invoked %> with <%= inspect_arguments expected_arguments %>, but <%= actual_invocation %>",
|
15
|
-
},
|
16
|
-
should_not: {
|
17
|
-
default: "shouldn't have been told to <%= subject %>, but was told to <%= subject %> <%= times_msg times_invoked %>",
|
18
|
-
with: "should not have been told to <%= subject %> with <%= inspect_arguments expected_arguments %>, but <%= actual_invocation %>",
|
19
|
-
times: "shouldn't have been told to <%= subject %> <%= times_msg expected_times_invoked %>, but was",
|
20
|
-
with_times: "should not have been told to <%= subject %> <%= times_msg expected_times_invoked %> with <%= inspect_arguments expected_arguments %>, but <%= actual_invocation %>",
|
21
|
-
},
|
22
|
-
other: {
|
23
|
-
not_invoked: "was never told to",
|
24
|
-
invoked_description: "got it",
|
25
|
-
},
|
26
|
-
},
|
27
|
-
noun: {
|
28
|
-
should: {
|
29
|
-
default: "was never asked for its <%= subject %>",
|
30
|
-
with: "should have been asked for its <%= subject %> with <%= inspect_arguments expected_arguments %>, but <%= actual_invocation %>",
|
31
|
-
times: "should have been asked for its <%= subject %> <%= times_msg expected_times_invoked %>, but was asked <%= times_msg times_invoked %>",
|
32
|
-
with_times: "should have been asked for its <%= subject %> <%= times_msg expected_times_invoked %> with <%= inspect_arguments expected_arguments %>, but <%= actual_invocation %>",
|
33
|
-
},
|
34
|
-
should_not: {
|
35
|
-
default: "shouldn't have been asked for its <%= subject %>, but was asked <%= times_msg times_invoked %>",
|
36
|
-
with: "should not have been asked for its <%= subject %> with <%= inspect_arguments expected_arguments %>, but <%= actual_invocation %>",
|
37
|
-
times: "shouldn't have been asked for its <%= subject %> <%= times_msg expected_times_invoked %>, but was",
|
38
|
-
with_times: "should not have been asked for its <%= subject %> <%= times_msg expected_times_invoked %> with <%= inspect_arguments expected_arguments %>, but <%= actual_invocation %>",
|
39
|
-
},
|
40
|
-
other: {
|
41
|
-
not_invoked: "was never asked",
|
42
|
-
invoked_description: "was asked",
|
43
|
-
},
|
44
|
-
},
|
45
|
-
}
|
46
|
-
|
47
|
-
def message_for(language_type, message_category, message_type, binding)
|
48
|
-
message = MESSAGES[language_type][message_category].fetch(message_type)
|
49
|
-
ERB.new(message).result(binding)
|
50
|
-
end
|
51
|
-
|
52
|
-
def inspect_arguments(arguments)
|
53
|
-
inspected_arguments = arguments.map { |argument| inspect_argument argument }
|
54
|
-
inspected_arguments << 'no args' if inspected_arguments.empty?
|
55
|
-
"`" << inspected_arguments.join(", ") << "'"
|
56
|
-
end
|
57
|
-
|
58
|
-
def inspect_argument(to_inspect)
|
59
|
-
if RSpec.rspec_mocks_loaded? && to_inspect.respond_to?(:description)
|
60
|
-
to_inspect.description
|
61
|
-
else
|
62
|
-
to_inspect.inspect
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
extend self
|
67
|
-
end
|
68
|
-
|
69
|
-
|
70
|
-
# sigh, surely there is a better name!
|
71
|
-
class Handler < Struct.new(:subject, :language_type)
|
72
|
-
attr_accessor :instance
|
73
|
-
|
74
|
-
def message_for(message_category, message_type)
|
75
|
-
MessagesFor.message_for(language_type, message_category, message_type, binding)
|
76
|
-
end
|
77
|
-
|
78
|
-
def inspect_arguments(args)
|
79
|
-
MessagesFor.inspect_arguments args
|
80
|
-
end
|
81
|
-
|
82
|
-
def message_type
|
83
|
-
:default
|
84
|
-
end
|
85
|
-
|
86
|
-
def invocations
|
87
|
-
instance.invocations(subject)
|
88
|
-
end
|
89
|
-
|
90
|
-
def times_invoked
|
91
|
-
invocations.size
|
92
|
-
end
|
93
|
-
|
94
|
-
def match?
|
95
|
-
times_invoked > 0
|
96
|
-
end
|
97
|
-
|
98
|
-
def times_msg(n)
|
99
|
-
"#{n} time#{'s' unless n == 1}"
|
100
|
-
end
|
101
|
-
|
102
|
-
def failure_message_for_should
|
103
|
-
message_for :should, message_type
|
104
|
-
end
|
105
|
-
|
106
|
-
def failure_message_for_should_not
|
107
|
-
message_for :should_not, message_type
|
108
|
-
end
|
109
|
-
|
110
|
-
def times(times_invoked)
|
111
|
-
# is there a good way to remove these conditionals?
|
112
|
-
extend (kind_of?(MatchWithArguments) ? MatchNumTimesWith : MatchNumTimes)
|
113
|
-
self.expected_times_invoked = times_invoked
|
114
|
-
self
|
115
|
-
end
|
116
|
-
|
117
|
-
def with(*arguments)
|
118
|
-
extend (kind_of?(MatchNumTimes) ? MatchNumTimesWith : MatchWithArguments)
|
119
|
-
self.expected_arguments = arguments
|
120
|
-
self
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
|
125
|
-
module ArgumentComparer
|
126
|
-
def args_match?(actual_arguments)
|
127
|
-
if RSpec.rspec_mocks_loaded?
|
128
|
-
rspec_arg_expectation = ::RSpec::Mocks::ArgumentExpectation.new *expected_arguments
|
129
|
-
rspec_arg_expectation.args_match? *actual_arguments
|
130
|
-
else
|
131
|
-
expected_arguments == actual_arguments
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
module MatchWithArguments
|
137
|
-
include ArgumentComparer
|
138
|
-
|
139
|
-
attr_accessor :expected_arguments
|
140
|
-
|
141
|
-
def message_type
|
142
|
-
:with
|
143
|
-
end
|
144
|
-
|
145
|
-
def match?
|
146
|
-
invocations.any? { |invocation| args_match? invocation }
|
147
|
-
end
|
148
|
-
|
149
|
-
def actual_invocation
|
150
|
-
return message_for :other, :not_invoked if times_invoked.zero?
|
151
|
-
inspected_invocations = invocations.map { |invocation| inspect_arguments invocation }
|
152
|
-
"got #{inspected_invocations.join ', '}"
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
|
157
|
-
module MatchNumTimes
|
158
|
-
def message_type
|
159
|
-
:times
|
160
|
-
end
|
161
|
-
|
162
|
-
attr_accessor :expected_times_invoked
|
163
|
-
|
164
|
-
def match?
|
165
|
-
expected_times_invoked == times_invoked
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
|
170
|
-
module MatchNumTimesWith
|
171
|
-
include ArgumentComparer
|
172
|
-
|
173
|
-
def message_type
|
174
|
-
:with_times
|
175
|
-
end
|
176
|
-
|
177
|
-
attr_accessor :expected_times_invoked, :expected_arguments
|
178
|
-
|
179
|
-
def times_invoked_with_expected_args
|
180
|
-
invocations.select { |invocation| args_match? invocation }.size
|
181
|
-
end
|
182
|
-
|
183
|
-
def match?
|
184
|
-
times_invoked_with_expected_args == expected_times_invoked
|
185
|
-
end
|
186
|
-
|
187
|
-
def actual_invocation
|
188
|
-
return message_for :other, :not_invoked if times_invoked.zero?
|
189
|
-
"#{message_for :other, :invoked_description} #{times_msg times_invoked_with_expected_args}"
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
|
-
|
194
|
-
surrogate_matcher = lambda do |use_case, matcher, morphable=false|
|
195
|
-
if morphable
|
196
|
-
matcher.chain(:times) { |number| use_case.times number }
|
197
|
-
matcher.chain(:with) { |*arguments| use_case.with *arguments }
|
198
|
-
end
|
199
|
-
|
200
|
-
matcher.match do |mocked_instance|
|
201
|
-
use_case.instance = mocked_instance
|
202
|
-
use_case.match?
|
203
|
-
end
|
204
|
-
|
205
|
-
matcher.failure_message_for_should { use_case.failure_message_for_should }
|
206
|
-
matcher.failure_message_for_should_not { use_case.failure_message_for_should_not }
|
207
|
-
end
|
208
|
-
|
209
|
-
|
210
|
-
# have_been_told_to
|
211
|
-
::RSpec::Matchers.define :have_been_told_to do |verb|
|
212
|
-
surrogate_matcher[Handler.new(verb, :verb), self, true]
|
213
|
-
end
|
214
|
-
|
215
|
-
|
216
|
-
# have_been_asked_for_its
|
217
|
-
::RSpec::Matchers.define :have_been_asked_for_its do |noun|
|
218
|
-
surrogate_matcher[Handler.new(noun, :noun), self, true]
|
219
|
-
end
|
220
|
-
|
221
|
-
|
222
|
-
# have_been_initialized_with
|
223
|
-
::RSpec::Matchers.define :have_been_initialized_with do |*init_args|
|
224
|
-
surrogate_matcher[Handler.new(:initialize, :verb).with(*init_args), self]
|
225
|
-
end
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
|
-
|