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 #contain_exactly matcher", type: :integration do
3
+ RSpec.describe "Integration with RSpec's #contain_exactly 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 contain_exactly(*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 contain_exactly(*expected)|,
20
- expectation: proc {
21
- line do
22
- plain %|Expected |
23
- actual %|["Marty", "Jennifer", "Doc"]|
24
- plain %| to contain exactly |
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 contain_exactly(*expected)",
19
+ expectation:
20
+ proc do
21
+ line do
22
+ plain "Expected "
23
+ actual %|["Marty", "Jennifer", "Doc"]|
24
+ plain " to contain exactly "
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 #contain_exactly matcher", type: :integ
51
52
  values = ["Einie", "Marty"]
52
53
  expect(values).not_to contain_exactly(*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 contain_exactly(*values)|,
62
- expectation: proc {
63
- line do
64
- plain %|Expected |
65
- actual %|["Einie", "Marty"]|
66
- plain %| not to contain exactly |
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 contain_exactly(*values)",
61
+ expectation:
62
+ proc do
63
+ line do
64
+ plain "Expected "
65
+ actual %|["Einie", "Marty"]|
66
+ plain " not to contain exactly "
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 #contain_exactly matcher", type: :integ
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 #contain_exactly matcher", type: :integ
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 contain_exactly(*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 contain_exactly(*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 contain_exactly(*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 contain exactly |
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 contain exactly "
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 #contain_exactly matcher", type: :integ
156
157
  ]
157
158
  expect(values).not_to contain_exactly(*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 contain_exactly(*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 contain_exactly(*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 contain exactly |
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 contain exactly "
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 #contain_exactly matcher", type: :integ
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 #contain_exactly matcher", type: :integ
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 contain_exactly(*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 contain_exactly(*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 contain_exactly(*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 contain exactly |
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 contain exactly "
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,104 +271,105 @@ RSpec.describe "Integration with RSpec's #contain_exactly matcher", type: :integ
269
271
  ]
270
272
  expect(values).not_to contain_exactly(*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 contain_exactly(*values)|,
280
- newline_before_expectation: true,
281
- expectation: proc {
282
- line do
283
- plain %| Expected |
284
- actual %|[/ Brown$/, "Marty McFly", "Biff Tannen", /Georg McFly/, /Lorrain McFly/]|
285
- end
277
+ expected_output =
278
+ build_expected_output(
279
+ color_enabled: color_enabled,
280
+ snippet: "expect(values).not_to contain_exactly(*values)",
281
+ newline_before_expectation: true,
282
+ expectation:
283
+ proc do
284
+ line do
285
+ plain " Expected "
286
+ actual %|[/ Brown$/, "Marty McFly", "Biff Tannen", /Georg McFly/, /Lorrain McFly/]|
287
+ end
286
288
 
287
- line do
288
- plain %|not to contain exactly |
289
- expected %|/ Brown$/|
290
- plain %|, |
291
- expected %|"Marty McFly"|
292
- plain %|, |
293
- expected %|"Biff Tannen"|
294
- plain %|, |
295
- expected %|/Georg McFly/|
296
- plain %| and |
297
- expected %|/Lorrain McFly/|
298
- end
299
- },
300
- )
289
+ line do
290
+ plain "not to contain exactly "
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
+ end
302
+ )
301
303
 
302
- expect(program).
303
- to produce_output_when_run(expected_output).
304
- in_color(color_enabled)
304
+ expect(program).to produce_output_when_run(expected_output).in_color(
305
+ color_enabled
306
+ )
305
307
  end
306
308
  end
307
309
  end
308
310
 
309
- context "and some of them are fuzzy objects" do
311
+ context "and some of them are RSpec matchers" do
310
312
  it "produces the correct failure message" do
311
313
  as_both_colored_and_uncolored do |color_enabled|
312
314
  snippet = <<~TEST.strip
315
+ actual = [
316
+ { foo: "bar" },
317
+ double(baz: "qux"),
318
+ { blargh: "riddle" }
319
+ ]
313
320
  expected = [
314
321
  a_hash_including(foo: "bar"),
315
322
  a_collection_containing_exactly("zing"),
316
323
  an_object_having_attributes(baz: "qux"),
317
324
  ]
318
- actual = [
319
- { foo: "bar" },
320
- double(baz: "qux"),
321
- { blargh: "riddle" }
322
- ]
323
325
  expect(actual).to contain_exactly(*expected)
324
326
  TEST
325
- program = make_plain_test_program(
326
- snippet,
327
- color_enabled: color_enabled,
328
- )
327
+ program =
328
+ make_plain_test_program(snippet, color_enabled: color_enabled)
329
329
 
330
- expected_output = build_expected_output(
331
- color_enabled: color_enabled,
332
- snippet: %|expect(actual).to contain_exactly(*expected)|,
333
- expectation: proc {
334
- line do
335
- plain %| Expected |
336
- actual %|[{ foo: "bar" }, #<Double (anonymous) baz: "qux">, { blargh: "riddle" }]|
337
- end
330
+ expected_output =
331
+ build_expected_output(
332
+ color_enabled: color_enabled,
333
+ snippet: "expect(actual).to contain_exactly(*expected)",
334
+ expectation:
335
+ proc do
336
+ line do
337
+ plain " Expected "
338
+ actual %|[{ foo: "bar" }, #<Double (anonymous) baz: "qux">, { blargh: "riddle" }]|
339
+ end
338
340
 
339
- line do
340
- plain %|to contain exactly |
341
- expected %|#<a hash including (foo: "bar")>|
342
- plain %|, |
343
- expected %|#<a collection containing exactly ("zing")>|
344
- plain %| and |
345
- expected %|#<an object having attributes (baz: "qux")>|
346
- end
347
- },
348
- diff: proc {
349
- plain_line %| [|
350
- plain_line %| {|
351
- plain_line %| foo: "bar"|
352
- plain_line %| },|
353
- plain_line %| #<Double (anonymous) {|
354
- plain_line %| baz: "qux"|
355
- plain_line %| }>,|
356
- actual_line %|+ {|
357
- actual_line %|+ blargh: "riddle"|
358
- actual_line %|+ },|
359
- expected_line %|- #<a collection containing exactly (|
360
- expected_line %|- "zing"|
361
- # expected_line %|- )>| # TODO
362
- expected_line %|- )>,|
363
- plain_line %| ]|
364
- },
365
- )
341
+ line do
342
+ plain "to contain exactly "
343
+ expected %|#<a hash including (foo: "bar")>|
344
+ plain ", "
345
+ expected %|#<a collection containing exactly ("zing")>|
346
+ plain " and "
347
+ expected %|#<an object having attributes (baz: "qux")>|
348
+ end
349
+ end,
350
+ diff:
351
+ proc do
352
+ plain_line " ["
353
+ plain_line " {"
354
+ plain_line %| foo: "bar"|
355
+ plain_line " },"
356
+ plain_line " #<Double (anonymous) {"
357
+ plain_line %| baz: "qux"|
358
+ plain_line " }>,"
359
+ actual_line "+ {"
360
+ actual_line %|+ blargh: "riddle"|
361
+ actual_line "+ },"
362
+ expected_line "- #<a collection containing exactly ("
363
+ expected_line %|- "zing"|
364
+ # expected_line %|- )>| # TODO
365
+ expected_line "- )>,"
366
+ plain_line " ]"
367
+ end
368
+ )
366
369
 
367
- expect(program).
368
- to produce_output_when_run(expected_output).
369
- in_color(color_enabled)
370
+ expect(program).to produce_output_when_run(expected_output).in_color(
371
+ color_enabled
372
+ )
370
373
  end
371
374
  end
372
375
  end