striuct 0.0.11.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,580 @@
1
+ $VERBOSE = true
2
+ require File.dirname(__FILE__) + '/test_helper.rb'
3
+
4
+ class User < Striuct.new
5
+ member :id, Integer
6
+ member :last_name, /\A\w+\z/
7
+ member :family_name, /\A\w+\z/
8
+ member :address, /\A((\w+) ?)+\z/
9
+ member :age, ->age{(20..140).include? age}
10
+ end
11
+
12
+ class TestStriuctSubclassEigen < Test::Unit::TestCase
13
+ User2 = Striuct.new :name, :age
14
+
15
+ def test_builder
16
+ klass = Striuct.new
17
+ assert_kind_of Striuct, klass.new
18
+
19
+ klass = Striuct.new :name, :age
20
+
21
+ assert_equal klass.members, [:name, :age]
22
+
23
+ klass = Striuct.new :foo do
24
+ member :var
25
+ end
26
+
27
+ assert_equal klass.members, [:foo, :var]
28
+ assert_equal User.members, [:id, :last_name, :family_name, :address, :age]
29
+ end
30
+
31
+ def test_define
32
+ user = User2.define{|r|r.age = 1; r.name = ''}
33
+ assert_same 1, user.age
34
+
35
+ assert_raises RuntimeError do
36
+ user.age = 1
37
+ end
38
+
39
+ user = User2.define(false){|r|r.age = 1; r.name = ''}
40
+ assert_same 1, user.age
41
+
42
+ assert_raises RuntimeError do
43
+ User2.define{|r|r.age = 1}
44
+ end
45
+ end
46
+
47
+ def test_sufficent?
48
+ assert_equal false, User.sufficent?(:age, 19)
49
+ assert_equal true, User.sufficent?(:age, 20)
50
+ end
51
+
52
+ def test_restrict?
53
+ klass = Striuct.new :foo do
54
+ member :var, //
55
+ member :hoge
56
+ member :moge, nil
57
+ end
58
+
59
+ assert_equal false, klass.restrict?(:foo)
60
+ assert_equal true, klass.restrict?(:var)
61
+ assert_equal false, klass.restrict?(:hoge)
62
+ assert_equal true, klass.restrict?(:moge)
63
+ end
64
+ end
65
+
66
+ class TestStriuctSubclassInstance1 < Test::Unit::TestCase
67
+ def test_setter
68
+ user = User.new
69
+ user[:last_name] = 'foo'
70
+ assert_equal user.last_name, 'foo'
71
+ user.last_name = 'bar'
72
+ assert_equal user[:last_name], 'bar'
73
+
74
+ assert_raises Striuct::ConditionError do
75
+ user[:last_name] = 'foo s'
76
+ end
77
+
78
+ assert_raises Striuct::ConditionError do
79
+ User.new 'asda'
80
+ end
81
+
82
+ assert_raises Striuct::ConditionError do
83
+ user.age = 19
84
+ end
85
+ end
86
+
87
+ def test_equal
88
+ user1 = User.new 11218, 'taro'
89
+ user2 = User.new 11218, 'taro'
90
+ assert_equal true, (user1 == user2)
91
+ user2.last_name = 'ichiro'
92
+ assert_equal false, (user1 == user2)
93
+ end
94
+ end
95
+
96
+ class TestStriuctSubclassInstance2 < Test::Unit::TestCase
97
+ def setup
98
+ @user = User.new 9999, 'taro', 'yamada', 'Tokyo Japan', 30
99
+ end
100
+
101
+ def test_reader
102
+ assert_equal @user[1], 'taro'
103
+ assert_equal @user[:last_name], 'taro'
104
+ assert_equal @user.last_name, 'taro'
105
+ end
106
+
107
+ def test_setter_pass
108
+ assert_equal (@user.id = 2139203509295), 2139203509295
109
+ assert_equal @user.id, 2139203509295
110
+ assert_equal (@user.last_name = 'jiro'), 'jiro'
111
+ assert_equal @user.last_name, 'jiro'
112
+ assert_equal (@user.age = 40), 40
113
+ assert_equal @user.age, 40
114
+ end
115
+
116
+ def test_setter_fail
117
+ assert_raises Striuct::ConditionError do
118
+ @user.id = 2139203509295.0
119
+ end
120
+
121
+ assert_raises Striuct::ConditionError do
122
+ @user.last_name = 'ignore name'
123
+ end
124
+
125
+ assert_raises Striuct::ConditionError do
126
+ @user.age = 19
127
+ end
128
+ end
129
+
130
+ def test_strict?
131
+ assert_same @user.sufficent?(:last_name), true
132
+ assert_same @user.strict?, true
133
+ assert_same @user.sufficent?(:last_name), true
134
+ @user.last_name.clear
135
+ assert_same @user.sufficent?(:last_name), false
136
+ assert_same @user.strict?, false
137
+ end
138
+ end
139
+
140
+ class TestStriuctSubclassInstance3 < Test::Unit::TestCase
141
+ def setup
142
+ @user = User.new 9999, 'taro', 'yamada', 'Tokyo Japan', 30
143
+ @user2 = User.new 9999, 'taro', 'yamada', 'Tokyo Japan', 30
144
+ end
145
+
146
+ def test_to_s
147
+ /\b(taro)\b/ =~ @user.to_s
148
+ assert_equal 'taro', $1
149
+ end
150
+
151
+ def test_inspect
152
+ /\b(taro)\b/ =~ @user.inspect
153
+ assert_equal 'taro', $1
154
+ end
155
+
156
+ def test_members
157
+ assert_equal @user.members, [:id, :last_name, :family_name, :address, :age]
158
+ end
159
+
160
+ def test_delegate_class_method
161
+ assert_equal @user.members, User.members
162
+ assert_equal @user.size, User.size
163
+ assert_equal @user.member?(:age), User.member?(:age)
164
+ end
165
+
166
+ def test_each
167
+ assert_same @user, @user.each{}
168
+ assert_kind_of Enumerator, enum = @user.each
169
+ assert_equal enum.next, 9999
170
+ assert_equal enum.next, 'taro'
171
+ end
172
+
173
+ def test_each_member
174
+ assert_same @user, @user.each_member{}
175
+ assert_kind_of Enumerator, enum = @user.each_member
176
+ assert_equal enum.next, :id
177
+ assert_equal enum.next, :last_name
178
+ end
179
+
180
+ def test_values
181
+ assert_equal @user.values, [9999, 'taro', 'yamada', 'Tokyo Japan', 30]
182
+ end
183
+
184
+ def test_values_at
185
+ assert_equal(@user.values_at(4, 0, (2..4)), [30, 9999, 'yamada', 'Tokyo Japan', 30])
186
+ end
187
+
188
+ def test_hash
189
+ assert_kind_of Integer, @user.hash
190
+ assert_equal @user.hash, @user2.hash
191
+ end
192
+
193
+ def test_eql?
194
+ assert_equal true, @user.eql?(@user2)
195
+ assert_equal true, @user2.eql?(@user)
196
+ assert_equal false, @user.eql?(User.new 9999, 'taro', 'yamada', 'Tokyo Japan', 31)
197
+ end
198
+ end
199
+
200
+
201
+ class TestStriuctSubclassInstance4 < Test::Unit::TestCase
202
+ class Sth < Striuct.new
203
+ member :bool, true, false
204
+ member :sth
205
+ protect_level :struct
206
+ member :lambda, ->v{v % 3 == 2}, ->v{v.kind_of? Float}
207
+ end
208
+
209
+ def setup
210
+ @sth = Sth.new
211
+ end
212
+
213
+ def test_accessor
214
+ @sth.bool = true
215
+ assert_same true, @sth.bool
216
+ @sth.bool = false
217
+ assert_same false, @sth.bool
218
+
219
+ assert_raises Striuct::ConditionError do
220
+ @sth.bool = nil
221
+ end
222
+
223
+ @sth.sth = 1
224
+ assert_same 1, @sth.sth
225
+
226
+ @sth.sth = 'String'
227
+ assert_equal 'String', @sth.sth
228
+
229
+ @sth.sth = Class.class
230
+ assert_same Class.class, @sth.sth
231
+
232
+ assert_raises Striuct::ConditionError do
233
+ @sth.lambda = 9
234
+ end
235
+
236
+ assert_raises Striuct::ConditionError do
237
+ @sth.lambda = 7
238
+ end
239
+
240
+ @sth.lambda = 8
241
+ assert_same 8, @sth.lambda
242
+
243
+ @sth.lambda = 9.0
244
+ assert_equal 9.0, @sth.lambda
245
+ end
246
+ end
247
+
248
+ class TestStriuctCloning < Test::Unit::TestCase
249
+ class Sth < Striuct.new
250
+ member :sth
251
+ end
252
+
253
+ def setup
254
+ @sth = Sth.new
255
+ end
256
+
257
+ def test_clone
258
+ sth2 = @sth.dup
259
+ @sth.sth = 1
260
+ assert_equal false, (@sth.sth == sth2.sth)
261
+
262
+ sth2 = @sth.clone
263
+ @sth.sth = 2
264
+ assert_equal false, (@sth.sth == sth2.sth)
265
+ end
266
+
267
+ def test_class_clone
268
+ klass = Sth.dup
269
+ Sth.__send__ :member, :dummy1
270
+ assert_equal false, klass.member?(:dummy)
271
+
272
+ klass = Sth.clone
273
+ Sth.__send__ :member, :dummy2
274
+ assert_equal false, klass.member?(:dummy)
275
+ end
276
+ end
277
+
278
+ class TestStriuctProcedure < Test::Unit::TestCase
279
+ Sth = Striuct.new do
280
+ member :age, /\A\d+\z/, Numeric do |arg|
281
+ Integer arg
282
+ end
283
+ end
284
+
285
+ def setup
286
+ @sth = Sth.new
287
+ assert_same nil, @sth.age
288
+ end
289
+
290
+ def test_procedure
291
+ @sth.age = 10
292
+ assert_same 10, @sth.age
293
+ @sth.age = 10.0
294
+ assert_same 10, @sth.age
295
+
296
+ assert_raises Striuct::ConditionError do
297
+ @sth.age = '10.0'
298
+ end
299
+
300
+ @sth.age = '10'
301
+ assert_same 10, @sth.age
302
+ end
303
+ end
304
+
305
+ class TestStriuctDefaultValue < Test::Unit::TestCase
306
+ Sth = Striuct.new do
307
+ member :lank, Integer
308
+ default :lank, 1
309
+ end
310
+
311
+ def test_default
312
+ sth = Sth.new 2
313
+ assert_equal 2, sth.lank
314
+ sth = Sth.new
315
+ assert_equal 1, sth.lank
316
+ assert_equal true, sth.default?(:lank)
317
+ sth.lank = 2
318
+ assert_equal false, sth.default?(:lank)
319
+ end
320
+
321
+ def test_define_default
322
+ assert_raises NameError do
323
+ Sth.class_eval do
324
+ default :anything, 10
325
+ end
326
+ end
327
+
328
+ assert_raises Striuct::ConditionError do
329
+ Sth.class_eval do
330
+ member :lank2, Integer
331
+ default :lank2, '10'
332
+ end
333
+ end
334
+ end
335
+ end
336
+
337
+ class TestStriuctFunctionalCondition < Test::Unit::TestCase
338
+ Sthlambda = Striuct.new do
339
+ member :lank, ->lank{lanks.include? lank}
340
+ member :lanks
341
+ default :lanks, 1..30
342
+ end
343
+
344
+ def test_lambda
345
+ sth = Sthlambda.new
346
+ sth.lank = 2
347
+ assert_equal 2, sth.lank
348
+
349
+ assert_raises Striuct::ConditionError do
350
+ sth.lank = 31
351
+ end
352
+ end
353
+
354
+ max = 9
355
+
356
+ SthProc = Striuct.new do
357
+ member :lank, Proc.new{|n|(3..max) === n}
358
+ end
359
+
360
+ def test_Proc
361
+ sth = SthProc.new
362
+ sth.lank = 8
363
+ assert_equal 8, sth.lank
364
+
365
+ assert_raises Striuct::ConditionError do
366
+ sth.lank = 2
367
+ end
368
+ end
369
+
370
+ SthMethod = Striuct.new do
371
+ member :lank, 7.method(:<)
372
+ end
373
+
374
+ def test_Method
375
+ sth = SthMethod.new
376
+ sth.lank = 8
377
+ assert_equal 8, sth.lank
378
+
379
+ assert_raises Striuct::ConditionError do
380
+ sth.lank = 6
381
+ end
382
+ end
383
+ end
384
+
385
+ class TestStriuctAssign < Test::Unit::TestCase
386
+ Sth = Striuct.new do
387
+ member :foo
388
+ end
389
+
390
+ def test_unassign
391
+ sth = Sth.new
392
+ assert_equal false, sth.assign?(:foo)
393
+ sth.foo = nil
394
+ assert_equal true, sth.assign?(:foo)
395
+ sth.unassign :foo
396
+ assert_equal false, sth.assign?(:foo)
397
+
398
+ assert_raises NameError do
399
+ sth.unassign :var
400
+ end
401
+ end
402
+ end
403
+
404
+ class TestStriuctClassLock < Test::Unit::TestCase
405
+ Sth = Striuct.new do
406
+ member :foo
407
+ end
408
+
409
+ def test_class_lock
410
+ sth = Sth.new
411
+
412
+ assert_equal true, sth.member?(:foo)
413
+
414
+ Sth.class_eval do
415
+ member :bar
416
+ end
417
+
418
+ assert_equal true, sth.member?(:bar)
419
+ assert_equal [:foo, :bar], sth.members
420
+
421
+ assert_equal false, Sth.closed?
422
+
423
+ Sth.__send__ :close
424
+
425
+ assert_equal true, Sth.closed?
426
+
427
+ assert_raises RuntimeError do
428
+ Sth.class_eval do
429
+ member :var2
430
+ end
431
+ end
432
+
433
+ assert_equal false, sth.member?(:var2)
434
+ end
435
+ end
436
+
437
+ class TestStriuctDefine < Test::Unit::TestCase
438
+ def test_define
439
+ assert_raises RuntimeError do
440
+ Striuct.define do
441
+ end
442
+ end
443
+
444
+ klass = Striuct.define do
445
+ member :foo
446
+ end
447
+
448
+ assert_equal true, klass.closed?
449
+ end
450
+ end
451
+
452
+ class TestStriuctFreeze < Test::Unit::TestCase
453
+ Sth = Striuct.new :foo
454
+
455
+ def test_freeze
456
+ sth = Sth.new
457
+ sth.freeze
458
+
459
+ assert_raises RuntimeError do
460
+ sth.foo = 8
461
+ end
462
+
463
+ assert_equal true, sth.frozen?
464
+ end
465
+ end
466
+
467
+
468
+ class TestStriuctSafetyNaming < Test::Unit::TestCase
469
+ def test_cname?
470
+ klass = Striuct.new
471
+ assert_same false, klass.cname?(Object)
472
+ assert_same false, klass.cname?('m?')
473
+ assert_same false, klass.cname?('__foo__')
474
+ assert_same false, klass.cname?('a b')
475
+ assert_same false, klass.cname?('object_id')
476
+ assert_same true, klass.cname?('foo')
477
+ klass.__send__ :protect_level, :warning
478
+ assert_same false, klass.cname?('m?')
479
+ assert_same false, klass.cname?('__foo__')
480
+ assert_same false, klass.cname?('a b')
481
+ assert_same false, klass.cname?('object_id')
482
+ assert_same true, klass.cname?('foo')
483
+ klass.__send__ :protect_level, :struct
484
+ assert_same true, klass.cname?('m?')
485
+ assert_same true, klass.cname?('__foo__')
486
+ assert_same true, klass.cname?('a b')
487
+ assert_same true, klass.cname?('object_id')
488
+ assert_same true, klass.cname?('foo')
489
+ end
490
+
491
+ def test_protect
492
+ klass = Striuct.new
493
+ assert_raises NameError do
494
+ klass.class_eval do
495
+ member ''
496
+ end
497
+ end
498
+
499
+ assert_raises NameError do
500
+ klass.class_eval do
501
+ member :'a b'
502
+ end
503
+ end
504
+
505
+ assert_raises NameError do
506
+ klass.class_eval do
507
+ member :'__send__'
508
+ end
509
+ end
510
+
511
+ assert_raises NameError do
512
+ klass.class_eval do
513
+ member :'__foo__'
514
+ end
515
+ end
516
+
517
+ assert_raises NameError do
518
+ klass.class_eval do
519
+ member :'m?'
520
+ end
521
+ end
522
+
523
+ assert_same false, klass.member?('m?')
524
+
525
+ klass.class_eval do
526
+ protect_level :struct
527
+ member :'m?'
528
+ end
529
+
530
+ assert_same true, klass.member?('m?')
531
+ end
532
+ end
533
+
534
+ class TestStriuctInference < Test::Unit::TestCase
535
+ def test_inference
536
+ klass = Striuct.define do
537
+ member :n, Numeric, inference
538
+ member :m, inference
539
+ end
540
+
541
+ sth, sth2 = klass.new, klass.new
542
+
543
+ assert_raises Striuct::ConditionError do
544
+ sth.n = '1'
545
+ end
546
+
547
+ sth.n = 1.1
548
+
549
+ assert_equal 1.1, sth.n
550
+
551
+ assert_raises Striuct::ConditionError do
552
+ sth.n = 1
553
+ end
554
+
555
+ assert_raises Striuct::ConditionError do
556
+ sth2.n = 1
557
+ end
558
+
559
+ sth.n = 2.1
560
+
561
+ assert_equal 2.1, sth.n
562
+
563
+
564
+ sth2.m = 1
565
+
566
+ assert_equal 1, sth2.m
567
+
568
+ assert_raises Striuct::ConditionError do
569
+ sth.m = 1.0
570
+ end
571
+
572
+ assert_raises Striuct::ConditionError do
573
+ sth2.m = 1.0
574
+ end
575
+
576
+ sth.m = 2
577
+
578
+ assert_equal 2, sth.m
579
+ end
580
+ end
@@ -0,0 +1,42 @@
1
+ $VERBOSE = true
2
+ require File.dirname(__FILE__) + '/test_helper_import.rb'
3
+
4
+
5
+ class TestStruct < Test::Unit::TestCase
6
+ Sth = Struct.new :age
7
+ Sth2 = Sth.to_strict
8
+
9
+ def test_eigen_boolean
10
+ assert_equal true, Sth.member?(:age)
11
+ assert_equal false, Sth.conditionable?(BasicObject.new)
12
+ assert_equal false, Sth.restrict?(:age)
13
+ assert_equal true, Sth.accept?(:age, 'String')
14
+ assert_equal false, Sth.has_default?(:age)
15
+ assert_equal true, Sth.cname?(:age)
16
+ assert_equal false, Sth.cname?(Object.new)
17
+ end
18
+
19
+ def test_eigen_actions
20
+ r = Sth.define{|o|o.age = 'Something'}
21
+ assert_kind_of Sth, r
22
+ assert_equal 'Something', r.age
23
+ assert_equal StrictStruct, Sth2.superclass
24
+ assert_equal Sth.members, Sth2.members
25
+
26
+ r2 = Sth.load_pairs age: 1
27
+ assert_equal 1, r2.age
28
+
29
+ assert_raises ArgumentError do
30
+ Sth.load_pairs age: 1, name: 'taro'
31
+ end
32
+ end
33
+
34
+ def test_instance_boolean
35
+ sth = Sth.new
36
+ assert_equal false, sth.strict?
37
+ assert_equal false, sth.secure?
38
+ assert_equal false, sth.assign?(:age)
39
+ sth.age = 'Something'
40
+ assert_equal true, sth.assign?(:age)
41
+ end
42
+ end
metadata ADDED
@@ -0,0 +1,94 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: striuct
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.11.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Kenichi Kamiya
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-12-23 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: hoe
16
+ requirement: &24039228 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '2.12'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *24039228
25
+ - !ruby/object:Gem::Dependency
26
+ name: rdoc
27
+ requirement: &20489640 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: '3.10'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *20489640
36
+ description: ! 'Striuct means Strict Struct.
37
+
38
+ Handy and safty than Ruby''s Standard Struct.'
39
+ email:
40
+ - kachick1+ruby@gmail.com
41
+ executables: []
42
+ extensions: []
43
+ extra_rdoc_files:
44
+ - Manifest.txt
45
+ files:
46
+ - History.rdoc
47
+ - Manifest.txt
48
+ - README.rdoc
49
+ - README.ja.rdoc
50
+ - Rakefile
51
+ - example.rb
52
+ - lib/striuct.rb
53
+ - lib/striuct/core.rb
54
+ - lib/striuct/version.rb
55
+ - lib/striuct/classutil.rb
56
+ - lib/striuct/subclass.rb
57
+ - lib/striuct/subclass_eigen.rb
58
+ - lib/striuct/import.rb
59
+ - test/test_helper.rb
60
+ - test/test_striuct.rb
61
+ - test/test_helper_import.rb
62
+ - test/test_striuct_import.rb
63
+ - .gemtest
64
+ homepage: http://github.com/kachick/striuct
65
+ licenses: []
66
+ post_install_message:
67
+ rdoc_options:
68
+ - --main
69
+ - README.rdoc
70
+ require_paths:
71
+ - lib
72
+ required_ruby_version: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ required_rubygems_version: !ruby/object:Gem::Requirement
79
+ none: false
80
+ requirements:
81
+ - - ! '>='
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ requirements: []
85
+ rubyforge_project: striuct
86
+ rubygems_version: 1.8.12
87
+ signing_key:
88
+ specification_version: 3
89
+ summary: Striuct means Strict Struct
90
+ test_files:
91
+ - test/test_helper.rb
92
+ - test/test_helper_import.rb
93
+ - test/test_striuct.rb
94
+ - test/test_striuct_import.rb