striuct 0.3.0 → 0.3.1

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.
Files changed (68) hide show
  1. data/.gitignore +32 -0
  2. data/.travis.yml +6 -0
  3. data/Gemfile +12 -0
  4. data/History.rdoc +5 -0
  5. data/Manifest.txt +53 -25
  6. data/README.md +97 -0
  7. data/Rakefile +7 -21
  8. data/examples/README.rb +25 -0
  9. data/{example → examples}/example1.rb +1 -1
  10. data/{example → examples}/example2.rb +1 -1
  11. data/{example → examples}/see_trace.rb +4 -0
  12. data/lib/striuct/{containable/eigen → classmethods}/basic.rb +13 -5
  13. data/lib/striuct/classmethods/constants.rb +23 -0
  14. data/lib/striuct/{containable/eigen → classmethods}/constructor.rb +20 -14
  15. data/lib/striuct/{containable/eigen → classmethods}/handy.rb +19 -20
  16. data/lib/striuct/{containable/eigen → classmethods}/inner.rb +10 -32
  17. data/lib/striuct/{containable/eigen → classmethods}/macro.rb +37 -7
  18. data/lib/striuct/classmethods/requiremnets.rb +7 -0
  19. data/lib/striuct/{containable/eigen → classmethods}/safety.rb +6 -6
  20. data/lib/striuct/classmethods.rb +1 -0
  21. data/lib/striuct/{containable → instancemethods}/basic.rb +6 -6
  22. data/lib/striuct/{containable → instancemethods}/handy.rb +3 -3
  23. data/lib/striuct/{containable → instancemethods}/hashlike.rb +12 -6
  24. data/lib/striuct/{containable → instancemethods}/inner.rb +9 -8
  25. data/lib/striuct/instancemethods/requirements.rb +6 -0
  26. data/lib/striuct/{containable → instancemethods}/safety.rb +2 -2
  27. data/lib/striuct/instancemethods/singleton_class.rb +19 -0
  28. data/lib/striuct/instancemethods.rb +1 -0
  29. data/lib/striuct/requirements.rb +6 -0
  30. data/lib/striuct/singleton_class.rb +93 -0
  31. data/lib/striuct/specificcontainer.rb +17 -0
  32. data/lib/striuct/structs.rb +7 -0
  33. data/lib/striuct/version.rb +3 -2
  34. data/lib/striuct.rb +4 -9
  35. data/striuct.gemspec +24 -0
  36. data/test/{test_helper.rb → helper.rb} +3 -0
  37. data/test/test_striuct.rb +23 -1409
  38. data/test/test_striuct_define.rb +19 -0
  39. data/test/test_striuct_subclass_adjuster.rb +95 -0
  40. data/test/test_striuct_subclass_alias_member.rb +54 -0
  41. data/test/test_striuct_subclass_assign.rb +30 -0
  42. data/test/test_striuct_subclass_classlock.rb +36 -0
  43. data/test/test_striuct_subclass_classmethods.rb +87 -0
  44. data/test/test_striuct_subclass_cloning.rb +36 -0
  45. data/test/test_striuct_subclass_default_value.rb +129 -0
  46. data/test/test_striuct_subclass_for_pairs.rb +13 -0
  47. data/test/test_striuct_subclass_freeze.rb +19 -0
  48. data/test/test_striuct_subclass_functional_condition.rb +51 -0
  49. data/test/test_striuct_subclass_getter_validation.rb +33 -0
  50. data/test/test_striuct_subclass_hashlike.rb +153 -0
  51. data/test/test_striuct_subclass_inference.rb +51 -0
  52. data/test/test_striuct_subclass_inheritable.rb +58 -0
  53. data/test/test_striuct_subclass_instance.rb +289 -0
  54. data/test/test_striuct_subclass_lock.rb +40 -0
  55. data/test/test_striuct_subclass_safetynaming.rb +72 -0
  56. data/test/test_striuct_subclass_specific_conditions.rb +247 -0
  57. data/test/test_striuct_subclass_to_struct.rb +25 -0
  58. data/test/test_striuct_version.rb +9 -0
  59. metadata +106 -68
  60. data/.gemtest +0 -0
  61. data/README.rdoc +0 -63
  62. data/example/example.rb +0 -17
  63. data/lib/striuct/abstract.rb +0 -74
  64. data/lib/striuct/containable/classutil.rb +0 -22
  65. data/lib/striuct/containable/eigen.rb +0 -29
  66. data/lib/striuct/containable.rb +0 -38
  67. /data/{example/benchmarks.rb → benchmarks/basics.rb} +0 -0
  68. /data/{example → examples}/example.old.rdoc +0 -0
@@ -0,0 +1,153 @@
1
+ require_relative 'helper'
2
+
3
+ class TestStriuctHashLike < Test::Unit::TestCase
4
+
5
+ Sth = Striuct.new :foo, :bar, :hoge
6
+
7
+ def test_empty?
8
+ sth = Sth[hoge: 7, foo: 8]
9
+ assert_equal false, sth.empty?
10
+ sth.each_member{|name|sth[name] = nil}
11
+ assert_equal false, sth.empty?
12
+ sth.each_member{|name|sth.unassign name}
13
+ assert_equal true, sth.empty?
14
+ end
15
+
16
+ def test_has_value?
17
+ sth = Sth[hoge: 7, foo: 8]
18
+ assert_equal true, sth.value?(7)
19
+ assert_equal true, sth.value?(8)
20
+ assert_equal false, sth.value?(9)
21
+ assert_equal false, sth.value?(nil)
22
+ end
23
+
24
+ def test_select!
25
+ sth = Sth[hoge: 7, foo: 8]
26
+ sth2, sth3 = sth.dup, sth.dup
27
+
28
+ assert_kind_of Enumerator, enum = sth.select!
29
+ assert_equal [:foo, 8], enum.next
30
+ assert_equal [:bar, nil], enum.next
31
+ assert_equal [:hoge, 7], enum.next
32
+ assert_raises StopIteration do
33
+ enum.next
34
+ end
35
+
36
+ assert_equal nil, sth2.select!{|k, v|true}
37
+ assert_equal sth3, sth3.select!{|k, v|k == :hoge && v == 7}
38
+ assert_equal nil, sth3.foo
39
+ assert_equal true, sth3.assign?(:hoge)
40
+ assert_equal false, sth3.assign?(:foo)
41
+ assert_equal 7, sth3.hoge
42
+ end
43
+
44
+ def test_keep_if
45
+ sth = Sth[hoge: 7, foo: 8]
46
+ sth2, sth3 = sth.dup, sth.dup
47
+
48
+ assert_kind_of Enumerator, enum = sth.keep_if
49
+ assert_equal [:foo, 8], enum.next
50
+ assert_equal [:bar, nil], enum.next
51
+ assert_equal [:hoge, 7], enum.next
52
+ assert_raises StopIteration do
53
+ enum.next
54
+ end
55
+
56
+ assert_equal sth2, sth2.keep_if{|k, v|true}
57
+ assert_equal sth3, sth3.keep_if{|k, v|k == :hoge && v == 7}
58
+ assert_equal nil, sth3.foo
59
+ assert_equal true, sth3.assign?(:hoge)
60
+ assert_equal false, sth3.assign?(:foo)
61
+ assert_equal 7, sth3.hoge
62
+ end
63
+
64
+ def test_reject!
65
+ sth = Sth[hoge: 7, foo: 8]
66
+ sth2, sth3 = sth.dup, sth.dup
67
+
68
+ assert_kind_of Enumerator, enum = sth.reject!
69
+ assert_equal [:foo, 8], enum.next
70
+ assert_equal [:bar, nil], enum.next
71
+ assert_equal [:hoge, 7], enum.next
72
+ assert_raises StopIteration do
73
+ enum.next
74
+ end
75
+
76
+ enum.rewind
77
+ assert_equal [:foo, 8], enum.next
78
+
79
+ assert_equal nil, sth2.reject!{|k, v|false}
80
+ assert_equal sth3, sth3.reject!{|k, v|k == :hoge && v == 7}
81
+ assert_equal nil, sth3.hoge
82
+ assert_equal false, sth3.assign?(:hoge)
83
+ assert_equal true, sth3.assign?(:foo)
84
+ assert_equal 8, sth3.foo
85
+ end
86
+
87
+ def test_delete_if
88
+ sth = Sth[hoge: 7, foo: 8]
89
+ sth2, sth3 = sth.dup, sth.dup
90
+
91
+ assert_kind_of Enumerator, enum = sth.delete_if
92
+
93
+ assert_equal [:foo, 8], enum.next
94
+ assert_equal [:bar, nil], enum.next
95
+ assert_equal [:hoge, 7], enum.next
96
+ assert_raises StopIteration do
97
+ enum.next
98
+ end
99
+
100
+ assert_equal sth2, sth2.delete_if{|k, v|false}
101
+ assert_equal sth3, sth3.delete_if{|k, v|k == :hoge && v == 7}
102
+ assert_equal nil, sth3.hoge
103
+ assert_equal false, sth3.assign?(:hoge)
104
+ assert_equal true, sth3.assign?(:foo)
105
+ assert_equal 8, sth3.foo
106
+ end
107
+
108
+ def test_assoc
109
+ sth = Sth[hoge: 7, foo: 8]
110
+
111
+ assert_equal [:foo, 8], sth.assoc(:foo)
112
+ assert_equal [:bar, nil], sth.assoc(:bar)
113
+ assert_equal [:hoge, 7], sth.assoc(:hoge)
114
+
115
+ assert_raises NameError do
116
+ sth.assoc(:dummy)
117
+ end
118
+ end
119
+
120
+ def test_rassoc
121
+ sth = Sth[hoge: 7, foo: 7]
122
+
123
+ assert_equal [:foo, 7], sth.rassoc(7)
124
+ assert_equal [:bar, nil], sth.rassoc(nil)
125
+ assert_equal nil, sth.rassoc(9)
126
+ end
127
+
128
+ def test_flatten
129
+ sth = Sth[hoge: 7, foo: 8, bar: [1, 2]]
130
+ assert_equal [:foo, 8, :bar, [1, 2], :hoge, 7], sth.flatten
131
+ assert_equal [:foo, 8, :bar, [1, 2], :hoge, 7], sth.flatten(1)
132
+ assert_equal [:foo, 8, :bar, 1, 2, :hoge, 7], sth.flatten(2)
133
+ assert_equal [:foo, 8, :bar, 1, 2, :hoge, 7], sth.flatten(3)
134
+ assert_equal [:foo, 8, :bar, 1, 2, :hoge, 7], sth.flatten(-1)
135
+ end
136
+
137
+ def test_select
138
+ sth = Sth[hoge: 7, foo: 8]
139
+
140
+ assert_kind_of Enumerator, sth.select
141
+
142
+ assert_equal Sth[hoge: 7], sth.select{|k, v|k == :hoge}
143
+ end
144
+
145
+ def test_reject
146
+ sth = Sth[hoge: 7, foo: 8]
147
+
148
+ assert_kind_of Enumerator, sth.reject
149
+
150
+ assert_equal Sth[foo: 8], sth.reject{|k, v|k == :hoge}
151
+ end
152
+
153
+ end
@@ -0,0 +1,51 @@
1
+ require_relative 'helper'
2
+
3
+ class TestStriuctInference < Test::Unit::TestCase
4
+
5
+ def test_inference
6
+ klass = Striuct.define do
7
+ member :n, Numeric, inference: true
8
+ member :m, ANYTHING?, inference: true
9
+ end
10
+
11
+ sth, sth2 = klass.new, klass.new
12
+
13
+ assert_raises Validation::InvalidWritingError do
14
+ sth.n = '1'
15
+ end
16
+
17
+ sth.n = 1.1
18
+
19
+ assert_equal 1.1, sth.n
20
+
21
+ assert_raises Validation::InvalidWritingError do
22
+ sth.n = 1
23
+ end
24
+
25
+ assert_raises Validation::InvalidWritingError do
26
+ sth2.n = 1
27
+ end
28
+
29
+ sth.n = 2.1
30
+
31
+ assert_equal 2.1, sth.n
32
+
33
+
34
+ sth2.m = 1
35
+
36
+ assert_equal 1, sth2.m
37
+
38
+ assert_raises Validation::InvalidWritingError do
39
+ sth.m = 1.0
40
+ end
41
+
42
+ assert_raises Validation::InvalidWritingError do
43
+ sth2.m = 1.0
44
+ end
45
+
46
+ sth.m = 2
47
+
48
+ assert_equal 2, sth.m
49
+ end
50
+
51
+ end
@@ -0,0 +1,58 @@
1
+ require_relative 'helper'
2
+
3
+ class TestStriuctInheritable < Test::Unit::TestCase
4
+
5
+ Sth = Striuct.define do
6
+ member :foo, String
7
+ member :bar, OR(nil, Fixnum)
8
+ end
9
+
10
+ class SubSth < Sth
11
+ member :hoge, OR(nil, 1..3)
12
+ end
13
+
14
+ class SubSubSth < SubSth
15
+ member :rest, AND(/\d/, Symbol)
16
+ end
17
+
18
+ def test_inherit
19
+ assert_equal [*Sth.members, :hoge], SubSth.members
20
+ sth = Sth.new
21
+ substh = SubSth.new
22
+
23
+ assert_raises Validation::InvalidWritingError do
24
+ substh.bar = 'str'
25
+ end
26
+
27
+ assert_raises Validation::InvalidWritingError do
28
+ substh.hoge = 4
29
+ end
30
+
31
+ assert_raises NoMethodError do
32
+ sth.hoge = 3
33
+ end
34
+
35
+ assert_raises NoMethodError do
36
+ substh.rest = :a4
37
+ end
38
+
39
+ subsubsth = SubSubSth.new
40
+
41
+ assert_raises Validation::InvalidWritingError do
42
+ subsubsth.rest = 4
43
+ end
44
+
45
+ subsubsth.rest = :a4
46
+
47
+ assert_equal :a4, subsubsth[:rest]
48
+
49
+ assert_equal true, Sth.__send__(:closed?)
50
+ assert_equal false, SubSth.__send__(:closed?)
51
+ SubSth.__send__(:close)
52
+ assert_equal true, SubSth.__send__(:closed?)
53
+ assert_equal false, SubSubSth.__send__(:closed?)
54
+ SubSubSth.__send__(:close)
55
+ assert_equal true, SubSubSth.__send__(:closed?)
56
+ end
57
+
58
+ end
@@ -0,0 +1,289 @@
1
+ require_relative 'helper'
2
+
3
+ class TestStriuctSubclassInstance1 < Test::Unit::TestCase
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
+ def test_setter
13
+ user = User.new
14
+ user[:last_name] = 'foo'
15
+ assert_equal user.last_name, 'foo'
16
+ user.last_name = 'bar'
17
+ assert_equal user[:last_name], 'bar'
18
+
19
+ assert_raises Validation::InvalidWritingError do
20
+ user[:last_name] = 'foo s'
21
+ end
22
+
23
+ assert_raises Validation::InvalidWritingError do
24
+ User.new 'asda'
25
+ end
26
+
27
+ assert_raises Validation::InvalidWritingError do
28
+ user.age = 19
29
+ end
30
+ end
31
+
32
+ def test_equal
33
+ user1 = User.new 11218, 'taro'
34
+ user2 = User.new 11218, 'taro'
35
+ assert_equal true, (user1 == user2)
36
+ user2.last_name = 'ichiro'
37
+ assert_equal false, (user1 == user2)
38
+ end
39
+ end
40
+
41
+ class TestStriuctSubclassInstance2 < Test::Unit::TestCase
42
+ class User < Striuct.new
43
+ member :id, Integer
44
+ member :last_name, /\A\w+\z/
45
+ member :family_name, /\A\w+\z/
46
+ member :address, /\A((\w+) ?)+\z/
47
+ member :age, ->age{(20..140).include? age}
48
+ end
49
+
50
+ def setup
51
+ @user = User.new 9999, 'taro', 'yamada', 'Tokyo Japan', 30
52
+ end
53
+
54
+ def test_reader
55
+ assert_equal @user[1], 'taro'
56
+ assert_equal @user[:last_name], 'taro'
57
+ assert_equal @user.last_name, 'taro'
58
+ end
59
+
60
+ def test_setter_pass
61
+ assert_equal((@user.id = 2139203509295), 2139203509295)
62
+ assert_equal @user.id, 2139203509295
63
+ assert_equal((@user.last_name = 'jiro'), 'jiro')
64
+ assert_equal @user.last_name, 'jiro'
65
+ assert_equal((@user.age = 40), 40)
66
+ assert_equal @user.age, 40
67
+ end
68
+
69
+ def test_setter_fail
70
+ assert_raises Validation::InvalidWritingError do
71
+ @user.id = 2139203509295.0
72
+ end
73
+
74
+ assert_raises Validation::InvalidWritingError do
75
+ @user.last_name = 'ignore name'
76
+ end
77
+
78
+ assert_raises Validation::InvalidWritingError do
79
+ @user.age = 19
80
+ end
81
+ end
82
+
83
+ def test_strict?
84
+ assert_same @user.sufficient?(:last_name), true
85
+ assert_same @user.strict?, true
86
+ assert_same @user.sufficient?(:last_name), true
87
+ @user.last_name.clear
88
+ assert_same @user.sufficient?(:last_name), false
89
+ assert_same @user.strict?, false
90
+ end
91
+ end
92
+
93
+ class TestStriuctSubclassInstance3 < Test::Unit::TestCase
94
+ class User < Striuct.new
95
+ member :id, Integer
96
+ member :last_name, /\A\w+\z/
97
+ member :family_name, /\A\w+\z/
98
+ member :address, /\A((\w+) ?)+\z/
99
+ member :age, ->age{(20..140).include? age}
100
+ end
101
+
102
+ def setup
103
+ @user = User.new 9999, 'taro', 'yamada', 'Tokyo Japan', 30
104
+ @user2 = User.new 9999, 'taro', 'yamada', 'Tokyo Japan', 30
105
+ end
106
+
107
+ def test_to_s
108
+ /\b(taro)\b/ =~ @user.to_s
109
+ assert_equal 'taro', $1
110
+ end
111
+
112
+ def test_inspect
113
+ /\b(taro)\b/ =~ @user.inspect
114
+ assert_equal 'taro', $1
115
+ end
116
+
117
+ def test_members
118
+ assert_equal @user.members, [:id, :last_name, :family_name, :address, :age]
119
+ end
120
+
121
+ def test_delegate_class_method
122
+ assert_equal @user.members, User.members
123
+ assert_equal @user.size, User.size
124
+ assert_equal @user.member?(:age), User.member?(:age)
125
+ end
126
+
127
+ def test_each
128
+ assert_same @user, @user.each{}
129
+ assert_kind_of Enumerator, enum = @user.each
130
+ assert_equal enum.next, 9999
131
+ assert_equal enum.next, 'taro'
132
+ end
133
+
134
+ def test_each_member
135
+ assert_same @user, @user.each_member{}
136
+ assert_kind_of Enumerator, enum = @user.each_member
137
+ assert_equal :id, enum.next
138
+ assert_equal :last_name, enum.next
139
+ assert_equal :family_name, enum.next
140
+ assert_equal :address, enum.next
141
+ assert_equal :age, enum.next
142
+ assert_raises StopIteration do
143
+ enum.next
144
+ end
145
+ end
146
+
147
+ def test_each_index
148
+ assert_same @user, @user.each_index{}
149
+ assert_kind_of Enumerator, enum = @user.each_index
150
+ assert_equal 0, enum.next
151
+ assert_equal 1, enum.next
152
+ assert_equal 2, enum.next
153
+ assert_equal 3, enum.next
154
+ assert_equal 4, enum.next
155
+ assert_raises StopIteration do
156
+ enum.next
157
+ end
158
+ end
159
+
160
+ def test_each_with_index
161
+ assert_same @user, @user.each_with_index{}
162
+ assert_kind_of Enumerator, @user.each_with_index
163
+
164
+ r = []
165
+ @user.each_with_index do |value, index|
166
+ r << [value, index]
167
+ end
168
+
169
+ assert_equal [@user.each_value.to_a, @user.each_index.to_a].transpose, r
170
+ end
171
+
172
+ def test_each_member_with_index
173
+ assert_same @user, @user.each_member_with_index{}
174
+ assert_kind_of Enumerator, @user.each_member_with_index
175
+
176
+ r = []
177
+ @user.each_member_with_index do |name, index|
178
+ r << [name, index]
179
+ end
180
+
181
+ assert_equal [@user.each_key.to_a, @user.each_index.to_a].transpose, r
182
+ end
183
+
184
+ def test_values
185
+ assert_equal @user.values, [9999, 'taro', 'yamada', 'Tokyo Japan', 30]
186
+ end
187
+
188
+ def test_values_at
189
+ assert_equal(@user.values_at(4, 0, (2..4)), [30, 9999, 'yamada', 'Tokyo Japan', 30])
190
+ end
191
+
192
+ def test_hash
193
+ assert_kind_of Integer, @user.hash
194
+ assert_equal @user.hash, @user2.hash
195
+ end
196
+
197
+ def test_eql?
198
+ assert_equal true, @user.eql?(@user2)
199
+ assert_equal true, @user2.eql?(@user)
200
+ assert_equal false, @user.eql?(User.new 9999, 'taro', 'yamada', 'Tokyo Japan', 31)
201
+ end
202
+ end
203
+
204
+
205
+ class TestStriuctSubclassInstance4 < Test::Unit::TestCase
206
+ class Sth < Striuct.new
207
+ member :bool, OR(true, false)
208
+ member :sth
209
+ protect_level :struct
210
+ member :lambda, OR(->v{v % 3 == 2}, ->v{v.kind_of? Float})
211
+ end
212
+
213
+ def setup
214
+ @sth = Sth.new
215
+ end
216
+
217
+ def test_accessor
218
+ @sth.bool = true
219
+ assert_same true, @sth.bool
220
+ @sth.bool = false
221
+ assert_same false, @sth.bool
222
+
223
+ assert_raises Validation::InvalidWritingError do
224
+ @sth.bool = nil
225
+ end
226
+
227
+ @sth.sth = 1
228
+ assert_same 1, @sth.sth
229
+
230
+ @sth.sth = 'String'
231
+ assert_equal 'String', @sth.sth
232
+
233
+ @sth.sth = Class.class
234
+ assert_same Class.class, @sth.sth
235
+
236
+ assert_raises Validation::InvalidWritingError do
237
+ @sth.lambda = 9
238
+ end
239
+
240
+ assert_raises Validation::InvalidWritingError do
241
+ @sth.lambda = 7
242
+ end
243
+
244
+ @sth.lambda = 8
245
+ assert_same 8, @sth.lambda
246
+
247
+ @sth.lambda = 9.0
248
+ assert_equal 9.0, @sth.lambda
249
+ end
250
+ end
251
+
252
+ class TestStriuctHashKeyable < Test::Unit::TestCase
253
+
254
+ Sth = Striuct.new :foo, :bar, :hoge
255
+
256
+ def test_hash
257
+ sth1 = Sth[hoge: 7, foo: 8]
258
+ sth2 = Sth[hoge: 7, foo: 8]
259
+ assert_equal true, sth1.eql?(sth2)
260
+ assert_equal true, sth2.eql?(sth1)
261
+ assert_equal sth1.hash, sth2.hash
262
+ assert_equal true, {sth1 => 1}.has_key?(sth2)
263
+ assert_equal true, {sth2 => 1}.has_key?(sth1)
264
+ assert_equal 1, {sth1 => 1}[sth2]
265
+ assert_equal 1, {sth2 => 1}[sth1]
266
+ end
267
+
268
+ end
269
+
270
+ class TestStriuctEachPair < Test::Unit::TestCase
271
+
272
+ Sth = Striuct.define do
273
+ member :name
274
+ member :age
275
+ end
276
+
277
+ def test_each_pair_with_index
278
+ sth = Sth.new 'a', 10
279
+ assert_same sth, sth.each_pair_with_index{}
280
+
281
+ enum = sth.each_pair_with_index
282
+ assert_equal [:name, 'a', 0], enum.next
283
+ assert_equal [:age, 10, 1], enum.next
284
+ assert_raises StopIteration do
285
+ enum.next
286
+ end
287
+ end
288
+
289
+ end
@@ -0,0 +1,40 @@
1
+ require_relative 'helper'
2
+
3
+ class TestStriuctLock < Test::Unit::TestCase
4
+
5
+ Sth = Striuct.new :foo, :bar
6
+ Sth.__send__ :close
7
+
8
+ def test_lock
9
+ sth = Sth.new
10
+ assert_equal false, sth.lock?(:foo)
11
+ assert_equal false, sth.lock?(:bar)
12
+ assert_equal false, sth.secure?
13
+ sth.lock :bar
14
+ assert_equal true, sth.lock?(:bar)
15
+ assert_equal false, sth.secure?
16
+
17
+ assert_raises RuntimeError do
18
+ sth.bar = 1
19
+ end
20
+
21
+ sth.__send__ :unlock, :bar
22
+
23
+ assert_equal false, sth.lock?(:bar)
24
+
25
+ sth.bar = 1
26
+ assert_equal 1, sth.bar
27
+
28
+ sth.lock
29
+ assert_equal true, sth.lock?(:foo)
30
+ assert_equal true, sth.lock?(:bar)
31
+ assert_equal true, sth.lock?
32
+
33
+ assert_raises RuntimeError do
34
+ sth.foo = 1
35
+ end
36
+
37
+ assert_equal true, sth.secure?
38
+ end
39
+
40
+ end
@@ -0,0 +1,72 @@
1
+ require_relative 'helper'
2
+
3
+ class TestStriuctSafetyNaming < Test::Unit::TestCase
4
+
5
+ def test_cname?
6
+ klass = Striuct.new
7
+ assert_same false, klass.cname?(Object)
8
+ assert_same false, klass.cname?('m?')
9
+ assert_same false, klass.cname?('__foo__')
10
+ assert_same false, klass.cname?('a b')
11
+ assert_same false, klass.cname?('object_id')
12
+ assert_same false, klass.cname?('to_ary')
13
+ assert_same true, klass.cname?('foo')
14
+ klass.__send__ :protect_level, :warning
15
+ assert_same false, klass.cname?('m?')
16
+ assert_same false, klass.cname?('__foo__')
17
+ assert_same false, klass.cname?('a b')
18
+ assert_same false, klass.cname?('object_id')
19
+ assert_same false, klass.cname?('to_ary')
20
+ assert_same true, klass.cname?('foo')
21
+ klass.__send__ :protect_level, :struct
22
+ assert_same true, klass.cname?('m?')
23
+ assert_same true, klass.cname?('__foo__')
24
+ assert_same true, klass.cname?('a b')
25
+ assert_same true, klass.cname?('object_id')
26
+ assert_same true, klass.cname?('to_ary')
27
+ assert_same true, klass.cname?('foo')
28
+ end
29
+
30
+ def test_protect
31
+ klass = Striuct.new
32
+ assert_raises NameError do
33
+ klass.class_eval do
34
+ member ''
35
+ end
36
+ end
37
+
38
+ assert_raises NameError do
39
+ klass.class_eval do
40
+ member :'a b'
41
+ end
42
+ end
43
+
44
+ assert_raises NameError do
45
+ klass.class_eval do
46
+ member :'__send__'
47
+ end
48
+ end
49
+
50
+ assert_raises NameError do
51
+ klass.class_eval do
52
+ member :'__foo__'
53
+ end
54
+ end
55
+
56
+ assert_raises NameError do
57
+ klass.class_eval do
58
+ member :'m?'
59
+ end
60
+ end
61
+
62
+ assert_same false, klass.member?('m?')
63
+
64
+ klass.class_eval do
65
+ protect_level :struct
66
+ member :'m?'
67
+ end
68
+
69
+ assert_same true, klass.member?('m?')
70
+ end
71
+
72
+ end