-
Notifications
You must be signed in to change notification settings - Fork 0
/
music_collection_spec.rb
253 lines (213 loc) · 4.7 KB
/
music_collection_spec.rb
1
2
3
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
56
57
58
59
60
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
113
114
115
116
117
118
119
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
172
173
174
175
176
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
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
require 'spec_helper'
describe "Collection" do
SONGS = <<END
Fields of Gold
Sting
Ten Summoner's Tales
Mad About You
Sting
The Soul Cages
Fields of Gold
Eva Cassidy
Live at Blues Alley
Autumn Leaves
Eva Cassidy
Live at Blues Alley
Autumn Leaves
Bill Evans
Portrait in Jazz
Brain of J.F.K
Pearl Jam
Yield
Jeremy
Pearl Jam
Ten
Come Away With Me
Norah Johnes
One
Acknowledgment
John Coltrane
A Love Supreme
Ruby, My Dear
Thelonious Monk
Mysterioso
END
let(:collection) { Collection.parse(SONGS) }
it 'has a custom to_s method' do
expect(collection.to_s).to eq <<-EOL
Fields of Gold
Sting
Ten Summoner's Tales
Mad About You
Sting
The Soul Cages
Fields of Gold
Eva Cassidy
Live at Blues Alley
Autumn Leaves
Eva Cassidy
Live at Blues Alley
Autumn Leaves
Bill Evans
Portrait in Jazz
Brain of J.F.K
Pearl Jam
Yield
Jeremy
Pearl Jam
Ten
Come Away With Me
Norah Johnes
One
Acknowledgment
John Coltrane
A Love Supreme
Ruby, My Dear
Thelonious Monk
Mysterioso
EOL
end
it "can find all the songs in the collection" do
collection.names.should =~ [
'Fields of Gold',
'Mad About You',
'Autumn Leaves',
'Brain of J.F.K',
'Jeremy',
'Come Away With Me',
'Acknowledgment',
'Ruby, My Dear',
]
end
it "can find all the albums in the collection" do
collection.albums.should =~ [
"Ten Summoner's Tales",
'The Soul Cages',
'Live at Blues Alley',
'Portrait in Jazz',
'Yield',
'Ten',
'One',
'A Love Supreme',
'Mysterioso',
]
end
it "can find all the artists in the collection" do
collection.artists.should =~ [
'Sting',
'Eva Cassidy',
'Bill Evans',
'Pearl Jam',
'Norah Johnes',
'John Coltrane',
'Thelonious Monk',
]
end
it 'implements the Enumerable module' do
collection.map { |song| song.name }.should =~ [
'Fields of Gold',
'Mad About You',
'Fields of Gold',
'Autumn Leaves',
'Autumn Leaves',
'Brain of J.F.K',
'Jeremy',
'Come Away With Me',
'Acknowledgment',
'Ruby, My Dear',
]
collection.map { |song| song.artist }.should =~ [
'Sting',
'Sting',
'Eva Cassidy',
'Eva Cassidy',
'Bill Evans',
'Pearl Jam',
'Pearl Jam',
'Norah Johnes',
'John Coltrane',
'Thelonious Monk',
]
collection.map { |song| song.album }.should =~ [
"Ten Summoner's Tales",
'The Soul Cages',
'Live at Blues Alley',
'Live at Blues Alley',
'Portrait in Jazz',
'Yield',
'Ten',
'One',
'A Love Supreme',
'Mysterioso',
]
end
it "can filter collection by name" do
expect(collection.filter(Criteria.name 'Fields of Gold').artists).to eq [
'Sting',
'Eva Cassidy',
]
expect(collection.filter(Criteria.name 'Autumn Leaves').albums).to eq [
'Live at Blues Alley',
'Portrait in Jazz',
]
expect(collection.filter(Criteria.name 'Brain of J.F.K').songs).to eq [
Song.new('Brain of J.F.K', 'Pearl Jam', 'Yield')]
end
it "can filter collection by artist" do
expect(collection.filter(Criteria.artist 'Sting').songs.size).to eq 2
expect(collection.filter(Criteria.artist 'Sting').songs).to eq [
Song.new('Fields of Gold', 'Sting', 'Ten Summoner\'s Tales'),
Song.new('Mad About You', 'Sting', 'The Soul Cages'),
]
end
it "can filter collection by album" do
expect(collection.filter(Criteria.album 'Live at Blues Alley').songs.size).to eq 2
expect(collection.filter(Criteria.album 'Live at Blues Alley').songs).to eq [
Song.new('Fields of Gold', 'Eva Cassidy', 'Live at Blues Alley'),
Song.new('Autumn Leaves', 'Eva Cassidy', 'Live at Blues Alley'),
]
end
it 'can filter by exclusion' do
expect(collection.filter(!Criteria.artist('Sting')).to_s).to eq <<-EOL
Fields of Gold
Eva Cassidy
Live at Blues Alley
Autumn Leaves
Eva Cassidy
Live at Blues Alley
Autumn Leaves
Bill Evans
Portrait in Jazz
Brain of J.F.K
Pearl Jam
Yield
Jeremy
Pearl Jam
Ten
Come Away With Me
Norah Johnes
One
Acknowledgment
John Coltrane
A Love Supreme
Ruby, My Dear
Thelonious Monk
Mysterioso
EOL
end
it "supports a conjuction of filters" do
filtered = collection.filter Criteria.artist('Sting') & Criteria.name('Fields of Gold')
filtered.map(&:album).should eq ["Ten Summoner's Tales"]
end
it "can be adjoined with another collection" do
sting = collection.filter Criteria.artist('Sting')
eva = collection.filter Criteria.artist('Eva Cassidy')
adjoined = sting.adjoin(eva)
adjoined.count.should eq 4
adjoined.names.should =~ [
'Fields of Gold',
'Autumn Leaves',
'Mad About You',
]
end
end