super_diff 0.9.0 → 0.11.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.
Files changed (212) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +65 -26
  3. data/lib/super_diff/active_record/differs/active_record_relation.rb +1 -2
  4. data/lib/super_diff/active_record/differs.rb +1 -1
  5. data/lib/super_diff/active_record/object_inspection/inspection_tree_builders/active_record_model.rb +22 -18
  6. data/lib/super_diff/active_record/object_inspection/inspection_tree_builders/active_record_relation.rb +14 -7
  7. data/lib/super_diff/active_record/object_inspection/inspection_tree_builders.rb +2 -2
  8. data/lib/super_diff/active_record/object_inspection.rb +1 -1
  9. data/lib/super_diff/active_record/operation_tree_builders/active_record_model.rb +1 -2
  10. data/lib/super_diff/active_record/operation_tree_builders/active_record_relation.rb +1 -2
  11. data/lib/super_diff/active_record/operation_tree_builders.rb +2 -2
  12. data/lib/super_diff/active_record/operation_tree_flatteners.rb +1 -1
  13. data/lib/super_diff/active_record/operation_trees.rb +1 -1
  14. data/lib/super_diff/active_record.rb +7 -15
  15. data/lib/super_diff/active_support/differs/hash_with_indifferent_access.rb +5 -6
  16. data/lib/super_diff/active_support/differs.rb +1 -1
  17. data/lib/super_diff/active_support/object_inspection/inspection_tree_builders/hash_with_indifferent_access.rb +20 -11
  18. data/lib/super_diff/active_support/object_inspection/inspection_tree_builders/ordered_options.rb +46 -0
  19. data/lib/super_diff/active_support/object_inspection/inspection_tree_builders.rb +5 -1
  20. data/lib/super_diff/active_support/object_inspection.rb +1 -1
  21. data/lib/super_diff/active_support/operation_tree_builders/hash_with_indifferent_access.rb +5 -6
  22. data/lib/super_diff/active_support/operation_tree_builders.rb +1 -1
  23. data/lib/super_diff/active_support/operation_tree_flatteners.rb +1 -1
  24. data/lib/super_diff/active_support/operation_trees.rb +1 -1
  25. data/lib/super_diff/active_support.rb +6 -10
  26. data/lib/super_diff/colorized_document_extensions.rb +2 -4
  27. data/lib/super_diff/configuration.rb +14 -8
  28. data/lib/super_diff/csi/color.rb +4 -4
  29. data/lib/super_diff/csi/colorized_document.rb +12 -16
  30. data/lib/super_diff/csi/document.rb +8 -19
  31. data/lib/super_diff/csi/eight_bit_color.rb +19 -19
  32. data/lib/super_diff/csi/four_bit_color.rb +82 -31
  33. data/lib/super_diff/csi/twenty_four_bit_color.rb +12 -11
  34. data/lib/super_diff/csi/uncolorized_document.rb +2 -6
  35. data/lib/super_diff/csi.rb +10 -14
  36. data/lib/super_diff/diff_formatters/collection.rb +35 -41
  37. data/lib/super_diff/differs/date_like.rb +15 -0
  38. data/lib/super_diff/differs/default_object.rb +1 -1
  39. data/lib/super_diff/differs/defaults.rb +2 -1
  40. data/lib/super_diff/differs/main.rb +2 -13
  41. data/lib/super_diff/differs.rb +1 -0
  42. data/lib/super_diff/equality_matchers/array.rb +10 -12
  43. data/lib/super_diff/equality_matchers/base.rb +1 -1
  44. data/lib/super_diff/equality_matchers/default.rb +2 -4
  45. data/lib/super_diff/equality_matchers/defaults.rb +1 -1
  46. data/lib/super_diff/equality_matchers/hash.rb +10 -12
  47. data/lib/super_diff/equality_matchers/multiline_string.rb +11 -13
  48. data/lib/super_diff/equality_matchers/primitive.rb +10 -12
  49. data/lib/super_diff/equality_matchers/singleline_string.rb +10 -12
  50. data/lib/super_diff/equality_matchers.rb +1 -1
  51. data/lib/super_diff/errors.rb +2 -6
  52. data/lib/super_diff/gem_version.rb +3 -3
  53. data/lib/super_diff/helpers.rb +10 -10
  54. data/lib/super_diff/implementation_checks.rb +2 -2
  55. data/lib/super_diff/line.rb +3 -3
  56. data/lib/super_diff/object_inspection/inspection_tree.rb +64 -73
  57. data/lib/super_diff/object_inspection/inspection_tree_builders/array.rb +29 -14
  58. data/lib/super_diff/object_inspection/inspection_tree_builders/custom_object.rb +17 -13
  59. data/lib/super_diff/object_inspection/inspection_tree_builders/date_like.rb +51 -0
  60. data/lib/super_diff/object_inspection/inspection_tree_builders/default_object.rb +43 -27
  61. data/lib/super_diff/object_inspection/inspection_tree_builders/defaults.rb +2 -1
  62. data/lib/super_diff/object_inspection/inspection_tree_builders/hash.rb +35 -18
  63. data/lib/super_diff/object_inspection/inspection_tree_builders/primitive.rb +3 -5
  64. data/lib/super_diff/object_inspection/inspection_tree_builders/time_like.rb +30 -36
  65. data/lib/super_diff/object_inspection/inspection_tree_builders.rb +13 -9
  66. data/lib/super_diff/object_inspection/nodes/as_lines_when_rendering_to_lines.rb +11 -22
  67. data/lib/super_diff/object_inspection/nodes/as_prefix_when_rendering_to_lines.rb +1 -5
  68. data/lib/super_diff/object_inspection/nodes/as_prelude_when_rendering_to_lines.rb +1 -5
  69. data/lib/super_diff/object_inspection/nodes/as_single_line.rb +3 -7
  70. data/lib/super_diff/object_inspection/nodes/base.rb +9 -14
  71. data/lib/super_diff/object_inspection/nodes/inspection.rb +26 -34
  72. data/lib/super_diff/object_inspection/nodes/nesting.rb +1 -1
  73. data/lib/super_diff/object_inspection/nodes/only_when.rb +2 -6
  74. data/lib/super_diff/object_inspection/nodes/text.rb +1 -5
  75. data/lib/super_diff/object_inspection/nodes/when_empty.rb +2 -6
  76. data/lib/super_diff/object_inspection/nodes/when_non_empty.rb +2 -6
  77. data/lib/super_diff/object_inspection/nodes/when_rendering_to_lines.rb +1 -1
  78. data/lib/super_diff/object_inspection/nodes/when_rendering_to_string.rb +1 -5
  79. data/lib/super_diff/object_inspection/nodes.rb +7 -7
  80. data/lib/super_diff/object_inspection.rb +3 -3
  81. data/lib/super_diff/operation_tree_builders/array.rb +12 -11
  82. data/lib/super_diff/operation_tree_builders/base.rb +17 -15
  83. data/lib/super_diff/operation_tree_builders/custom_object.rb +8 -6
  84. data/lib/super_diff/operation_tree_builders/date_like.rb +15 -0
  85. data/lib/super_diff/operation_tree_builders/default_object.rb +29 -21
  86. data/lib/super_diff/operation_tree_builders/defaults.rb +1 -1
  87. data/lib/super_diff/operation_tree_builders/hash.rb +23 -24
  88. data/lib/super_diff/operation_tree_builders/main.rb +4 -11
  89. data/lib/super_diff/operation_tree_builders/multiline_string.rb +3 -3
  90. data/lib/super_diff/operation_tree_builders/time_like.rb +1 -11
  91. data/lib/super_diff/operation_tree_builders.rb +2 -1
  92. data/lib/super_diff/operation_tree_flatteners/base.rb +1 -5
  93. data/lib/super_diff/operation_tree_flatteners/collection.rb +13 -16
  94. data/lib/super_diff/operation_tree_flatteners/default_object.rb +1 -2
  95. data/lib/super_diff/operation_tree_flatteners/hash.rb +2 -10
  96. data/lib/super_diff/operation_tree_flatteners/multiline_string.rb +2 -1
  97. data/lib/super_diff/operation_tree_flatteners.rb +3 -3
  98. data/lib/super_diff/operation_trees/base.rb +3 -5
  99. data/lib/super_diff/operation_trees/default_object.rb +1 -3
  100. data/lib/super_diff/operations/binary_operation.rb +2 -2
  101. data/lib/super_diff/operations/unary_operation.rb +1 -1
  102. data/lib/super_diff/rails.rb +2 -1
  103. data/lib/super_diff/recursion_guard.rb +5 -4
  104. data/lib/super_diff/rspec/augmented_matcher.rb +4 -5
  105. data/lib/super_diff/rspec/differ.rb +6 -13
  106. data/lib/super_diff/rspec/differs/collection_containing_exactly.rb +3 -2
  107. data/lib/super_diff/rspec/differs/collection_including.rb +1 -1
  108. data/lib/super_diff/rspec/differs/hash_including.rb +1 -1
  109. data/lib/super_diff/rspec/differs.rb +3 -3
  110. data/lib/super_diff/rspec/matcher_text_builders/base.rb +13 -15
  111. data/lib/super_diff/rspec/matcher_text_builders/be_predicate.rb +5 -7
  112. data/lib/super_diff/rspec/matcher_text_builders/have_predicate.rb +3 -5
  113. data/lib/super_diff/rspec/matcher_text_builders/raise_error.rb +2 -10
  114. data/lib/super_diff/rspec/matcher_text_builders/respond_to.rb +2 -6
  115. data/lib/super_diff/rspec/matcher_text_builders.rb +5 -8
  116. data/lib/super_diff/rspec/matcher_text_template.rb +13 -16
  117. data/lib/super_diff/rspec/monkey_patches.rb +180 -123
  118. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/collection_containing_exactly.rb +14 -7
  119. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/collection_including.rb +21 -13
  120. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/double.rb +35 -36
  121. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/generic_describable_matcher.rb +19 -0
  122. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/hash_including.rb +21 -15
  123. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/instance_of.rb +11 -10
  124. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/kind_of.rb +11 -10
  125. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/object_having_attributes.rb +14 -7
  126. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/value_within.rb +10 -11
  127. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders.rb +13 -9
  128. data/lib/super_diff/rspec/object_inspection.rb +1 -1
  129. data/lib/super_diff/rspec/operation_tree_builders/collection_containing_exactly.rb +11 -10
  130. data/lib/super_diff/rspec/operation_tree_builders/collection_including.rb +7 -6
  131. data/lib/super_diff/rspec/operation_tree_builders/hash_including.rb +11 -10
  132. data/lib/super_diff/rspec/operation_tree_builders/object_having_attributes.rb +22 -17
  133. data/lib/super_diff/rspec/operation_tree_builders.rb +4 -4
  134. data/lib/super_diff/rspec.rb +17 -18
  135. data/lib/super_diff/tiered_lines_elider.rb +87 -115
  136. data/lib/super_diff/tiered_lines_formatter.rb +5 -9
  137. data/lib/super_diff/version.rb +1 -1
  138. data/lib/super_diff.rb +13 -9
  139. data/spec/examples.txt +541 -483
  140. data/spec/integration/rails/active_record_spec.rb +3 -1
  141. data/spec/integration/rails/engines_spec.rb +25 -0
  142. data/spec/integration/rails/hash_with_indifferent_access_spec.rb +3 -1
  143. data/spec/integration/rspec/be_falsey_matcher_spec.rb +40 -35
  144. data/spec/integration/rspec/be_matcher_spec.rb +360 -320
  145. data/spec/integration/rspec/be_nil_matcher_spec.rb +38 -34
  146. data/spec/integration/rspec/be_predicate_matcher_spec.rb +376 -359
  147. data/spec/integration/rspec/be_truthy_matcher_spec.rb +38 -33
  148. data/spec/integration/rspec/contain_exactly_matcher_spec.rb +257 -254
  149. data/spec/integration/rspec/eq_matcher_spec.rb +695 -585
  150. data/spec/integration/rspec/generic_describable_matchers_spec.rb +177 -0
  151. data/spec/integration/rspec/have_attributes_matcher_spec.rb +312 -304
  152. data/spec/integration/rspec/have_predicate_matcher_spec.rb +291 -297
  153. data/spec/integration/rspec/include_matcher_spec.rb +327 -225
  154. data/spec/integration/rspec/magic_metadata_spec.rb +51 -0
  155. data/spec/integration/rspec/match_array_matcher_spec.rb +294 -291
  156. data/spec/integration/rspec/match_matcher_spec.rb +916 -903
  157. data/spec/integration/rspec/raise_error_matcher_spec.rb +1208 -449
  158. data/spec/integration/rspec/respond_to_matcher_spec.rb +702 -697
  159. data/spec/integration/rspec/third_party_matcher_spec.rb +142 -138
  160. data/spec/integration/rspec/unhandled_errors_spec.rb +88 -84
  161. data/spec/internal/log/test.log +0 -0
  162. data/spec/spec_helper.rb +20 -20
  163. data/spec/support/command_runner.rb +34 -57
  164. data/spec/support/integration/helpers.rb +44 -32
  165. data/spec/support/integration/matchers/produce_output_when_run_matcher.rb +28 -23
  166. data/spec/support/integration/matchers.rb +34 -0
  167. data/spec/support/integration/test_programs/base.rb +17 -22
  168. data/spec/support/integration/test_programs/plain.rb +6 -0
  169. data/spec/support/integration/test_programs/rspec_active_record.rb +4 -1
  170. data/spec/support/integration/test_programs/rspec_active_support.rb +4 -1
  171. data/spec/support/integration/test_programs/rspec_rails.rb +4 -1
  172. data/spec/support/integration/test_programs/rspec_rails_engine.rb +20 -0
  173. data/spec/support/models/active_record/person.rb +6 -4
  174. data/spec/support/models/active_record/shipping_address.rb +9 -10
  175. data/spec/support/models/customer.rb +2 -4
  176. data/spec/support/models/player.rb +3 -6
  177. data/spec/support/models/shipping_address.rb +4 -13
  178. data/spec/support/shared_examples/active_record.rb +258 -240
  179. data/spec/support/shared_examples/active_support.rb +174 -51
  180. data/spec/support/shared_examples/elided_diffs.rb +447 -423
  181. data/spec/support/shared_examples/hash_with_indifferent_access.rb +500 -464
  182. data/spec/support/shared_examples/key.rb +123 -0
  183. data/spec/support/unit/helpers.rb +1 -3
  184. data/spec/support/unit/matchers/match_output.rb +12 -13
  185. data/spec/unit/active_record/object_inspection_spec.rb +222 -206
  186. data/spec/unit/active_support/object_inspection_spec.rb +170 -0
  187. data/spec/unit/equality_matchers/main_spec.rb +1049 -984
  188. data/spec/unit/helpers_spec.rb +14 -21
  189. data/spec/unit/operation_tree_flatteners/array_spec.rb +557 -524
  190. data/spec/unit/operation_tree_flatteners/custom_object_spec.rb +619 -601
  191. data/spec/unit/operation_tree_flatteners/default_object_spec.rb +619 -621
  192. data/spec/unit/operation_tree_flatteners/hash_spec.rb +595 -556
  193. data/spec/unit/operation_tree_flatteners/multiline_string_spec.rb +102 -92
  194. data/spec/unit/rspec/matchers/be_compared_to_spec.rb +3 -3
  195. data/spec/unit/rspec/matchers/be_predicate_spec.rb +3 -3
  196. data/spec/unit/rspec/matchers/contain_exactly_spec.rb +1 -1
  197. data/spec/unit/rspec/matchers/have_attributes_spec.rb +1 -1
  198. data/spec/unit/rspec/matchers/have_predicate_spec.rb +2 -2
  199. data/spec/unit/rspec/matchers/include_spec.rb +2 -2
  200. data/spec/unit/rspec/matchers/match_array_spec.rb +2 -2
  201. data/spec/unit/rspec/matchers/raise_error_spec.rb +43 -11
  202. data/spec/unit/rspec/matchers/respond_to_spec.rb +23 -16
  203. data/spec/unit/rspec/object_inspection/rspec_matcher_spec.rb +91 -0
  204. data/spec/unit/rspec/object_inspection_spec.rb +351 -326
  205. data/spec/unit/super_diff_spec.rb +1594 -1437
  206. data/spec/unit/tiered_lines_elider_spec.rb +3508 -3536
  207. data/spec/unit/tiered_lines_formatter_spec.rb +54 -116
  208. data/super_diff.gemspec +13 -12
  209. metadata +88 -75
  210. data/lib/super_diff/errors/no_diff_formatter_available_error.rb +0 -21
  211. data/lib/super_diff/errors/no_operational_sequencer_available_error.rb +0 -22
  212. data/spec/tmp/warnings_logger/all_warnings.txt +0 -2
@@ -1,47 +1,48 @@
1
1
  require "spec_helper"
2
2
 
3
- RSpec.describe "Integration with RSpec's #match_array matcher", type: :integration do
3
+ RSpec.describe "Integration with RSpec's #match_array matcher",
4
+ type: :integration do
4
5
  context "when a few number of values are given" do
5
6
  it "produces the correct failure message when used in the positive" do
6
7
  as_both_colored_and_uncolored do |color_enabled|
7
8
  snippet = <<~TEST.strip
9
+ actual = ["Marty", "Jennifer", "Doc"]
8
10
  expected = ["Einie", "Marty"]
9
- actual = ["Marty", "Jennifer", "Doc"]
10
11
  expect(actual).to match_array(expected)
11
12
  TEST
12
- program = make_plain_test_program(
13
- snippet,
14
- color_enabled: color_enabled,
15
- )
13
+ program = make_plain_test_program(snippet, color_enabled: color_enabled)
16
14
 
17
- expected_output = build_expected_output(
18
- color_enabled: color_enabled,
19
- snippet: %|expect(actual).to match_array(expected)|,
20
- expectation: proc {
21
- line do
22
- plain %|Expected |
23
- actual %|["Marty", "Jennifer", "Doc"]|
24
- plain %| to match array with |
25
- expected %|"Einie"|
26
- plain %| and |
27
- expected %|"Marty"|
28
- plain %|.|
29
- end
30
- },
31
- diff: proc {
32
- plain_line %| [|
33
- plain_line %| "Marty",|
34
- actual_line %|+ "Jennifer",|
35
- actual_line %|+ "Doc",|
36
- # expected_line %|- "Einie"| # TODO
37
- expected_line %|- "Einie",|
38
- plain_line %| ]|
39
- },
40
- )
15
+ expected_output =
16
+ build_expected_output(
17
+ color_enabled: color_enabled,
18
+ snippet: "expect(actual).to match_array(expected)",
19
+ expectation:
20
+ proc do
21
+ line do
22
+ plain "Expected "
23
+ actual %|["Marty", "Jennifer", "Doc"]|
24
+ plain " to match array with "
25
+ expected %|"Einie"|
26
+ plain " and "
27
+ expected %|"Marty"|
28
+ plain "."
29
+ end
30
+ end,
31
+ diff:
32
+ proc do
33
+ plain_line " ["
34
+ plain_line %| "Marty",|
35
+ actual_line %|+ "Jennifer",|
36
+ actual_line %|+ "Doc",|
37
+ # expected_line %|- "Einie"| # TODO
38
+ expected_line %|- "Einie",|
39
+ plain_line " ]"
40
+ end
41
+ )
41
42
 
42
- expect(program).
43
- to produce_output_when_run(expected_output).
44
- in_color(color_enabled)
43
+ expect(program).to produce_output_when_run(expected_output).in_color(
44
+ color_enabled
45
+ )
45
46
  end
46
47
  end
47
48
 
@@ -51,30 +52,29 @@ RSpec.describe "Integration with RSpec's #match_array matcher", type: :integrati
51
52
  values = ["Einie", "Marty"]
52
53
  expect(values).not_to match_array(values)
53
54
  TEST
54
- program = make_plain_test_program(
55
- snippet,
56
- color_enabled: color_enabled,
57
- )
55
+ program = make_plain_test_program(snippet, color_enabled: color_enabled)
58
56
 
59
- expected_output = build_expected_output(
60
- color_enabled: color_enabled,
61
- snippet: %|expect(values).not_to match_array(values)|,
62
- expectation: proc {
63
- line do
64
- plain %|Expected |
65
- actual %|["Einie", "Marty"]|
66
- plain %| not to match array with |
67
- expected %|"Einie"|
68
- plain %| and |
69
- expected %|"Marty"|
70
- plain %|.|
71
- end
72
- },
73
- )
57
+ expected_output =
58
+ build_expected_output(
59
+ color_enabled: color_enabled,
60
+ snippet: "expect(values).not_to match_array(values)",
61
+ expectation:
62
+ proc do
63
+ line do
64
+ plain "Expected "
65
+ actual %|["Einie", "Marty"]|
66
+ plain " not to match array with "
67
+ expected %|"Einie"|
68
+ plain " and "
69
+ expected %|"Marty"|
70
+ plain "."
71
+ end
72
+ end
73
+ )
74
74
 
75
- expect(program).
76
- to produce_output_when_run(expected_output).
77
- in_color(color_enabled)
75
+ expect(program).to produce_output_when_run(expected_output).in_color(
76
+ color_enabled
77
+ )
78
78
  end
79
79
  end
80
80
  end
@@ -84,6 +84,12 @@ RSpec.describe "Integration with RSpec's #match_array matcher", type: :integrati
84
84
  it "produces the correct failure message when used in the positive" do
85
85
  as_both_colored_and_uncolored do |color_enabled|
86
86
  snippet = <<~TEST.strip
87
+ actual = [
88
+ "Marty McFly",
89
+ "Doc Brown",
90
+ "Einie",
91
+ "Lorraine McFly"
92
+ ]
87
93
  expected = [
88
94
  "Doc Brown",
89
95
  "Marty McFly",
@@ -91,57 +97,52 @@ RSpec.describe "Integration with RSpec's #match_array matcher", type: :integrati
91
97
  "George McFly",
92
98
  "Lorraine McFly"
93
99
  ]
94
- actual = [
95
- "Marty McFly",
96
- "Doc Brown",
97
- "Einie",
98
- "Lorraine McFly"
99
- ]
100
100
  expect(actual).to match_array(expected)
101
101
  TEST
102
- program = make_plain_test_program(
103
- snippet,
104
- color_enabled: color_enabled,
105
- )
102
+ program =
103
+ make_plain_test_program(snippet, color_enabled: color_enabled)
106
104
 
107
- expected_output = build_expected_output(
108
- color_enabled: color_enabled,
109
- snippet: %|expect(actual).to match_array(expected)|,
110
- expectation: proc {
111
- line do
112
- plain %| Expected |
113
- actual %|["Marty McFly", "Doc Brown", "Einie", "Lorraine McFly"]|
114
- end
105
+ expected_output =
106
+ build_expected_output(
107
+ color_enabled: color_enabled,
108
+ snippet: "expect(actual).to match_array(expected)",
109
+ expectation:
110
+ proc do
111
+ line do
112
+ plain " Expected "
113
+ actual %|["Marty McFly", "Doc Brown", "Einie", "Lorraine McFly"]|
114
+ end
115
115
 
116
- line do
117
- plain %|to match array with |
118
- expected %|"Doc Brown"|
119
- plain %|, |
120
- expected %|"Marty McFly"|
121
- plain %|, |
122
- expected %|"Biff Tannen"|
123
- plain %|, |
124
- expected %|"George McFly"|
125
- plain %| and |
126
- expected %|"Lorraine McFly"|
127
- end
128
- },
129
- diff: proc {
130
- plain_line %| [|
131
- plain_line %| "Marty McFly",|
132
- plain_line %| "Doc Brown",|
133
- plain_line %| "Lorraine McFly",|
134
- actual_line %|+ "Einie",|
135
- expected_line %|- "Biff Tannen",|
136
- # expected_line %|- "George McFly"| # TODO
137
- expected_line %|- "George McFly",|
138
- plain_line %| ]|
139
- },
140
- )
116
+ line do
117
+ plain "to match array with "
118
+ expected %|"Doc Brown"|
119
+ plain ", "
120
+ expected %|"Marty McFly"|
121
+ plain ", "
122
+ expected %|"Biff Tannen"|
123
+ plain ", "
124
+ expected %|"George McFly"|
125
+ plain " and "
126
+ expected %|"Lorraine McFly"|
127
+ end
128
+ end,
129
+ diff:
130
+ proc do
131
+ plain_line " ["
132
+ plain_line %| "Marty McFly",|
133
+ plain_line %| "Doc Brown",|
134
+ plain_line %| "Lorraine McFly",|
135
+ actual_line %|+ "Einie",|
136
+ expected_line %|- "Biff Tannen",|
137
+ # expected_line %|- "George McFly"| # TODO
138
+ expected_line %|- "George McFly",|
139
+ plain_line " ]"
140
+ end
141
+ )
141
142
 
142
- expect(program).
143
- to produce_output_when_run(expected_output).
144
- in_color(color_enabled)
143
+ expect(program).to produce_output_when_run(expected_output).in_color(
144
+ color_enabled
145
+ )
145
146
  end
146
147
  end
147
148
 
@@ -156,37 +157,37 @@ RSpec.describe "Integration with RSpec's #match_array matcher", type: :integrati
156
157
  ]
157
158
  expect(values).not_to match_array(values)
158
159
  TEST
159
- program = make_plain_test_program(
160
- snippet,
161
- color_enabled: color_enabled,
162
- )
160
+ program =
161
+ make_plain_test_program(snippet, color_enabled: color_enabled)
163
162
 
164
- expected_output = build_expected_output(
165
- color_enabled: color_enabled,
166
- snippet: %|expect(values).not_to match_array(values)|,
167
- newline_before_expectation: true,
168
- expectation: proc {
169
- line do
170
- plain %| Expected |
171
- actual %|["Marty McFly", "Doc Brown", "Einie", "Lorraine McFly"]|
172
- end
163
+ expected_output =
164
+ build_expected_output(
165
+ color_enabled: color_enabled,
166
+ snippet: "expect(values).not_to match_array(values)",
167
+ newline_before_expectation: true,
168
+ expectation:
169
+ proc do
170
+ line do
171
+ plain " Expected "
172
+ actual %|["Marty McFly", "Doc Brown", "Einie", "Lorraine McFly"]|
173
+ end
173
174
 
174
- line do
175
- plain %|not to match array with |
176
- expected %|"Marty McFly"|
177
- plain %|, |
178
- expected %|"Doc Brown"|
179
- plain %|, |
180
- expected %|"Einie"|
181
- plain %| and |
182
- expected %|"Lorraine McFly"|
183
- end
184
- },
185
- )
175
+ line do
176
+ plain "not to match array with "
177
+ expected %|"Marty McFly"|
178
+ plain ", "
179
+ expected %|"Doc Brown"|
180
+ plain ", "
181
+ expected %|"Einie"|
182
+ plain " and "
183
+ expected %|"Lorraine McFly"|
184
+ end
185
+ end
186
+ )
186
187
 
187
- expect(program).
188
- to produce_output_when_run(expected_output).
189
- in_color(color_enabled)
188
+ expect(program).to produce_output_when_run(expected_output).in_color(
189
+ color_enabled
190
+ )
190
191
  end
191
192
  end
192
193
  end
@@ -195,6 +196,12 @@ RSpec.describe "Integration with RSpec's #match_array matcher", type: :integrati
195
196
  it "produces the correct failure message when used in the positive" do
196
197
  as_both_colored_and_uncolored do |color_enabled|
197
198
  snippet = <<~TEST
199
+ actual = [
200
+ "Marty McFly",
201
+ "Doc Brown",
202
+ "Einie",
203
+ "Lorraine McFly"
204
+ ]
198
205
  expected = [
199
206
  / Brown$/,
200
207
  "Marty McFly",
@@ -202,58 +209,53 @@ RSpec.describe "Integration with RSpec's #match_array matcher", type: :integrati
202
209
  /Georg McFly/,
203
210
  /Lorrain McFly/
204
211
  ]
205
- actual = [
206
- "Marty McFly",
207
- "Doc Brown",
208
- "Einie",
209
- "Lorraine McFly"
210
- ]
211
212
  expect(actual).to match_array(expected)
212
213
  TEST
213
- program = make_plain_test_program(
214
- snippet,
215
- color_enabled: color_enabled,
216
- )
214
+ program =
215
+ make_plain_test_program(snippet, color_enabled: color_enabled)
217
216
 
218
- expected_output = build_expected_output(
219
- color_enabled: color_enabled,
220
- snippet: %|expect(actual).to match_array(expected)|,
221
- expectation: proc {
222
- line do
223
- plain %| Expected |
224
- actual %|["Marty McFly", "Doc Brown", "Einie", "Lorraine McFly"]|
225
- end
217
+ expected_output =
218
+ build_expected_output(
219
+ color_enabled: color_enabled,
220
+ snippet: "expect(actual).to match_array(expected)",
221
+ expectation:
222
+ proc do
223
+ line do
224
+ plain " Expected "
225
+ actual %|["Marty McFly", "Doc Brown", "Einie", "Lorraine McFly"]|
226
+ end
226
227
 
227
- line do
228
- plain %|to match array with |
229
- expected %|/ Brown$/|
230
- plain %|, |
231
- expected %|"Marty McFly"|
232
- plain %|, |
233
- expected %|"Biff Tannen"|
234
- plain %|, |
235
- expected %|/Georg McFly/|
236
- plain %| and |
237
- expected %|/Lorrain McFly/|
238
- end
239
- },
240
- diff: proc {
241
- plain_line %| [|
242
- plain_line %| "Marty McFly",|
243
- plain_line %| "Doc Brown",|
244
- actual_line %|+ "Einie",|
245
- actual_line %|+ "Lorraine McFly",|
246
- expected_line %|- "Biff Tannen",|
247
- expected_line %|- /Georg McFly/,|
248
- # expected_line %|- /Lorrain McFly/| # TODO
249
- expected_line %|- /Lorrain McFly/,|
250
- plain_line %| ]|
251
- },
252
- )
228
+ line do
229
+ plain "to match array with "
230
+ expected "/ Brown$/"
231
+ plain ", "
232
+ expected %|"Marty McFly"|
233
+ plain ", "
234
+ expected %|"Biff Tannen"|
235
+ plain ", "
236
+ expected "/Georg McFly/"
237
+ plain " and "
238
+ expected "/Lorrain McFly/"
239
+ end
240
+ end,
241
+ diff:
242
+ proc do
243
+ plain_line " ["
244
+ plain_line %| "Marty McFly",|
245
+ plain_line %| "Doc Brown",|
246
+ actual_line %|+ "Einie",|
247
+ actual_line %|+ "Lorraine McFly",|
248
+ expected_line %|- "Biff Tannen",|
249
+ expected_line "- /Georg McFly/,"
250
+ # expected_line %|- /Lorrain McFly/| # TODO
251
+ expected_line "- /Lorrain McFly/,"
252
+ plain_line " ]"
253
+ end
254
+ )
253
255
 
254
- expect(program).
255
- to produce_output_when_run(expected_output).
256
- in_color(color_enabled)
256
+ expect(program).to produce_output_when_run(expected_output).in_color(
257
+ color_enabled
258
+ )
257
259
  end
258
260
  end
259
261
 
@@ -269,152 +271,153 @@ RSpec.describe "Integration with RSpec's #match_array matcher", type: :integrati
269
271
  ]
270
272
  expect(values).not_to match_array(values)
271
273
  TEST
272
- program = make_plain_test_program(
273
- snippet,
274
- color_enabled: color_enabled,
275
- )
274
+ program =
275
+ make_plain_test_program(snippet, color_enabled: color_enabled)
276
276
 
277
- expected_output = build_expected_output(
278
- color_enabled: color_enabled,
279
- snippet: %|expect(values).not_to match_array(values)|,
280
- newline_before_expectation: true,
281
- expectation: proc {
282
- line do
283
- plain %| Expected |
284
- # rubocop:disable Metrics/LineLength
285
- actual %|[/ Brown$/, "Marty McFly", "Biff Tannen", /Georg McFly/, /Lorrain McFly/]|
286
- # rubocop:enable Metrics/LineLength
287
- end
277
+ expected_output =
278
+ build_expected_output(
279
+ color_enabled: color_enabled,
280
+ snippet: "expect(values).not_to match_array(values)",
281
+ newline_before_expectation: true,
282
+ expectation:
283
+ proc do
284
+ line do
285
+ plain " Expected "
286
+ # rubocop:disable Metrics/LineLength
287
+ actual %|[/ Brown$/, "Marty McFly", "Biff Tannen", /Georg McFly/, /Lorrain McFly/]|
288
+ # rubocop:enable Metrics/LineLength
289
+ end
288
290
 
289
- line do
290
- plain %|not to match array with |
291
- expected %|/ Brown$/|
292
- plain %|, |
293
- expected %|"Marty McFly"|
294
- plain %|, |
295
- expected %|"Biff Tannen"|
296
- plain %|, |
297
- expected %|/Georg McFly/|
298
- plain %| and |
299
- expected %|/Lorrain McFly/|
300
- end
301
- },
302
- )
291
+ line do
292
+ plain "not to match array with "
293
+ expected "/ Brown$/"
294
+ plain ", "
295
+ expected %|"Marty McFly"|
296
+ plain ", "
297
+ expected %|"Biff Tannen"|
298
+ plain ", "
299
+ expected "/Georg McFly/"
300
+ plain " and "
301
+ expected "/Lorrain McFly/"
302
+ end
303
+ end
304
+ )
303
305
 
304
- expect(program).
305
- to produce_output_when_run(expected_output).
306
- in_color(color_enabled)
306
+ expect(program).to produce_output_when_run(expected_output).in_color(
307
+ color_enabled
308
+ )
307
309
  end
308
310
  end
309
311
  end
310
312
 
311
- context "and some of them are fuzzy objects" do
313
+ context "and some of them are RSpec matchers" do
312
314
  it "produces the correct failure message" do
313
315
  as_both_colored_and_uncolored do |color_enabled|
314
316
  snippet = <<~TEST.strip
317
+ actual = [
318
+ { foo: "bar" },
319
+ double(baz: "qux"),
320
+ { blargh: "riddle" }
321
+ ]
315
322
  expected = [
316
323
  a_hash_including(foo: "bar"),
317
324
  a_collection_containing_exactly("zing"),
318
325
  an_object_having_attributes(baz: "qux"),
319
326
  ]
320
- actual = [
321
- { foo: "bar" },
322
- double(baz: "qux"),
323
- { blargh: "riddle" }
324
- ]
325
327
  expect(actual).to match_array(expected)
326
328
  TEST
327
- program = make_plain_test_program(
328
- snippet,
329
- color_enabled: color_enabled,
330
- )
329
+ program =
330
+ make_plain_test_program(snippet, color_enabled: color_enabled)
331
331
 
332
- expected_output = build_expected_output(
333
- color_enabled: color_enabled,
334
- snippet: %|expect(actual).to match_array(expected)|,
335
- expectation: proc {
336
- line do
337
- plain %| Expected |
338
- # rubocop:disable Metrics/LineLength
339
- actual %|[{ foo: "bar" }, #<Double (anonymous) baz: "qux">, { blargh: "riddle" }]|
340
- # rubocop:enable Metrics/LineLength
341
- end
332
+ expected_output =
333
+ build_expected_output(
334
+ color_enabled: color_enabled,
335
+ snippet: "expect(actual).to match_array(expected)",
336
+ expectation:
337
+ proc do
338
+ line do
339
+ plain " Expected "
340
+ # rubocop:disable Metrics/LineLength
341
+ actual %|[{ foo: "bar" }, #<Double (anonymous) baz: "qux">, { blargh: "riddle" }]|
342
+ # rubocop:enable Metrics/LineLength
343
+ end
342
344
 
343
- line do
344
- plain %|to match array with |
345
- expected %|#<a hash including (foo: "bar")>|
346
- plain %|, |
347
- expected %|#<a collection containing exactly ("zing")>|
348
- plain %| and |
349
- expected %|#<an object having attributes (baz: "qux")>|
350
- end
351
- },
352
- diff: proc {
353
- plain_line %| [|
354
- plain_line %| {|
355
- plain_line %| foo: "bar"|
356
- plain_line %| },|
357
- plain_line %| #<Double (anonymous) {|
358
- plain_line %| baz: "qux"|
359
- plain_line %| }>,|
360
- actual_line %|+ {|
361
- actual_line %|+ blargh: "riddle"|
362
- actual_line %|+ },|
363
- expected_line %|- #<a collection containing exactly (|
364
- expected_line %|- "zing"|
365
- # expected_line %|- )>| # TODO
366
- expected_line %|- )>,|
367
- plain_line %| ]|
368
- },
369
- )
345
+ line do
346
+ plain "to match array with "
347
+ expected %|#<a hash including (foo: "bar")>|
348
+ plain ", "
349
+ expected %|#<a collection containing exactly ("zing")>|
350
+ plain " and "
351
+ expected %|#<an object having attributes (baz: "qux")>|
352
+ end
353
+ end,
354
+ diff:
355
+ proc do
356
+ plain_line " ["
357
+ plain_line " {"
358
+ plain_line %| foo: "bar"|
359
+ plain_line " },"
360
+ plain_line " #<Double (anonymous) {"
361
+ plain_line %| baz: "qux"|
362
+ plain_line " }>,"
363
+ actual_line "+ {"
364
+ actual_line %|+ blargh: "riddle"|
365
+ actual_line "+ },"
366
+ expected_line "- #<a collection containing exactly ("
367
+ expected_line %|- "zing"|
368
+ # expected_line %|- )>| # TODO
369
+ expected_line "- )>,"
370
+ plain_line " ]"
371
+ end
372
+ )
370
373
 
371
- expect(program).
372
- to produce_output_when_run(expected_output).
373
- in_color(color_enabled)
374
+ expect(program).to produce_output_when_run(expected_output).in_color(
375
+ color_enabled
376
+ )
374
377
  end
375
378
  end
376
379
  end
377
380
  end
378
381
 
379
- context "when the input value is a string" do
380
- it "produces the correct failure message when used in the positive" do
382
+ context "when the input value is not an array, and especially not a value that could be turned into one" do
383
+ it "produces the correct failure message, as though an array had been given" do
381
384
  as_both_colored_and_uncolored do |color_enabled|
382
385
  snippet = <<~TEST.strip
383
- expected = "Einie"
384
- actual = ["Marty", "Jennifer", "Doc"]
386
+ actual = [:marty, :jennifer, :doc]
387
+ expected = :einie
385
388
  expect(actual).to match_array(expected)
386
389
  TEST
387
- program = make_plain_test_program(
388
- snippet,
389
- color_enabled: color_enabled,
390
- )
390
+ program = make_plain_test_program(snippet, color_enabled: color_enabled)
391
391
 
392
- expected_output = build_expected_output(
393
- color_enabled: color_enabled,
394
- snippet: %|expect(actual).to match_array(expected)|,
395
- expectation: proc {
396
- line do
397
- plain %|Expected |
398
- actual %|["Marty", "Jennifer", "Doc"]|
399
- plain %| to match array with |
400
- expected %|"Einie"|
401
- plain %|.|
402
- end
403
- },
404
- diff: proc {
405
- plain_line %| [|
406
- actual_line %|+ "Marty",|
407
- actual_line %|+ "Jennifer",|
408
- actual_line %|+ "Doc",|
409
- # expected_line %|- "Einie"| # TODO
410
- expected_line %|- "Einie",|
411
- plain_line %| ]|
412
- },
413
- )
392
+ expected_output =
393
+ build_expected_output(
394
+ color_enabled: color_enabled,
395
+ snippet: "expect(actual).to match_array(expected)",
396
+ expectation:
397
+ proc do
398
+ line do
399
+ plain "Expected "
400
+ actual "[:marty, :jennifer, :doc]"
401
+ plain " to match array with "
402
+ expected ":einie"
403
+ plain "."
404
+ end
405
+ end,
406
+ diff:
407
+ proc do
408
+ plain_line " ["
409
+ actual_line "+ :marty,"
410
+ actual_line "+ :jennifer,"
411
+ actual_line "+ :doc,"
412
+ # expected_line %|- :einie| # TODO
413
+ expected_line "- :einie,"
414
+ plain_line " ]"
415
+ end
416
+ )
414
417
 
415
- expect(program).
416
- to produce_output_when_run(expected_output).
417
- in_color(color_enabled)
418
+ expect(program).to produce_output_when_run(expected_output).in_color(
419
+ color_enabled
420
+ )
418
421
  end
419
422
  end
420
423
  end