striuct 0.3.2 → 0.3.3
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/History.rdoc +12 -0
- data/LICENSE +2 -2
- data/Manifest.txt +34 -24
- data/README.md +34 -5
- data/example/README.rb +20 -1
- data/lib/striuct/classmethods/README.md +5 -0
- data/lib/striuct/classmethods/adjustment.rb +5 -3
- data/lib/striuct/classmethods/default.rb +2 -2
- data/lib/striuct/classmethods/enum.rb +3 -3
- data/lib/striuct/classmethods/inner.rb +28 -49
- data/lib/striuct/classmethods/named.rb +22 -2
- data/lib/striuct/classmethods/object.rb +35 -5
- data/lib/striuct/instancemethods/README.md +5 -0
- data/lib/striuct/instancemethods/assign.rb +1 -1
- data/lib/striuct/instancemethods/cast.rb +35 -0
- data/lib/striuct/instancemethods/compare.rb +4 -5
- data/lib/striuct/instancemethods/delegate_class_methods.rb +12 -4
- data/lib/striuct/instancemethods/hashy.rb +0 -11
- data/lib/striuct/instancemethods/keyvalidatable.rb +14 -0
- data/lib/striuct/instancemethods/lock.rb +15 -4
- data/lib/striuct/instancemethods/object.rb +11 -6
- data/lib/striuct/instancemethods/requirements.rb +2 -2
- data/lib/striuct/instancemethods/subscript.rb +1 -1
- data/lib/striuct/instancemethods/values.rb +1 -8
- data/lib/striuct/singleton_class.rb +9 -36
- data/lib/striuct/version.rb +1 -1
- data/striuct.gemspec +4 -4
- data/test/{test_striuct_define.rb → test_striuct-singleton_class-define.rb} +1 -1
- data/test/test_striuct-subclass-class-cloning.rb +21 -0
- data/test/{test_striuct_subclass_classlock.rb → test_striuct-subclass-class-close.rb} +2 -2
- data/test/{test_striuct_subclass_classmethods.rb → test_striuct-subclass-class-constructor.rb} +15 -20
- data/test/test_striuct-subclass-class-freeze.rb +36 -0
- data/test/{test_striuct_subclass_inheritable.rb → test_striuct-subclass-class-inheritable.rb} +1 -1
- data/test/test_striuct-subclass-class-macro.rb +13 -0
- data/test/{test_striuct_subclass_safetynaming.rb → test_striuct-subclass-class-safety_naming.rb} +1 -1
- data/test/test_striuct-subclass-class-validation.rb +26 -0
- data/test/{test_striuct_subclass_alias_member.rb → test_striuct-subclass-feature-alias_member.rb} +1 -1
- data/test/{test_striuct_subclass_to_struct.rb → test_striuct-subclass-feature-to_struct.rb} +1 -1
- data/test/test_striuct-subclass-instance-accessor.rb +137 -0
- data/test/{test_striuct_subclass_adjuster.rb → test_striuct-subclass-instance-adjuster.rb} +28 -28
- data/test/{test_striuct_subclass_assign.rb → test_striuct-subclass-instance-assign.rb} +1 -1
- data/test/test_striuct-subclass-instance-basic.rb +32 -0
- data/test/test_striuct-subclass-instance-cloning.rb +23 -0
- data/test/test_striuct-subclass-instance-compare.rb +52 -0
- data/test/{test_striuct_subclass_default_value.rb → test_striuct-subclass-instance-default_value.rb} +2 -2
- data/test/test_striuct-subclass-instance-enum.rb +93 -0
- data/test/{test_striuct_subclass_freeze.rb → test_striuct-subclass-instance-freeze.rb} +1 -1
- data/test/{test_striuct_subclass_hashlike.rb → test_striuct-subclass-instance-hashlike.rb} +1 -1
- data/test/test_striuct-subclass-instance-keyvalidatable.rb +25 -0
- data/test/{test_striuct_subclass_lock.rb → test_striuct-subclass-instance-lock.rb} +1 -1
- data/test/test_striuct-subclass-instance-to_s_family.rb +25 -0
- data/test/{test_striuct_subclass_functional_condition.rb → test_striuct-subclass-instance-validation_functional_condition.rb} +0 -0
- data/test/{test_striuct_subclass_inference.rb → test_striuct-subclass-instance-validation_inference.rb} +1 -1
- data/test/{test_striuct_subclass_specific_conditions.rb → test_striuct-subclass-instance-validation_specific_conditions.rb} +1 -1
- data/test/{test_striuct_subclass_getter_validation.rb → test_striuct-subclass-instance-validation_with_getter.rb} +1 -1
- data/test/test_striuct-subclass-instance_names.rb +18 -0
- data/test/test_striuct-version.rb +11 -0
- metadata +68 -50
- data/lib/striuct/instancemethods/singleton_class.rb +0 -22
- data/lib/striuct/instancemethods/to_struct.rb +0 -12
- data/test/test_striuct.rb +0 -24
- data/test/test_striuct_subclass_cloning.rb +0 -36
- data/test/test_striuct_subclass_for_pairs.rb +0 -20
- data/test/test_striuct_subclass_instance.rb +0 -289
- data/test/test_striuct_version.rb +0 -9
@@ -13,7 +13,7 @@ class Striuct; module InstanceMethods
|
|
13
13
|
raise "can't modify frozen #{self.class}" if frozen?
|
14
14
|
|
15
15
|
if key.equal? true
|
16
|
-
|
16
|
+
_autonyms.each do |autonym|
|
17
17
|
@locks[autonym] = true
|
18
18
|
end
|
19
19
|
else
|
@@ -22,11 +22,16 @@ class Striuct; module InstanceMethods
|
|
22
22
|
|
23
23
|
self
|
24
24
|
end
|
25
|
-
|
26
|
-
# @
|
25
|
+
|
26
|
+
# @overload lock?(key)
|
27
|
+
# predicate locking a setter for key
|
28
|
+
# @param [Symbol, String, Fixnum] key
|
29
|
+
# @overload lock?(true)
|
30
|
+
# predicate locking for all members
|
31
|
+
# @param [true] true
|
27
32
|
def lock?(key=true)
|
28
33
|
if key.equal? true
|
29
|
-
|
34
|
+
_autonyms.all?{|autonym|@locks[autonym]}
|
30
35
|
else
|
31
36
|
__subscript__(key){|autonym|@locks[autonym]} || false
|
32
37
|
end
|
@@ -34,6 +39,12 @@ class Striuct; module InstanceMethods
|
|
34
39
|
|
35
40
|
private
|
36
41
|
|
42
|
+
# @overload unlock(key)
|
43
|
+
# unlock a setter for key
|
44
|
+
# @param [Symbol, String, Fixnum] key
|
45
|
+
# @overload unlock(true)
|
46
|
+
# unlock setters for all members
|
47
|
+
# @param [true] true
|
37
48
|
def unlock(key=true)
|
38
49
|
raise "can't modify frozen #{self.class}" if frozen?
|
39
50
|
|
@@ -9,23 +9,28 @@ class Striuct; module InstanceMethods
|
|
9
9
|
|
10
10
|
# @return [String]
|
11
11
|
def inspect
|
12
|
-
"
|
12
|
+
"#<struct' #{self.class} strict?:#{strict?}".tap {|s|
|
13
13
|
each_pair do |autonym, value|
|
14
|
-
suffix = (has_default?(autonym) && default?(autonym)) ? '
|
15
|
-
s << " #{autonym}=#{value.inspect}#{suffix}"
|
14
|
+
suffix = (has_default?(autonym) && default?(autonym)) ? '/default' : nil
|
15
|
+
s << " #{autonym}=#{value.inspect}#{suffix}("
|
16
|
+
s << "valid?:#{valid? autonym}, "
|
17
|
+
s << "lock?:#{lock? autonym}"
|
18
|
+
s << '),'
|
16
19
|
end
|
17
20
|
|
18
|
-
s
|
21
|
+
s.chop!
|
22
|
+
s << '>'
|
19
23
|
}
|
20
24
|
end
|
21
25
|
|
22
26
|
# @return [String]
|
23
27
|
def to_s
|
24
|
-
"#<struct #{self.class}".tap {|s|
|
28
|
+
"#<struct' #{self.class}".tap {|s|
|
25
29
|
each_pair do |autonym, value|
|
26
|
-
s << " #{autonym}=#{value.inspect}"
|
30
|
+
s << " #{autonym}=#{value.inspect},"
|
27
31
|
end
|
28
32
|
|
33
|
+
s.chop!
|
29
34
|
s << '>'
|
30
35
|
}
|
31
36
|
end
|
@@ -1,10 +1,10 @@
|
|
1
|
-
require_relative 'singleton_class'
|
2
1
|
require_relative 'delegate_class_methods'
|
2
|
+
require_relative 'keyvalidatable'
|
3
3
|
require_relative 'inner'
|
4
4
|
require_relative 'object'
|
5
5
|
require_relative 'compare'
|
6
6
|
require_relative 'values'
|
7
|
-
require_relative '
|
7
|
+
require_relative 'cast'
|
8
8
|
require_relative 'default'
|
9
9
|
require_relative 'enum'
|
10
10
|
require_relative 'hashy'
|
@@ -2,13 +2,6 @@ class Striuct; module InstanceMethods
|
|
2
2
|
|
3
3
|
# @group Behavior under Values
|
4
4
|
|
5
|
-
# @return [Array]
|
6
|
-
def values
|
7
|
-
each_value.to_a
|
8
|
-
end
|
9
|
-
|
10
|
-
alias_method :to_a, :values
|
11
|
-
|
12
5
|
# @param [Fixnum, Range] _keys
|
13
6
|
# @return [Array]
|
14
7
|
def values_at(*_keys)
|
@@ -39,7 +32,7 @@ class Striuct; module InstanceMethods
|
|
39
32
|
self[index] = value
|
40
33
|
end
|
41
34
|
|
42
|
-
excess =
|
35
|
+
excess = _autonyms.last(size - values.size)
|
43
36
|
|
44
37
|
excess.each do |autonym|
|
45
38
|
if has_default? autonym
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require_relative 'instancemethods'
|
2
2
|
|
3
3
|
class Striuct
|
4
|
-
|
4
|
+
|
5
5
|
class << self
|
6
6
|
|
7
7
|
# @group Constructor
|
@@ -45,46 +45,19 @@ class Striuct
|
|
45
45
|
private
|
46
46
|
|
47
47
|
alias_method :original_inherited, :inherited
|
48
|
-
|
49
|
-
def inherited(subclass)
|
50
|
-
attributes = (
|
51
|
-
if equal? ::Striuct
|
52
|
-
[[], {}, {}, {}, {}, {}, {}, {}, :prevent]
|
53
|
-
else
|
54
|
-
[
|
55
|
-
*[
|
56
|
-
@autonyms, @conditions, @adjusters, @defaults,
|
57
|
-
@inferences, @aliases, @setter_validations,
|
58
|
-
@getter_validations
|
59
|
-
].map(&:dup), @protect_level
|
60
|
-
]
|
61
|
-
end
|
62
|
-
)
|
63
|
-
|
64
|
-
eigen = self
|
65
48
|
|
49
|
+
def inherited(subclass)
|
66
50
|
subclass.class_eval do
|
67
51
|
original_inherited subclass
|
68
52
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
include InstanceMethods
|
73
|
-
end
|
53
|
+
extend ClassMethods
|
54
|
+
include Enumerable
|
55
|
+
include InstanceMethods
|
74
56
|
|
75
|
-
@autonyms
|
76
|
-
@inferences, @aliases, @setter_validations,
|
77
|
-
|
78
|
-
|
79
|
-
singleton_class.instance_eval do
|
80
|
-
define_method :initialize_copy do |original|
|
81
|
-
@autonyms, @adjusters, @defaults, @aliases,
|
82
|
-
@setter_validations, @getter_validations =
|
83
|
-
*[@autonyms, @adjusters, @defaults, @aliases,
|
84
|
-
@setter_validations, @getter_validations].map(&:dup)
|
85
|
-
@conditions, @inferences = @conditions.dup, @inferences.dup
|
86
|
-
end
|
87
|
-
end
|
57
|
+
@autonyms = []
|
58
|
+
@conditions, @adjusters, @defaults, @inferences, @aliases, @setter_validations, @getter_validations = \
|
59
|
+
{}, {}, {}, {}, {}, {}, {}
|
60
|
+
@protect_level = :prevent
|
88
61
|
end
|
89
62
|
end
|
90
63
|
|
data/lib/striuct/version.rb
CHANGED
data/striuct.gemspec
CHANGED
@@ -16,9 +16,9 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.require_paths = ['lib']
|
17
17
|
gem.version = Striuct::VERSION.dup # dup for https://github.com/rubygems/rubygems/commit/48f1d869510dcd325d6566df7d0147a086905380#-P0
|
18
18
|
|
19
|
-
gem.required_ruby_version = '>=1.9.2'
|
20
|
-
gem.add_runtime_dependency 'validation', '~>0.0.3
|
21
|
-
gem.add_runtime_dependency 'keyvalidatable', '~>0.0.3'
|
22
|
-
gem.add_development_dependency 'yard', '>=0.8.2.1'
|
19
|
+
gem.required_ruby_version = '>= 1.9.2'
|
20
|
+
gem.add_runtime_dependency 'validation', '~> 0.0.3'
|
21
|
+
gem.add_runtime_dependency 'keyvalidatable', '~> 0.0.3'
|
22
|
+
gem.add_development_dependency 'yard', '>= 0.8.2.1'
|
23
23
|
end
|
24
24
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
class Test_Striuct_Subclass_Class_Cloning < Test::Unit::TestCase
|
4
|
+
|
5
|
+
class Sth < Striuct.new
|
6
|
+
member :sth
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_dup
|
10
|
+
klass = Sth.dup
|
11
|
+
Sth.__send__ :member, :dummy1
|
12
|
+
assert_equal false, klass.member?(:dummy1)
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_clone
|
16
|
+
klass = Sth.clone
|
17
|
+
Sth.__send__ :member, :dummy2
|
18
|
+
assert_equal false, klass.member?(:dummy2)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
require_relative 'helper'
|
2
2
|
|
3
|
-
class
|
3
|
+
class Test_Striuct_Subclass_Class_Close < Test::Unit::TestCase
|
4
4
|
|
5
5
|
Sth = Striuct.new do
|
6
6
|
member :foo
|
7
7
|
end
|
8
8
|
|
9
|
-
def
|
9
|
+
def test_class_close
|
10
10
|
sth = Sth.new
|
11
11
|
|
12
12
|
assert_equal true, sth.member?(:foo)
|
data/test/{test_striuct_subclass_classmethods.rb → test_striuct-subclass-class-constructor.rb}
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
require_relative 'helper'
|
2
2
|
|
3
|
-
class
|
3
|
+
class Test_Striuct_Subclass_Class_Constructor < Test::Unit::TestCase
|
4
4
|
|
5
5
|
class User < Striuct.new
|
6
6
|
member :id, Integer
|
@@ -15,7 +15,7 @@ class TestStriuctSubclassClassMethods < Test::Unit::TestCase
|
|
15
15
|
member :age, Fixnum
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
18
|
+
def test_new
|
19
19
|
klass = Striuct.new
|
20
20
|
assert_kind_of Striuct, klass.new
|
21
21
|
|
@@ -64,24 +64,19 @@ class TestStriuctSubclassClassMethods < Test::Unit::TestCase
|
|
64
64
|
assert_equal false, user.strict?
|
65
65
|
end
|
66
66
|
|
67
|
-
|
68
|
-
|
69
|
-
member :var, //
|
70
|
-
member :hoge
|
71
|
-
member :moge, nil
|
72
|
-
end
|
73
|
-
|
74
|
-
assert_equal false, klass.restrict?(:foo)
|
75
|
-
assert_equal true, klass.restrict?(:var)
|
76
|
-
assert_equal false, klass.restrict?(:hoge)
|
77
|
-
assert_equal true, klass.restrict?(:moge)
|
78
|
-
end
|
67
|
+
Sth = Striuct.new :foo, :bar, :hoge
|
68
|
+
SampleStruct = Struct.new :foo, :bar, :hoge
|
79
69
|
|
80
|
-
def
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
assert_equal [:foo, :aaa, :bbb, :ccc], klass.members
|
70
|
+
def test_for_pairs_from_hash
|
71
|
+
sth = Sth[hoge: 7, foo: 8]
|
72
|
+
|
73
|
+
assert_equal [8, nil, 7], sth.values
|
86
74
|
end
|
75
|
+
|
76
|
+
def test_for_pairs_from_struct
|
77
|
+
sth = Sth[SampleStruct.new 8, nil, 7]
|
78
|
+
|
79
|
+
assert_equal [8, nil, 7], sth.values
|
80
|
+
end
|
81
|
+
|
87
82
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
class Test_Striuct_Subclass_Class_Freeze < Test::Unit::TestCase
|
4
|
+
|
5
|
+
Sth = Striuct.new do
|
6
|
+
member :foo
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_class_freeze
|
10
|
+
sth = Sth.new
|
11
|
+
|
12
|
+
assert_same true, sth.member?(:foo)
|
13
|
+
|
14
|
+
Sth.class_eval do
|
15
|
+
member :bar
|
16
|
+
end
|
17
|
+
|
18
|
+
assert_same true, sth.member?(:bar)
|
19
|
+
assert_equal [:foo, :bar], sth.members
|
20
|
+
|
21
|
+
assert_same false, Sth.frozen?
|
22
|
+
|
23
|
+
Sth.freeze
|
24
|
+
|
25
|
+
assert_same true, Sth.frozen?
|
26
|
+
|
27
|
+
assert_raises RuntimeError do
|
28
|
+
Sth.class_eval do
|
29
|
+
member :var2
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
assert_same false, sth.member?(:var2)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
class Test_Striuct_Subclass_Class_Macro < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_add_members
|
6
|
+
klass = Striuct.new :foo do
|
7
|
+
add_members :aaa, 'bbb', :ccc
|
8
|
+
end
|
9
|
+
|
10
|
+
assert_equal [:foo, :aaa, :bbb, :ccc], klass.members
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
class Test_Striuct_Subclass_Class_Validation < Test::Unit::TestCase
|
4
|
+
|
5
|
+
class User < Striuct.new
|
6
|
+
member :id, Integer
|
7
|
+
member :last_name, /\A\w+\z/
|
8
|
+
member :family_name, /\A\w+\z/
|
9
|
+
member :address, /\A((\w+) ?)+\z/
|
10
|
+
member :age, ->age{(20..140).include? age}
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_restrict?
|
14
|
+
klass = Striuct.new :foo do
|
15
|
+
member :var, //
|
16
|
+
member :hoge
|
17
|
+
member :moge, nil
|
18
|
+
end
|
19
|
+
|
20
|
+
assert_equal false, klass.restrict?(:foo)
|
21
|
+
assert_equal true, klass.restrict?(:var)
|
22
|
+
assert_equal false, klass.restrict?(:hoge)
|
23
|
+
assert_equal true, klass.restrict?(:moge)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
class Test_Striuct_Subclass_Instance_Setter < Test::Unit::TestCase
|
4
|
+
|
5
|
+
class User < Striuct.new
|
6
|
+
member :id, Integer
|
7
|
+
member :last_name, /\A\w+\z/
|
8
|
+
member :family_name, /\A\w+\z/
|
9
|
+
member :address, /\A((\w+) ?)+\z/
|
10
|
+
member :age, ->age{(20..140).include? age}
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_setter
|
14
|
+
user = User.new
|
15
|
+
user[:last_name] = 'foo'
|
16
|
+
assert_equal user.last_name, 'foo'
|
17
|
+
user.last_name = 'bar'
|
18
|
+
assert_equal user[:last_name], 'bar'
|
19
|
+
|
20
|
+
assert_raises Validation::InvalidWritingError do
|
21
|
+
user[:last_name] = 'foo s'
|
22
|
+
end
|
23
|
+
|
24
|
+
assert_raises Validation::InvalidWritingError do
|
25
|
+
User.new 'asda'
|
26
|
+
end
|
27
|
+
|
28
|
+
assert_raises Validation::InvalidWritingError do
|
29
|
+
user.age = 19
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
class Test_Striuct_Subclass_Instance_Accessor_With_Validation < Test::Unit::TestCase
|
36
|
+
|
37
|
+
class User < Striuct.new
|
38
|
+
member :id, Integer
|
39
|
+
member :last_name, /\A\w+\z/
|
40
|
+
member :family_name, /\A\w+\z/
|
41
|
+
member :address, /\A((\w+) ?)+\z/
|
42
|
+
member :age, ->age{(20..140).include? age}
|
43
|
+
end
|
44
|
+
|
45
|
+
def setup
|
46
|
+
@user = User.new 9999, 'taro', 'yamada', 'Tokyo Japan', 30
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_reader
|
50
|
+
assert_equal @user[1], 'taro'
|
51
|
+
assert_equal @user[:last_name], 'taro'
|
52
|
+
assert_equal @user.last_name, 'taro'
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_setter_pass
|
56
|
+
assert_equal((@user.id = 2139203509295), 2139203509295)
|
57
|
+
assert_equal @user.id, 2139203509295
|
58
|
+
assert_equal((@user.last_name = 'jiro'), 'jiro')
|
59
|
+
assert_equal @user.last_name, 'jiro'
|
60
|
+
assert_equal((@user.age = 40), 40)
|
61
|
+
assert_equal @user.age, 40
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_setter_fail
|
65
|
+
assert_raises Validation::InvalidWritingError do
|
66
|
+
@user.id = 2139203509295.0
|
67
|
+
end
|
68
|
+
|
69
|
+
assert_raises Validation::InvalidWritingError do
|
70
|
+
@user.last_name = 'ignore name'
|
71
|
+
end
|
72
|
+
|
73
|
+
assert_raises Validation::InvalidWritingError do
|
74
|
+
@user.age = 19
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_strict?
|
79
|
+
assert_same @user.sufficient?(:last_name), true
|
80
|
+
assert_same @user.strict?, true
|
81
|
+
assert_same @user.sufficient?(:last_name), true
|
82
|
+
@user.last_name.clear
|
83
|
+
assert_same @user.sufficient?(:last_name), false
|
84
|
+
assert_same @user.strict?, false
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
class Test_Striuct_Subclass_Instance_Accsessor < Test::Unit::TestCase
|
91
|
+
|
92
|
+
class Sth < Striuct.new
|
93
|
+
member :bool, OR(true, false)
|
94
|
+
member :sth
|
95
|
+
protect_level :struct
|
96
|
+
member :lambda, OR(->v{v % 3 == 2}, ->v{v.kind_of? Float})
|
97
|
+
end
|
98
|
+
|
99
|
+
def setup
|
100
|
+
@sth = Sth.new
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_accessor
|
104
|
+
@sth.bool = true
|
105
|
+
assert_same true, @sth.bool
|
106
|
+
@sth.bool = false
|
107
|
+
assert_same false, @sth.bool
|
108
|
+
|
109
|
+
assert_raises Validation::InvalidWritingError do
|
110
|
+
@sth.bool = nil
|
111
|
+
end
|
112
|
+
|
113
|
+
@sth.sth = 1
|
114
|
+
assert_same 1, @sth.sth
|
115
|
+
|
116
|
+
@sth.sth = 'String'
|
117
|
+
assert_equal 'String', @sth.sth
|
118
|
+
|
119
|
+
@sth.sth = Class.class
|
120
|
+
assert_same Class.class, @sth.sth
|
121
|
+
|
122
|
+
assert_raises Validation::InvalidWritingError do
|
123
|
+
@sth.lambda = 9
|
124
|
+
end
|
125
|
+
|
126
|
+
assert_raises Validation::InvalidWritingError do
|
127
|
+
@sth.lambda = 7
|
128
|
+
end
|
129
|
+
|
130
|
+
@sth.lambda = 8
|
131
|
+
assert_same 8, @sth.lambda
|
132
|
+
|
133
|
+
@sth.lambda = 9.0
|
134
|
+
assert_equal 9.0, @sth.lambda
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
@@ -1,34 +1,7 @@
|
|
1
1
|
require_relative 'helper'
|
2
2
|
|
3
|
-
class TestStriuctAdjusterOld < Test::Unit::TestCase
|
4
3
|
|
5
|
-
|
6
|
-
member :age, Numeric, &->arg{Integer arg}
|
7
|
-
end
|
8
|
-
|
9
|
-
def setup
|
10
|
-
@sth = Sth.new
|
11
|
-
assert_same nil, @sth.age
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_procedure
|
15
|
-
@sth.age = 10
|
16
|
-
assert_same 10, @sth.age
|
17
|
-
@sth.age = 10.0
|
18
|
-
assert_same 10, @sth.age
|
19
|
-
|
20
|
-
assert_raises Validation::UnmanagebleError do
|
21
|
-
@sth.age = '10.0'
|
22
|
-
end
|
23
|
-
|
24
|
-
@sth.age = '10'
|
25
|
-
assert_same 10, @sth.age
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
|
31
|
-
class TestStriuctAdjuster < Test::Unit::TestCase
|
4
|
+
class Test_Striuct_Subclass_Instance_Adjuster < Test::Unit::TestCase
|
32
5
|
|
33
6
|
class MyClass
|
34
7
|
def self.parse(v)
|
@@ -92,4 +65,31 @@ class TestStriuctAdjuster < Test::Unit::TestCase
|
|
92
65
|
assert_kind_of MyClass, sth.myobj
|
93
66
|
end
|
94
67
|
|
68
|
+
end
|
69
|
+
|
70
|
+
class Test_Striuct_Subclass_Instance_AdjusterOld < Test::Unit::TestCase
|
71
|
+
|
72
|
+
Sth = Striuct.new do
|
73
|
+
member :age, Numeric, &->arg{Integer arg}
|
74
|
+
end
|
75
|
+
|
76
|
+
def setup
|
77
|
+
@sth = Sth.new
|
78
|
+
assert_same nil, @sth.age
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_procedure
|
82
|
+
@sth.age = 10
|
83
|
+
assert_same 10, @sth.age
|
84
|
+
@sth.age = 10.0
|
85
|
+
assert_same 10, @sth.age
|
86
|
+
|
87
|
+
assert_raises Validation::UnmanagebleError do
|
88
|
+
@sth.age = '10.0'
|
89
|
+
end
|
90
|
+
|
91
|
+
@sth.age = '10'
|
92
|
+
assert_same 10, @sth.age
|
93
|
+
end
|
94
|
+
|
95
95
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
class Test_Striuct_Subclass_Instance_Basic < Test::Unit::TestCase
|
4
|
+
|
5
|
+
class User < Striuct.new
|
6
|
+
member :id, Integer
|
7
|
+
member :last_name, /\A\w+\z/
|
8
|
+
member :family_name, /\A\w+\z/
|
9
|
+
member :address, /\A((\w+) ?)+\z/
|
10
|
+
member :age, ->age{(20..140).include? age}
|
11
|
+
end
|
12
|
+
|
13
|
+
def setup
|
14
|
+
@user = User.new 9999, 'taro', 'yamada', 'Tokyo Japan', 30
|
15
|
+
@user2 = User.new 9999, 'taro', 'yamada', 'Tokyo Japan', 30
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_delegate_class_method
|
19
|
+
assert_equal @user.members, User.members
|
20
|
+
assert_equal @user.size, User.size
|
21
|
+
assert_equal @user.member?(:age), User.member?(:age)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_values
|
25
|
+
assert_equal @user.values, [9999, 'taro', 'yamada', 'Tokyo Japan', 30]
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_values_at
|
29
|
+
assert_equal(@user.values_at(4, 0, (2..4)), [30, 9999, 'yamada', 'Tokyo Japan', 30])
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|