rspec-mocks 3.8.1

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 (51) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +3 -0
  4. data/.document +5 -0
  5. data/.yardopts +6 -0
  6. data/Changelog.md +1108 -0
  7. data/LICENSE.md +25 -0
  8. data/README.md +460 -0
  9. data/lib/rspec/mocks.rb +130 -0
  10. data/lib/rspec/mocks/any_instance.rb +11 -0
  11. data/lib/rspec/mocks/any_instance/chain.rb +110 -0
  12. data/lib/rspec/mocks/any_instance/error_generator.rb +31 -0
  13. data/lib/rspec/mocks/any_instance/expect_chain_chain.rb +31 -0
  14. data/lib/rspec/mocks/any_instance/expectation_chain.rb +50 -0
  15. data/lib/rspec/mocks/any_instance/message_chains.rb +83 -0
  16. data/lib/rspec/mocks/any_instance/proxy.rb +116 -0
  17. data/lib/rspec/mocks/any_instance/recorder.rb +289 -0
  18. data/lib/rspec/mocks/any_instance/stub_chain.rb +51 -0
  19. data/lib/rspec/mocks/any_instance/stub_chain_chain.rb +23 -0
  20. data/lib/rspec/mocks/argument_list_matcher.rb +100 -0
  21. data/lib/rspec/mocks/argument_matchers.rb +320 -0
  22. data/lib/rspec/mocks/configuration.rb +212 -0
  23. data/lib/rspec/mocks/error_generator.rb +369 -0
  24. data/lib/rspec/mocks/example_methods.rb +434 -0
  25. data/lib/rspec/mocks/instance_method_stasher.rb +146 -0
  26. data/lib/rspec/mocks/marshal_extension.rb +41 -0
  27. data/lib/rspec/mocks/matchers/expectation_customization.rb +20 -0
  28. data/lib/rspec/mocks/matchers/have_received.rb +134 -0
  29. data/lib/rspec/mocks/matchers/receive.rb +132 -0
  30. data/lib/rspec/mocks/matchers/receive_message_chain.rb +82 -0
  31. data/lib/rspec/mocks/matchers/receive_messages.rb +77 -0
  32. data/lib/rspec/mocks/message_chain.rb +87 -0
  33. data/lib/rspec/mocks/message_expectation.rb +741 -0
  34. data/lib/rspec/mocks/method_double.rb +287 -0
  35. data/lib/rspec/mocks/method_reference.rb +202 -0
  36. data/lib/rspec/mocks/minitest_integration.rb +68 -0
  37. data/lib/rspec/mocks/mutate_const.rb +339 -0
  38. data/lib/rspec/mocks/object_reference.rb +149 -0
  39. data/lib/rspec/mocks/order_group.rb +81 -0
  40. data/lib/rspec/mocks/proxy.rb +485 -0
  41. data/lib/rspec/mocks/space.rb +238 -0
  42. data/lib/rspec/mocks/standalone.rb +3 -0
  43. data/lib/rspec/mocks/syntax.rb +325 -0
  44. data/lib/rspec/mocks/targets.rb +124 -0
  45. data/lib/rspec/mocks/test_double.rb +171 -0
  46. data/lib/rspec/mocks/verifying_double.rb +129 -0
  47. data/lib/rspec/mocks/verifying_message_expectation.rb +54 -0
  48. data/lib/rspec/mocks/verifying_proxy.rb +220 -0
  49. data/lib/rspec/mocks/version.rb +9 -0
  50. metadata +221 -0
  51. metadata.gz.sig +0 -0
@@ -0,0 +1,220 @@
1
+ RSpec::Support.require_rspec_mocks 'verifying_message_expectation'
2
+ RSpec::Support.require_rspec_mocks 'method_reference'
3
+
4
+ module RSpec
5
+ module Mocks
6
+ # @private
7
+ class CallbackInvocationStrategy
8
+ def call(doubled_module)
9
+ RSpec::Mocks.configuration.verifying_double_callbacks.each do |block|
10
+ block.call doubled_module
11
+ end
12
+ end
13
+ end
14
+
15
+ # @private
16
+ class NoCallbackInvocationStrategy
17
+ def call(_doubled_module)
18
+ end
19
+ end
20
+
21
+ # @private
22
+ module VerifyingProxyMethods
23
+ def add_stub(method_name, opts={}, &implementation)
24
+ ensure_implemented(method_name)
25
+ super
26
+ end
27
+
28
+ def add_simple_stub(method_name, *args)
29
+ ensure_implemented(method_name)
30
+ super
31
+ end
32
+
33
+ def add_message_expectation(method_name, opts={}, &block)
34
+ ensure_implemented(method_name)
35
+ super
36
+ end
37
+
38
+ def ensure_implemented(method_name)
39
+ return unless method_reference[method_name].unimplemented?
40
+
41
+ @error_generator.raise_unimplemented_error(
42
+ @doubled_module,
43
+ method_name,
44
+ @object
45
+ )
46
+ end
47
+
48
+ def ensure_publicly_implemented(method_name, _object)
49
+ ensure_implemented(method_name)
50
+ visibility = method_reference[method_name].visibility
51
+
52
+ return if visibility == :public
53
+ @error_generator.raise_non_public_error(method_name, visibility)
54
+ end
55
+ end
56
+
57
+ # A verifying proxy mostly acts like a normal proxy, except that it
58
+ # contains extra logic to try and determine the validity of any expectation
59
+ # set on it. This includes whether or not methods have been defined and the
60
+ # validatiy of arguments on method calls.
61
+ #
62
+ # In all other ways this behaves like a normal proxy. It only adds the
63
+ # verification behaviour to specific methods then delegates to the parent
64
+ # implementation.
65
+ #
66
+ # These checks are only activated if the doubled class has already been
67
+ # loaded, otherwise they are disabled. This allows for testing in
68
+ # isolation.
69
+ #
70
+ # @private
71
+ class VerifyingProxy < TestDoubleProxy
72
+ include VerifyingProxyMethods
73
+
74
+ def initialize(object, order_group, doubled_module, method_reference_class)
75
+ super(object, order_group)
76
+ @object = object
77
+ @doubled_module = doubled_module
78
+ @method_reference_class = method_reference_class
79
+
80
+ # A custom method double is required to pass through a way to lookup
81
+ # methods to determine their parameters. This is only relevant if the doubled
82
+ # class is loaded.
83
+ @method_doubles = Hash.new do |h, k|
84
+ h[k] = VerifyingMethodDouble.new(@object, k, self, method_reference[k])
85
+ end
86
+ end
87
+
88
+ def method_reference
89
+ @method_reference ||= Hash.new do |h, k|
90
+ h[k] = @method_reference_class.for(@doubled_module, k)
91
+ end
92
+ end
93
+
94
+ def visibility_for(method_name)
95
+ method_reference[method_name].visibility
96
+ end
97
+
98
+ def validate_arguments!(method_name, args)
99
+ @method_doubles[method_name].validate_arguments!(args)
100
+ end
101
+ end
102
+
103
+ # @private
104
+ DEFAULT_CALLBACK_INVOCATION_STRATEGY = CallbackInvocationStrategy.new
105
+
106
+ # @private
107
+ class VerifyingPartialDoubleProxy < PartialDoubleProxy
108
+ include VerifyingProxyMethods
109
+
110
+ def initialize(object, expectation_ordering, optional_callback_invocation_strategy=DEFAULT_CALLBACK_INVOCATION_STRATEGY)
111
+ super(object, expectation_ordering)
112
+ @doubled_module = DirectObjectReference.new(object)
113
+
114
+ # A custom method double is required to pass through a way to lookup
115
+ # methods to determine their parameters.
116
+ @method_doubles = Hash.new do |h, k|
117
+ h[k] = VerifyingExistingMethodDouble.for(object, k, self)
118
+ end
119
+
120
+ optional_callback_invocation_strategy.call(@doubled_module)
121
+ end
122
+
123
+ def ensure_implemented(_method_name)
124
+ return if Mocks.configuration.temporarily_suppress_partial_double_verification
125
+ super
126
+ end
127
+
128
+ def method_reference
129
+ @method_doubles
130
+ end
131
+ end
132
+
133
+ # @private
134
+ class VerifyingPartialClassDoubleProxy < VerifyingPartialDoubleProxy
135
+ include PartialClassDoubleProxyMethods
136
+ end
137
+
138
+ # @private
139
+ class VerifyingMethodDouble < MethodDouble
140
+ def initialize(object, method_name, proxy, method_reference)
141
+ super(object, method_name, proxy)
142
+ @method_reference = method_reference
143
+ end
144
+
145
+ def message_expectation_class
146
+ VerifyingMessageExpectation
147
+ end
148
+
149
+ def add_expectation(*args, &block)
150
+ # explict params necessary for 1.8.7 see #626
151
+ super(*args, &block).tap { |x| x.method_reference = @method_reference }
152
+ end
153
+
154
+ def add_stub(*args, &block)
155
+ # explict params necessary for 1.8.7 see #626
156
+ super(*args, &block).tap { |x| x.method_reference = @method_reference }
157
+ end
158
+
159
+ def proxy_method_invoked(obj, *args, &block)
160
+ validate_arguments!(args)
161
+ super
162
+ end
163
+
164
+ def validate_arguments!(actual_args)
165
+ @method_reference.with_signature do |signature|
166
+ verifier = Support::StrictSignatureVerifier.new(signature, actual_args)
167
+ raise ArgumentError, verifier.error_message unless verifier.valid?
168
+ end
169
+ end
170
+ end
171
+
172
+ # A VerifyingMethodDouble fetches the method to verify against from the
173
+ # original object, using a MethodReference. This works for pure doubles,
174
+ # but when the original object is itself the one being modified we need to
175
+ # collapse the reference and the method double into a single object so that
176
+ # we can access the original pristine method definition.
177
+ #
178
+ # @private
179
+ class VerifyingExistingMethodDouble < VerifyingMethodDouble
180
+ def initialize(object, method_name, proxy)
181
+ super(object, method_name, proxy, self)
182
+
183
+ @valid_method = object.respond_to?(method_name, true)
184
+
185
+ # Trigger an eager find of the original method since if we find it any
186
+ # later we end up getting a stubbed method with incorrect arity.
187
+ save_original_implementation_callable!
188
+ end
189
+
190
+ def with_signature
191
+ yield Support::MethodSignature.new(original_implementation_callable)
192
+ end
193
+
194
+ def unimplemented?
195
+ !@valid_method
196
+ end
197
+
198
+ def self.for(object, method_name, proxy)
199
+ if ClassNewMethodReference.applies_to?(method_name) { object }
200
+ VerifyingExistingClassNewMethodDouble
201
+ elsif Mocks.configuration.temporarily_suppress_partial_double_verification
202
+ MethodDouble
203
+ else
204
+ self
205
+ end.new(object, method_name, proxy)
206
+ end
207
+ end
208
+
209
+ # Used in place of a `VerifyingExistingMethodDouble` for the specific case
210
+ # of mocking or stubbing a `new` method on a class. In this case, we substitute
211
+ # the method signature from `#initialize` since new's signature is just `*args`.
212
+ #
213
+ # @private
214
+ class VerifyingExistingClassNewMethodDouble < VerifyingExistingMethodDouble
215
+ def with_signature
216
+ yield Support::MethodSignature.new(object.instance_method(:initialize))
217
+ end
218
+ end
219
+ end
220
+ end
@@ -0,0 +1,9 @@
1
+ module RSpec
2
+ module Mocks
3
+ # Version information for RSpec mocks.
4
+ module Version
5
+ # Version of RSpec mocks currently in use in SemVer format.
6
+ STRING = '3.8.1'
7
+ end
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,221 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rspec-mocks
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.8.1
5
+ platform: ruby
6
+ authors:
7
+ - Steven Baker
8
+ - David Chelimsky
9
+ - Myron Marston
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain:
13
+ - |
14
+ -----BEGIN CERTIFICATE-----
15
+ MIIF1TCCA72gAwIBAgIJAPXjfUbCjdXUMA0GCSqGSIb3DQEBBQUAMIGAMQswCQYD
16
+ VQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEO
17
+ MAwGA1UECgwFUlNwZWMxEzARBgNVBAMMCnJzcGVjLmluZm8xJTAjBgkqhkiG9w0B
18
+ CQEWFnJzcGVjQGdvb2dsZWdyb3Vwcy5jb20wHhcNMTQxMjIzMDkzNTIyWhcNMjQx
19
+ MjIyMDkzNTIyWjCBgDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24x
20
+ EDAOBgNVBAcMB1NlYXR0bGUxDjAMBgNVBAoMBVJTcGVjMRMwEQYDVQQDDApyc3Bl
21
+ Yy5pbmZvMSUwIwYJKoZIhvcNAQkBFhZyc3BlY0Bnb29nbGVncm91cHMuY29tMIIC
22
+ IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsSmjgcHaKlD0jizRJowi2bGI
23
+ KMOHnJoExxRNHHxH+3w9kkl95YldvDRVX495b13ZCzwRe0AyqX24wq04tp0G5Z5C
24
+ e/w2pnNK4ol1eECPwQu+YGpepeODlZICL5gwQspe0cDifbBnHx5QySMiPpvx6bC0
25
+ tQTox0ppDIaMhch8IPCwyoE4DQK5bpsdwnLSHTsQjUIb7IM8tUMpd/iKrJgNffwc
26
+ 6gC1TmhIlzQoB26nCNh9uK7xZjUM+sGECzvcYuImchUaIgJA/ybrlZS+m/hxzvBo
27
+ mLnn/xNEC6Vz5HG+3TR0Gb0cSUf6XUu2s51Jk/SJi3MhCZp2gs9OUg4EVZNzQVkZ
28
+ efLBjAZG2Mxk14JyB4/Omc+Jk0ajprINCBbUNnxzCJrYDM3J9TVWIwyUGNX/U3MO
29
+ s3tMAT+EVgx/mZMPnBO8EULlyF51MRUp3Wy9Mnw8AYLk30UnMG5AjqgO5JNyFlA7
30
+ Xeh3EVdWY3vMB1pkhPwlsenpcmj5gOzrd54lELOVbCGHCf48iSqeflY2Lhe0pvzK
31
+ blXCJBDmtrebvus291rM/dHcbEfK1SVd5Wut/n131iouf6dnNCFskFygDcgBbthC
32
+ gpEMqf80lEmhX59VUsm0Pv6OEo+ZPHBvXPiJA6DShQh9t3YtpwyA8uVDMbT/i32u
33
+ 2FUsqZbbJcCmkBrGposCAwEAAaNQME4wHQYDVR0OBBYEFPPvQ5XT0Nvuhi6k+hrW
34
+ Vv35J+TeMB8GA1UdIwQYMBaAFPPvQ5XT0Nvuhi6k+hrWVv35J+TeMAwGA1UdEwQF
35
+ MAMBAf8wDQYJKoZIhvcNAQEFBQADggIBAIqbQSWH2aAF537DKwAMB8nMFsoe24MD
36
+ gtuQAyjTtbH+QBE4N2RdQF/sU7Y3PYR7nqdrCsYc3RxyqM5XXi7I3IYdpfe1RuxY
37
+ +pyPzVQsPPDhMlJlCrwJsADnxlpxZlAgxYSLKOan55ihscaAWA90wqRUrf/ZJM36
38
+ 8LWCPVn5teIt5aaxZWX68RMxa+AXvpbtJOBwXLkIFk3apD8CX4DhelIdw67DbkUe
39
+ ghUd/u62qrnqBTVgditt7OoWIZjzh24/Fda5d0MxZyvLILGOrf5bN4cTbe/q9Cid
40
+ Xrik7Upm+mu3y3yQIfrw85xybHq6iNXyYHvCdSrFfCIKrGpd/0CAdmYnJlx59Fk/
41
+ UbD3Eyx4psBSkU+WKO0Uf+3zNI7N/nVeNIwU/Ft+l8l7/K+427656c+ZGWDO0Gt/
42
+ BeEOSTDKP7qQ1T+JvMrBcBQo+i0cnRT10J1aoV90BhxsvWTRizIbugbaqR6Tq3bj
43
+ Akt00cIlNSplL6DenIAKSh5kF7s0tRD0tC3bNkZmNjNGkdoGEcUODEpTB3RHKKiu
44
+ e6k2Jg6m00z5vGFQhOnROG/QaUzMA3A3mFBe1RHFo07xd0pFeoeWL3vF69Gx9Jwp
45
+ ZsVDj6a7lH3cNqtWXZxrb2wO38qV5AkYj8SQK7Hj3/Yui9myUX3crr+PdetazSqQ
46
+ F3MdtaDehhjC
47
+ -----END CERTIFICATE-----
48
+ date: 2019-06-13 00:00:00.000000000 Z
49
+ dependencies:
50
+ - !ruby/object:Gem::Dependency
51
+ name: rspec-support
52
+ requirement: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: 3.8.0
57
+ type: :runtime
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: 3.8.0
64
+ - !ruby/object:Gem::Dependency
65
+ name: diff-lcs
66
+ requirement: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: 1.2.0
71
+ - - "<"
72
+ - !ruby/object:Gem::Version
73
+ version: '2.0'
74
+ type: :runtime
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: 1.2.0
81
+ - - "<"
82
+ - !ruby/object:Gem::Version
83
+ version: '2.0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rake
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: 10.0.0
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: 10.0.0
98
+ - !ruby/object:Gem::Dependency
99
+ name: cucumber
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: 1.3.15
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: 1.3.15
112
+ - !ruby/object:Gem::Dependency
113
+ name: aruba
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: 0.6.2
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: 0.6.2
126
+ - !ruby/object:Gem::Dependency
127
+ name: minitest
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - "~>"
131
+ - !ruby/object:Gem::Version
132
+ version: '5.2'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: '5.2'
140
+ description: RSpec's 'test double' framework, with support for stubbing and mocking
141
+ email: rspec@googlegroups.com
142
+ executables: []
143
+ extensions: []
144
+ extra_rdoc_files: []
145
+ files:
146
+ - ".document"
147
+ - ".yardopts"
148
+ - Changelog.md
149
+ - LICENSE.md
150
+ - README.md
151
+ - lib/rspec/mocks.rb
152
+ - lib/rspec/mocks/any_instance.rb
153
+ - lib/rspec/mocks/any_instance/chain.rb
154
+ - lib/rspec/mocks/any_instance/error_generator.rb
155
+ - lib/rspec/mocks/any_instance/expect_chain_chain.rb
156
+ - lib/rspec/mocks/any_instance/expectation_chain.rb
157
+ - lib/rspec/mocks/any_instance/message_chains.rb
158
+ - lib/rspec/mocks/any_instance/proxy.rb
159
+ - lib/rspec/mocks/any_instance/recorder.rb
160
+ - lib/rspec/mocks/any_instance/stub_chain.rb
161
+ - lib/rspec/mocks/any_instance/stub_chain_chain.rb
162
+ - lib/rspec/mocks/argument_list_matcher.rb
163
+ - lib/rspec/mocks/argument_matchers.rb
164
+ - lib/rspec/mocks/configuration.rb
165
+ - lib/rspec/mocks/error_generator.rb
166
+ - lib/rspec/mocks/example_methods.rb
167
+ - lib/rspec/mocks/instance_method_stasher.rb
168
+ - lib/rspec/mocks/marshal_extension.rb
169
+ - lib/rspec/mocks/matchers/expectation_customization.rb
170
+ - lib/rspec/mocks/matchers/have_received.rb
171
+ - lib/rspec/mocks/matchers/receive.rb
172
+ - lib/rspec/mocks/matchers/receive_message_chain.rb
173
+ - lib/rspec/mocks/matchers/receive_messages.rb
174
+ - lib/rspec/mocks/message_chain.rb
175
+ - lib/rspec/mocks/message_expectation.rb
176
+ - lib/rspec/mocks/method_double.rb
177
+ - lib/rspec/mocks/method_reference.rb
178
+ - lib/rspec/mocks/minitest_integration.rb
179
+ - lib/rspec/mocks/mutate_const.rb
180
+ - lib/rspec/mocks/object_reference.rb
181
+ - lib/rspec/mocks/order_group.rb
182
+ - lib/rspec/mocks/proxy.rb
183
+ - lib/rspec/mocks/space.rb
184
+ - lib/rspec/mocks/standalone.rb
185
+ - lib/rspec/mocks/syntax.rb
186
+ - lib/rspec/mocks/targets.rb
187
+ - lib/rspec/mocks/test_double.rb
188
+ - lib/rspec/mocks/verifying_double.rb
189
+ - lib/rspec/mocks/verifying_message_expectation.rb
190
+ - lib/rspec/mocks/verifying_proxy.rb
191
+ - lib/rspec/mocks/version.rb
192
+ homepage: https://github.com/rspec/rspec-mocks
193
+ licenses:
194
+ - MIT
195
+ metadata:
196
+ bug_tracker_uri: https://github.com/rspec/rspec-mocks/issues
197
+ changelog_uri: https://github.com/rspec/rspec-mocks/blob/v3.8.1/Changelog.md
198
+ documentation_uri: https://rspec.info/documentation/
199
+ mailing_list_uri: https://groups.google.com/forum/#!forum/rspec
200
+ source_code_uri: https://github.com/rspec/rspec-mocks
201
+ post_install_message:
202
+ rdoc_options:
203
+ - "--charset=UTF-8"
204
+ require_paths:
205
+ - lib
206
+ required_ruby_version: !ruby/object:Gem::Requirement
207
+ requirements:
208
+ - - ">="
209
+ - !ruby/object:Gem::Version
210
+ version: 1.8.7
211
+ required_rubygems_version: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ requirements: []
217
+ rubygems_version: 3.0.3
218
+ signing_key:
219
+ specification_version: 4
220
+ summary: rspec-mocks-3.8.1
221
+ test_files: []