inum 3.0.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/inum/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Inum
2
- VERSION = "3.0.0"
2
+ VERSION = "4.0.0"
3
3
  end
@@ -2,7 +2,7 @@ require 'rspec'
2
2
  require 'spec_helper'
3
3
 
4
4
  describe Inum::ActiveRecordMixin do
5
- create_temp_table(:tvs){|t| t.integer :anime; t.integer :favorite; t.integer :watching}
5
+ create_temp_table(:tvs){|t| t.integer :anime}
6
6
 
7
7
  before :each do
8
8
  class Anime < Inum::Base
@@ -12,13 +12,7 @@ describe Inum::ActiveRecordMixin do
12
12
  define :KMB, 4
13
13
  end
14
14
 
15
- class TV < ActiveRecord::Base
16
- bind_inum :column => :anime, :class => Anime
17
-
18
- bind_inum :column => :favorite, :class => Anime, :prefix => :fav, :allow_nil => true
19
-
20
- bind_inum :column => :watching, :class => Anime, :prefix => nil, :validation => false
21
- end
15
+ class TV < ActiveRecord::Base; end
22
16
  end
23
17
 
24
18
  after :each do
@@ -28,116 +22,87 @@ describe Inum::ActiveRecordMixin do
28
22
  end
29
23
  end
30
24
 
31
- let :tv do
32
- TV.create(anime: Anime::NYARUKO)
25
+ let :bind_class do
26
+ TV.tap {|klass| klass.instance_eval{ bind_inum :anime, Anime } }
33
27
  end
34
28
 
35
- context 'Comparison methods' do
36
- it 'Be defined' do
37
- expect(TV.method_defined?(:anime_nyaruko?)).to be_true
38
- expect(TV.method_defined?(:anime_muromisan?)).to be_true
39
- expect(TV.method_defined?(:anime_nourin?)).to be_true
40
- expect(TV.method_defined?(:anime_kmb?)).to be_true
41
- end
42
-
43
- it 'Can compare' do
44
- expect(tv.anime_nyaruko?).to be_true
45
- end
29
+ let :instance do
30
+ bind_class.create!(anime: type)
46
31
  end
47
32
 
48
- context 'getter' do
49
- it 'Can set enum' do
50
- tv.anime = Anime::NOURIN
51
- expect(tv.anime_nourin?).to be_true
52
- end
53
-
54
- it 'Can set integer' do
55
- tv.anime = 1
56
- expect(tv.anime_muromisan?).to be_true
57
- end
33
+ let :type do
34
+ Anime::NYARUKO
35
+ end
58
36
 
59
- it 'Can set string' do
60
- tv.anime = 'KMB'
61
- expect(tv.anime_kmb?).to be_true
37
+ describe 'Comparison methods' do
38
+ it 'Will be defined.' do
39
+ expect(bind_class.method_defined?(:anime_nyaruko?)).to be_truthy
40
+ expect(bind_class.method_defined?(:anime_muromisan?)).to be_truthy
41
+ expect(bind_class.method_defined?(:anime_nourin?)).to be_truthy
42
+ expect(bind_class.method_defined?(:anime_kmb?)).to be_truthy
62
43
  end
63
44
 
64
- it 'Can set symbol' do
65
- tv.anime = :KMB
66
- expect(tv.anime_kmb?).to be_true
45
+ it 'Return correct value.' do
46
+ expect(instance.anime_nyaruko?).to be_truthy
67
47
  end
68
48
  end
69
49
 
70
- it 'Prefix is enable, when prefix was set.' do
71
- expect(TV.method_defined?(:fav_nyaruko?)).to be_true
72
- expect(TV.method_defined?(:fav_muromisan?)).to be_true
73
- expect(TV.method_defined?(:fav_nourin?)).to be_true
74
- expect(TV.method_defined?(:fav_kmb?)).to be_true
75
- end
76
-
77
- it 'Prefix is nothing, when prefix is nil.' do
78
- expect(TV.method_defined?(:nyaruko?)).to be_true
79
- expect(TV.method_defined?(:muromisan?)).to be_true
80
- expect(TV.method_defined?(:nourin?)).to be_true
81
- expect(TV.method_defined?(:kmb?)).to be_true
82
- end
50
+ describe '#setter' do
51
+ subject do
52
+ expect {
53
+ instance.anime = target
54
+ }.to change {
55
+ instance.send(:read_attribute, :anime)
56
+ }.from(type.to_i).to(Anime.parse(target).to_i)
57
+ end
83
58
 
84
- it 'setter return enum' do
85
- expect(tv.anime.instance_of?(Anime)).to be_true
86
- end
59
+ context 'When enum' do
60
+ let(:target){ Anime::NOURIN }
87
61
 
88
- context 'update methods can update enum column' do
89
- it 'update' do
90
- tv.update!(anime: Anime::NOURIN)
91
- expect(tv.reload.anime).to eq(Anime::NOURIN)
62
+ it 'set value.' do
63
+ subject
64
+ end
92
65
  end
93
66
 
94
- it 'update_attribute' do
95
- tv.update_attribute(:anime, Anime::NOURIN)
96
- expect(tv.reload.anime).to eq(Anime::NOURIN)
97
- end
98
- end
67
+ context 'When integer' do
68
+ let(:target){ 1 }
99
69
 
100
- context 'validation' do
101
- let :validators do
102
- TV.validators.map{|v| v.attributes[0]}
70
+ it 'set value.' do
71
+ subject
72
+ end
103
73
  end
104
74
 
105
- it 'Enable validator' do
106
- expect(validators).to include(:anime)
107
- expect(validators).to include(:favorite)
108
- end
75
+ context 'When string' do
76
+ let(:target){ 'KMB' }
109
77
 
110
- it 'Disable validator when column has option of validation false.' do
111
- expect(validators).not_to include(:watching)
78
+ it 'set value.' do
79
+ subject
80
+ end
112
81
  end
113
82
 
114
- context 'valid' do
115
- it 'default is validation passed.' do
116
- expect(tv).to be_valid
117
- end
83
+ context 'When string' do
84
+ let(:target){ :KMB }
118
85
 
119
- it 'Correct values are validation passed.' do
120
- Anime.each do |enum|
121
- tv.anime = enum
122
- expect(tv).to be_valid
123
- end
86
+ it 'set value.' do
87
+ subject
124
88
  end
89
+ end
90
+ end
125
91
 
126
- it 'Incorrect values are validation failed.' do
127
- [-1000, 9999, 'Nothing!!', :Nothing].each do |value|
128
- tv.anime = value
129
- expect(tv).not_to be_valid
130
- end
131
- end
92
+ describe '#getter' do
93
+ it 'Return enum' do
94
+ expect(instance.anime.instance_of?(Anime)).to be_truthy
95
+ end
96
+ end
132
97
 
133
- it 'Can not set nil' do
134
- tv.anime = nil
135
- expect(tv).not_to be_valid
136
- end
98
+ context 'When with prefix option' do
99
+ let :bind_class do
100
+ TV.tap {|klass| klass.instance_eval{ bind_inum :anime, Anime, prefix: 'prefix' } }
101
+ end
137
102
 
138
- it 'Can set nil when column has option of allow_nil true.' do
139
- tv.favorite = nil
140
- expect(tv).to be_valid
103
+ describe 'Comparison methods' do
104
+ it 'Will be defined with prefix.' do
105
+ expect(bind_class.method_defined?(:prefix_nyaruko?)).to be_truthy
141
106
  end
142
107
  end
143
108
  end
@@ -2,214 +2,317 @@ require 'rspec'
2
2
  require 'spec_helper'
3
3
 
4
4
  describe Inum::Base do
5
-
6
- context 'When define enum,' do
7
- it 'Correct definition be validation passed.' do
8
- expect{
9
- Class.new(Inum::Base) { define :REDBULL, 0 }
5
+ describe '.define' do
6
+ context 'When define a correct enum' do
7
+ subject do
10
8
  Class.new(Inum::Base) {
11
- define :REDBULL, 0
12
- define :MONSTER, 1
9
+ define :RED_BULL, 0
10
+ define :MONSTER, 1
11
+ define :MONSTER2, 2
13
12
  }
14
- }.not_to raise_error
15
- end
16
-
17
- it 'Incorrect definition be validation failed.' do
18
- # wrong name.
19
- expect{
20
- Class.new(Inum::Base) { define 1111, 0 }
21
- }.to raise_error
13
+ end
22
14
 
23
- # wrong value.
24
- expect{
25
- Class.new(Inum::Base) { define :REDBULL, :no_int }
26
- }.to raise_error
15
+ it 'pass validation.' do
16
+ expect { subject }.not_to raise_error
17
+ end
18
+ end
27
19
 
28
- # dup name.
29
- expect{
20
+ context 'When define a omit a value enum' do
21
+ subject do
30
22
  Class.new(Inum::Base) {
31
- define :REDBULL, 0
32
- define :REDBULL, 1
23
+ define :RED_BULL
24
+ define :MONSTER
25
+ define :MONSTER2
33
26
  }
34
- }.to raise_error
27
+ end
35
28
 
36
- # dup value.
37
- expect{
38
- Class.new(Inum::Base) {
39
- define :REDBULL, 0
40
- define :MONSTER, 0
41
- }
42
- }.to raise_error
29
+ it 'pass validation.' do
30
+ expect { subject }.not_to raise_error
31
+ end
32
+
33
+ it 'auto incremented value.' do
34
+ expect(subject::RED_BULL.to_i).to eq(0)
35
+ expect(subject::MONSTER.to_i).to eq(1)
36
+ expect(subject::MONSTER2.to_i).to eq(2)
37
+ end
43
38
  end
44
39
 
45
- it 'Autoincrement value when without default value.' do
46
- enum = Class.new(Inum::Base) do
47
- define :REDBULL
48
- define :MONSTER
49
- define :BURN
40
+ context 'When define a enum having wrong label' do
41
+ subject do
42
+ Class.new(Inum::Base) {
43
+ define :red_bull, 0
44
+ }
50
45
  end
51
46
 
52
- expect(enum::REDBULL.value).to eq(0)
53
- expect(enum::MONSTER.value).to eq(1)
54
- expect(enum::BURN.value).to eq(2)
47
+ it 'fail validation.' do
48
+ expect { subject }.to raise_error
49
+ end
55
50
  end
56
51
 
57
- it 'Instances of enum are different each definition.' do
58
- first = Class.new(Inum::Base){ define :REDBULL }
59
- second = Class.new(Inum::Base){ define :MONSTER }
60
-
61
- first_enum_format = first.instance_variable_get(:@enum_format)
62
- second_enum_format = second.instance_variable_get(:@enum_format)
52
+ context 'When define a enum having duplicate label' do
53
+ subject do
54
+ Class.new(Inum::Base) {
55
+ define :RED_BULL, 0
56
+ define :RED_BULL, 1
57
+ }
58
+ end
63
59
 
64
- first_enums = first.instance_variable_get(:@enums)
65
- second_enums = second.instance_variable_get(:@enums)
60
+ it 'fail validation.' do
61
+ expect { subject }.to raise_error
62
+ end
63
+ end
66
64
 
67
- expect(first_enum_format.eql?(second_enum_format)).to be_false
68
- expect(first_enum_format.equal?(second_enum_format)).to be_false
65
+ context 'When define a enum having duplicate value' do
66
+ subject do
67
+ Class.new(Inum::Base) {
68
+ define :RED_BULL, 0
69
+ define :MONSTER, 0
70
+ }
71
+ end
69
72
 
70
- expect(first_enums.eql?(second_enums)).to be_false
71
- expect(first_enums.equal?(second_enums)).to be_false
73
+ it 'fail validation.' do
74
+ expect { subject }.to raise_error
75
+ end
72
76
  end
73
77
  end
74
78
 
75
-
76
- describe 'Defined Inum::Base' do
77
- before :each do
79
+ describe 'Defined enum class' do
80
+ before :all do
78
81
  class Anime < Inum::Base
79
82
  define :NYARUKO, 0
80
83
  define :MUROMISAN, 1
81
84
  define :NOURIN, 2
82
- define :KMB, 4
85
+ define :KMB, 3
83
86
  end
84
87
  end
85
88
 
86
- after :each do
89
+ after :all do
87
90
  Object.class_eval{ remove_const :Anime }
88
91
  end
89
92
 
90
- it 'Can not create instance.(Singleton)' do
91
- expect{ Anime.new(:NICONICO, 2525) }.to raise_error
92
- end
93
-
94
- it 'The instance of enum is equal.' do
95
- expect(Anime::NYARUKO.equal?(Anime.parse!('NYARUKO'))).to be_true
96
- end
93
+ describe '#<=>' do
94
+ context 'self == other' do
95
+ it 'Return 0.' do
96
+ expect(Anime::MUROMISAN <=> 1).to eq(0)
97
+ end
98
+ end
97
99
 
98
- it '<=> method return a correct value.' do
99
- expect((Anime::MUROMISAN <=> 0) > 0 ).to be_true
100
- expect((Anime::MUROMISAN <=> 1) == 0 ).to be_true
101
- expect((Anime::MUROMISAN <=> 2) < 0 ).to be_true
100
+ context 'self < other' do
101
+ it 'Return a negative values.' do
102
+ expect(Anime::MUROMISAN <=> 2).to be < 0
103
+ end
104
+ end
102
105
 
103
- expect(Anime::NYARUKO <=> 'Value can not compare.').to be_nil
106
+ context 'self > other' do
107
+ it 'Return a positive values.' do
108
+ expect(Anime::MUROMISAN <=> 0).to be > 0
109
+ end
110
+ end
104
111
  end
105
112
 
106
- it '+ method return a correct Inum.' do
107
- expect(Anime::NYARUKO + 1).to eq(Anime::MUROMISAN)
113
+ describe '#+' do
114
+ it 'Returning value is correct.' do
115
+ expect(Anime::NYARUKO + 1).to eq(Anime::MUROMISAN)
116
+ end
108
117
  end
109
118
 
110
- it '- method return a correct Inum.' do
111
- expect(Anime::NOURIN - 1).to eq(Anime::MUROMISAN)
119
+ describe '#-' do
120
+ it 'Returning value is correct.' do
121
+ expect(Anime::MUROMISAN - 1).to eq(Anime::NYARUKO)
122
+ end
112
123
  end
113
124
 
114
- it 'Comparable module enable.' do
115
- expect(Anime::MUROMISAN.between?(0,2)).to be_true
116
- end
125
+ describe '#eql?' do
126
+ context 'When compare same enum' do
127
+ it 'Return truthy value.' do
128
+ expect(Anime::KMB.eql?(Anime::KMB)).to be_truthy
129
+ end
130
+ end
117
131
 
118
- it 'each method can execute block with enum' do
119
- count = 0
120
- expect{
121
- Anime.each do |enum|
122
- expect(enum.instance_of?(Anime)).to be_true
123
- count += 1
132
+ context 'When compare other enum' do
133
+ it 'Return falsey value.' do
134
+ expect(Anime::KMB.eql?(Anime::NYARUKO)).to be_falsey
124
135
  end
125
- }.to change{count}.by(Anime.length)
136
+ end
126
137
  end
127
138
 
128
- it 'Enumerable module enable.' do
129
- expect(Anime.count).to eq(Anime.length)
130
- expect(Anime.include?(Anime::NOURIN)).to be_true
139
+ describe '#t' do
140
+ subject do
141
+ expect(I18n).to receive(:t).with('animes.kmb') { 'ok' }
142
+ expect(Anime::KMB.t).to eq('ok')
143
+ end
131
144
  end
132
145
 
133
- it 'eql? method return a correct result.' do
134
- expect(Anime::KMB.eql?(0) ).to be_false
135
- expect(Anime::KMB.eql?(4) ).to be_true
146
+ describe '#to_i' do
147
+ it 'Return integer.' do
148
+ expect(Anime::KMB.to_i).to eq(3)
149
+ end
136
150
  end
137
151
 
138
- it 'labels method return Array<Symbol>.' do
139
- expect(Anime.labels.length).to eq(Anime.length)
140
- expect(Anime.labels.instance_of?(Array)).to be_true
141
- expect(Anime.labels[0].instance_of?(Symbol)).to be_true
152
+ describe '#to_s ' do
153
+ it 'Return string.' do
154
+ expect(Anime::NOURIN.to_s).to eq('NOURIN')
155
+ end
142
156
  end
143
157
 
144
- it 'length return count of enum.' do
145
- expect(Anime.length).to eq(4)
158
+ describe '#translate' do
159
+ subject do
160
+ expect(I18n).to receive(:t).with('animes.kmb') { 'ok' }
161
+ expect(Anime::KMB.translate).to eq('ok')
162
+ end
146
163
  end
147
164
 
148
- context 'Parse method' do
149
- it 'Parsable string.' do
150
- expect(Anime.parse('NOURIN')).to eq(Anime::NOURIN)
165
+ describe '#value' do
166
+ it 'Return integer.' do
167
+ expect(Anime::KMB.value).to eq(3)
151
168
  end
169
+ end
152
170
 
153
- it 'Parsable integer.' do
154
- expect(Anime.parse(1)).to eq(Anime::MUROMISAN)
171
+ describe '.collection' do
172
+ subject do
173
+ allow(I18n).to receive(:t) { 't' }
174
+ Anime.collection(option)
155
175
  end
156
176
 
157
- it 'Parsable symbol.' do
158
- expect(Anime.parse(:KMB)).to eq(Anime::KMB)
177
+ let(:option) { Hash.new }
178
+
179
+ it 'Return all item array.' do
180
+ expect(subject).to match_array([
181
+ ['t', 0],
182
+ ['t', 1],
183
+ ['t', 2],
184
+ ['t', 3],
185
+ ])
159
186
  end
160
187
 
161
- it 'Parsable self instance.' do
162
- expect(Anime.parse(Anime::NYARUKO)).to eq(Anime::NYARUKO)
188
+ context 'When with only option' do
189
+ let(:option) { {only: [:KMB]} }
190
+
191
+ it 'Return only selected item array.' do
192
+ expect(subject).to match_array([['t', 3]])
193
+ end
163
194
  end
164
195
 
165
- it 'return nil for a unknown value.' do
166
- expect(Anime.parse('Nothing') ).to eq(nil)
196
+ context 'When with except option' do
197
+ let(:option) { {except: [:KMB]} }
198
+
199
+ it 'Return only except item array.' do
200
+ expect(subject).to match_array([
201
+ ['t', 0],
202
+ ['t', 1],
203
+ ['t', 2],
204
+ ])
205
+ end
167
206
  end
207
+ end
168
208
 
169
- it 'parse! method raise exception for a unknown value.' do
170
- expect{Anime.parse!('Nothing') }.to raise_error(NameError)
209
+ describe '.new' do
210
+ it 'Can not create a instance of enum.' do
211
+ expect{ Anime.new(:NICONICO, 2525) }.to raise_error
171
212
  end
172
213
  end
173
214
 
174
- it 'to_a method return Array<Enum>.' do
175
- enums = Anime.instance_variable_get(:@enums)
215
+ describe '.each' do
216
+ it 'Execute block with a right order.' do
217
+ count = 0
218
+ orders = [Anime::NYARUKO, Anime::MUROMISAN, Anime::NOURIN, Anime::KMB]
176
219
 
177
- expect(Anime.to_a.eql?(enums)).to be_true
178
- expect(Anime.to_a.equal?(enums)).to be_false
220
+ Anime.each do |enum|
221
+ expect(enum).to eq(orders[count])
222
+ count += 1
223
+ end
224
+ end
179
225
  end
180
226
 
181
- it 'to_h method return Hash' do
182
- enum_format = Anime.instance_variable_get(:@enum_format)
183
-
184
- expect(Anime.to_h.eql?(enum_format)).to be_true
185
- expect(Anime.to_h.equal?(enum_format)).to be_false
227
+ describe '.labels' do
228
+ it 'Return array of label.' do
229
+ expect(Anime.labels).to match_array([:NYARUKO, :MUROMISAN, :NOURIN, :KMB])
230
+ end
186
231
  end
187
232
 
188
- it 'to_i and value methods return integer.' do
189
- expect(Anime::KMB.to_i).to eq(4)
190
- expect(Anime::KMB.value).to eq(4)
233
+ describe '.length' do
234
+ it 'Return correct count of enum.' do
235
+ expect(Anime.length).to eq(4)
236
+ end
191
237
  end
192
238
 
193
- it 'to_s method return string.' do
194
- expect(Anime::NOURIN.to_s ).to eq('NOURIN')
239
+ describe '.parse' do
240
+ subject do
241
+ expect(Anime.parse(source)).to eq(destination)
242
+ end
243
+
244
+ let(:destination) { Anime::KMB }
245
+
246
+ context 'source is string' do
247
+ let(:source) { 'KMB' }
248
+ it 'success.' do
249
+ subject
250
+ end
251
+ end
252
+
253
+ context 'source is symbol' do
254
+ let(:source) { :kmb }
255
+ it 'success.' do
256
+ subject
257
+ end
258
+ end
259
+
260
+ context 'source is integer' do
261
+ let(:source) { 3 }
262
+ it 'success.' do
263
+ subject
264
+ end
265
+ end
266
+
267
+ context 'source is enum' do
268
+ let(:source) { Anime::KMB }
269
+ it 'success.' do
270
+ subject
271
+ end
272
+ end
273
+
274
+ context 'source is incorrect' do
275
+ let(:source) { '' }
276
+ let(:destination) { nil }
277
+ it 'return nil.' do
278
+ subject
279
+ end
280
+ end
195
281
  end
196
282
 
197
- it 'translate and t methods return localized string.' do
198
- I18n.should_receive(:t).with('inum.anime.nourin').and_return('NO-RIN!')
199
- I18n.should_receive(:t).with('inum.anime.kmb').and_return('KIRUMI-BEIBE-')
283
+ describe '.parse!' do
284
+ subject do
285
+ expect(Anime).to receive(:parse).with(:hoge) { returning_value }
286
+ expect(Anime.parse!(:hoge)).to eq(returning_value)
287
+ end
288
+
289
+ context '#parse return enum' do
290
+ let(:returning_value) { Anime::KMB }
291
+
292
+ it 'success.' do
293
+ subject
294
+ end
295
+ end
200
296
 
201
- expect(Anime::NOURIN.t).to eq('NO-RIN!')
202
- expect(Anime::KMB.translate).to eq('KIRUMI-BEIBE-')
297
+ context '#parse return nil' do
298
+ let(:returning_value) { nil }
299
+
300
+ it 'raise error.' do
301
+ expect{subject}.to raise_error
302
+ end
303
+ end
203
304
  end
204
305
 
205
- it 'underscore method return underscore string.' do
206
- expect(Anime::NYARUKO.underscore).to eq('nyaruko')
306
+ describe '.to_a' do
307
+ it 'Return array of enum.' do
308
+ expect(Anime.to_a).to match_array([Anime::NYARUKO, Anime::MUROMISAN, Anime::NOURIN, Anime::KMB])
309
+ end
207
310
  end
208
311
 
209
- it 'values method return Array<integer>.' do
210
- expect(Anime.values.length).to eq(Anime.length)
211
- expect(Anime.values.instance_of?(Array)).to be_true
212
- expect(Anime.values[0].integer?).to be_true
312
+ describe '.values' do
313
+ it 'Return array of value.' do
314
+ expect(Anime.values).to match_array([0, 1, 2, 3])
315
+ end
213
316
  end
214
317
  end
215
318
  end