enumerize 2.0.0 → 2.7.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.
- checksums.yaml +5 -5
- data/.github/workflows/ruby.yml +75 -0
- data/CHANGELOG.md +117 -3
- data/Gemfile +3 -3
- data/Gemfile.global +5 -9
- data/Gemfile.mongo_mapper +2 -2
- data/Gemfile.rails60 +6 -0
- data/Gemfile.rails61 +6 -0
- data/Gemfile.rails70 +9 -0
- data/Gemfile.railsmaster +5 -0
- data/README.md +210 -92
- data/Rakefile +9 -3
- data/enumerize.gemspec +1 -1
- data/lib/enumerize/activemodel.rb +47 -0
- data/lib/enumerize/activerecord.rb +92 -6
- data/lib/enumerize/attribute.rb +19 -11
- data/lib/enumerize/attribute_map.rb +2 -0
- data/lib/enumerize/base.rb +22 -18
- data/lib/enumerize/hooks/formtastic.rb +4 -1
- data/lib/enumerize/hooks/sequel_dataset.rb +2 -0
- data/lib/enumerize/hooks/simple_form.rb +4 -1
- data/lib/enumerize/hooks/uniqueness.rb +5 -1
- data/lib/enumerize/integrations/rails_admin.rb +3 -1
- data/lib/enumerize/integrations/rspec/matcher.rb +7 -2
- data/lib/enumerize/integrations/rspec.rb +3 -0
- data/lib/enumerize/module.rb +2 -0
- data/lib/enumerize/module_attributes.rb +2 -0
- data/lib/enumerize/mongoid.rb +23 -0
- data/lib/enumerize/predicatable.rb +3 -1
- data/lib/enumerize/predicates.rb +16 -0
- data/lib/enumerize/scope/activerecord.rb +16 -0
- data/lib/enumerize/scope/mongoid.rb +15 -0
- data/lib/enumerize/scope/sequel.rb +16 -0
- data/lib/enumerize/sequel.rb +9 -4
- data/lib/enumerize/set.rb +2 -0
- data/lib/enumerize/utils.rb +12 -0
- data/lib/enumerize/value.rb +14 -15
- data/lib/enumerize/version.rb +3 -1
- data/lib/enumerize.rb +9 -0
- data/lib/sequel/plugins/enumerize.rb +18 -0
- data/spec/enumerize/integrations/rspec/matcher_spec.rb +13 -10
- data/spec/spec_helper.rb +2 -0
- data/test/activemodel_test.rb +114 -0
- data/test/activerecord_test.rb +327 -78
- data/test/attribute_map_test.rb +9 -7
- data/test/attribute_test.rb +37 -34
- data/test/base_test.rb +117 -65
- data/test/formtastic_test.rb +25 -0
- data/test/module_attributes_test.rb +10 -8
- data/test/mongo_mapper_test.rb +20 -11
- data/test/mongoid_test.rb +52 -23
- data/test/multiple_test.rb +27 -19
- data/test/predicates_test.rb +51 -29
- data/test/rails_admin_test.rb +8 -6
- data/test/sequel_test.rb +228 -177
- data/test/set_test.rb +29 -27
- data/test/simple_form_test.rb +25 -0
- data/test/support/mock_controller.rb +6 -0
- data/test/support/shared_enums.rb +43 -0
- data/test/support/view_test_helper.rb +14 -1
- data/test/test_helper.rb +10 -0
- data/test/value_test.rb +59 -31
- metadata +16 -7
- data/.travis.yml +0 -18
- data/Gemfile.rails42 +0 -6
data/test/sequel_test.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
require 'sequel'
|
3
5
|
require 'logger'
|
4
6
|
require 'jdbc/sqlite3' if RUBY_PLATFORM == 'java'
|
5
7
|
|
6
|
-
|
8
|
+
class SequelTest < MiniTest::Spec
|
7
9
|
silence_warnings do
|
8
10
|
DB = if RUBY_PLATFORM == 'java'
|
9
11
|
Sequel.connect('jdbc:sqlite::memory:')
|
@@ -21,7 +23,9 @@ module SequelTest
|
|
21
23
|
String :name
|
22
24
|
String :interests
|
23
25
|
String :status
|
26
|
+
Integer :skill
|
24
27
|
String :account_type, default: "basic"
|
28
|
+
String :foo
|
25
29
|
end
|
26
30
|
|
27
31
|
DB.create_table :documents do
|
@@ -32,7 +36,7 @@ module SequelTest
|
|
32
36
|
end
|
33
37
|
|
34
38
|
class Document < Sequel::Model
|
35
|
-
|
39
|
+
plugin :enumerize
|
36
40
|
enumerize :visibility, :in => [:public, :private, :protected], :scope => true, :default => :public
|
37
41
|
end
|
38
42
|
|
@@ -47,15 +51,17 @@ module SequelTest
|
|
47
51
|
plugin :dirty
|
48
52
|
plugin :defaults_setter
|
49
53
|
plugin :validation_helpers
|
50
|
-
|
54
|
+
plugin :enumerize
|
51
55
|
include RoleEnum
|
52
56
|
|
53
|
-
enumerize :sex, :in => [:male, :female]
|
57
|
+
enumerize :sex, :in => [:male, :female], scope: :shallow
|
54
58
|
|
55
59
|
enumerize :interests, :in => [:music, :sports, :dancing, :programming], :multiple => true
|
56
60
|
|
57
61
|
enumerize :status, :in => { active: 1, blocked: 2 }, scope: true
|
58
62
|
|
63
|
+
enumerize :skill, :in => { noob: 0, casual: 1, pro: 2 }, scope: :shallow
|
64
|
+
|
59
65
|
enumerize :account_type, :in => [:basic, :premium]
|
60
66
|
end
|
61
67
|
|
@@ -67,225 +73,270 @@ module SequelTest
|
|
67
73
|
end
|
68
74
|
end
|
69
75
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
user.sex = :invalid
|
74
|
-
user.sex.must_equal nil
|
75
|
-
end
|
76
|
+
class SkipValidationsUser < Sequel::Model(:users)
|
77
|
+
include SkipValidationsEnum
|
78
|
+
end
|
76
79
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
user.sex = :female
|
81
|
-
user.save
|
82
|
-
user.sex.must_equal 'female'
|
83
|
-
end
|
80
|
+
class DoNotSkipValidationsUser < Sequel::Model(:users)
|
81
|
+
include DoNotSkipValidationsEnum
|
82
|
+
end
|
84
83
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
store_translations(:en, :enumerize => {:sex => {:male => 'Male'}}) do
|
89
|
-
user = User.first
|
90
|
-
user.sex.must_equal 'male'
|
91
|
-
user.sex_text.must_equal 'Male'
|
92
|
-
end
|
93
|
-
end
|
84
|
+
class SkipValidationsLambdaUser < Sequel::Model(:users)
|
85
|
+
include SkipValidationsLambdaEnum
|
86
|
+
end
|
94
87
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
end
|
88
|
+
class SkipValidationsLambdaWithParamUser < Sequel::Model(:users)
|
89
|
+
include SkipValidationsLambdaWithParamEnum
|
90
|
+
end
|
99
91
|
|
100
|
-
|
101
|
-
|
102
|
-
|
92
|
+
it 'sets nil if invalid value is passed' do
|
93
|
+
user = User.new
|
94
|
+
user.sex = :invalid
|
95
|
+
expect(user.sex).must_be_nil
|
96
|
+
end
|
103
97
|
|
104
|
-
|
105
|
-
|
98
|
+
it 'saves value' do
|
99
|
+
User.filter{ true }.delete
|
100
|
+
user = User.new
|
101
|
+
user.sex = :female
|
102
|
+
user.save
|
103
|
+
expect(user.sex).must_equal 'female'
|
104
|
+
end
|
106
105
|
|
107
|
-
|
108
|
-
|
109
|
-
|
106
|
+
it 'loads value' do
|
107
|
+
User.filter{ true }.delete
|
108
|
+
User.create(:sex => :male)
|
109
|
+
store_translations(:en, :enumerize => {:sex => {:male => 'Male'}}) do
|
110
|
+
user = User.first
|
111
|
+
expect(user.sex).must_equal 'male'
|
112
|
+
expect(user.sex_text).must_equal 'Male'
|
110
113
|
end
|
111
|
-
|
112
|
-
User.filter.delete
|
113
|
-
User.create(sex: 'male', lambda_role: nil)
|
114
|
+
end
|
114
115
|
|
115
|
-
|
116
|
-
|
117
|
-
|
116
|
+
it 'has default value' do
|
117
|
+
expect(User.new.role).must_equal 'user'
|
118
|
+
expect(User.new.values[:role]).must_equal 'user'
|
119
|
+
end
|
118
120
|
|
119
|
-
|
120
|
-
|
121
|
-
|
121
|
+
it 'does not set default value for not selected attributes' do
|
122
|
+
User.filter{ true }.delete
|
123
|
+
User.create(:sex => :male)
|
122
124
|
|
123
|
-
|
124
|
-
|
125
|
-
user.role = 'wrong'
|
126
|
-
user.wont_be :valid?
|
127
|
-
user.errors[:role].must_include 'is not included in the list'
|
128
|
-
end
|
125
|
+
assert_equal [:id], User.select(:id).first.values.keys
|
126
|
+
end
|
129
127
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
128
|
+
it 'has default value with lambda' do
|
129
|
+
expect(User.new.lambda_role).must_equal 'admin'
|
130
|
+
expect(User.new.values[:lambda_role]).must_equal 'admin'
|
131
|
+
end
|
132
|
+
it 'uses after_initialize callback to set default value' do
|
133
|
+
User.filter{ true }.delete
|
134
|
+
User.create(sex: 'male', lambda_role: nil)
|
135
135
|
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
end
|
136
|
+
user = User.where(:sex => 'male').first
|
137
|
+
expect(user.lambda_role).must_equal 'admin'
|
138
|
+
end
|
140
139
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
user.must_be :valid?
|
145
|
-
end
|
140
|
+
it 'uses default value from db column' do
|
141
|
+
expect(User.new.account_type).must_equal 'basic'
|
142
|
+
end
|
146
143
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
144
|
+
it 'validates inclusion' do
|
145
|
+
user = User.new
|
146
|
+
user.role = 'wrong'
|
147
|
+
expect(user).wont_be :valid?
|
148
|
+
expect(user.errors[:role]).must_include 'is not included in the list'
|
149
|
+
end
|
152
150
|
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
user.interests.must_be_empty
|
157
|
-
user.interests << "music"
|
158
|
-
user.interests.must_equal %w(music)
|
159
|
-
user.save
|
160
|
-
|
161
|
-
user = User[user.id]
|
162
|
-
user.interests.must_be_instance_of Enumerize::Set
|
163
|
-
user.interests.must_equal %w(music)
|
164
|
-
user.interests << "sports"
|
165
|
-
user.interests.must_equal %w(music sports)
|
166
|
-
|
167
|
-
user.interests = []
|
168
|
-
interests = user.interests
|
169
|
-
interests << "music"
|
170
|
-
interests.must_equal %w(music)
|
171
|
-
interests << "dancing"
|
172
|
-
interests.must_equal %w(music dancing)
|
151
|
+
it 'validates inclusion on mass assignment' do
|
152
|
+
assert_raises Sequel::ValidationFailed do
|
153
|
+
User.create(role: 'wrong')
|
173
154
|
end
|
155
|
+
end
|
174
156
|
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
157
|
+
it "uses persisted value for validation if it hasn't been set" do
|
158
|
+
user = User.create :sex => :male
|
159
|
+
expect(User[user.id].read_attribute_for_validation(:sex)).must_equal 'male'
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'is valid with empty string assigned' do
|
163
|
+
user = User.new
|
164
|
+
user.role = ''
|
165
|
+
expect(user).must_be :valid?
|
166
|
+
end
|
182
167
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
168
|
+
it 'stores nil when empty string assigned' do
|
169
|
+
user = User.new
|
170
|
+
user.role = ''
|
171
|
+
expect(user.values[:role]).must_be_nil
|
172
|
+
end
|
187
173
|
|
188
|
-
|
189
|
-
|
174
|
+
it 'validates inclusion when :skip_validations = false' do
|
175
|
+
user = DoNotSkipValidationsUser.new
|
176
|
+
user.foo = 'wrong'
|
177
|
+
expect(user).wont_be :valid?
|
178
|
+
expect(user.errors[:foo]).must_include 'is not included in the list'
|
179
|
+
end
|
190
180
|
|
191
|
-
|
192
|
-
|
193
|
-
|
181
|
+
it 'does not validate inclusion when :skip_validations = true' do
|
182
|
+
user = SkipValidationsUser.new
|
183
|
+
user.foo = 'wrong'
|
184
|
+
expect(user).must_be :valid?
|
185
|
+
end
|
194
186
|
|
195
|
-
|
196
|
-
|
187
|
+
it 'supports :skip_validations option as lambda' do
|
188
|
+
user = SkipValidationsLambdaUser.new
|
189
|
+
user.foo = 'wrong'
|
190
|
+
expect(user).must_be :valid?
|
191
|
+
end
|
197
192
|
|
198
|
-
|
199
|
-
|
193
|
+
it 'supports :skip_validations option as lambda with a parameter' do
|
194
|
+
user = SkipValidationsLambdaWithParamUser.new
|
195
|
+
user.foo = 'wrong'
|
196
|
+
expect(user).must_be :valid?
|
197
|
+
end
|
200
198
|
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
199
|
+
it 'supports multiple attributes' do
|
200
|
+
user = User.new
|
201
|
+
user.interests ||= []
|
202
|
+
expect(user.interests).must_be_empty
|
203
|
+
user.interests << "music"
|
204
|
+
expect(user.interests).must_equal %w(music)
|
205
|
+
user.save
|
206
|
+
|
207
|
+
user = User[user.id]
|
208
|
+
expect(user.interests).must_be_instance_of Enumerize::Set
|
209
|
+
expect(user.interests).must_equal %w(music)
|
210
|
+
user.interests << "sports"
|
211
|
+
expect(user.interests).must_equal %w(music sports)
|
212
|
+
|
213
|
+
user.interests = []
|
214
|
+
interests = user.interests
|
215
|
+
interests << "music"
|
216
|
+
expect(interests).must_equal %w(music)
|
217
|
+
interests << "dancing"
|
218
|
+
expect(interests).must_equal %w(music dancing)
|
219
|
+
end
|
205
220
|
|
206
|
-
|
207
|
-
|
208
|
-
|
221
|
+
it 'returns invalid multiple value for validation' do
|
222
|
+
user = User.new
|
223
|
+
user.interests << :music
|
224
|
+
user.interests << :invalid
|
225
|
+
values = user.read_attribute_for_validation(:interests)
|
226
|
+
expect(values).must_equal %w(music invalid)
|
227
|
+
end
|
209
228
|
|
210
|
-
|
211
|
-
|
229
|
+
it 'validates multiple attributes' do
|
230
|
+
user = User.new
|
231
|
+
user.interests << :invalid
|
232
|
+
expect(user).wont_be :valid?
|
212
233
|
|
213
|
-
|
214
|
-
|
234
|
+
user.interests = Object.new
|
235
|
+
expect(user).wont_be :valid?
|
215
236
|
|
216
|
-
|
217
|
-
|
218
|
-
|
237
|
+
user.interests = ['music', '']
|
238
|
+
expect(user).must_be :valid?
|
239
|
+
end
|
219
240
|
|
220
|
-
|
221
|
-
|
241
|
+
it 'stores custom values for multiple attributes' do
|
242
|
+
User.filter{ true }.delete
|
222
243
|
|
223
|
-
|
224
|
-
|
244
|
+
klass = Class.new(User)
|
245
|
+
klass.enumerize :interests, in: { music: 0, sports: 1, dancing: 2, programming: 3}, multiple: true
|
225
246
|
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
247
|
+
user = klass.new
|
248
|
+
user.interests << :music
|
249
|
+
expect(user.interests).must_equal %w(music)
|
250
|
+
user.save
|
230
251
|
|
231
|
-
|
232
|
-
|
233
|
-
|
252
|
+
user = klass[user.id]
|
253
|
+
expect(user.interests).must_equal %w(music)
|
254
|
+
end
|
234
255
|
|
235
|
-
|
236
|
-
|
237
|
-
user_3.must_be :valid?
|
238
|
-
end
|
256
|
+
it 'adds scope' do
|
257
|
+
User.filter{ true }.delete
|
239
258
|
|
240
|
-
|
241
|
-
|
259
|
+
user_1 = User.create(sex: :female, skill: :noob, status: :active, role: :admin)
|
260
|
+
user_2 = User.create(sex: :female, skill: :casual, status: :blocked)
|
261
|
+
user_3 = User.create(sex: :male, skill: :pro)
|
242
262
|
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
end
|
263
|
+
expect(User.with_status(:active).to_a).must_equal [user_1]
|
264
|
+
expect(User.with_status(:blocked).to_a).must_equal [user_2]
|
265
|
+
expect(User.with_status(:active, :blocked).to_set).must_equal [user_1, user_2].to_set
|
247
266
|
|
248
|
-
|
249
|
-
|
267
|
+
expect(User.without_status(:active).to_a).must_equal [user_2]
|
268
|
+
expect(User.without_status(:active, :blocked).to_a).must_equal []
|
250
269
|
|
251
|
-
|
252
|
-
|
270
|
+
expect(User.having_role(:admin).to_a).must_equal [user_1]
|
271
|
+
expect(User.male.to_a).must_equal [user_3]
|
272
|
+
expect(User.pro.to_a).must_equal [user_3]
|
253
273
|
|
254
|
-
|
255
|
-
|
274
|
+
expect(User.not_male.to_set).must_equal [user_1, user_2].to_set
|
275
|
+
expect(User.not_pro.to_set).must_equal [user_1, user_2].to_set
|
276
|
+
end
|
256
277
|
|
257
|
-
|
258
|
-
|
278
|
+
it 'allows either key or value as valid' do
|
279
|
+
user_1 = User.new(status: :active)
|
280
|
+
user_2 = User.new(status: 1)
|
281
|
+
user_3 = User.new(status: '1')
|
259
282
|
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
user.valid?.must_equal false
|
283
|
+
expect(user_1.status).must_equal 'active'
|
284
|
+
expect(user_2.status).must_equal 'active'
|
285
|
+
expect(user_3.status).must_equal 'active'
|
264
286
|
|
265
|
-
|
266
|
-
|
287
|
+
expect(user_1).must_be :valid?
|
288
|
+
expect(user_2).must_be :valid?
|
289
|
+
expect(user_3).must_be :valid?
|
290
|
+
end
|
267
291
|
|
268
|
-
|
269
|
-
|
292
|
+
it 'supports defining enumerized attributes on abstract class' do
|
293
|
+
Document.filter{ true }.delete
|
270
294
|
|
271
|
-
|
295
|
+
document = Document.new
|
296
|
+
document.visibility = :protected
|
297
|
+
expect(document.visibility).must_equal 'protected'
|
298
|
+
end
|
272
299
|
|
273
|
-
|
274
|
-
|
275
|
-
document.save
|
300
|
+
it 'supports defining enumerized scopes on abstract class' do
|
301
|
+
Document.filter{ true }.delete
|
276
302
|
|
277
|
-
|
278
|
-
|
303
|
+
document_1 = Document.create(visibility: :public)
|
304
|
+
document_2 = Document.create(visibility: :private)
|
279
305
|
|
280
|
-
|
281
|
-
|
306
|
+
expect(Document.with_visibility(:public).to_a).must_equal [document_1]
|
307
|
+
end
|
282
308
|
|
283
|
-
|
284
|
-
|
285
|
-
user.status = :blocked
|
309
|
+
it 'validates uniqueness' do
|
310
|
+
user = User.create(status: :active, sex: "male")
|
286
311
|
|
287
|
-
|
288
|
-
|
289
|
-
|
312
|
+
user = UniqStatusUser.new
|
313
|
+
user.sex = "male"
|
314
|
+
user.status = :active
|
315
|
+
expect(user.valid?).must_equal false
|
316
|
+
|
317
|
+
expect(user.errors[:status]).wont_be :empty?
|
318
|
+
end
|
319
|
+
|
320
|
+
it "doesn't update record" do
|
321
|
+
Document.filter{ true }.delete
|
322
|
+
|
323
|
+
expected = Time.new(2010, 10, 10)
|
324
|
+
|
325
|
+
document = Document.new
|
326
|
+
document.updated_at = expected
|
327
|
+
document.save
|
328
|
+
|
329
|
+
document = Document.last
|
330
|
+
document.save
|
331
|
+
|
332
|
+
assert_equal expected, document.updated_at
|
333
|
+
end
|
334
|
+
|
335
|
+
it 'changes from dirty should be serialized as scalar values' do
|
336
|
+
user = User.create(:status => :active)
|
337
|
+
user.status = :blocked
|
338
|
+
|
339
|
+
expected = { status: [1, 2] }.to_yaml
|
340
|
+
assert_equal expected, user.column_changes.to_yaml
|
290
341
|
end
|
291
342
|
end
|
data/test/set_test.rb
CHANGED
@@ -1,18 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
require 'yaml'
|
3
5
|
|
4
|
-
|
5
|
-
let(:
|
6
|
+
class SetTest < MiniTest::Spec
|
7
|
+
let(:kklass) do
|
6
8
|
Class.new do
|
7
9
|
extend Enumerize
|
8
10
|
enumerize :foo, :in => %w(a b c), :multiple => true
|
9
11
|
end
|
10
12
|
end
|
11
13
|
|
12
|
-
let(:object) {
|
14
|
+
let(:object) { kklass.new }
|
13
15
|
|
14
16
|
def build_set(values)
|
15
|
-
@set = Enumerize::Set.new(object,
|
17
|
+
@set = Enumerize::Set.new(object, kklass.foo, values)
|
16
18
|
end
|
17
19
|
|
18
20
|
def set
|
@@ -39,36 +41,36 @@ describe Enumerize::Set do
|
|
39
41
|
end
|
40
42
|
|
41
43
|
it 'equals to other set' do
|
42
|
-
set.must_equal Enumerize::Set.new(nil,
|
44
|
+
expect(set).must_equal Enumerize::Set.new(nil, kklass.foo, %w(a))
|
43
45
|
end
|
44
46
|
|
45
47
|
it 'equals to array' do
|
46
|
-
set.must_equal %w(a)
|
48
|
+
expect(set).must_equal %w(a)
|
47
49
|
end
|
48
50
|
|
49
51
|
it 'equals to array of symbols' do
|
50
|
-
set.must_equal [:a]
|
52
|
+
expect(set).must_equal [:a]
|
51
53
|
end
|
52
54
|
|
53
55
|
it 'has unique values' do
|
54
56
|
set << :a
|
55
|
-
set.must_equal %w(a)
|
57
|
+
expect(set).must_equal %w(a)
|
56
58
|
end
|
57
59
|
|
58
60
|
it 'equals to array with different value order' do
|
59
61
|
set << :b
|
60
|
-
set.must_equal %w(b a)
|
62
|
+
expect(set).must_equal %w(b a)
|
61
63
|
end
|
62
64
|
|
63
65
|
it "isn't equal to a part of values" do
|
64
66
|
set << :b
|
65
|
-
set.wont_equal %w(a)
|
67
|
+
expect(set).wont_equal %w(a)
|
66
68
|
end
|
67
69
|
|
68
70
|
describe '#push' do
|
69
71
|
it 'appends values' do
|
70
72
|
set.push :b
|
71
|
-
set.must_include :b
|
73
|
+
expect(set).must_include :b
|
72
74
|
end
|
73
75
|
|
74
76
|
it 'reassigns attribute' do
|
@@ -81,7 +83,7 @@ describe Enumerize::Set do
|
|
81
83
|
describe '#delete' do
|
82
84
|
it 'deletes value' do
|
83
85
|
set.delete :a
|
84
|
-
set.wont_include :a
|
86
|
+
expect(set).wont_include :a
|
85
87
|
end
|
86
88
|
|
87
89
|
it 'reassigns attribute' do
|
@@ -94,64 +96,64 @@ describe Enumerize::Set do
|
|
94
96
|
describe '#inspect' do
|
95
97
|
it 'returns custom string' do
|
96
98
|
set << :b
|
97
|
-
set.inspect.must_equal '#<Enumerize::Set {a, b}>'
|
99
|
+
expect(set.inspect).must_equal '#<Enumerize::Set {a, b}>'
|
98
100
|
end
|
99
101
|
end
|
100
102
|
|
101
103
|
describe '#to_ary' do
|
102
104
|
it 'returns array' do
|
103
|
-
set.to_ary.must_be_instance_of Array
|
105
|
+
expect(set.to_ary).must_be_instance_of Array
|
104
106
|
end
|
105
107
|
end
|
106
108
|
|
107
109
|
describe '#texts' do
|
108
110
|
it 'returns array of text values' do
|
109
|
-
set.texts.must_equal ['A']
|
111
|
+
expect(set.texts).must_equal ['A']
|
110
112
|
end
|
111
113
|
end
|
112
114
|
|
113
115
|
describe '#join' do
|
114
116
|
it 'joins values' do
|
115
117
|
set << :b
|
116
|
-
set.join(', ').must_equal 'a, b'
|
118
|
+
expect(set.join(', ')).must_equal 'a, b'
|
117
119
|
end
|
118
120
|
end
|
119
121
|
|
120
122
|
describe 'boolean methods comparison' do
|
121
123
|
it 'returns true if value equals method' do
|
122
124
|
set << :a
|
123
|
-
set.a
|
125
|
+
expect(set.a?).must_equal true
|
124
126
|
end
|
125
127
|
|
126
128
|
it 'returns false if value does not equal method' do
|
127
129
|
set << :a
|
128
|
-
set.b
|
130
|
+
expect(set.b?).must_equal false
|
129
131
|
end
|
130
132
|
|
131
133
|
it 'raises NoMethodError if there are no values like boolean method' do
|
132
|
-
proc {
|
134
|
+
expect(proc {
|
133
135
|
set.some_method?
|
134
|
-
}.must_raise NoMethodError
|
136
|
+
}).must_raise NoMethodError
|
135
137
|
end
|
136
138
|
|
137
139
|
it 'raises ArgumentError if arguments are passed' do
|
138
|
-
proc {
|
140
|
+
expect(proc {
|
139
141
|
set.a?('<3')
|
140
|
-
}.must_raise ArgumentError
|
142
|
+
}).must_raise ArgumentError
|
141
143
|
end
|
142
144
|
|
143
145
|
it 'responds to methods for existing values' do
|
144
|
-
set.must_respond_to :a?
|
145
|
-
set.must_respond_to :b?
|
146
|
-
set.must_respond_to :c?
|
146
|
+
expect(set).must_respond_to :a?
|
147
|
+
expect(set).must_respond_to :b?
|
148
|
+
expect(set).must_respond_to :c?
|
147
149
|
end
|
148
150
|
|
149
151
|
it 'returns a method object' do
|
150
|
-
set.method(:a?).must_be_instance_of Method
|
152
|
+
expect(set.method(:a?)).must_be_instance_of Method
|
151
153
|
end
|
152
154
|
|
153
155
|
it 'does not respond to a method for not existing value' do
|
154
|
-
set.wont_respond_to :some_method?
|
156
|
+
expect(set).wont_respond_to :some_method?
|
155
157
|
end
|
156
158
|
end
|
157
159
|
|