striuct 0.0.11.1 → 0.1.7

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.
data/test/test_striuct.rb CHANGED
@@ -10,7 +10,10 @@ class User < Striuct.new
10
10
  end
11
11
 
12
12
  class TestStriuctSubclassEigen < Test::Unit::TestCase
13
- User2 = Striuct.new :name, :age
13
+ User2 = Striuct.define do
14
+ member :name, AND(String, NOT(''))
15
+ member :age, Fixnum
16
+ end
14
17
 
15
18
  def test_builder
16
19
  klass = Striuct.new
@@ -29,24 +32,41 @@ class TestStriuctSubclassEigen < Test::Unit::TestCase
29
32
  end
30
33
 
31
34
  def test_define
32
- user = User2.define{|r|r.age = 1; r.name = ''}
35
+ user = User2.define{|r|r.age = 1; r.name = 'a'}
33
36
  assert_same 1, user.age
34
37
 
35
38
  assert_raises RuntimeError do
36
39
  user.age = 1
37
40
  end
38
41
 
39
- user = User2.define(false){|r|r.age = 1; r.name = ''}
42
+ user = User2.define{|r|r.age = 1; r.name = 'a'}
40
43
  assert_same 1, user.age
44
+ assert_same true, user.lock?
45
+ assert_same false, user.frozen?
41
46
 
42
47
  assert_raises RuntimeError do
43
48
  User2.define{|r|r.age = 1}
44
49
  end
50
+
51
+ user = User2.define(lock: true){|r|r.age = 1; r.name = 'a'}
52
+ assert_same 1, user.age
53
+ assert_same true, user.lock?
54
+ user = User2.define(lock: false){|r|r.age = 1; r.name = 'a'}
55
+ assert_same false, user.lock?
56
+ assert_equal true, user.strict?
57
+
58
+ assert_raises Striuct::ConditionError do
59
+ User2.define{|r|r.age = 1; r.name = 'a'; r.name.clear}
60
+ end
61
+
62
+ user = User2.define(strict: false){|r|r.age = 1; r.name = 'a'; r.name.clear}
63
+ assert_equal '', user.name
64
+ assert_equal false, user.strict?
45
65
  end
46
66
 
47
- def test_sufficent?
48
- assert_equal false, User.sufficent?(:age, 19)
49
- assert_equal true, User.sufficent?(:age, 20)
67
+ def test_sufficient?
68
+ assert_equal false, User.sufficient?(:age, 19)
69
+ assert_equal true, User.sufficient?(:age, 20)
50
70
  end
51
71
 
52
72
  def test_restrict?
@@ -128,11 +148,11 @@ class TestStriuctSubclassInstance2 < Test::Unit::TestCase
128
148
  end
129
149
 
130
150
  def test_strict?
131
- assert_same @user.sufficent?(:last_name), true
151
+ assert_same @user.sufficient?(:last_name), true
132
152
  assert_same @user.strict?, true
133
- assert_same @user.sufficent?(:last_name), true
153
+ assert_same @user.sufficient?(:last_name), true
134
154
  @user.last_name.clear
135
- assert_same @user.sufficent?(:last_name), false
155
+ assert_same @user.sufficient?(:last_name), false
136
156
  assert_same @user.strict?, false
137
157
  end
138
158
  end
@@ -173,8 +193,39 @@ class TestStriuctSubclassInstance3 < Test::Unit::TestCase
173
193
  def test_each_member
174
194
  assert_same @user, @user.each_member{}
175
195
  assert_kind_of Enumerator, enum = @user.each_member
176
- assert_equal enum.next, :id
177
- assert_equal enum.next, :last_name
196
+ assert_equal :id, enum.next
197
+ assert_equal :last_name, enum.next
198
+ assert_equal :family_name, enum.next
199
+ assert_equal :address, enum.next
200
+ assert_equal :age, enum.next
201
+ assert_raises StopIteration do
202
+ enum.next
203
+ end
204
+ end
205
+
206
+ def test_each_index
207
+ assert_same @user, @user.each_index{}
208
+ assert_kind_of Enumerator, enum = @user.each_index
209
+ assert_equal 0, enum.next
210
+ assert_equal 1, enum.next
211
+ assert_equal 2, enum.next
212
+ assert_equal 3, enum.next
213
+ assert_equal 4, enum.next
214
+ assert_raises StopIteration do
215
+ enum.next
216
+ end
217
+ end
218
+
219
+ def test_each_with_index
220
+ assert_same @user, @user.each_with_index{}
221
+ assert_kind_of Enumerator, enum = @user.each_with_index
222
+
223
+ r = []
224
+ @user.each_with_index do |value, index|
225
+ r << [value, index]
226
+ end
227
+
228
+ assert_equal [@user.each_value.to_a, @user.each_index.to_a].transpose, r
178
229
  end
179
230
 
180
231
  def test_values
@@ -264,14 +315,16 @@ class TestStriuctCloning < Test::Unit::TestCase
264
315
  assert_equal false, (@sth.sth == sth2.sth)
265
316
  end
266
317
 
267
- def test_class_clone
318
+ def test_class_dup
268
319
  klass = Sth.dup
269
320
  Sth.__send__ :member, :dummy1
270
- assert_equal false, klass.member?(:dummy)
271
-
321
+ assert_equal false, klass.member?(:dummy1)
322
+ end
323
+
324
+ def test_class_clone
272
325
  klass = Sth.clone
273
326
  Sth.__send__ :member, :dummy2
274
- assert_equal false, klass.member?(:dummy)
327
+ assert_equal false, klass.member?(:dummy2)
275
328
  end
276
329
  end
277
330
 
@@ -304,7 +357,7 @@ end
304
357
 
305
358
  class TestStriuctDefaultValue < Test::Unit::TestCase
306
359
  Sth = Striuct.new do
307
- member :lank, Integer
360
+ member :lank, OR(Bignum, Fixnum)
308
361
  default :lank, 1
309
362
  end
310
363
 
@@ -324,13 +377,46 @@ class TestStriuctDefaultValue < Test::Unit::TestCase
324
377
  default :anything, 10
325
378
  end
326
379
  end
327
-
380
+
381
+ klass = Striuct.define do
382
+ member :lank2, Integer
383
+ default :lank2, '10'
384
+ end
385
+
328
386
  assert_raises Striuct::ConditionError do
329
- Sth.class_eval do
330
- member :lank2, Integer
331
- default :lank2, '10'
387
+ klass.new
388
+ end
389
+
390
+ scope = self
391
+ seef = nil
392
+ klass = Striuct.define do
393
+ member :lank, Integer
394
+ scope.assert_raises ArgumentError do
395
+ default :lank, '10', &->own, name{rand}
396
+ end
397
+
398
+ scope.assert_raises ArgumentError do
399
+ default :lank, '10', &->own{rand}
400
+ end
401
+
402
+ scope.assert_raises ArgumentError do
403
+ default :lank, '10', &->{rand}
332
404
  end
405
+
406
+ default :lank, &->own, name{(seef = own); rand}
407
+ end
408
+
409
+ assert_raises Striuct::ConditionError do
410
+ klass.new
411
+ end
412
+
413
+ klass = Striuct.define do
414
+ member :lank, Integer
415
+ default :lank, &->own, name{(seef = own); 10 - name.length}
333
416
  end
417
+
418
+ assert_equal 6, klass.new.lank
419
+ assert_equal seef, klass.new
334
420
  end
335
421
  end
336
422
 
@@ -394,10 +480,18 @@ class TestStriuctAssign < Test::Unit::TestCase
394
480
  assert_equal true, sth.assign?(:foo)
395
481
  sth.unassign :foo
396
482
  assert_equal false, sth.assign?(:foo)
483
+ sth.foo = nil
484
+ assert_equal true, sth.assign?(:foo)
485
+ sth.clear_at 0
486
+ assert_equal false, sth.assign?(:foo)
397
487
 
398
488
  assert_raises NameError do
399
489
  sth.unassign :var
400
490
  end
491
+
492
+ assert_raises IndexError do
493
+ sth.unassign 1
494
+ end
401
495
  end
402
496
  end
403
497
 
@@ -473,18 +567,21 @@ class TestStriuctSafetyNaming < Test::Unit::TestCase
473
567
  assert_same false, klass.cname?('__foo__')
474
568
  assert_same false, klass.cname?('a b')
475
569
  assert_same false, klass.cname?('object_id')
570
+ assert_same false, klass.cname?('to_ary')
476
571
  assert_same true, klass.cname?('foo')
477
572
  klass.__send__ :protect_level, :warning
478
573
  assert_same false, klass.cname?('m?')
479
574
  assert_same false, klass.cname?('__foo__')
480
575
  assert_same false, klass.cname?('a b')
481
576
  assert_same false, klass.cname?('object_id')
577
+ assert_same false, klass.cname?('to_ary')
482
578
  assert_same true, klass.cname?('foo')
483
579
  klass.__send__ :protect_level, :struct
484
580
  assert_same true, klass.cname?('m?')
485
581
  assert_same true, klass.cname?('__foo__')
486
582
  assert_same true, klass.cname?('a b')
487
583
  assert_same true, klass.cname?('object_id')
584
+ assert_same true, klass.cname?('to_ary')
488
585
  assert_same true, klass.cname?('foo')
489
586
  end
490
587
 
@@ -578,3 +675,535 @@ class TestStriuctInference < Test::Unit::TestCase
578
675
  assert_equal 2, sth.m
579
676
  end
580
677
  end
678
+
679
+ class TestStriuctLoadPairs < Test::Unit::TestCase
680
+ Sth = Striuct.new :foo, :bar, :hoge
681
+
682
+ def test_load_pairs
683
+ sth = Sth[hoge: 7, foo: 8]
684
+
685
+ assert_equal [8, nil, 7], sth.values
686
+ end
687
+ end
688
+
689
+ class TestStriuctObject < Test::Unit::TestCase
690
+ Sth = Striuct.new :foo, :bar, :hoge
691
+
692
+ def test_hash
693
+ sth1 = Sth[hoge: 7, foo: 8]
694
+ sth2 = Sth[hoge: 7, foo: 8]
695
+ assert_equal true, sth1.eql?(sth2)
696
+ assert_equal true, sth2.eql?(sth1)
697
+ assert_equal sth1.hash, sth2.hash
698
+ assert_equal true, {sth1 => 1}.has_key?(sth2)
699
+ assert_equal true, {sth2 => 1}.has_key?(sth1)
700
+ assert_equal 1, {sth1 => 1}[sth2]
701
+ assert_equal 1, {sth2 => 1}[sth1]
702
+ end
703
+ end
704
+
705
+ class TestStriuctHashLike < Test::Unit::TestCase
706
+ Sth = Striuct.new :foo, :bar, :hoge
707
+
708
+ def test_empty?
709
+ sth = Sth[hoge: 7, foo: 8]
710
+ assert_equal false, sth.empty?
711
+ sth.each_member{|name|sth[name] = nil}
712
+ assert_equal false, sth.empty?
713
+ sth.each_member{|name|sth.unassign name}
714
+ assert_equal true, sth.empty?
715
+ end
716
+
717
+ def test_has_value?
718
+ sth = Sth[hoge: 7, foo: 8]
719
+ assert_equal true, sth.value?(7)
720
+ assert_equal true, sth.value?(8)
721
+ assert_equal false, sth.value?(9)
722
+ assert_equal false, sth.value?(nil)
723
+ end
724
+
725
+ def test_select!
726
+ sth = Sth[hoge: 7, foo: 8]
727
+ sth2, sth3 = sth.dup, sth.dup
728
+
729
+ assert_kind_of Enumerator, enum = sth.select!
730
+ assert_equal [:foo, 8], enum.next
731
+ assert_equal [:bar, nil], enum.next
732
+ assert_equal [:hoge, 7], enum.next
733
+ assert_raises StopIteration do
734
+ enum.next
735
+ end
736
+
737
+ assert_equal nil, sth2.select!{|k, v|true}
738
+ assert_equal sth3, sth3.select!{|k, v|k == :hoge && v == 7}
739
+ assert_equal nil, sth3.foo
740
+ assert_equal true, sth3.assign?(:hoge)
741
+ assert_equal false, sth3.assign?(:foo)
742
+ assert_equal 7, sth3.hoge
743
+ end
744
+
745
+ def test_keep_if
746
+ sth = Sth[hoge: 7, foo: 8]
747
+ sth2, sth3 = sth.dup, sth.dup
748
+
749
+ assert_kind_of Enumerator, enum = sth.keep_if
750
+ assert_equal [:foo, 8], enum.next
751
+ assert_equal [:bar, nil], enum.next
752
+ assert_equal [:hoge, 7], enum.next
753
+ assert_raises StopIteration do
754
+ enum.next
755
+ end
756
+
757
+ assert_equal sth2, sth2.keep_if{|k, v|true}
758
+ assert_equal sth3, sth3.keep_if{|k, v|k == :hoge && v == 7}
759
+ assert_equal nil, sth3.foo
760
+ assert_equal true, sth3.assign?(:hoge)
761
+ assert_equal false, sth3.assign?(:foo)
762
+ assert_equal 7, sth3.hoge
763
+ end
764
+
765
+ def test_reject!
766
+ sth = Sth[hoge: 7, foo: 8]
767
+ sth2, sth3 = sth.dup, sth.dup
768
+
769
+ assert_kind_of Enumerator, enum = sth.reject!
770
+ assert_equal [:foo, 8], enum.next
771
+ assert_equal [:bar, nil], enum.next
772
+ assert_equal [:hoge, 7], enum.next
773
+ assert_raises StopIteration do
774
+ enum.next
775
+ end
776
+
777
+ enum.rewind
778
+ assert_equal [:foo, 8], enum.next
779
+
780
+ assert_equal nil, sth2.reject!{|k, v|false}
781
+ assert_equal sth3, sth3.reject!{|k, v|k == :hoge && v == 7}
782
+ assert_equal nil, sth3.hoge
783
+ assert_equal false, sth3.assign?(:hoge)
784
+ assert_equal true, sth3.assign?(:foo)
785
+ assert_equal 8, sth3.foo
786
+ end
787
+
788
+ def test_delete_if
789
+ sth = Sth[hoge: 7, foo: 8]
790
+ sth2, sth3 = sth.dup, sth.dup
791
+
792
+ assert_kind_of Enumerator, enum = sth.delete_if
793
+
794
+ assert_equal [:foo, 8], enum.next
795
+ assert_equal [:bar, nil], enum.next
796
+ assert_equal [:hoge, 7], enum.next
797
+ assert_raises StopIteration do
798
+ enum.next
799
+ end
800
+
801
+ assert_equal sth2, sth2.delete_if{|k, v|false}
802
+ assert_equal sth3, sth3.delete_if{|k, v|k == :hoge && v == 7}
803
+ assert_equal nil, sth3.hoge
804
+ assert_equal false, sth3.assign?(:hoge)
805
+ assert_equal true, sth3.assign?(:foo)
806
+ assert_equal 8, sth3.foo
807
+ end
808
+
809
+ def test_assoc
810
+ sth = Sth[hoge: 7, foo: 8]
811
+
812
+ assert_equal [:foo, 8], sth.assoc(:foo)
813
+ assert_equal [:bar, nil], sth.assoc(:bar)
814
+ assert_equal [:hoge, 7], sth.assoc(:hoge)
815
+
816
+ assert_raises NameError do
817
+ sth.assoc(:dummy)
818
+ end
819
+ end
820
+
821
+ def test_rassoc
822
+ sth = Sth[hoge: 7, foo: 7]
823
+
824
+ assert_equal [:foo, 7], sth.rassoc(7)
825
+ assert_equal [:bar, nil], sth.rassoc(nil)
826
+ assert_equal nil, sth.rassoc(9)
827
+ end
828
+
829
+ def test_flatten
830
+ sth = Sth[hoge: 7, foo: 8, bar: [1, 2]]
831
+ assert_equal [:foo, 8, :bar, [1, 2], :hoge, 7], sth.flatten
832
+ assert_equal [:foo, 8, :bar, [1, 2], :hoge, 7], sth.flatten(1)
833
+ assert_equal [:foo, 8, :bar, 1, 2, :hoge, 7], sth.flatten(2)
834
+ assert_equal [:foo, 8, :bar, 1, 2, :hoge, 7], sth.flatten(3)
835
+ assert_equal [:foo, 8, :bar, 1, 2, :hoge, 7], sth.flatten(-1)
836
+ end
837
+
838
+ def test_select
839
+ sth = Sth[hoge: 7, foo: 8]
840
+
841
+ assert_kind_of Enumerator, enum = sth.select
842
+
843
+ assert_equal Sth[hoge: 7], sth.select{|k, v|k == :hoge}
844
+ end
845
+
846
+ def test_reject
847
+ sth = Sth[hoge: 7, foo: 8]
848
+
849
+ assert_kind_of Enumerator, enum = sth.reject
850
+
851
+ assert_equal Sth[foo: 8], sth.reject{|k, v|k == :hoge}
852
+ end
853
+ end
854
+
855
+
856
+ class TestStriuctAliasMember < Test::Unit::TestCase
857
+ class Sth < Striuct.new
858
+ member :foo, String
859
+
860
+ member :bar, Integer do |v|
861
+ v
862
+ end
863
+
864
+ member :hoge, Symbol
865
+ default :hoge, :'Z'
866
+ alias_member :abc, :bar
867
+ default :abc, 8
868
+ end
869
+
870
+ def test_alias_member
871
+ sth = Sth.new 'A'
872
+ assert_equal [:foo, :bar, :hoge], sth.members
873
+
874
+ assert_equal 8, sth[:abc]
875
+ flavor = Sth.__send__(:flavor_for, :abc)
876
+ assert_kind_of Proc, flavor
877
+ assert_same flavor, Sth.__send__(:flavor_for, :bar)
878
+ assert_equal 8, sth.abc
879
+ sth.abc = 5
880
+ assert_equal 5, sth.bar
881
+ sth[:abc] = 6
882
+ assert_equal 6, sth.bar
883
+
884
+ assert_raises Striuct::ConditionError do
885
+ sth[:abc] = 'a'
886
+ end
887
+
888
+ assert_raises Striuct::ConditionError do
889
+ sth.abc = 'a'
890
+ end
891
+
892
+ assert_raises Striuct::ConditionError do
893
+ sth.bar = 'a'
894
+ end
895
+
896
+ assert_raises ArgumentError do
897
+ Sth.class_eval do
898
+ member :abc
899
+ end
900
+ end
901
+ end
902
+ end
903
+
904
+ class TestStriuctSpecificConditions < Test::Unit::TestCase
905
+ Sth = Striuct.define do
906
+ member :list_only_int, generics(Integer)
907
+ member :true_or_false, boolean
908
+ member :like_str, stringable
909
+ member :has_x, CAN(:x)
910
+ member :has_x_and_y, CAN(:x, :y)
911
+ member :one_of_member, member_of([1, 3])
912
+ member :has_ignore, AND(1..5, 3..10)
913
+ member :all_pass, OR(1..5, 3..10)
914
+ member :catch_name_error, CATCH(NameError){|v|v.no_name!}
915
+ member :no_exception, STILL(->v{v.class})
916
+ member :not_integer, NOT(Integer)
917
+ end
918
+
919
+ def test_not
920
+ sth = Sth.new
921
+
922
+ obj = Object.new
923
+
924
+ sth.not_integer = obj
925
+ assert_same obj, sth.not_integer
926
+
927
+ assert_raises Striuct::ConditionError do
928
+ sth.not_integer = 1
929
+ end
930
+ end
931
+
932
+
933
+ def test_still
934
+ sth = Sth.new
935
+
936
+ obj = Object.new
937
+
938
+ sth.no_exception = obj
939
+ assert_same obj, sth.no_exception
940
+ sth.no_exception = false
941
+
942
+ obj.singleton_class.class_eval do
943
+ undef_method :class
944
+ end
945
+
946
+ assert_raises Striuct::ConditionError do
947
+ sth.no_exception = obj
948
+ end
949
+ end
950
+
951
+ def test_catch
952
+ sth = Sth.new
953
+
954
+ obj = Object.new
955
+
956
+ sth.catch_name_error = obj
957
+ assert_same obj, sth.catch_name_error
958
+ sth.catch_name_error = false
959
+
960
+ obj.singleton_class.class_eval do
961
+ def no_name!
962
+ end
963
+ end
964
+
965
+ assert_raises Striuct::ConditionError do
966
+ sth.catch_name_error = obj
967
+ end
968
+ end
969
+
970
+ def test_or
971
+ sth = Sth.new
972
+
973
+ assert_raises Striuct::ConditionError do
974
+ sth.all_pass = 11
975
+ end
976
+
977
+ sth.all_pass = 1
978
+ assert_equal 1, sth.all_pass
979
+ sth.all_pass = 4
980
+ assert_equal 4, sth.all_pass
981
+ assert_equal true, sth.valid?(:all_pass)
982
+ end
983
+
984
+ def test_and
985
+ sth = Sth.new
986
+
987
+ assert_raises Striuct::ConditionError do
988
+ sth.has_ignore = 1
989
+ end
990
+
991
+ assert_raises Striuct::ConditionError do
992
+ sth.has_ignore = 2
993
+ end
994
+
995
+ sth.has_ignore = 3
996
+ assert_equal 3, sth.has_ignore
997
+ assert_equal true, sth.valid?(:has_ignore)
998
+
999
+ assert_raises Striuct::ConditionError do
1000
+ sth.has_ignore = []
1001
+ end
1002
+ end
1003
+
1004
+ def test_member_of
1005
+ sth = Sth.new
1006
+
1007
+ assert_raises Striuct::ConditionError do
1008
+ sth.one_of_member = 4
1009
+ end
1010
+
1011
+ sth.one_of_member = 3
1012
+ assert_equal 3, sth.one_of_member
1013
+ assert_equal true, sth.valid?(:one_of_member)
1014
+ end
1015
+
1016
+ def test_generics
1017
+ sth = Sth.new
1018
+
1019
+ assert_raises Striuct::ConditionError do
1020
+ sth.list_only_int = [1, '2']
1021
+ end
1022
+
1023
+ sth.list_only_int = [1, 2]
1024
+ assert_equal [1, 2], sth.list_only_int
1025
+ assert_equal true, sth.valid?(:list_only_int)
1026
+ sth.list_only_int = []
1027
+ assert_equal [], sth.list_only_int
1028
+ assert_equal true, sth.valid?(:list_only_int)
1029
+ sth.list_only_int << '2'
1030
+ assert_equal false, sth.valid?(:list_only_int)
1031
+ end
1032
+
1033
+ def test_boolean
1034
+ sth = Sth.new
1035
+
1036
+ assert_raises Striuct::ConditionError do
1037
+ sth.true_or_false = nil
1038
+ end
1039
+
1040
+ assert_equal false, sth.valid?(:true_or_false)
1041
+
1042
+ sth.true_or_false = true
1043
+ assert_equal true, sth.true_or_false
1044
+ assert_equal true, sth.valid?(:true_or_false)
1045
+ sth.true_or_false = false
1046
+ assert_equal false, sth.true_or_false
1047
+ assert_equal true, sth.valid?(:true_or_false)
1048
+ end
1049
+
1050
+ def test_stringable
1051
+ sth = Sth.new
1052
+ obj = Object.new
1053
+
1054
+ assert_raises Striuct::ConditionError do
1055
+ sth.like_str = obj
1056
+ end
1057
+
1058
+ sth.like_str = 'str'
1059
+ assert_equal true, sth.valid?(:like_str)
1060
+ sth.like_str = :sym
1061
+ assert_equal true, sth.valid?(:like_str)
1062
+
1063
+ obj.singleton_class.class_eval do
1064
+ def to_str
1065
+ end
1066
+ end
1067
+
1068
+ sth.like_str = obj
1069
+ assert_equal true, sth.valid?(:like_str)
1070
+ end
1071
+
1072
+ def test_responsible_arg1
1073
+ sth = Sth.new
1074
+ obj = Object.new
1075
+
1076
+ assert_raises Striuct::ConditionError do
1077
+ sth.has_x = obj
1078
+ end
1079
+
1080
+ obj.singleton_class.class_eval do
1081
+ def x
1082
+ end
1083
+ end
1084
+
1085
+ sth.has_x = obj
1086
+ assert_equal obj, sth.has_x
1087
+ assert_equal true, sth.valid?(:has_x)
1088
+ end
1089
+
1090
+ def test_responsible_arg2
1091
+ sth = Sth.new
1092
+ obj = Object.new
1093
+
1094
+ assert_raises Striuct::ConditionError do
1095
+ sth.has_x_and_y = obj
1096
+ end
1097
+
1098
+ obj.singleton_class.class_eval do
1099
+ def x
1100
+ end
1101
+ end
1102
+
1103
+ assert_raises Striuct::ConditionError do
1104
+ sth.has_x_and_y = obj
1105
+ end
1106
+
1107
+ obj.singleton_class.class_eval do
1108
+ def y
1109
+ end
1110
+ end
1111
+
1112
+ sth.has_x_and_y = obj
1113
+ assert_equal obj, sth.has_x_and_y
1114
+ assert_equal true, sth.valid?(:has_x_and_y)
1115
+ end
1116
+ end
1117
+
1118
+
1119
+ class TestStriuctLock < Test::Unit::TestCase
1120
+ Sth = Striuct.new :foo, :bar
1121
+ Sth.__send__ :close
1122
+
1123
+ def test_lock
1124
+ sth = Sth.new
1125
+ assert_equal false, sth.lock?(:foo)
1126
+ assert_equal false, sth.lock?(:bar)
1127
+ assert_equal false, sth.secure?
1128
+ sth.lock :bar
1129
+ assert_equal true, sth.lock?(:bar)
1130
+ assert_equal false, sth.secure?
1131
+
1132
+ assert_raises RuntimeError do
1133
+ sth.bar = 1
1134
+ end
1135
+
1136
+ sth.__send__ :unlock, :bar
1137
+
1138
+ assert_equal false, sth.lock?(:bar)
1139
+
1140
+ sth.bar = 1
1141
+ assert_equal 1, sth.bar
1142
+
1143
+ sth.lock
1144
+ assert_equal true, sth.lock?(:foo)
1145
+ assert_equal true, sth.lock?(:bar)
1146
+ assert_equal true, sth.lock?
1147
+
1148
+ assert_raises RuntimeError do
1149
+ sth.foo = 1
1150
+ end
1151
+
1152
+ assert_equal true, sth.secure?
1153
+ end
1154
+ end
1155
+
1156
+ class TestStriuctInherit < Test::Unit::TestCase
1157
+ Sth = Striuct.define do
1158
+ member :foo, String
1159
+ member :bar, OR(nil, Fixnum)
1160
+ end
1161
+
1162
+ class SubSth < Sth
1163
+ member :hoge, OR(nil, 1..3)
1164
+ end
1165
+
1166
+ class SubSubSth < SubSth
1167
+ member :rest, AND(/\d/, Symbol)
1168
+ end
1169
+
1170
+ def test_inherit
1171
+ assert_equal [*Sth.members, :hoge], SubSth.members
1172
+ sth = Sth.new
1173
+ substh = SubSth.new
1174
+
1175
+ assert_raises Striuct::ConditionError do
1176
+ substh.bar = 'str'
1177
+ end
1178
+
1179
+ assert_raises Striuct::ConditionError do
1180
+ substh.hoge = 4
1181
+ end
1182
+
1183
+ assert_raises NoMethodError do
1184
+ sth.hoge = 3
1185
+ end
1186
+
1187
+ assert_raises NoMethodError do
1188
+ substh.rest = :a4
1189
+ end
1190
+
1191
+ subsubsth = SubSubSth.new
1192
+
1193
+ assert_raises Striuct::ConditionError do
1194
+ subsubsth.rest = 4
1195
+ end
1196
+
1197
+ subsubsth.rest = :a4
1198
+
1199
+ assert_equal :a4, subsubsth[:rest]
1200
+
1201
+ assert_equal true, Sth.__send__(:closed?)
1202
+ assert_equal false, SubSth.__send__(:closed?)
1203
+ SubSth.__send__(:close)
1204
+ assert_equal true, SubSth.__send__(:closed?)
1205
+ assert_equal false, SubSubSth.__send__(:closed?)
1206
+ SubSubSth.__send__(:close)
1207
+ assert_equal true, SubSubSth.__send__(:closed?)
1208
+ end
1209
+ end