super_diff 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +87 -69
- data/lib/super_diff/rspec/monkey_patches.rb +6 -4
- data/lib/super_diff/version.rb +1 -1
- data/spec/examples.txt +5 -0
- data/spec/integration/rspec/unhandled_errors_spec.rb +21 -0
- data/spec/support/shared_examples/hash_with_indifferent_access.rb +724 -208
- data/super_diff.gemspec +3 -4
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7325f6b92497f0f81a67431c8e6581fc165b3f3dff4f01b2d18bcfabaab648ec
|
4
|
+
data.tar.gz: c358e94ecaab9d20b22cb7f3d60315057b6cdf1e415a902d1ae402529344beb4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f32b832ab5647a3f6a73319e4a95e5b0ee3e346046c0b1ac4046169a439d9474d6f1ac37c791a9851f66070f82941d1a3520fdf477a57c828bf4945edab1994b
|
7
|
+
data.tar.gz: 042406c46094b4c0d9b5b1c88870e899672851b9a03f31cfec702d2119e5a73db6f23209e206a0b9b450336d288c2c62c1dfe62cb58f1701ad24498dd7540098
|
data/README.md
CHANGED
@@ -7,32 +7,33 @@
|
|
7
7
|
[hound-badge]: https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg
|
8
8
|
[hound]: https://houndci.com
|
9
9
|
|
10
|
-
SuperDiff is a gem that hooks into RSpec
|
11
|
-
differences between two data structures of any type.
|
10
|
+
SuperDiff is a gem that hooks into RSpec
|
11
|
+
to intelligently display the differences between two data structures of any type.
|
12
12
|
|
13
|
-
📢 **[See what's changed in the latest version (0.
|
13
|
+
📢 **[See what's changed in the latest version (0.4.1)][changelog].**
|
14
14
|
|
15
15
|
[changelog]: CHANGELOG.md
|
16
16
|
|
17
17
|
## Introduction
|
18
18
|
|
19
|
-
The primary motivation behind this gem
|
20
|
-
built-in diffing capabilities.
|
19
|
+
The primary motivation behind this gem
|
20
|
+
is to vastly improve upon RSpec's built-in diffing capabilities.
|
21
21
|
|
22
|
-
Sometimes, whenever you use a matcher such as `eq`, `match`, `include`, or
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
Since [RSpec merely runs your `expected` and `actual` values through Ruby's
|
30
|
-
|
31
|
-
|
22
|
+
Sometimes, whenever you use a matcher such as `eq`, `match`, `include`, or `have_attributes`,
|
23
|
+
you will get a diff of the two data structures you are trying to match against.
|
24
|
+
This is great if all you want to do is compare multi-line strings.
|
25
|
+
But if you want to compare other, more "real world" kinds of values,
|
26
|
+
such as what you might work with when developing API endpoints
|
27
|
+
or testing methods that make database calls and return a set of model objects,
|
28
|
+
then you are out of luck.
|
29
|
+
Since [RSpec merely runs your `expected` and `actual` values through Ruby's PrettyPrinter library][rspec-differ-fail]
|
30
|
+
and then performs a diff of these strings,
|
31
|
+
the output it produces leaves much to be desired.
|
32
32
|
|
33
33
|
[rspec-differ-fail]: https://github.com/rspec/rspec-support/blob/c69a231d7369dd165ad7ce4742e1a2e21e3462b5/lib/rspec/support/differ.rb#L178
|
34
34
|
|
35
|
-
For instance,
|
35
|
+
For instance,
|
36
|
+
let's say you wanted to compare these two hashes:
|
36
37
|
|
37
38
|
``` ruby
|
38
39
|
actual = {
|
@@ -86,36 +87,60 @@ You would get output that looks like this:
|
|
86
87
|
|
87
88
|
![Before super_diff](doc/before.png)
|
88
89
|
|
89
|
-
What this library does
|
90
|
-
|
91
|
-
|
90
|
+
What this library does
|
91
|
+
is to provide a diff engine
|
92
|
+
that knows how to figure out the differences between any two data structures
|
93
|
+
and display them in a sensible way.
|
94
|
+
So, using the example above,
|
95
|
+
you'd get this instead:
|
92
96
|
|
93
97
|
![After super_diff](doc/after.png)
|
94
98
|
|
95
99
|
## Installation
|
96
100
|
|
97
|
-
|
98
|
-
|
101
|
+
There are a few different ways to install `super_diff`
|
102
|
+
depending on your type of project.
|
99
103
|
|
100
104
|
### Rails apps
|
101
105
|
|
102
|
-
If you're developing a Rails app,
|
106
|
+
If you're developing a Rails app,
|
107
|
+
add the following to your Gemfile:
|
103
108
|
|
104
109
|
``` ruby
|
105
|
-
|
110
|
+
group :test do
|
111
|
+
gem "super_diff"
|
112
|
+
end
|
106
113
|
```
|
107
114
|
|
108
|
-
After running `bundle install`,
|
115
|
+
After running `bundle install`,
|
116
|
+
add the following to your `rails_helper`:
|
109
117
|
|
110
118
|
``` ruby
|
111
119
|
require "super_diff/rspec-rails"
|
112
120
|
```
|
113
121
|
|
114
|
-
|
122
|
+
### Projects using some part of Rails (e.g. ActiveModel)
|
115
123
|
|
116
|
-
|
124
|
+
If you're developing an app using Hanami or Sinatra,
|
125
|
+
or merely using a part of Rails such as ActiveModel,
|
126
|
+
add the following to your Gemfile where appropriate:
|
117
127
|
|
118
|
-
|
128
|
+
``` ruby
|
129
|
+
gem "super_diff"
|
130
|
+
```
|
131
|
+
|
132
|
+
After running `bundle install`,
|
133
|
+
add the following to your `spec_helper`:
|
134
|
+
|
135
|
+
``` ruby
|
136
|
+
require "super_diff/rspec"
|
137
|
+
require "super_diff/active_support"
|
138
|
+
```
|
139
|
+
|
140
|
+
### Gems
|
141
|
+
|
142
|
+
If you're developing a gem,
|
143
|
+
add the following to your gemspec:
|
119
144
|
|
120
145
|
``` ruby
|
121
146
|
spec.add_development_dependency "super_diff"
|
@@ -127,14 +152,16 @@ Now add the following to your `spec_helper`:
|
|
127
152
|
require "super_diff/rspec"
|
128
153
|
```
|
129
154
|
|
130
|
-
You're done!
|
131
|
-
|
132
155
|
## Configuration
|
133
156
|
|
134
|
-
As capable as this library is,
|
135
|
-
|
136
|
-
|
137
|
-
your
|
157
|
+
As capable as this library is,
|
158
|
+
it doesn't know how to deal with every kind of object out there.
|
159
|
+
If you have a custom class,
|
160
|
+
and instances of your class aren't appearing in diffs like you like,
|
161
|
+
you might find it necessary to instruct the gem on how to handle them.
|
162
|
+
In that case
|
163
|
+
you would add something like this to your test helper file
|
164
|
+
(`rails_helper` or `spec_helper`):
|
138
165
|
|
139
166
|
``` ruby
|
140
167
|
SuperDiff::RSpec.configure do |config|
|
@@ -144,55 +171,45 @@ SuperDiff::RSpec.configure do |config|
|
|
144
171
|
end
|
145
172
|
```
|
146
173
|
|
147
|
-
*(More info here in the future on adding a custom differ, operational sequencer,
|
148
|
-
|
174
|
+
*(More info here in the future on adding a custom differ, operational sequencer, and diff formatter.
|
175
|
+
Also explanations on what these are.)*
|
149
176
|
|
150
|
-
##
|
151
|
-
|
152
|
-
If you encounter a bug or have an idea for how this could be better, feel free
|
153
|
-
to [create an issue](https://github.com/mcmire/super_diff/issues).
|
154
|
-
|
155
|
-
If you'd like to submit a PR instead, here's how to get started. First, fork
|
156
|
-
this repo. Then, when you've cloned your fork, run:
|
157
|
-
|
158
|
-
```
|
159
|
-
bin/setup
|
160
|
-
```
|
177
|
+
## Support
|
161
178
|
|
162
|
-
|
163
|
-
|
179
|
+
My goal for this library is to improve your development experience.
|
180
|
+
If this is not the case,
|
181
|
+
and you encounter a bug or have a suggestion,
|
182
|
+
feel free to [create an issue][issues-list].
|
183
|
+
I'll try to respond to it as soon as I can!
|
164
184
|
|
165
|
-
|
166
|
-
bundle exec rake
|
167
|
-
```
|
168
|
-
|
169
|
-
If you update one of the tests, you can run it like so:
|
185
|
+
[issues-list]: https://github.com/mcmire/super_diff/issues
|
170
186
|
|
171
|
-
|
172
|
-
bin/rspec spec/integration/...
|
173
|
-
bin/rspec spec/unit/...
|
174
|
-
```
|
187
|
+
## Contributing
|
175
188
|
|
176
|
-
|
189
|
+
Any contributions to improve this library are welcome!
|
190
|
+
Please see the [contributing](./CONTRIBUTING.md) document for more on how to do that.
|
177
191
|
|
178
192
|
## Compatibility
|
179
193
|
|
180
|
-
`super_diff` is [tested][travis] to work with
|
181
|
-
|
194
|
+
`super_diff` is [tested][travis] to work with
|
195
|
+
Ruby >= 2.4.x,
|
196
|
+
RSpec 3.x,
|
197
|
+
and Rails >= 5.x.
|
182
198
|
|
183
199
|
[travis]: http://travis-ci.org/mcmire/super_diff
|
184
200
|
|
185
201
|
## Inspiration/Thanks
|
186
202
|
|
187
|
-
In developing this gem
|
203
|
+
In developing this gem
|
204
|
+
I made use of or was heavily inspired by these libraries:
|
188
205
|
|
189
|
-
* [Diff::LCS][diff-lcs],
|
190
|
-
this gem][original-version]
|
191
|
-
|
192
|
-
|
193
|
-
the [inspectors][inspection-tree].
|
206
|
+
* [Diff::LCS][diff-lcs],
|
207
|
+
the library I started with in the [original version of this gem][original-version]
|
208
|
+
(made in 2011!)
|
209
|
+
* The pretty-printing algorithms and API within [PrettyPrinter][pretty-printer] and [AwesomePrint][awesome-print],
|
210
|
+
from which I borrowed ideas to develop the [inspectors][inspection-tree].
|
194
211
|
|
195
|
-
Thank you
|
212
|
+
Thank you to the authors of these libraries!
|
196
213
|
|
197
214
|
[original-version]: https://github.com/mcmire/super_diff/tree/old-master
|
198
215
|
[diff-lcs]: https://github.com/halostatue/diff-lcs
|
@@ -200,6 +217,7 @@ Thank you so much!
|
|
200
217
|
[awesome-print]: https://github.com/awesome-print/awesome_print
|
201
218
|
[inspection-tree]: https://github.com/mcmire/super_diff/blob/master/lib/super_diff/object_inspection/inspection_tree.rb
|
202
219
|
|
203
|
-
##
|
220
|
+
## Author/License
|
204
221
|
|
205
|
-
|
222
|
+
`super_diff` was created and is maintained by Elliot Winkler.
|
223
|
+
It is released under the [MIT license](LICENSE).
|
@@ -91,10 +91,12 @@ module RSpec
|
|
91
91
|
@skip_shared_group_trace = options.fetch(:skip_shared_group_trace, false)
|
92
92
|
# Patch to convert options[:failure_lines] to groups
|
93
93
|
if options.include?(:failure_lines)
|
94
|
-
@failure_line_groups =
|
95
|
-
|
96
|
-
|
97
|
-
|
94
|
+
@failure_line_groups = [
|
95
|
+
{
|
96
|
+
lines: options[:failure_lines],
|
97
|
+
already_colorized: false
|
98
|
+
}
|
99
|
+
]
|
98
100
|
end
|
99
101
|
end
|
100
102
|
|
data/lib/super_diff/version.rb
CHANGED
data/spec/examples.txt
ADDED
@@ -0,0 +1,5 @@
|
|
1
|
+
example_id | status | run_time |
|
2
|
+
---------------------------------------------------------- | ------ | -------------- |
|
3
|
+
./spec/integration/rspec/unhandled_errors_spec.rb[1:1:1:1] | passed | 1.28 seconds |
|
4
|
+
./spec/integration/rspec/unhandled_errors_spec.rb[1:1:2:1] | passed | 1.31 seconds |
|
5
|
+
./spec/integration/rspec/unhandled_errors_spec.rb[1:2:1] | failed | 0.7241 seconds |
|
@@ -66,4 +66,25 @@ RSpec.describe "Integration with RSpec and unhandled errors", type: :integration
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
end
|
69
|
+
|
70
|
+
context "when multiple exception occur" do
|
71
|
+
it "highlights the first line in red, and then leaves the rest of the message alone" do
|
72
|
+
as_both_colored_and_uncolored do |color_enabled|
|
73
|
+
program = <<~PROGRAM.strip
|
74
|
+
#{set_up_with("super_diff/rspec", color_enabled: color_enabled)}
|
75
|
+
RSpec.describe "test" do
|
76
|
+
after(:each) do
|
77
|
+
raise "Some kind of after error or whatever\\n\\nThis is another line"
|
78
|
+
end
|
79
|
+
it "passes" do
|
80
|
+
raise "Some kind of error or whatever\\n\\nThis is another line"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
PROGRAM
|
84
|
+
|
85
|
+
expect(program).
|
86
|
+
to produce_output_when_run('Some kind of after error or whatever')
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
69
90
|
end
|
@@ -1,115 +1,373 @@
|
|
1
1
|
shared_examples_for "integration with HashWithIndifferentAccess" do
|
2
2
|
describe "and RSpec's #eq matcher" do
|
3
3
|
context "when the actual value is a HashWithIndifferentAccess" do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
4
|
+
context "and both hashes are one-dimensional" do
|
5
|
+
context "and the expected hash contains symbol keys" do
|
6
|
+
it "produces the correct output" do
|
7
|
+
as_both_colored_and_uncolored do |color_enabled|
|
8
|
+
snippet = <<~TEST.strip
|
9
|
+
expected = {
|
10
|
+
line_1: "123 Main St.",
|
11
|
+
city: "Hill Valley",
|
12
|
+
state: "CA",
|
13
|
+
zip: "90382",
|
14
|
+
}
|
15
|
+
actual = HashWithIndifferentAccess.new({
|
16
|
+
line_1: "456 Ponderosa Ct.",
|
17
|
+
city: "Oakland",
|
18
|
+
state: "CA",
|
19
|
+
zip: "91234",
|
20
|
+
})
|
21
|
+
expect(actual).to eq(expected)
|
22
|
+
TEST
|
23
|
+
program = make_rspec_rails_test_program(
|
24
|
+
snippet,
|
25
|
+
color_enabled: color_enabled,
|
26
|
+
)
|
27
|
+
|
28
|
+
expected_output = build_expected_output(
|
29
|
+
color_enabled: color_enabled,
|
30
|
+
snippet: "expect(actual).to eq(expected)",
|
31
|
+
expectation: proc {
|
32
|
+
line do
|
33
|
+
plain "Expected "
|
34
|
+
beta %|#<HashWithIndifferentAccess { "line_1" => "456 Ponderosa Ct.", "city" => "Oakland", "state" => "CA", "zip" => "91234" }>|
|
35
|
+
end
|
36
|
+
|
37
|
+
line do
|
38
|
+
plain " to eq "
|
39
|
+
alpha %|{ line_1: "123 Main St.", city: "Hill Valley", state: "CA", zip: "90382" }|
|
40
|
+
end
|
41
|
+
},
|
42
|
+
diff: proc {
|
43
|
+
plain_line %| #<HashWithIndifferentAccess {|
|
44
|
+
alpha_line %|- "line_1" => "123 Main St.",|
|
45
|
+
beta_line %|+ "line_1" => "456 Ponderosa Ct.",|
|
46
|
+
alpha_line %|- "city" => "Hill Valley",|
|
47
|
+
beta_line %|+ "city" => "Oakland",|
|
48
|
+
plain_line %| "state" => "CA",|
|
49
|
+
alpha_line %|- "zip" => "90382"|
|
50
|
+
beta_line %|+ "zip" => "91234"|
|
51
|
+
plain_line %| }>|
|
52
|
+
},
|
53
|
+
)
|
54
|
+
|
55
|
+
expect(program).
|
56
|
+
to produce_output_when_run(expected_output).
|
57
|
+
in_color(color_enabled)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context "and the expected hash contains string keys" do
|
63
|
+
it "produces the correct output" do
|
64
|
+
as_both_colored_and_uncolored do |color_enabled|
|
65
|
+
snippet = <<~TEST.strip
|
66
|
+
expected = {
|
67
|
+
"line_1" => "123 Main St.",
|
68
|
+
"city" => "Hill Valley",
|
69
|
+
"state" => "CA",
|
70
|
+
"zip" => "90382",
|
71
|
+
}
|
72
|
+
actual = HashWithIndifferentAccess.new({
|
73
|
+
line_1: "456 Ponderosa Ct.",
|
74
|
+
city: "Oakland",
|
75
|
+
state: "CA",
|
76
|
+
zip: "91234",
|
77
|
+
})
|
78
|
+
expect(actual).to eq(expected)
|
79
|
+
TEST
|
80
|
+
program = make_rspec_rails_test_program(
|
81
|
+
snippet,
|
82
|
+
color_enabled: color_enabled,
|
83
|
+
)
|
84
|
+
|
85
|
+
expected_output = build_expected_output(
|
86
|
+
color_enabled: color_enabled,
|
87
|
+
snippet: "expect(actual).to eq(expected)",
|
88
|
+
expectation: proc {
|
89
|
+
line do
|
90
|
+
plain "Expected "
|
91
|
+
beta %|#<HashWithIndifferentAccess { "line_1" => "456 Ponderosa Ct.", "city" => "Oakland", "state" => "CA", "zip" => "91234" }>|
|
92
|
+
end
|
93
|
+
|
94
|
+
line do
|
95
|
+
plain " to eq "
|
96
|
+
alpha %|{ "line_1" => "123 Main St.", "city" => "Hill Valley", "state" => "CA", "zip" => "90382" }|
|
97
|
+
end
|
98
|
+
},
|
99
|
+
diff: proc {
|
100
|
+
plain_line %| #<HashWithIndifferentAccess {|
|
101
|
+
alpha_line %|- "line_1" => "123 Main St.",|
|
102
|
+
beta_line %|+ "line_1" => "456 Ponderosa Ct.",|
|
103
|
+
alpha_line %|- "city" => "Hill Valley",|
|
104
|
+
beta_line %|+ "city" => "Oakland",|
|
105
|
+
plain_line %| "state" => "CA",|
|
106
|
+
alpha_line %|- "zip" => "90382"|
|
107
|
+
beta_line %|+ "zip" => "91234"|
|
108
|
+
plain_line %| }>|
|
109
|
+
},
|
110
|
+
)
|
111
|
+
|
112
|
+
expect(program).
|
113
|
+
to produce_output_when_run(expected_output).
|
114
|
+
in_color(color_enabled)
|
115
|
+
end
|
116
|
+
end
|
56
117
|
end
|
57
118
|
end
|
58
119
|
end
|
59
120
|
|
60
121
|
context "when the expected value is a HashWithIndifferentAccess" do
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
122
|
+
context "and both hashes are one-dimensional" do
|
123
|
+
context "and the actual hash contains symbol keys" do
|
124
|
+
it "produces the correct output" do
|
125
|
+
as_both_colored_and_uncolored do |color_enabled|
|
126
|
+
snippet = <<~TEST.strip
|
127
|
+
expected = HashWithIndifferentAccess.new({
|
128
|
+
line_1: "456 Ponderosa Ct.",
|
129
|
+
city: "Oakland",
|
130
|
+
state: "CA",
|
131
|
+
zip: "91234",
|
132
|
+
})
|
133
|
+
actual = {
|
134
|
+
line_1: "123 Main St.",
|
135
|
+
city: "Hill Valley",
|
136
|
+
state: "CA",
|
137
|
+
zip: "90382",
|
138
|
+
}
|
139
|
+
expect(actual).to eq(expected)
|
140
|
+
TEST
|
141
|
+
program = make_rspec_rails_test_program(
|
142
|
+
snippet,
|
143
|
+
color_enabled: color_enabled,
|
144
|
+
)
|
145
|
+
|
146
|
+
expected_output = build_expected_output(
|
147
|
+
color_enabled: color_enabled,
|
148
|
+
snippet: "expect(actual).to eq(expected)",
|
149
|
+
expectation: proc {
|
150
|
+
line do
|
151
|
+
plain "Expected "
|
152
|
+
beta %|{ line_1: "123 Main St.", city: "Hill Valley", state: "CA", zip: "90382" }|
|
153
|
+
end
|
154
|
+
|
155
|
+
line do
|
156
|
+
plain " to eq "
|
157
|
+
alpha %|#<HashWithIndifferentAccess { "line_1" => "456 Ponderosa Ct.", "city" => "Oakland", "state" => "CA", "zip" => "91234" }>|
|
158
|
+
end
|
159
|
+
},
|
160
|
+
diff: proc {
|
161
|
+
plain_line %| #<HashWithIndifferentAccess {|
|
162
|
+
alpha_line %|- "line_1" => "456 Ponderosa Ct.",|
|
163
|
+
beta_line %|+ "line_1" => "123 Main St.",|
|
164
|
+
alpha_line %|- "city" => "Oakland",|
|
165
|
+
beta_line %|+ "city" => "Hill Valley",|
|
166
|
+
plain_line %| "state" => "CA",|
|
167
|
+
alpha_line %|- "zip" => "91234"|
|
168
|
+
beta_line %|+ "zip" => "90382"|
|
169
|
+
plain_line %| }>|
|
170
|
+
},
|
171
|
+
)
|
172
|
+
|
173
|
+
expect(program).
|
174
|
+
to produce_output_when_run(expected_output).
|
175
|
+
in_color(color_enabled)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
context "and the actual hash contains string keys" do
|
181
|
+
it "produces the correct output" do
|
182
|
+
as_both_colored_and_uncolored do |color_enabled|
|
183
|
+
snippet = <<~TEST.strip
|
184
|
+
expected = HashWithIndifferentAccess.new({
|
185
|
+
line_1: "456 Ponderosa Ct.",
|
186
|
+
city: "Oakland",
|
187
|
+
state: "CA",
|
188
|
+
zip: "91234",
|
189
|
+
})
|
190
|
+
actual = {
|
191
|
+
"line_1" => "123 Main St.",
|
192
|
+
"city" => "Hill Valley",
|
193
|
+
"state" => "CA",
|
194
|
+
"zip" => "90382",
|
195
|
+
}
|
196
|
+
expect(actual).to eq(expected)
|
197
|
+
TEST
|
198
|
+
program = make_rspec_rails_test_program(
|
199
|
+
snippet,
|
200
|
+
color_enabled: color_enabled,
|
201
|
+
)
|
202
|
+
|
203
|
+
expected_output = build_expected_output(
|
204
|
+
color_enabled: color_enabled,
|
205
|
+
snippet: "expect(actual).to eq(expected)",
|
206
|
+
expectation: proc {
|
207
|
+
line do
|
208
|
+
plain "Expected "
|
209
|
+
beta %|{ "line_1" => "123 Main St.", "city" => "Hill Valley", "state" => "CA", "zip" => "90382" }|
|
210
|
+
end
|
211
|
+
|
212
|
+
line do
|
213
|
+
plain " to eq "
|
214
|
+
alpha %|#<HashWithIndifferentAccess { "line_1" => "456 Ponderosa Ct.", "city" => "Oakland", "state" => "CA", "zip" => "91234" }>|
|
215
|
+
end
|
216
|
+
},
|
217
|
+
diff: proc {
|
218
|
+
plain_line %| #<HashWithIndifferentAccess {|
|
219
|
+
alpha_line %|- "line_1" => "456 Ponderosa Ct.",|
|
220
|
+
beta_line %|+ "line_1" => "123 Main St.",|
|
221
|
+
alpha_line %|- "city" => "Oakland",|
|
222
|
+
beta_line %|+ "city" => "Hill Valley",|
|
223
|
+
plain_line %| "state" => "CA",|
|
224
|
+
alpha_line %|- "zip" => "91234"|
|
225
|
+
beta_line %|+ "zip" => "90382"|
|
226
|
+
plain_line %| }>|
|
227
|
+
},
|
228
|
+
)
|
229
|
+
|
230
|
+
expect(program).
|
231
|
+
to produce_output_when_run(expected_output).
|
232
|
+
in_color(color_enabled)
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
context "and both hashes are multi-dimensional" do
|
239
|
+
context "and the actual hash contains symbol keys" do
|
240
|
+
it "produces the correct output" do
|
241
|
+
as_both_colored_and_uncolored do |color_enabled|
|
242
|
+
snippet = <<~TEST.strip
|
243
|
+
expected = HashWithIndifferentAccess.new({
|
244
|
+
shipments: [
|
245
|
+
HashWithIndifferentAccess.new({
|
246
|
+
estimated_delivery: HashWithIndifferentAccess.new({
|
247
|
+
from: '2019-05-06',
|
248
|
+
to: '2019-05-06'
|
249
|
+
})
|
250
|
+
})
|
251
|
+
]
|
252
|
+
})
|
253
|
+
actual = {
|
254
|
+
shipments: [
|
255
|
+
{
|
256
|
+
estimated_delivery: {
|
257
|
+
from: '2019-05-06',
|
258
|
+
to: '2019-05-09'
|
259
|
+
}
|
260
|
+
}
|
261
|
+
]
|
262
|
+
}
|
263
|
+
expect(actual).to eq(expected)
|
264
|
+
TEST
|
265
|
+
program = make_rspec_rails_test_program(
|
266
|
+
snippet,
|
267
|
+
color_enabled: color_enabled,
|
268
|
+
)
|
269
|
+
|
270
|
+
expected_output = build_expected_output(
|
271
|
+
color_enabled: color_enabled,
|
272
|
+
snippet: "expect(actual).to eq(expected)",
|
273
|
+
expectation: proc {
|
274
|
+
line do
|
275
|
+
plain "Expected "
|
276
|
+
beta %|{ shipments: [{ estimated_delivery: { from: "2019-05-06", to: "2019-05-09" } }] }|
|
277
|
+
end
|
278
|
+
|
279
|
+
line do
|
280
|
+
plain " to eq "
|
281
|
+
alpha %|#<HashWithIndifferentAccess { "shipments" => [#<HashWithIndifferentAccess { "estimated_delivery" => #<HashWithIndifferentAccess { "from" => "2019-05-06", "to" => "2019-05-06" }> }>] }>|
|
282
|
+
end
|
283
|
+
},
|
284
|
+
diff: proc {
|
285
|
+
plain_line %| #<HashWithIndifferentAccess {|
|
286
|
+
plain_line %| "shipments" => [|
|
287
|
+
plain_line %| {|
|
288
|
+
plain_line %| "estimated_delivery" => {|
|
289
|
+
plain_line %| "from" => "2019-05-06",|
|
290
|
+
alpha_line %|- "to" => "2019-05-06"|
|
291
|
+
beta_line %|+ "to" => "2019-05-09"|
|
292
|
+
plain_line %| }|
|
293
|
+
plain_line %| }|
|
294
|
+
plain_line %| ]|
|
295
|
+
plain_line %| }>|
|
296
|
+
},
|
297
|
+
)
|
298
|
+
|
299
|
+
expect(program).
|
300
|
+
to produce_output_when_run(expected_output).
|
301
|
+
in_color(color_enabled)
|
302
|
+
end
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
context "and the actual hash contains string keys" do
|
307
|
+
it "produces the correct output" do
|
308
|
+
as_both_colored_and_uncolored do |color_enabled|
|
309
|
+
snippet = <<~TEST.strip
|
310
|
+
expected = HashWithIndifferentAccess.new({
|
311
|
+
shipments: [
|
312
|
+
HashWithIndifferentAccess.new({
|
313
|
+
estimated_delivery: HashWithIndifferentAccess.new({
|
314
|
+
from: '2019-05-06',
|
315
|
+
to: '2019-05-06'
|
316
|
+
})
|
317
|
+
})
|
318
|
+
]
|
319
|
+
})
|
320
|
+
actual = {
|
321
|
+
'shipments' => [
|
322
|
+
{
|
323
|
+
'estimated_delivery' => {
|
324
|
+
'from' => '2019-05-06',
|
325
|
+
'to' => '2019-05-09'
|
326
|
+
}
|
327
|
+
}
|
328
|
+
]
|
329
|
+
}
|
330
|
+
expect(actual).to eq(expected)
|
331
|
+
TEST
|
332
|
+
program = make_rspec_rails_test_program(
|
333
|
+
snippet,
|
334
|
+
color_enabled: color_enabled,
|
335
|
+
)
|
336
|
+
|
337
|
+
expected_output = build_expected_output(
|
338
|
+
color_enabled: color_enabled,
|
339
|
+
snippet: "expect(actual).to eq(expected)",
|
340
|
+
expectation: proc {
|
341
|
+
line do
|
342
|
+
plain "Expected "
|
343
|
+
beta %|{ "shipments" => [{ "estimated_delivery" => { "from" => "2019-05-06", "to" => "2019-05-09" } }] }|
|
344
|
+
end
|
345
|
+
|
346
|
+
line do
|
347
|
+
plain " to eq "
|
348
|
+
alpha %|#<HashWithIndifferentAccess { "shipments" => [#<HashWithIndifferentAccess { "estimated_delivery" => #<HashWithIndifferentAccess { "from" => "2019-05-06", "to" => "2019-05-06" }> }>] }>|
|
349
|
+
end
|
350
|
+
},
|
351
|
+
diff: proc {
|
352
|
+
plain_line %| #<HashWithIndifferentAccess {|
|
353
|
+
plain_line %| "shipments" => [|
|
354
|
+
plain_line %| {|
|
355
|
+
plain_line %| "estimated_delivery" => {|
|
356
|
+
plain_line %| "from" => "2019-05-06",|
|
357
|
+
alpha_line %|- "to" => "2019-05-06"|
|
358
|
+
beta_line %|+ "to" => "2019-05-09"|
|
359
|
+
plain_line %| }|
|
360
|
+
plain_line %| }|
|
361
|
+
plain_line %| ]|
|
362
|
+
plain_line %| }>|
|
363
|
+
},
|
364
|
+
)
|
365
|
+
|
366
|
+
expect(program).
|
367
|
+
to produce_output_when_run(expected_output).
|
368
|
+
in_color(color_enabled)
|
369
|
+
end
|
370
|
+
end
|
113
371
|
end
|
114
372
|
end
|
115
373
|
end
|
@@ -117,115 +375,373 @@ shared_examples_for "integration with HashWithIndifferentAccess" do
|
|
117
375
|
|
118
376
|
describe "and RSpec's #match matcher" do
|
119
377
|
context "when the actual value is a HashWithIndifferentAccess" do
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
378
|
+
context "and both hashes are one-dimensional" do
|
379
|
+
context "and the expected hash contains symbol keys" do
|
380
|
+
it "produces the correct output" do
|
381
|
+
as_both_colored_and_uncolored do |color_enabled|
|
382
|
+
snippet = <<~TEST.strip
|
383
|
+
expected = {
|
384
|
+
line_1: "123 Main St.",
|
385
|
+
city: "Hill Valley",
|
386
|
+
state: "CA",
|
387
|
+
zip: "90382",
|
388
|
+
}
|
389
|
+
actual = HashWithIndifferentAccess.new({
|
390
|
+
line_1: "456 Ponderosa Ct.",
|
391
|
+
city: "Oakland",
|
392
|
+
state: "CA",
|
393
|
+
zip: "91234",
|
394
|
+
})
|
395
|
+
expect(actual).to match(expected)
|
396
|
+
TEST
|
397
|
+
program = make_rspec_rails_test_program(
|
398
|
+
snippet,
|
399
|
+
color_enabled: color_enabled,
|
400
|
+
)
|
401
|
+
|
402
|
+
expected_output = build_expected_output(
|
403
|
+
color_enabled: color_enabled,
|
404
|
+
snippet: "expect(actual).to match(expected)",
|
405
|
+
expectation: proc {
|
406
|
+
line do
|
407
|
+
plain "Expected "
|
408
|
+
beta %|#<HashWithIndifferentAccess { "line_1" => "456 Ponderosa Ct.", "city" => "Oakland", "state" => "CA", "zip" => "91234" }>|
|
409
|
+
end
|
410
|
+
|
411
|
+
line do
|
412
|
+
plain "to match "
|
413
|
+
alpha %|{ line_1: "123 Main St.", city: "Hill Valley", state: "CA", zip: "90382" }|
|
414
|
+
end
|
415
|
+
},
|
416
|
+
diff: proc {
|
417
|
+
plain_line %| #<HashWithIndifferentAccess {|
|
418
|
+
alpha_line %|- "line_1" => "123 Main St.",|
|
419
|
+
beta_line %|+ "line_1" => "456 Ponderosa Ct.",|
|
420
|
+
alpha_line %|- "city" => "Hill Valley",|
|
421
|
+
beta_line %|+ "city" => "Oakland",|
|
422
|
+
plain_line %| "state" => "CA",|
|
423
|
+
alpha_line %|- "zip" => "90382"|
|
424
|
+
beta_line %|+ "zip" => "91234"|
|
425
|
+
plain_line %| }>|
|
426
|
+
},
|
427
|
+
)
|
428
|
+
|
429
|
+
expect(program).
|
430
|
+
to produce_output_when_run(expected_output).
|
431
|
+
in_color(color_enabled)
|
432
|
+
end
|
433
|
+
end
|
434
|
+
end
|
435
|
+
|
436
|
+
context "and the expected hash contains string keys" do
|
437
|
+
it "produces the correct output" do
|
438
|
+
as_both_colored_and_uncolored do |color_enabled|
|
439
|
+
snippet = <<~TEST.strip
|
440
|
+
expected = {
|
441
|
+
"line_1" => "123 Main St.",
|
442
|
+
"city" => "Hill Valley",
|
443
|
+
"state" => "CA",
|
444
|
+
"zip" => "90382",
|
445
|
+
}
|
446
|
+
actual = HashWithIndifferentAccess.new({
|
447
|
+
line_1: "456 Ponderosa Ct.",
|
448
|
+
city: "Oakland",
|
449
|
+
state: "CA",
|
450
|
+
zip: "91234",
|
451
|
+
})
|
452
|
+
expect(actual).to match(expected)
|
453
|
+
TEST
|
454
|
+
program = make_rspec_rails_test_program(
|
455
|
+
snippet,
|
456
|
+
color_enabled: color_enabled,
|
457
|
+
)
|
458
|
+
|
459
|
+
expected_output = build_expected_output(
|
460
|
+
color_enabled: color_enabled,
|
461
|
+
snippet: "expect(actual).to match(expected)",
|
462
|
+
expectation: proc {
|
463
|
+
line do
|
464
|
+
plain "Expected "
|
465
|
+
beta %|#<HashWithIndifferentAccess { "line_1" => "456 Ponderosa Ct.", "city" => "Oakland", "state" => "CA", "zip" => "91234" }>|
|
466
|
+
end
|
467
|
+
|
468
|
+
line do
|
469
|
+
plain "to match "
|
470
|
+
alpha %|{ "line_1" => "123 Main St.", "city" => "Hill Valley", "state" => "CA", "zip" => "90382" }|
|
471
|
+
end
|
472
|
+
},
|
473
|
+
diff: proc {
|
474
|
+
plain_line %| #<HashWithIndifferentAccess {|
|
475
|
+
alpha_line %|- "line_1" => "123 Main St.",|
|
476
|
+
beta_line %|+ "line_1" => "456 Ponderosa Ct.",|
|
477
|
+
alpha_line %|- "city" => "Hill Valley",|
|
478
|
+
beta_line %|+ "city" => "Oakland",|
|
479
|
+
plain_line %| "state" => "CA",|
|
480
|
+
alpha_line %|- "zip" => "90382"|
|
481
|
+
beta_line %|+ "zip" => "91234"|
|
482
|
+
plain_line %| }>|
|
483
|
+
},
|
484
|
+
)
|
485
|
+
|
486
|
+
expect(program).
|
487
|
+
to produce_output_when_run(expected_output).
|
488
|
+
in_color(color_enabled)
|
489
|
+
end
|
490
|
+
end
|
172
491
|
end
|
173
492
|
end
|
174
493
|
end
|
175
494
|
|
176
495
|
context "when the expected value is a HashWithIndifferentAccess" do
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
496
|
+
context "and both hashes are one-dimensional" do
|
497
|
+
context "and the actual hash contains symbol keys" do
|
498
|
+
it "produces the correct output" do
|
499
|
+
as_both_colored_and_uncolored do |color_enabled|
|
500
|
+
snippet = <<~TEST.strip
|
501
|
+
expected = HashWithIndifferentAccess.new({
|
502
|
+
line_1: "456 Ponderosa Ct.",
|
503
|
+
city: "Oakland",
|
504
|
+
state: "CA",
|
505
|
+
zip: "91234",
|
506
|
+
})
|
507
|
+
actual = {
|
508
|
+
line_1: "123 Main St.",
|
509
|
+
city: "Hill Valley",
|
510
|
+
state: "CA",
|
511
|
+
zip: "90382",
|
512
|
+
}
|
513
|
+
expect(actual).to match(expected)
|
514
|
+
TEST
|
515
|
+
program = make_rspec_rails_test_program(
|
516
|
+
snippet,
|
517
|
+
color_enabled: color_enabled,
|
518
|
+
)
|
519
|
+
|
520
|
+
expected_output = build_expected_output(
|
521
|
+
color_enabled: color_enabled,
|
522
|
+
snippet: "expect(actual).to match(expected)",
|
523
|
+
expectation: proc {
|
524
|
+
line do
|
525
|
+
plain "Expected "
|
526
|
+
beta %|{ line_1: "123 Main St.", city: "Hill Valley", state: "CA", zip: "90382" }|
|
527
|
+
end
|
528
|
+
|
529
|
+
line do
|
530
|
+
plain "to match "
|
531
|
+
alpha %|#<HashWithIndifferentAccess { "line_1" => "456 Ponderosa Ct.", "city" => "Oakland", "state" => "CA", "zip" => "91234" }>|
|
532
|
+
end
|
533
|
+
},
|
534
|
+
diff: proc {
|
535
|
+
plain_line %| #<HashWithIndifferentAccess {|
|
536
|
+
alpha_line %|- "line_1" => "456 Ponderosa Ct.",|
|
537
|
+
beta_line %|+ "line_1" => "123 Main St.",|
|
538
|
+
alpha_line %|- "city" => "Oakland",|
|
539
|
+
beta_line %|+ "city" => "Hill Valley",|
|
540
|
+
plain_line %| "state" => "CA",|
|
541
|
+
alpha_line %|- "zip" => "91234"|
|
542
|
+
beta_line %|+ "zip" => "90382"|
|
543
|
+
plain_line %| }>|
|
544
|
+
},
|
545
|
+
)
|
546
|
+
|
547
|
+
expect(program).
|
548
|
+
to produce_output_when_run(expected_output).
|
549
|
+
in_color(color_enabled)
|
550
|
+
end
|
551
|
+
end
|
552
|
+
end
|
553
|
+
|
554
|
+
context "and the actual hash contains string keys" do
|
555
|
+
it "produces the correct output" do
|
556
|
+
as_both_colored_and_uncolored do |color_enabled|
|
557
|
+
snippet = <<~TEST.strip
|
558
|
+
expected = HashWithIndifferentAccess.new({
|
559
|
+
line_1: "456 Ponderosa Ct.",
|
560
|
+
city: "Oakland",
|
561
|
+
state: "CA",
|
562
|
+
zip: "91234",
|
563
|
+
})
|
564
|
+
actual = {
|
565
|
+
"line_1" => "123 Main St.",
|
566
|
+
"city" => "Hill Valley",
|
567
|
+
"state" => "CA",
|
568
|
+
"zip" => "90382",
|
569
|
+
}
|
570
|
+
expect(actual).to match(expected)
|
571
|
+
TEST
|
572
|
+
program = make_rspec_rails_test_program(
|
573
|
+
snippet,
|
574
|
+
color_enabled: color_enabled,
|
575
|
+
)
|
576
|
+
|
577
|
+
expected_output = build_expected_output(
|
578
|
+
color_enabled: color_enabled,
|
579
|
+
snippet: "expect(actual).to match(expected)",
|
580
|
+
expectation: proc {
|
581
|
+
line do
|
582
|
+
plain "Expected "
|
583
|
+
beta %|{ "line_1" => "123 Main St.", "city" => "Hill Valley", "state" => "CA", "zip" => "90382" }|
|
584
|
+
end
|
585
|
+
|
586
|
+
line do
|
587
|
+
plain "to match "
|
588
|
+
alpha %|#<HashWithIndifferentAccess { "line_1" => "456 Ponderosa Ct.", "city" => "Oakland", "state" => "CA", "zip" => "91234" }>|
|
589
|
+
end
|
590
|
+
},
|
591
|
+
diff: proc {
|
592
|
+
plain_line %| #<HashWithIndifferentAccess {|
|
593
|
+
alpha_line %|- "line_1" => "456 Ponderosa Ct.",|
|
594
|
+
beta_line %|+ "line_1" => "123 Main St.",|
|
595
|
+
alpha_line %|- "city" => "Oakland",|
|
596
|
+
beta_line %|+ "city" => "Hill Valley",|
|
597
|
+
plain_line %| "state" => "CA",|
|
598
|
+
alpha_line %|- "zip" => "91234"|
|
599
|
+
beta_line %|+ "zip" => "90382"|
|
600
|
+
plain_line %| }>|
|
601
|
+
},
|
602
|
+
)
|
603
|
+
|
604
|
+
expect(program).
|
605
|
+
to produce_output_when_run(expected_output).
|
606
|
+
in_color(color_enabled)
|
607
|
+
end
|
608
|
+
end
|
609
|
+
end
|
610
|
+
end
|
611
|
+
|
612
|
+
context "and both hashes are multi-dimensional" do
|
613
|
+
context "and the actual hash contains symbol keys" do
|
614
|
+
it "produces the correct output" do
|
615
|
+
as_both_colored_and_uncolored do |color_enabled|
|
616
|
+
snippet = <<~TEST.strip
|
617
|
+
expected = HashWithIndifferentAccess.new({
|
618
|
+
shipments: [
|
619
|
+
HashWithIndifferentAccess.new({
|
620
|
+
estimated_delivery: HashWithIndifferentAccess.new({
|
621
|
+
from: '2019-05-06',
|
622
|
+
to: '2019-05-06'
|
623
|
+
})
|
624
|
+
})
|
625
|
+
]
|
626
|
+
})
|
627
|
+
actual = {
|
628
|
+
shipments: [
|
629
|
+
{
|
630
|
+
estimated_delivery: {
|
631
|
+
from: '2019-05-06',
|
632
|
+
to: '2019-05-09'
|
633
|
+
}
|
634
|
+
}
|
635
|
+
]
|
636
|
+
}
|
637
|
+
expect(actual).to match(expected)
|
638
|
+
TEST
|
639
|
+
program = make_rspec_rails_test_program(
|
640
|
+
snippet,
|
641
|
+
color_enabled: color_enabled,
|
642
|
+
)
|
643
|
+
|
644
|
+
expected_output = build_expected_output(
|
645
|
+
color_enabled: color_enabled,
|
646
|
+
snippet: "expect(actual).to match(expected)",
|
647
|
+
expectation: proc {
|
648
|
+
line do
|
649
|
+
plain "Expected "
|
650
|
+
beta %|{ shipments: [{ estimated_delivery: { from: "2019-05-06", to: "2019-05-09" } }] }|
|
651
|
+
end
|
652
|
+
|
653
|
+
line do
|
654
|
+
plain "to match "
|
655
|
+
alpha %|#<HashWithIndifferentAccess { "shipments" => [#<HashWithIndifferentAccess { "estimated_delivery" => #<HashWithIndifferentAccess { "from" => "2019-05-06", "to" => "2019-05-06" }> }>] }>|
|
656
|
+
end
|
657
|
+
},
|
658
|
+
diff: proc {
|
659
|
+
plain_line %| #<HashWithIndifferentAccess {|
|
660
|
+
plain_line %| "shipments" => [|
|
661
|
+
plain_line %| {|
|
662
|
+
plain_line %| "estimated_delivery" => {|
|
663
|
+
plain_line %| "from" => "2019-05-06",|
|
664
|
+
alpha_line %|- "to" => "2019-05-06"|
|
665
|
+
beta_line %|+ "to" => "2019-05-09"|
|
666
|
+
plain_line %| }|
|
667
|
+
plain_line %| }|
|
668
|
+
plain_line %| ]|
|
669
|
+
plain_line %| }>|
|
670
|
+
},
|
671
|
+
)
|
672
|
+
|
673
|
+
expect(program).
|
674
|
+
to produce_output_when_run(expected_output).
|
675
|
+
in_color(color_enabled)
|
676
|
+
end
|
677
|
+
end
|
678
|
+
end
|
679
|
+
|
680
|
+
context "and the actual hash contains string keys" do
|
681
|
+
it "produces the correct output" do
|
682
|
+
as_both_colored_and_uncolored do |color_enabled|
|
683
|
+
snippet = <<~TEST.strip
|
684
|
+
expected = HashWithIndifferentAccess.new({
|
685
|
+
shipments: [
|
686
|
+
HashWithIndifferentAccess.new({
|
687
|
+
estimated_delivery: HashWithIndifferentAccess.new({
|
688
|
+
from: '2019-05-06',
|
689
|
+
to: '2019-05-06'
|
690
|
+
})
|
691
|
+
})
|
692
|
+
]
|
693
|
+
})
|
694
|
+
actual = {
|
695
|
+
'shipments' => [
|
696
|
+
{
|
697
|
+
'estimated_delivery' => {
|
698
|
+
'from' => '2019-05-06',
|
699
|
+
'to' => '2019-05-09'
|
700
|
+
}
|
701
|
+
}
|
702
|
+
]
|
703
|
+
}
|
704
|
+
expect(actual).to match(expected)
|
705
|
+
TEST
|
706
|
+
program = make_rspec_rails_test_program(
|
707
|
+
snippet,
|
708
|
+
color_enabled: color_enabled,
|
709
|
+
)
|
710
|
+
|
711
|
+
expected_output = build_expected_output(
|
712
|
+
color_enabled: color_enabled,
|
713
|
+
snippet: "expect(actual).to match(expected)",
|
714
|
+
expectation: proc {
|
715
|
+
line do
|
716
|
+
plain "Expected "
|
717
|
+
beta %|{ "shipments" => [{ "estimated_delivery" => { "from" => "2019-05-06", "to" => "2019-05-09" } }] }|
|
718
|
+
end
|
719
|
+
|
720
|
+
line do
|
721
|
+
plain "to match "
|
722
|
+
alpha %|#<HashWithIndifferentAccess { "shipments" => [#<HashWithIndifferentAccess { "estimated_delivery" => #<HashWithIndifferentAccess { "from" => "2019-05-06", "to" => "2019-05-06" }> }>] }>|
|
723
|
+
end
|
724
|
+
},
|
725
|
+
diff: proc {
|
726
|
+
plain_line %| #<HashWithIndifferentAccess {|
|
727
|
+
plain_line %| "shipments" => [|
|
728
|
+
plain_line %| {|
|
729
|
+
plain_line %| "estimated_delivery" => {|
|
730
|
+
plain_line %| "from" => "2019-05-06",|
|
731
|
+
alpha_line %|- "to" => "2019-05-06"|
|
732
|
+
beta_line %|+ "to" => "2019-05-09"|
|
733
|
+
plain_line %| }|
|
734
|
+
plain_line %| }|
|
735
|
+
plain_line %| ]|
|
736
|
+
plain_line %| }>|
|
737
|
+
},
|
738
|
+
)
|
739
|
+
|
740
|
+
expect(program).
|
741
|
+
to produce_output_when_run(expected_output).
|
742
|
+
in_color(color_enabled)
|
743
|
+
end
|
744
|
+
end
|
229
745
|
end
|
230
746
|
end
|
231
747
|
end
|