super_diff 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (206) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +117 -89
  3. data/lib/super_diff.rb +33 -47
  4. data/lib/super_diff/active_record.rb +41 -0
  5. data/lib/super_diff/active_record/diff_formatters.rb +10 -0
  6. data/lib/super_diff/active_record/diff_formatters/active_record_relation.rb +23 -0
  7. data/lib/super_diff/active_record/differs.rb +10 -0
  8. data/lib/super_diff/active_record/differs/active_record_relation.rb +30 -0
  9. data/lib/super_diff/active_record/object_inspection.rb +14 -0
  10. data/lib/super_diff/active_record/object_inspection/inspectors.rb +16 -0
  11. data/lib/super_diff/active_record/object_inspection/inspectors/active_record_model.rb +38 -0
  12. data/lib/super_diff/active_record/object_inspection/inspectors/active_record_relation.rb +18 -0
  13. data/lib/super_diff/active_record/object_inspection/map_extension.rb +18 -0
  14. data/lib/super_diff/active_record/operation_sequences.rb +10 -0
  15. data/lib/super_diff/active_record/operation_sequences/active_record_relation.rb +16 -0
  16. data/lib/super_diff/active_record/operational_sequencers.rb +14 -0
  17. data/lib/super_diff/active_record/operational_sequencers/active_record_model.rb +19 -0
  18. data/lib/super_diff/active_record/operational_sequencers/active_record_relation.rb +24 -0
  19. data/lib/super_diff/active_support.rb +33 -0
  20. data/lib/super_diff/active_support/diff_formatters.rb +10 -0
  21. data/lib/super_diff/active_support/diff_formatters/hash_with_indifferent_access.rb +36 -0
  22. data/lib/super_diff/active_support/differs.rb +10 -0
  23. data/lib/super_diff/active_support/differs/hash_with_indifferent_access.rb +36 -0
  24. data/lib/super_diff/active_support/object_inspection.rb +14 -0
  25. data/lib/super_diff/active_support/object_inspection/inspectors.rb +12 -0
  26. data/lib/super_diff/active_support/object_inspection/inspectors/hash_with_indifferent_access.rb +18 -0
  27. data/lib/super_diff/active_support/object_inspection/map_extension.rb +15 -0
  28. data/lib/super_diff/active_support/operation_sequences.rb +10 -0
  29. data/lib/super_diff/active_support/operation_sequences/hash_with_indifferent_access.rb +16 -0
  30. data/lib/super_diff/active_support/operational_sequencers.rb +10 -0
  31. data/lib/super_diff/active_support/operational_sequencers/hash_with_indifferent_access.rb +21 -0
  32. data/lib/super_diff/colorized_document_extensions.rb +17 -0
  33. data/lib/super_diff/csi.rb +45 -15
  34. data/lib/super_diff/csi/bold_sequence.rb +9 -0
  35. data/lib/super_diff/csi/color.rb +62 -0
  36. data/lib/super_diff/csi/color_sequence_block.rb +28 -0
  37. data/lib/super_diff/csi/colorized_document.rb +72 -0
  38. data/lib/super_diff/csi/document.rb +183 -0
  39. data/lib/super_diff/csi/eight_bit_color.rb +72 -26
  40. data/lib/super_diff/csi/four_bit_color.rb +63 -29
  41. data/lib/super_diff/csi/twenty_four_bit_color.rb +79 -18
  42. data/lib/super_diff/csi/uncolorized_document.rb +29 -0
  43. data/lib/super_diff/diff_formatter.rb +10 -15
  44. data/lib/super_diff/diff_formatters.rb +10 -1
  45. data/lib/super_diff/diff_formatters/base.rb +12 -17
  46. data/lib/super_diff/diff_formatters/collection.rb +81 -50
  47. data/lib/super_diff/diff_formatters/{object.rb → custom_object.rb} +12 -9
  48. data/lib/super_diff/diff_formatters/default_object.rb +48 -0
  49. data/lib/super_diff/diff_formatters/multiline_string.rb +31 -0
  50. data/lib/super_diff/differ.rb +35 -32
  51. data/lib/super_diff/differs.rb +16 -1
  52. data/lib/super_diff/differs/array.rb +2 -2
  53. data/lib/super_diff/differs/base.rb +11 -21
  54. data/lib/super_diff/differs/custom_object.rb +26 -0
  55. data/lib/super_diff/differs/default_object.rb +25 -0
  56. data/lib/super_diff/differs/empty.rb +1 -1
  57. data/lib/super_diff/differs/hash.rb +2 -2
  58. data/lib/super_diff/differs/{multi_line_string.rb → multiline_string.rb} +6 -5
  59. data/lib/super_diff/equality_matcher.rb +9 -22
  60. data/lib/super_diff/equality_matchers.rb +19 -1
  61. data/lib/super_diff/equality_matchers/array.rb +6 -4
  62. data/lib/super_diff/equality_matchers/base.rb +8 -16
  63. data/lib/super_diff/equality_matchers/default.rb +60 -0
  64. data/lib/super_diff/equality_matchers/hash.rb +6 -4
  65. data/lib/super_diff/equality_matchers/{multi_line_string.rb → multiline_string.rb} +9 -6
  66. data/lib/super_diff/equality_matchers/primitive.rb +34 -0
  67. data/lib/super_diff/equality_matchers/{single_line_string.rb → singleline_string.rb} +7 -5
  68. data/lib/super_diff/helpers.rb +17 -81
  69. data/lib/super_diff/no_differ_available_error.rb +22 -0
  70. data/lib/super_diff/{errors.rb → no_operational_sequencer_available_error.rb} +0 -0
  71. data/lib/super_diff/object_inspection.rb +24 -0
  72. data/lib/super_diff/object_inspection/inspection_tree.rb +144 -0
  73. data/lib/super_diff/object_inspection/inspector.rb +27 -0
  74. data/lib/super_diff/object_inspection/inspectors.rb +18 -0
  75. data/lib/super_diff/object_inspection/inspectors/array.rb +22 -0
  76. data/lib/super_diff/object_inspection/inspectors/custom_object.rb +27 -0
  77. data/lib/super_diff/object_inspection/inspectors/default_object.rb +47 -0
  78. data/lib/super_diff/object_inspection/inspectors/hash.rb +22 -0
  79. data/lib/super_diff/object_inspection/inspectors/primitive.rb +13 -0
  80. data/lib/super_diff/object_inspection/inspectors/string.rb +13 -0
  81. data/lib/super_diff/object_inspection/map.rb +28 -0
  82. data/lib/super_diff/object_inspection/nodes.rb +49 -0
  83. data/lib/super_diff/object_inspection/nodes/base.rb +86 -0
  84. data/lib/super_diff/object_inspection/nodes/break.rb +15 -0
  85. data/lib/super_diff/object_inspection/nodes/inspection.rb +15 -0
  86. data/lib/super_diff/object_inspection/nodes/nesting.rb +16 -0
  87. data/lib/super_diff/object_inspection/nodes/text.rb +15 -0
  88. data/lib/super_diff/object_inspection/nodes/when_empty.rb +30 -0
  89. data/lib/super_diff/object_inspection/nodes/when_multiline.rb +22 -0
  90. data/lib/super_diff/object_inspection/nodes/when_non_empty.rb +30 -0
  91. data/lib/super_diff/object_inspection/nodes/when_singleline.rb +24 -0
  92. data/lib/super_diff/operation_sequences.rb +9 -0
  93. data/lib/super_diff/operation_sequences/base.rb +1 -1
  94. data/lib/super_diff/operation_sequences/{object.rb → custom_object.rb} +4 -3
  95. data/lib/super_diff/operation_sequences/default_object.rb +25 -0
  96. data/lib/super_diff/operational_sequencer.rb +23 -18
  97. data/lib/super_diff/operational_sequencers.rb +12 -1
  98. data/lib/super_diff/operational_sequencers/array.rb +65 -62
  99. data/lib/super_diff/operational_sequencers/base.rb +18 -26
  100. data/lib/super_diff/operational_sequencers/custom_object.rb +35 -0
  101. data/lib/super_diff/operational_sequencers/{object.rb → default_object.rb} +21 -11
  102. data/lib/super_diff/operational_sequencers/hash.rb +8 -5
  103. data/lib/super_diff/operational_sequencers/{multi_line_string.rb → multiline_string.rb} +11 -6
  104. data/lib/super_diff/operations.rb +6 -0
  105. data/lib/super_diff/operations/binary_operation.rb +14 -34
  106. data/lib/super_diff/operations/unary_operation.rb +11 -2
  107. data/lib/super_diff/rails.rb +1 -0
  108. data/lib/super_diff/recursion_guard.rb +47 -0
  109. data/lib/super_diff/rspec-rails.rb +2 -0
  110. data/lib/super_diff/rspec.rb +52 -8
  111. data/lib/super_diff/rspec/augmented_matcher.rb +98 -0
  112. data/lib/super_diff/rspec/configuration.rb +31 -0
  113. data/lib/super_diff/rspec/differ.rb +60 -16
  114. data/lib/super_diff/rspec/differs.rb +13 -0
  115. data/lib/super_diff/rspec/differs/collection_containing_exactly.rb +23 -0
  116. data/lib/super_diff/rspec/differs/partial_array.rb +22 -0
  117. data/lib/super_diff/rspec/differs/partial_hash.rb +22 -0
  118. data/lib/super_diff/rspec/differs/partial_object.rb +22 -0
  119. data/lib/super_diff/rspec/matcher_text_builders.rb +24 -0
  120. data/lib/super_diff/rspec/matcher_text_builders/base.rb +155 -0
  121. data/lib/super_diff/rspec/matcher_text_builders/be_predicate.rb +78 -0
  122. data/lib/super_diff/rspec/matcher_text_builders/contain_exactly.rb +14 -0
  123. data/lib/super_diff/rspec/matcher_text_builders/match.rb +23 -0
  124. data/lib/super_diff/rspec/matcher_text_builders/raise_error.rb +13 -0
  125. data/lib/super_diff/rspec/matcher_text_builders/respond_to.rb +99 -0
  126. data/lib/super_diff/rspec/matcher_text_template.rb +240 -0
  127. data/lib/super_diff/rspec/monkey_patches.rb +601 -98
  128. data/lib/super_diff/rspec/object_inspection.rb +8 -0
  129. data/lib/super_diff/rspec/object_inspection/inspectors.rb +24 -0
  130. data/lib/super_diff/rspec/object_inspection/inspectors/collection_containing_exactly.rb +19 -0
  131. data/lib/super_diff/rspec/object_inspection/inspectors/partial_array.rb +22 -0
  132. data/lib/super_diff/rspec/object_inspection/inspectors/partial_hash.rb +21 -0
  133. data/lib/super_diff/rspec/object_inspection/inspectors/partial_object.rb +21 -0
  134. data/lib/super_diff/rspec/object_inspection/map_extension.rb +23 -0
  135. data/lib/super_diff/rspec/operational_sequencers.rb +22 -0
  136. data/lib/super_diff/rspec/operational_sequencers/collection_containing_exactly.rb +97 -0
  137. data/lib/super_diff/rspec/operational_sequencers/partial_array.rb +23 -0
  138. data/lib/super_diff/rspec/operational_sequencers/partial_hash.rb +32 -0
  139. data/lib/super_diff/rspec/operational_sequencers/partial_object.rb +64 -0
  140. data/lib/super_diff/version.rb +1 -1
  141. data/spec/examples.txt +328 -46
  142. data/spec/integration/rails/active_record_spec.rb +19 -0
  143. data/spec/integration/rails/hash_with_indifferent_access_spec.rb +19 -0
  144. data/spec/integration/rspec/be_falsey_matcher_spec.rb +53 -0
  145. data/spec/integration/rspec/be_matcher_spec.rb +565 -0
  146. data/spec/integration/rspec/be_nil_matcher_spec.rb +53 -0
  147. data/spec/integration/rspec/be_predicate_matcher_spec.rb +546 -0
  148. data/spec/integration/rspec/be_truthy_matcher_spec.rb +57 -0
  149. data/spec/integration/rspec/contain_exactly_matcher_spec.rb +368 -0
  150. data/spec/integration/rspec/eq_matcher_spec.rb +874 -0
  151. data/spec/integration/rspec/have_attributes_matcher_spec.rb +299 -0
  152. data/spec/integration/rspec/include_matcher_spec.rb +350 -0
  153. data/spec/integration/rspec/match_matcher_spec.rb +1258 -0
  154. data/spec/integration/rspec/raise_error_matcher_spec.rb +350 -0
  155. data/spec/integration/rspec/respond_to_matcher_spec.rb +994 -0
  156. data/spec/integration/rspec/unhandled_errors_spec.rb +94 -0
  157. data/spec/spec_helper.rb +19 -4
  158. data/spec/support/colorizer.rb +9 -0
  159. data/spec/support/command_runner.rb +4 -0
  160. data/spec/support/integration/helpers.rb +179 -0
  161. data/spec/support/integration/matchers/produce_output_when_run_matcher.rb +79 -41
  162. data/spec/support/models/a.rb +11 -0
  163. data/spec/support/models/active_record/person.rb +26 -0
  164. data/spec/support/models/active_record/shipping_address.rb +29 -0
  165. data/spec/support/models/customer.rb +24 -0
  166. data/spec/support/models/empty_class.rb +6 -0
  167. data/spec/support/models/item.rb +10 -0
  168. data/spec/support/models/order.rb +9 -0
  169. data/spec/support/models/person.rb +20 -0
  170. data/spec/support/models/player.rb +33 -0
  171. data/spec/support/models/shipping_address.rb +34 -0
  172. data/spec/support/ruby_versions.rb +7 -0
  173. data/spec/support/shared_examples/active_record.rb +338 -0
  174. data/spec/support/shared_examples/hash_with_indifferent_access.rb +233 -0
  175. data/spec/unit/equality_matcher_spec.rb +579 -171
  176. data/spec/unit/object_inspection_spec.rb +1092 -0
  177. data/spec/unit/rspec/matchers/be_compared_to_spec.rb +23 -0
  178. data/spec/unit/rspec/matchers/be_falsey_spec.rb +9 -0
  179. data/spec/unit/rspec/matchers/be_nil_spec.rb +9 -0
  180. data/spec/unit/rspec/matchers/be_predicate_spec.rb +31 -0
  181. data/spec/unit/rspec/matchers/be_spec.rb +17 -0
  182. data/spec/unit/rspec/matchers/be_truthy_spec.rb +9 -0
  183. data/spec/unit/rspec/matchers/contain_exactly_spec.rb +11 -0
  184. data/spec/unit/rspec/matchers/eq_spec.rb +9 -0
  185. data/spec/unit/rspec/matchers/have_attributes_spec.rb +11 -0
  186. data/spec/unit/rspec/matchers/include_spec.rb +21 -0
  187. data/spec/unit/rspec/matchers/match_spec.rb +9 -0
  188. data/spec/unit/rspec/matchers/raise_error_spec.rb +29 -0
  189. data/spec/unit/rspec/matchers/respond_to_spec.rb +78 -0
  190. data/super_diff.gemspec +4 -2
  191. metadata +231 -34
  192. data/lib/super_diff/csi/color_helper.rb +0 -52
  193. data/lib/super_diff/csi/eight_bit_sequence.rb +0 -27
  194. data/lib/super_diff/csi/four_bit_sequence.rb +0 -24
  195. data/lib/super_diff/csi/sequence.rb +0 -22
  196. data/lib/super_diff/csi/twenty_four_bit_sequence.rb +0 -27
  197. data/lib/super_diff/diff_formatters/multi_line_string.rb +0 -31
  198. data/lib/super_diff/differs/object.rb +0 -68
  199. data/lib/super_diff/equality_matchers/object.rb +0 -18
  200. data/lib/super_diff/value_inspection.rb +0 -11
  201. data/spec/integration/rspec_spec.rb +0 -261
  202. data/spec/support/color_helper.rb +0 -49
  203. data/spec/support/person.rb +0 -23
  204. data/spec/support/person_diff_formatter.rb +0 -15
  205. data/spec/support/person_operation_sequence.rb +0 -14
  206. data/spec/support/person_operational_sequencer.rb +0 -19
@@ -0,0 +1,350 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe "Integration with RSpec's #raise_error matcher", type: :integration do
4
+ context "given only an exception class" do
5
+ it "produces the correct failure message when used in the positive" do
6
+ as_both_colored_and_uncolored do |color_enabled|
7
+ snippet = <<~TEST.strip
8
+ expect { raise StandardError.new('boo') }.to raise_error(RuntimeError)
9
+ TEST
10
+ program = make_plain_test_program(
11
+ snippet,
12
+ color_enabled: color_enabled,
13
+ )
14
+
15
+ expected_output = build_expected_output(
16
+ color_enabled: color_enabled,
17
+ snippet: %|expect { raise StandardError.new('boo') }.to raise_error(RuntimeError)|,
18
+ expectation: proc {
19
+ line do
20
+ plain "Expected raised exception "
21
+ beta %|#<StandardError "boo">|
22
+ plain " to match "
23
+ alpha %|#<RuntimeError>|
24
+ plain "."
25
+ end
26
+ },
27
+ )
28
+
29
+ expect(program).
30
+ to produce_output_when_run(expected_output).
31
+ in_color(color_enabled)
32
+ end
33
+ end
34
+
35
+ it "produces the correct failure message when used in the negative" do
36
+ as_both_colored_and_uncolored do |color_enabled|
37
+ snippet = <<~TEST.strip
38
+ expect { raise StandardError.new('boo') }.not_to raise_error(StandardError)
39
+ TEST
40
+ program = make_plain_test_program(
41
+ snippet,
42
+ color_enabled: color_enabled,
43
+ )
44
+
45
+ expected_output = build_expected_output(
46
+ color_enabled: color_enabled,
47
+ snippet: %|expect { raise StandardError.new('boo') }.not_to raise_error(StandardError)|,
48
+ expectation: proc {
49
+ line do
50
+ plain "Expected raised exception "
51
+ beta %|#<StandardError "boo">|
52
+ plain " not to match "
53
+ alpha %|#<StandardError>|
54
+ plain "."
55
+ end
56
+ },
57
+ )
58
+
59
+ expect(program).
60
+ to produce_output_when_run(expected_output).
61
+ in_color(color_enabled)
62
+ end
63
+ end
64
+ end
65
+
66
+ context "with only a message (and assuming a RuntimeError)" do
67
+ context "when the message is short" do
68
+ it "produces the correct failure message when used in the positive" do
69
+ as_both_colored_and_uncolored do |color_enabled|
70
+ snippet = <<~TEST.strip
71
+ expect { raise 'boo' }.to raise_error('hell')
72
+ TEST
73
+ program = make_plain_test_program(
74
+ snippet,
75
+ color_enabled: color_enabled,
76
+ )
77
+
78
+ expected_output = build_expected_output(
79
+ color_enabled: color_enabled,
80
+ snippet: %|expect { raise 'boo' }.to raise_error('hell')|,
81
+ expectation: proc {
82
+ line do
83
+ plain "Expected raised exception "
84
+ beta %|#<RuntimeError "boo">|
85
+ plain " to match "
86
+ alpha %|#<Exception "hell">|
87
+ plain "."
88
+ end
89
+ },
90
+ )
91
+
92
+ expect(program).
93
+ to produce_output_when_run(expected_output).
94
+ in_color(color_enabled)
95
+ end
96
+ end
97
+
98
+ it "produces the correct failure message when used in the negative" do
99
+ as_both_colored_and_uncolored do |color_enabled|
100
+ snippet = <<~TEST.strip
101
+ expect { raise 'boo' }.not_to raise_error('boo')
102
+ TEST
103
+ program = make_plain_test_program(
104
+ snippet,
105
+ color_enabled: color_enabled,
106
+ )
107
+
108
+ expected_output = build_expected_output(
109
+ color_enabled: color_enabled,
110
+ snippet: %|expect { raise 'boo' }.not_to raise_error('boo')|,
111
+ expectation: proc {
112
+ line do
113
+ plain "Expected raised exception "
114
+ beta %|#<RuntimeError "boo">|
115
+ plain " not to match "
116
+ alpha %|#<Exception "boo">|
117
+ plain "."
118
+ end
119
+ },
120
+ )
121
+
122
+ expect(program).
123
+ to produce_output_when_run(expected_output).
124
+ in_color(color_enabled)
125
+ end
126
+ end
127
+ end
128
+
129
+ context "when the message is long" do
130
+ context "but contains no line breaks" do
131
+ it "produces the correct failure message when used in the positive" do
132
+ as_both_colored_and_uncolored do |color_enabled|
133
+ snippet = <<~TEST.strip
134
+ actual_message = "some really really really long message"
135
+ expected_message = "whatever"
136
+ expect { raise(actual_message) }.to raise_error(expected_message)
137
+ TEST
138
+ program = make_plain_test_program(
139
+ snippet,
140
+ color_enabled: color_enabled,
141
+ )
142
+
143
+ expected_output = build_expected_output(
144
+ color_enabled: color_enabled,
145
+ snippet: %|expect { raise(actual_message) }.to raise_error(expected_message)|,
146
+ newline_before_expectation: true,
147
+ expectation: proc {
148
+ line do
149
+ plain "Expected raised exception "
150
+ beta %|#<RuntimeError "some really really really long message">|
151
+ end
152
+
153
+ line do
154
+ plain " to match "
155
+ alpha %|#<Exception "whatever">|
156
+ end
157
+ },
158
+ )
159
+
160
+ expect(program).
161
+ to produce_output_when_run(expected_output).
162
+ in_color(color_enabled)
163
+ end
164
+ end
165
+
166
+ it "produces the correct failure message when used in the negative" do
167
+ as_both_colored_and_uncolored do |color_enabled|
168
+ snippet = <<~TEST.strip
169
+ message = "some really long message"
170
+ expect { raise(message) }.not_to raise_error(message)
171
+ TEST
172
+ program = make_plain_test_program(
173
+ snippet,
174
+ color_enabled: color_enabled,
175
+ )
176
+
177
+ expected_output = build_expected_output(
178
+ color_enabled: color_enabled,
179
+ snippet: %|expect { raise(message) }.not_to raise_error(message)|,
180
+ newline_before_expectation: true,
181
+ expectation: proc {
182
+ line do
183
+ plain "Expected raised exception "
184
+ beta %|#<RuntimeError "some really long message">|
185
+ end
186
+
187
+ line do
188
+ plain " not to match "
189
+ alpha %|#<Exception "some really long message">|
190
+ end
191
+ },
192
+ )
193
+
194
+ expect(program).
195
+ to produce_output_when_run(expected_output).
196
+ in_color(color_enabled)
197
+ end
198
+ end
199
+ end
200
+
201
+ context "but contains line breaks" do
202
+ it "produces the correct failure message when used in the positive" do
203
+ as_both_colored_and_uncolored do |color_enabled|
204
+ snippet = <<~TEST.strip
205
+ actual_message = <<\~MESSAGE.rstrip
206
+ This is fun
207
+ So is this
208
+ MESSAGE
209
+ expected_message = <<\~MESSAGE.rstrip
210
+ This is fun
211
+ And so is this
212
+ MESSAGE
213
+ expect { raise(actual_message) }.to raise_error(expected_message)
214
+ TEST
215
+ program = make_plain_test_program(
216
+ snippet,
217
+ color_enabled: color_enabled,
218
+ )
219
+
220
+ expected_output = build_expected_output(
221
+ color_enabled: color_enabled,
222
+ snippet: %|expect { raise(actual_message) }.to raise_error(expected_message)|,
223
+ expectation: proc {
224
+ line do
225
+ plain "Expected raised exception "
226
+ beta %|#<RuntimeError "This is fun\\nSo is this">|
227
+ end
228
+
229
+ line do
230
+ plain " to match "
231
+ alpha %|#<Exception "This is fun\\nAnd so is this">|
232
+ end
233
+ },
234
+ diff: proc {
235
+ plain_line %| This is fun\\n|
236
+ alpha_line %|- And so is this|
237
+ beta_line %|+ So is this|
238
+ },
239
+ )
240
+
241
+ expect(program).
242
+ to produce_output_when_run(expected_output).
243
+ in_color(color_enabled)
244
+ end
245
+ end
246
+
247
+ it "produces the correct failure message when used in the negative" do
248
+ as_both_colored_and_uncolored do |color_enabled|
249
+ snippet = <<~TEST.strip
250
+ message = <<\~MESSAGE.rstrip
251
+ This is fun
252
+ So is this
253
+ MESSAGE
254
+ expect { raise(message) }.not_to raise_error(message)
255
+ TEST
256
+ program = make_plain_test_program(
257
+ snippet,
258
+ color_enabled: color_enabled,
259
+ )
260
+
261
+ expected_output = build_expected_output(
262
+ color_enabled: color_enabled,
263
+ snippet: %|expect { raise(message) }.not_to raise_error(message)|,
264
+ newline_before_expectation: true,
265
+ expectation: proc {
266
+ line do
267
+ plain "Expected raised exception "
268
+ beta %|#<RuntimeError "This is fun\\nSo is this">|
269
+ end
270
+
271
+ line do
272
+ plain " not to match "
273
+ alpha %|#<Exception "This is fun\\nSo is this">|
274
+ end
275
+ },
276
+ )
277
+
278
+ expect(program).
279
+ to produce_output_when_run(expected_output).
280
+ in_color(color_enabled)
281
+ end
282
+ end
283
+ end
284
+ end
285
+ end
286
+
287
+ context "with both an exception and a message" do
288
+ it "produces the correct failure message when used in the positive" do
289
+ as_both_colored_and_uncolored do |color_enabled|
290
+ snippet = <<~TEST.strip
291
+ block = -> { raise StandardError.new('a') }
292
+ expect(&block).to raise_error(RuntimeError, 'b')
293
+ TEST
294
+ program = make_plain_test_program(
295
+ snippet,
296
+ color_enabled: color_enabled,
297
+ )
298
+
299
+ expected_output = build_expected_output(
300
+ color_enabled: color_enabled,
301
+ snippet: %|expect(&block).to raise_error(RuntimeError, 'b')|,
302
+ expectation: proc {
303
+ line do
304
+ plain "Expected raised exception "
305
+ beta %|#<StandardError "a">|
306
+ plain " to match "
307
+ alpha %|#<RuntimeError "b">|
308
+ plain "."
309
+ end
310
+ },
311
+ )
312
+
313
+ expect(program).
314
+ to produce_output_when_run(expected_output).
315
+ in_color(color_enabled)
316
+ end
317
+ end
318
+
319
+ it "produces the correct failure message when used in the negative" do
320
+ as_both_colored_and_uncolored do |color_enabled|
321
+ snippet = <<~TEST.strip
322
+ block = -> { raise StandardError.new('a') }
323
+ expect(&block).not_to raise_error(StandardError, 'a')
324
+ TEST
325
+ program = make_plain_test_program(
326
+ snippet,
327
+ color_enabled: color_enabled,
328
+ )
329
+
330
+ expected_output = build_expected_output(
331
+ color_enabled: color_enabled,
332
+ snippet: %|expect(&block).not_to raise_error(StandardError, 'a')|,
333
+ expectation: proc {
334
+ line do
335
+ plain "Expected raised exception "
336
+ beta %|#<StandardError "a">|
337
+ plain " not to match "
338
+ alpha %|#<StandardError "a">|
339
+ plain "."
340
+ end
341
+ },
342
+ )
343
+
344
+ expect(program).
345
+ to produce_output_when_run(expected_output).
346
+ in_color(color_enabled)
347
+ end
348
+ end
349
+ end
350
+ end
@@ -0,0 +1,994 @@
1
+ require "spec_helper"
2
+
3
+ # TODO: Update coloring here
4
+ RSpec.describe "Integration with RSpec's #respond_to matcher", type: :integration do
5
+ context "without any qualifiers" do
6
+ context "when a few number of methods are specified" do
7
+ it "produces the correct failure message when used in the positive" do
8
+ as_both_colored_and_uncolored do |color_enabled|
9
+ snippet = %|expect(double).to respond_to(:foo)|
10
+ program = make_plain_test_program(
11
+ snippet,
12
+ color_enabled: color_enabled,
13
+ )
14
+
15
+ expected_output = build_expected_output(
16
+ color_enabled: color_enabled,
17
+ snippet: snippet,
18
+ expectation: proc {
19
+ line do
20
+ plain "Expected "
21
+ beta %|#<Double (anonymous)>|
22
+ plain " to respond to "
23
+ alpha %|:foo|
24
+ plain "."
25
+ end
26
+ },
27
+ )
28
+
29
+ expect(program).
30
+ to produce_output_when_run(expected_output).
31
+ in_color(color_enabled)
32
+ end
33
+ end
34
+
35
+ it "produces the correct failure message when used in the negative" do
36
+ as_both_colored_and_uncolored do |color_enabled|
37
+ snippet = %|expect(double).not_to respond_to(:inspect)|
38
+ program = make_plain_test_program(
39
+ snippet,
40
+ color_enabled: color_enabled,
41
+ )
42
+
43
+ expected_output = build_expected_output(
44
+ color_enabled: color_enabled,
45
+ snippet: snippet,
46
+ expectation: proc {
47
+ line do
48
+ plain "Expected "
49
+ beta %|#<Double (anonymous)>|
50
+ plain " not to respond to "
51
+ alpha %|:inspect|
52
+ plain "."
53
+ end
54
+ },
55
+ )
56
+
57
+ expect(program).
58
+ to produce_output_when_run(expected_output).
59
+ in_color(color_enabled)
60
+ end
61
+ end
62
+ end
63
+
64
+ context "when a large number of methods are specified" do
65
+ it "produces the correct failure message when used in the positive" do
66
+ as_both_colored_and_uncolored do |color_enabled|
67
+ snippet = <<~TEST.strip
68
+ expect(double(:something_really_long)).to respond_to(:foo, :bar, :baz, :qux, :fizz, :buzz, :zing)
69
+ TEST
70
+ program = make_plain_test_program(
71
+ snippet,
72
+ color_enabled: color_enabled,
73
+ )
74
+
75
+ expected_output = build_expected_output(
76
+ color_enabled: color_enabled,
77
+ snippet: %|expect(double(:something_really_long)).to respond_to(:foo, :bar, :baz, :qux, :fizz, :buzz, :zing)|,
78
+ newline_before_expectation: true,
79
+ expectation: proc {
80
+ line do
81
+ plain " Expected "
82
+ beta %|#<Double :something_really_long>|
83
+ end
84
+
85
+ line do
86
+ plain "to respond to "
87
+ alpha %|:foo|
88
+ plain ", "
89
+ alpha %|:bar|
90
+ plain ", "
91
+ alpha %|:baz|
92
+ plain ", "
93
+ alpha %|:qux|
94
+ plain ", "
95
+ alpha %|:fizz|
96
+ plain ", "
97
+ alpha %|:buzz|
98
+ plain " and "
99
+ alpha %|:zing|
100
+ end
101
+ },
102
+ )
103
+
104
+ expect(program).
105
+ to produce_output_when_run(expected_output).
106
+ in_color(color_enabled)
107
+ end
108
+ end
109
+
110
+ it "produces the correct failure message when used in the negative" do
111
+ as_both_colored_and_uncolored do |color_enabled|
112
+ snippet = <<~TEST.strip
113
+ class B
114
+ def some_really_long_method_and_stuff; end
115
+ def another_method_or_whatever; end
116
+ end
117
+
118
+ expect(B.new).not_to respond_to(:some_really_long_method_and_stuff, :another_method_or_whatever)
119
+ TEST
120
+ program = make_plain_test_program(
121
+ snippet,
122
+ color_enabled: color_enabled,
123
+ )
124
+
125
+ expected_output = build_expected_output(
126
+ color_enabled: color_enabled,
127
+ snippet: %|expect(B.new).not_to respond_to(:some_really_long_method_and_stuff, :another_method_or_whatever)|,
128
+ newline_before_expectation: true,
129
+ expectation: proc {
130
+ line do
131
+ plain " Expected "
132
+ beta %|#<B>|
133
+ end
134
+
135
+ line do
136
+ plain "not to respond to "
137
+ alpha %|:some_really_long_method_and_stuff|
138
+ plain " and "
139
+ alpha %|:another_method_or_whatever|
140
+ end
141
+ },
142
+ )
143
+
144
+ expect(program).
145
+ to produce_output_when_run(expected_output).
146
+ removing_object_ids.
147
+ in_color(color_enabled)
148
+ end
149
+ end
150
+ end
151
+ end
152
+
153
+ context "qualified with #with + #arguments" do
154
+ context "when a few number of methods are specified when used in the positive" do
155
+ it "produces the correct failure message" do
156
+ as_both_colored_and_uncolored do |color_enabled|
157
+ snippet = <<~TEST.strip
158
+ expect(double).to respond_to(:foo).with(3).arguments
159
+ TEST
160
+ program = make_plain_test_program(
161
+ snippet,
162
+ color_enabled: color_enabled,
163
+ )
164
+
165
+ expected_output = build_expected_output(
166
+ color_enabled: color_enabled,
167
+ snippet: %|expect(double).to respond_to(:foo).with(3).arguments|,
168
+ expectation: proc {
169
+ line do
170
+ plain "Expected "
171
+ beta %|#<Double (anonymous)>|
172
+ plain " to respond to "
173
+ alpha %|:foo|
174
+ plain " with "
175
+ alpha %|3|
176
+ plain " arguments."
177
+ end
178
+ },
179
+ )
180
+
181
+ expect(program).
182
+ to produce_output_when_run(expected_output).
183
+ in_color(color_enabled)
184
+ end
185
+ end
186
+
187
+ it "produces the correct failure message when used in the negative" do
188
+ as_both_colored_and_uncolored do |color_enabled|
189
+ snippet = <<~TEST.strip
190
+ class B
191
+ def foo(bar, baz, qux); end
192
+ end
193
+
194
+ expect(B.new).not_to respond_to(:foo).with(3).arguments
195
+ TEST
196
+ program = make_plain_test_program(
197
+ snippet,
198
+ color_enabled: color_enabled,
199
+ )
200
+
201
+ expected_output = build_expected_output(
202
+ color_enabled: color_enabled,
203
+ snippet: %|expect(B.new).not_to respond_to(:foo).with(3).arguments|,
204
+ expectation: proc {
205
+ line do
206
+ plain "Expected "
207
+ beta %|#<B>|
208
+ plain " not to respond to "
209
+ alpha %|:foo|
210
+ plain " with "
211
+ alpha %|3|
212
+ plain " arguments."
213
+ end
214
+ },
215
+ )
216
+
217
+ expect(program).
218
+ to produce_output_when_run(expected_output).
219
+ removing_object_ids.
220
+ in_color(color_enabled)
221
+ end
222
+ end
223
+ end
224
+
225
+ context "when a large number of methods are specified" do
226
+ it "produces the correct failure message when used in the positive" do
227
+ as_both_colored_and_uncolored do |color_enabled|
228
+ snippet = <<~TEST.strip
229
+ expect(double(:something_really_long)).to respond_to(:foo, :bar, :baz, :fizz, :buzz).with(3).arguments
230
+ TEST
231
+ program = make_plain_test_program(
232
+ snippet,
233
+ color_enabled: color_enabled,
234
+ )
235
+
236
+ expected_output = build_expected_output(
237
+ color_enabled: color_enabled,
238
+ snippet: %|expect(double(:something_really_long)).to respond_to(:foo, :bar, :baz, :fizz, :buzz).with(3).arguments|,
239
+ newline_before_expectation: true,
240
+ expectation: proc {
241
+ line do
242
+ plain " Expected "
243
+ beta %|#<Double :something_really_long>|
244
+ end
245
+
246
+ line do
247
+ plain "to respond to "
248
+ alpha %|:foo|
249
+ plain ", "
250
+ alpha %|:bar|
251
+ plain ", "
252
+ alpha %|:baz|
253
+ plain ", "
254
+ alpha %|:fizz|
255
+ plain " and "
256
+ alpha %|:buzz|
257
+ plain " with "
258
+ alpha %|3|
259
+ plain " arguments"
260
+ end
261
+ },
262
+ )
263
+
264
+ expect(program).
265
+ to produce_output_when_run(expected_output).
266
+ in_color(color_enabled)
267
+ end
268
+ end
269
+
270
+ it "produces the correct failure message when used in the negative" do
271
+ as_both_colored_and_uncolored do |color_enabled|
272
+ snippet = <<~TEST.strip
273
+ class B
274
+ def some_really_long_method_and_stuff(foo, bar, baz); end
275
+ def another_method_or_whatever(foo, bar, baz); end
276
+ end
277
+
278
+ expect(B.new).not_to respond_to(:some_really_long_method_and_stuff, :another_method_or_whatever).with(3).arguments
279
+ TEST
280
+ program = make_plain_test_program(
281
+ snippet,
282
+ color_enabled: color_enabled,
283
+ )
284
+
285
+ expected_output = build_expected_output(
286
+ color_enabled: color_enabled,
287
+ snippet: %|expect(B.new).not_to respond_to(:some_really_long_method_and_stuff, :another_method_or_whatever).with(3).arguments|,
288
+ newline_before_expectation: true,
289
+ expectation: proc {
290
+ line do
291
+ plain " Expected "
292
+ beta %|#<B>|
293
+ end
294
+
295
+ line do
296
+ plain "not to respond to "
297
+ alpha %|:some_really_long_method_and_stuff|
298
+ plain " and "
299
+ alpha %|:another_method_or_whatever|
300
+ plain " with "
301
+ alpha %|3|
302
+ plain " arguments"
303
+ end
304
+ },
305
+ )
306
+
307
+ expect(program).
308
+ to produce_output_when_run(expected_output).
309
+ removing_object_ids.
310
+ in_color(color_enabled)
311
+ end
312
+ end
313
+ end
314
+ end
315
+
316
+ context "qualified with #with_keywords" do
317
+ context "when a few number of methods are specified" do
318
+ it "produces the correct failure message when used in the positive" do
319
+ as_both_colored_and_uncolored do |color_enabled|
320
+ snippet = <<~TEST.strip
321
+ expect(double).to respond_to(:foo).with_keywords(:bar)
322
+ TEST
323
+ program = make_plain_test_program(
324
+ snippet,
325
+ color_enabled: color_enabled,
326
+ )
327
+
328
+ expected_output = build_expected_output(
329
+ color_enabled: color_enabled,
330
+ snippet: %|expect(double).to respond_to(:foo).with_keywords(:bar)|,
331
+ expectation: proc {
332
+ line do
333
+ plain "Expected "
334
+ beta %|#<Double (anonymous)>|
335
+ plain " to respond to "
336
+ alpha %|:foo|
337
+ plain " with keyword "
338
+ alpha %|:bar|
339
+ plain "."
340
+ end
341
+ },
342
+ )
343
+
344
+ expect(program).
345
+ to produce_output_when_run(expected_output).
346
+ in_color(color_enabled)
347
+ end
348
+ end
349
+
350
+ it "produces the correct failure message when used in the negative" do
351
+ as_both_colored_and_uncolored do |color_enabled|
352
+ snippet = <<~TEST.strip
353
+ class B
354
+ def foo(bar:); end
355
+ end
356
+
357
+ expect(B.new).not_to respond_to(:foo).with_keywords(:bar)
358
+ TEST
359
+ program = make_plain_test_program(
360
+ snippet,
361
+ color_enabled: color_enabled,
362
+ )
363
+
364
+ expected_output = build_expected_output(
365
+ color_enabled: color_enabled,
366
+ snippet: %|expect(B.new).not_to respond_to(:foo).with_keywords(:bar)|,
367
+ expectation: proc {
368
+ line do
369
+ plain "Expected "
370
+ beta %|#<B>|
371
+ plain " not to respond to "
372
+ alpha %|:foo|
373
+ plain " with keyword "
374
+ alpha %|:bar|
375
+ plain "."
376
+ end
377
+ },
378
+ )
379
+
380
+ expect(program).
381
+ to produce_output_when_run(expected_output).
382
+ removing_object_ids.
383
+ in_color(color_enabled)
384
+ end
385
+ end
386
+ end
387
+
388
+ context "when a large number of methods are specified" do
389
+ it "produces the correct failure message when used in the positive" do
390
+ as_both_colored_and_uncolored do |color_enabled|
391
+ snippet = <<~TEST.strip
392
+ expect(double(:something_really_long)).to respond_to(:foo, :bar, :baz, :fizz, :buzz).with_keywords(:qux, :blargh)
393
+ TEST
394
+ program = make_plain_test_program(
395
+ snippet,
396
+ color_enabled: color_enabled,
397
+ )
398
+
399
+ expected_output = build_expected_output(
400
+ color_enabled: color_enabled,
401
+ snippet: %|expect(double(:something_really_long)).to respond_to(:foo, :bar, :baz, :fizz, :buzz).with_keywords(:qux, :blargh)|,
402
+ newline_before_expectation: true,
403
+ expectation: proc {
404
+ line do
405
+ plain " Expected "
406
+ beta %|#<Double :something_really_long>|
407
+ end
408
+
409
+ line do
410
+ plain "to respond to "
411
+ alpha %|:foo|
412
+ plain ", "
413
+ alpha %|:bar|
414
+ plain ", "
415
+ alpha %|:baz|
416
+ plain ", "
417
+ alpha %|:fizz|
418
+ plain " and "
419
+ alpha %|:buzz|
420
+ plain " with keywords "
421
+ alpha %|:qux|
422
+ plain " and "
423
+ alpha %|:blargh|
424
+ end
425
+ },
426
+ )
427
+
428
+ expect(program).
429
+ to produce_output_when_run(expected_output).
430
+ in_color(color_enabled)
431
+ end
432
+ end
433
+
434
+ it "produces the correct failure message when used in the negative" do
435
+ as_both_colored_and_uncolored do |color_enabled|
436
+ snippet = <<~TEST.strip
437
+ class B
438
+ def some_really_long_method_and_stuff(foo:, bar:); end
439
+ def another_method_or_whatever(foo:, bar:); end
440
+ end
441
+
442
+ expect(B.new).not_to respond_to(:some_really_long_method_and_stuff, :another_method_or_whatever).with_keywords(:foo, :bar)
443
+ TEST
444
+ program = make_plain_test_program(
445
+ snippet,
446
+ color_enabled: color_enabled,
447
+ )
448
+
449
+ expected_output = build_expected_output(
450
+ color_enabled: color_enabled,
451
+ snippet: %|expect(B.new).not_to respond_to(:some_really_long_method_and_stuff, :another_method_or_whatever).with_keywords(:foo, :bar)|,
452
+ newline_before_expectation: true,
453
+ expectation: proc {
454
+ line do
455
+ plain " Expected "
456
+ beta %|#<B>|
457
+ end
458
+
459
+ line do
460
+ plain "not to respond to "
461
+ alpha %|:some_really_long_method_and_stuff|
462
+ plain " and "
463
+ alpha %|:another_method_or_whatever|
464
+ plain " with keywords "
465
+ alpha %|:foo|
466
+ plain " and "
467
+ alpha %|:bar|
468
+ end
469
+ },
470
+ )
471
+
472
+ expect(program).
473
+ to produce_output_when_run(expected_output).
474
+ removing_object_ids.
475
+ in_color(color_enabled)
476
+ end
477
+ end
478
+ end
479
+ end
480
+
481
+ context "qualified with #with_any_keywords" do
482
+ context "when a few number of methods are specified" do
483
+ it "produces the correct failure message when used in the positive" do
484
+ as_both_colored_and_uncolored do |color_enabled|
485
+ snippet = <<~TEST.strip
486
+ expect(double).to respond_to(:foo).with_any_keywords
487
+ TEST
488
+ program = make_plain_test_program(
489
+ snippet,
490
+ color_enabled: color_enabled,
491
+ )
492
+
493
+ expected_output = build_expected_output(
494
+ color_enabled: color_enabled,
495
+ snippet: %|expect(double).to respond_to(:foo).with_any_keywords|,
496
+ expectation: proc {
497
+ line do
498
+ plain "Expected "
499
+ beta %|#<Double (anonymous)>|
500
+ plain " to respond to "
501
+ alpha %|:foo|
502
+ plain " with "
503
+ alpha %|any|
504
+ plain " keywords."
505
+ end
506
+ },
507
+ )
508
+
509
+ expect(program).
510
+ to produce_output_when_run(expected_output).
511
+ in_color(color_enabled)
512
+ end
513
+ end
514
+
515
+ it "produces the correct failure message when used in the negative" do
516
+ as_both_colored_and_uncolored do |color_enabled|
517
+ snippet = <<~TEST.strip
518
+ class B
519
+ def foo(**options); end
520
+ end
521
+
522
+ expect(B.new).not_to respond_to(:foo).with_any_keywords
523
+ TEST
524
+ program = make_plain_test_program(
525
+ snippet,
526
+ color_enabled: color_enabled,
527
+ )
528
+
529
+ expected_output = build_expected_output(
530
+ color_enabled: color_enabled,
531
+ snippet: %|expect(B.new).not_to respond_to(:foo).with_any_keywords|,
532
+ expectation: proc {
533
+ line do
534
+ plain "Expected "
535
+ beta %|#<B>|
536
+ plain " not to respond to "
537
+ alpha %|:foo|
538
+ plain " with "
539
+ alpha %|any|
540
+ plain " keywords."
541
+ end
542
+ },
543
+ )
544
+
545
+ expect(program).
546
+ to produce_output_when_run(expected_output).
547
+ removing_object_ids.
548
+ in_color(color_enabled)
549
+ end
550
+ end
551
+ end
552
+
553
+ context "when a large number of methods are specified" do
554
+ it "produces the correct failure message when used in the positive" do
555
+ as_both_colored_and_uncolored do |color_enabled|
556
+ snippet = <<~TEST.strip
557
+ expect(double(:something_really_long)).to respond_to(:foo, :bar, :baz, :qux, :fizz, :buzz).with_any_keywords
558
+ TEST
559
+ program = make_plain_test_program(
560
+ snippet,
561
+ color_enabled: color_enabled,
562
+ )
563
+
564
+ expected_output = build_expected_output(
565
+ color_enabled: color_enabled,
566
+ snippet: %|expect(double(:something_really_long)).to respond_to(:foo, :bar, :baz, :qux, :fizz, :buzz).with_any_keywords|,
567
+ newline_before_expectation: true,
568
+ expectation: proc {
569
+ line do
570
+ plain " Expected "
571
+ beta %|#<Double :something_really_long>|
572
+ end
573
+
574
+ line do
575
+ plain "to respond to "
576
+ alpha %|:foo|
577
+ plain ", "
578
+ alpha %|:bar|
579
+ plain ", "
580
+ alpha %|:baz|
581
+ plain ", "
582
+ alpha %|:qux|
583
+ plain ", "
584
+ alpha %|:fizz|
585
+ plain " and "
586
+ alpha %|:buzz|
587
+ plain " with "
588
+ alpha %|any|
589
+ plain " keywords "
590
+ end
591
+ },
592
+ )
593
+
594
+ expect(program).
595
+ to produce_output_when_run(expected_output).
596
+ in_color(color_enabled)
597
+ end
598
+ end
599
+
600
+ it "produces the correct failure message when used in the negative" do
601
+ as_both_colored_and_uncolored do |color_enabled|
602
+ snippet = <<~TEST.strip
603
+ class B
604
+ def some_really_long_method_and_stuff(**options); end
605
+ def another_method_or_whatever(**options); end
606
+ end
607
+
608
+ expect(B.new).not_to respond_to(:some_really_long_method_and_stuff, :another_method_or_whatever).with_any_keywords
609
+ TEST
610
+ program = make_plain_test_program(
611
+ snippet,
612
+ color_enabled: color_enabled,
613
+ )
614
+
615
+ expected_output = build_expected_output(
616
+ color_enabled: color_enabled,
617
+ snippet: %|expect(B.new).not_to respond_to(:some_really_long_method_and_stuff, :another_method_or_whatever).with_any_keywords|,
618
+ newline_before_expectation: true,
619
+ expectation: proc {
620
+ line do
621
+ plain " Expected "
622
+ beta %|#<B>|
623
+ end
624
+
625
+ line do
626
+ plain "not to respond to "
627
+ alpha %|:some_really_long_method_and_stuff|
628
+ plain " and "
629
+ alpha %|:another_method_or_whatever|
630
+ plain " with "
631
+ alpha %|any|
632
+ plain " keywords "
633
+ end
634
+ },
635
+ )
636
+
637
+ expect(program).
638
+ to produce_output_when_run(expected_output).
639
+ removing_object_ids.
640
+ in_color(color_enabled)
641
+ end
642
+ end
643
+ end
644
+ end
645
+
646
+ context "qualified with #with_unlimited_arguments" do
647
+ context "when a few number of methods are specified" do
648
+ it "produces the correct failure message when used in the positive" do
649
+ as_both_colored_and_uncolored do |color_enabled|
650
+ snippet = <<~TEST.strip
651
+ expect(double).to respond_to(:foo).with_unlimited_arguments
652
+ TEST
653
+ program = make_plain_test_program(
654
+ snippet,
655
+ color_enabled: color_enabled,
656
+ )
657
+
658
+ expected_output = build_expected_output(
659
+ color_enabled: color_enabled,
660
+ snippet: %|expect(double).to respond_to(:foo).with_unlimited_arguments|,
661
+ expectation: proc {
662
+ line do
663
+ plain "Expected "
664
+ beta %|#<Double (anonymous)>|
665
+ plain " to respond to "
666
+ alpha %|:foo|
667
+ plain " with "
668
+ alpha %|unlimited|
669
+ plain " arguments."
670
+ end
671
+ },
672
+ )
673
+
674
+ expect(program).
675
+ to produce_output_when_run(expected_output).
676
+ in_color(color_enabled)
677
+ end
678
+ end
679
+
680
+ it "produces the correct failure message when used in the negative" do
681
+ as_both_colored_and_uncolored do |color_enabled|
682
+ snippet = <<~TEST.strip
683
+ class B
684
+ def foo(*args); end
685
+ end
686
+
687
+ expect(B.new).not_to respond_to(:foo).with_unlimited_arguments
688
+ TEST
689
+ program = make_plain_test_program(
690
+ snippet,
691
+ color_enabled: color_enabled,
692
+ )
693
+
694
+ expected_output = build_expected_output(
695
+ color_enabled: color_enabled,
696
+ snippet: %|expect(B.new).not_to respond_to(:foo).with_unlimited_arguments|,
697
+ expectation: proc {
698
+ line do
699
+ plain "Expected "
700
+ beta %|#<B>|
701
+ plain " not to respond to "
702
+ alpha %|:foo|
703
+ plain " with "
704
+ alpha %|unlimited|
705
+ plain " arguments."
706
+ end
707
+ },
708
+ )
709
+
710
+ expect(program).
711
+ to produce_output_when_run(expected_output).
712
+ removing_object_ids.
713
+ in_color(color_enabled)
714
+ end
715
+ end
716
+ end
717
+
718
+ context "when a large number of methods are specified" do
719
+ it "produces the correct failure message when used in the positive" do
720
+ as_both_colored_and_uncolored do |color_enabled|
721
+ snippet = <<~TEST.strip
722
+ expect(double(:something_really_long)).to respond_to(:foo, :bar, :baz).with_unlimited_arguments
723
+ TEST
724
+ program = make_plain_test_program(
725
+ snippet,
726
+ color_enabled: color_enabled,
727
+ )
728
+
729
+ expected_output = build_expected_output(
730
+ color_enabled: color_enabled,
731
+ snippet: %|expect(double(:something_really_long)).to respond_to(:foo, :bar, :baz).with_unlimited_arguments|,
732
+ newline_before_expectation: true,
733
+ expectation: proc {
734
+ line do
735
+ plain " Expected "
736
+ beta %|#<Double :something_really_long>|
737
+ end
738
+
739
+ line do
740
+ plain "to respond to "
741
+ alpha %|:foo|
742
+ plain ", "
743
+ alpha %|:bar|
744
+ plain " and "
745
+ alpha %|:baz|
746
+ plain " with "
747
+ alpha %|unlimited|
748
+ plain " arguments"
749
+ end
750
+ },
751
+ )
752
+
753
+ expect(program).
754
+ to produce_output_when_run(expected_output).
755
+ in_color(color_enabled)
756
+ end
757
+ end
758
+
759
+ it "produces the correct failure message when used in the negative" do
760
+ as_both_colored_and_uncolored do |color_enabled|
761
+ snippet = <<~TEST.strip
762
+ class B
763
+ def some_really_long_method_and_stuff(*args); end
764
+ def another_method_or_whatever(*args); end
765
+ end
766
+
767
+ expect(B.new).not_to respond_to(:some_really_long_method_and_stuff, :another_method_or_whatever).with_unlimited_arguments
768
+ TEST
769
+ program = make_plain_test_program(
770
+ snippet,
771
+ color_enabled: color_enabled,
772
+ )
773
+
774
+ expected_output = build_expected_output(
775
+ color_enabled: color_enabled,
776
+ snippet: %|expect(B.new).not_to respond_to(:some_really_long_method_and_stuff, :another_method_or_whatever).with_unlimited_arguments|,
777
+ newline_before_expectation: true,
778
+ expectation: proc {
779
+ line do
780
+ plain " Expected "
781
+ beta %|#<B>|
782
+ end
783
+
784
+ line do
785
+ plain "not to respond to "
786
+ alpha %|:some_really_long_method_and_stuff|
787
+ plain " and "
788
+ alpha %|:another_method_or_whatever|
789
+ plain " with "
790
+ alpha %|unlimited|
791
+ plain " arguments"
792
+ end
793
+ },
794
+ )
795
+
796
+ expect(program).
797
+ to produce_output_when_run(expected_output).
798
+ removing_object_ids.
799
+ in_color(color_enabled)
800
+ end
801
+ end
802
+ end
803
+ end
804
+
805
+ context "qualified with #with_any_keywords + #with_unlimited_arguments" do
806
+ it "produces the correct failure message when used in the positive" do
807
+ as_both_colored_and_uncolored do |color_enabled|
808
+ snippet = <<~TEST.strip
809
+ expect(double(:something_really_long)).to respond_to(:foo, :bar, :baz).with_any_keywords.with_unlimited_arguments
810
+ TEST
811
+ program = make_plain_test_program(
812
+ snippet,
813
+ color_enabled: color_enabled,
814
+ )
815
+
816
+ expected_output = build_expected_output(
817
+ color_enabled: color_enabled,
818
+ snippet: %|expect(double(:something_really_long)).to respond_to(:foo, :bar, :baz).with_any_keywords.with_unlimited_arguments|,
819
+ newline_before_expectation: true,
820
+ expectation: proc {
821
+ line do
822
+ plain " Expected "
823
+ beta %|#<Double :something_really_long>|
824
+ end
825
+
826
+ line do
827
+ plain "to respond to "
828
+ alpha %|:foo|
829
+ plain ", "
830
+ alpha %|:bar|
831
+ plain " and "
832
+ alpha %|:baz|
833
+ plain " with "
834
+ alpha %|any|
835
+ plain " keywords and "
836
+ alpha %|unlimited|
837
+ plain " arguments"
838
+ end
839
+ },
840
+ )
841
+
842
+ expect(program).
843
+ to produce_output_when_run(expected_output).
844
+ in_color(color_enabled)
845
+ end
846
+ end
847
+
848
+ it "produces the correct failure message when used in the negative" do
849
+ as_both_colored_and_uncolored do |color_enabled|
850
+ snippet = <<~TEST.strip
851
+ class B
852
+ def foo(*args, **options); end
853
+ def bar(*args, **options); end
854
+ def baz(*args, **options); end
855
+ end
856
+
857
+ expect(B.new).not_to respond_to(:foo, :bar, :baz).with_any_keywords.with_unlimited_arguments
858
+ TEST
859
+ program = make_plain_test_program(
860
+ snippet,
861
+ color_enabled: color_enabled,
862
+ )
863
+
864
+ expected_output = build_expected_output(
865
+ color_enabled: color_enabled,
866
+ snippet: %|expect(B.new).not_to respond_to(:foo, :bar, :baz).with_any_keywords.with_unlimited_arguments|,
867
+ newline_before_expectation: true,
868
+ expectation: proc {
869
+ line do
870
+ plain " Expected "
871
+ beta %|#<B>|
872
+ end
873
+
874
+ line do
875
+ plain "not to respond to "
876
+ alpha %|:foo|
877
+ plain ", "
878
+ alpha %|:bar|
879
+ plain " and "
880
+ alpha %|:baz|
881
+ plain " with "
882
+ alpha %|any|
883
+ plain " keywords and "
884
+ alpha %|unlimited|
885
+ plain " arguments"
886
+ end
887
+ },
888
+ )
889
+
890
+ expect(program).
891
+ to produce_output_when_run(expected_output).
892
+ removing_object_ids.
893
+ in_color(color_enabled)
894
+ end
895
+ end
896
+ end
897
+
898
+ context "qualified with #with_keywords + #with_unlimited_arguments" do
899
+ it "produces the correct failure message when used in the positive" do
900
+ as_both_colored_and_uncolored do |color_enabled|
901
+ snippet = <<~TEST.strip
902
+ expect(double(:something_really_long)).to respond_to(:foo, :bar, :baz).with_keywords(:qux, :blargh).with_unlimited_arguments
903
+ TEST
904
+ program = make_plain_test_program(
905
+ snippet,
906
+ color_enabled: color_enabled,
907
+ )
908
+
909
+ expected_output = build_expected_output(
910
+ color_enabled: color_enabled,
911
+ snippet: %|expect(double(:something_really_long)).to respond_to(:foo, :bar, :baz).with_keywords(:qux, :blargh).with_unlimited_arguments|,
912
+ newline_before_expectation: true,
913
+ expectation: proc {
914
+ line do
915
+ plain " Expected "
916
+ beta %|#<Double :something_really_long>|
917
+ end
918
+
919
+ line do
920
+ plain "to respond to "
921
+ alpha %|:foo|
922
+ plain ", "
923
+ alpha %|:bar|
924
+ plain " and "
925
+ alpha %|:baz|
926
+ plain " with keywords "
927
+ alpha %|:qux|
928
+ plain " and "
929
+ alpha %|:blargh|
930
+ plain " and "
931
+ alpha %|unlimited|
932
+ plain " arguments"
933
+ end
934
+ },
935
+ )
936
+
937
+ expect(program).
938
+ to produce_output_when_run(expected_output).
939
+ in_color(color_enabled)
940
+ end
941
+ end
942
+
943
+ it "produces the correct failure message when used in the negative" do
944
+ as_both_colored_and_uncolored do |color_enabled|
945
+ snippet = <<~TEST.strip
946
+ class B
947
+ def foo(*args, qux:, blargh:); end
948
+ def bar(*args, qux:, blargh:); end
949
+ def baz(*args, qux:, blargh:); end
950
+ end
951
+
952
+ expect(B.new).not_to respond_to(:foo, :bar, :baz).with_keywords(:qux, :blargh).with_unlimited_arguments
953
+ TEST
954
+ program = make_plain_test_program(
955
+ snippet,
956
+ color_enabled: color_enabled,
957
+ )
958
+
959
+ expected_output = build_expected_output(
960
+ color_enabled: color_enabled,
961
+ snippet: %|expect(B.new).not_to respond_to(:foo, :bar, :baz).with_keywords(:qux, :blargh).with_unlimited_arguments|,
962
+ newline_before_expectation: true,
963
+ expectation: proc {
964
+ line do
965
+ plain " Expected "
966
+ beta %|#<B>|
967
+ end
968
+
969
+ line do
970
+ plain "not to respond to "
971
+ alpha %|:foo|
972
+ plain ", "
973
+ alpha %|:bar|
974
+ plain " and "
975
+ alpha %|:baz|
976
+ plain " with keywords "
977
+ alpha %|:qux|
978
+ plain " and "
979
+ alpha %|:blargh|
980
+ plain " and "
981
+ alpha %|unlimited|
982
+ plain " arguments"
983
+ end
984
+ },
985
+ )
986
+
987
+ expect(program).
988
+ to produce_output_when_run(expected_output).
989
+ removing_object_ids.
990
+ in_color(color_enabled)
991
+ end
992
+ end
993
+ end
994
+ end