striuct 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +32 -0
- data/.travis.yml +6 -0
- data/Gemfile +12 -0
- data/History.rdoc +5 -0
- data/Manifest.txt +53 -25
- data/README.md +97 -0
- data/Rakefile +7 -21
- data/examples/README.rb +25 -0
- data/{example → examples}/example1.rb +1 -1
- data/{example → examples}/example2.rb +1 -1
- data/{example → examples}/see_trace.rb +4 -0
- data/lib/striuct/{containable/eigen → classmethods}/basic.rb +13 -5
- data/lib/striuct/classmethods/constants.rb +23 -0
- data/lib/striuct/{containable/eigen → classmethods}/constructor.rb +20 -14
- data/lib/striuct/{containable/eigen → classmethods}/handy.rb +19 -20
- data/lib/striuct/{containable/eigen → classmethods}/inner.rb +10 -32
- data/lib/striuct/{containable/eigen → classmethods}/macro.rb +37 -7
- data/lib/striuct/classmethods/requiremnets.rb +7 -0
- data/lib/striuct/{containable/eigen → classmethods}/safety.rb +6 -6
- data/lib/striuct/classmethods.rb +1 -0
- data/lib/striuct/{containable → instancemethods}/basic.rb +6 -6
- data/lib/striuct/{containable → instancemethods}/handy.rb +3 -3
- data/lib/striuct/{containable → instancemethods}/hashlike.rb +12 -6
- data/lib/striuct/{containable → instancemethods}/inner.rb +9 -8
- data/lib/striuct/instancemethods/requirements.rb +6 -0
- data/lib/striuct/{containable → instancemethods}/safety.rb +2 -2
- data/lib/striuct/instancemethods/singleton_class.rb +19 -0
- data/lib/striuct/instancemethods.rb +1 -0
- data/lib/striuct/requirements.rb +6 -0
- data/lib/striuct/singleton_class.rb +93 -0
- data/lib/striuct/specificcontainer.rb +17 -0
- data/lib/striuct/structs.rb +7 -0
- data/lib/striuct/version.rb +3 -2
- data/lib/striuct.rb +4 -9
- data/striuct.gemspec +24 -0
- data/test/{test_helper.rb → helper.rb} +3 -0
- data/test/test_striuct.rb +23 -1409
- data/test/test_striuct_define.rb +19 -0
- data/test/test_striuct_subclass_adjuster.rb +95 -0
- data/test/test_striuct_subclass_alias_member.rb +54 -0
- data/test/test_striuct_subclass_assign.rb +30 -0
- data/test/test_striuct_subclass_classlock.rb +36 -0
- data/test/test_striuct_subclass_classmethods.rb +87 -0
- data/test/test_striuct_subclass_cloning.rb +36 -0
- data/test/test_striuct_subclass_default_value.rb +129 -0
- data/test/test_striuct_subclass_for_pairs.rb +13 -0
- data/test/test_striuct_subclass_freeze.rb +19 -0
- data/test/test_striuct_subclass_functional_condition.rb +51 -0
- data/test/test_striuct_subclass_getter_validation.rb +33 -0
- data/test/test_striuct_subclass_hashlike.rb +153 -0
- data/test/test_striuct_subclass_inference.rb +51 -0
- data/test/test_striuct_subclass_inheritable.rb +58 -0
- data/test/test_striuct_subclass_instance.rb +289 -0
- data/test/test_striuct_subclass_lock.rb +40 -0
- data/test/test_striuct_subclass_safetynaming.rb +72 -0
- data/test/test_striuct_subclass_specific_conditions.rb +247 -0
- data/test/test_striuct_subclass_to_struct.rb +25 -0
- data/test/test_striuct_version.rb +9 -0
- metadata +106 -68
- data/.gemtest +0 -0
- data/README.rdoc +0 -63
- data/example/example.rb +0 -17
- data/lib/striuct/abstract.rb +0 -74
- data/lib/striuct/containable/classutil.rb +0 -22
- data/lib/striuct/containable/eigen.rb +0 -29
- data/lib/striuct/containable.rb +0 -38
- /data/{example/benchmarks.rb → benchmarks/basics.rb} +0 -0
- /data/{example → examples}/example.old.rdoc +0 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
class TestStriuctDefine < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_define
|
6
|
+
assert_raises RuntimeError do
|
7
|
+
Striuct.define do
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
klass = Striuct.define do
|
12
|
+
member :foo
|
13
|
+
end
|
14
|
+
|
15
|
+
assert_equal true, klass.closed?
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
class TestStriuctAdjusterOld < Test::Unit::TestCase
|
4
|
+
|
5
|
+
Sth = Striuct.new do
|
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
|
32
|
+
|
33
|
+
class MyClass
|
34
|
+
def self.parse(v)
|
35
|
+
raise unless /\A[a-z]+\z/ =~ v
|
36
|
+
new
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
Sth = Striuct.define do
|
41
|
+
member :chomped, AND(Symbol, /[^\n]\z/), &WHEN(String, ->v{v.chomp.to_sym})
|
42
|
+
member :no_reduced, Symbol, &->v{v.to_sym}
|
43
|
+
member :reduced, Symbol, &INJECT(->v{v.to_s}, ->v{v.to_sym})
|
44
|
+
member :integer, Integer, &PARSE(Integer)
|
45
|
+
member :myobj, ->v{v.instance_of? MyClass}, &PARSE(MyClass)
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_WHEN
|
49
|
+
sth = Sth.new
|
50
|
+
|
51
|
+
assert_raises Validation::InvalidWritingError do
|
52
|
+
sth.chomped = :"a\n"
|
53
|
+
end
|
54
|
+
|
55
|
+
sth.chomped = "a\n"
|
56
|
+
|
57
|
+
assert_equal :a, sth.chomped
|
58
|
+
|
59
|
+
sth.chomped = :b
|
60
|
+
assert_equal :b, sth.chomped
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_INJECT
|
64
|
+
sth = Sth.new
|
65
|
+
|
66
|
+
assert_raises Validation::UnmanagebleError do
|
67
|
+
sth.no_reduced = 1
|
68
|
+
end
|
69
|
+
|
70
|
+
sth.reduced = 1
|
71
|
+
|
72
|
+
assert_equal :'1', sth.reduced
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_PARSE
|
76
|
+
sth = Sth.new
|
77
|
+
|
78
|
+
assert_raises Validation::UnmanagebleError do
|
79
|
+
sth.integer = '1.0'
|
80
|
+
end
|
81
|
+
|
82
|
+
sth.integer = '1'
|
83
|
+
|
84
|
+
assert_equal 1, sth.integer
|
85
|
+
|
86
|
+
assert_raises Validation::UnmanagebleError do
|
87
|
+
sth.myobj = '1'
|
88
|
+
end
|
89
|
+
|
90
|
+
sth.myobj = 'a'
|
91
|
+
|
92
|
+
assert_kind_of MyClass, sth.myobj
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
class TestStriuctAliasMember < Test::Unit::TestCase
|
4
|
+
|
5
|
+
class Sth < Striuct.new
|
6
|
+
member :foo, String
|
7
|
+
|
8
|
+
member :bar, Integer do |v|
|
9
|
+
v
|
10
|
+
end
|
11
|
+
|
12
|
+
member :hoge, Symbol
|
13
|
+
default :hoge, :'Z'
|
14
|
+
alias_member :abc, :bar
|
15
|
+
default :abc, 8
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_alias_member
|
19
|
+
sth = Sth.new 'A'
|
20
|
+
assert_equal [:foo, :bar, :hoge], sth.members
|
21
|
+
assert_equal [:foo, :bar, :hoge], sth.autonyms
|
22
|
+
assert_equal({abc: :bar}, sth.aliases)
|
23
|
+
assert_equal [:foo, :bar, :hoge, :abc], sth.all_members
|
24
|
+
|
25
|
+
assert_equal 8, sth[:abc]
|
26
|
+
flavor = Sth.__send__(:flavor_for, :abc)
|
27
|
+
assert_kind_of Proc, flavor
|
28
|
+
assert_same flavor, Sth.__send__(:flavor_for, :bar)
|
29
|
+
assert_equal 8, sth.abc
|
30
|
+
sth.abc = 5
|
31
|
+
assert_equal 5, sth.bar
|
32
|
+
sth[:abc] = 6
|
33
|
+
assert_equal 6, sth.bar
|
34
|
+
|
35
|
+
assert_raises Validation::InvalidWritingError do
|
36
|
+
sth[:abc] = 'a'
|
37
|
+
end
|
38
|
+
|
39
|
+
assert_raises Validation::InvalidWritingError do
|
40
|
+
sth.abc = 'a'
|
41
|
+
end
|
42
|
+
|
43
|
+
assert_raises Validation::InvalidWritingError do
|
44
|
+
sth.bar = 'a'
|
45
|
+
end
|
46
|
+
|
47
|
+
assert_raises ArgumentError do
|
48
|
+
Sth.class_eval do
|
49
|
+
member :abc
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
class TestStriuctAssign < Test::Unit::TestCase
|
4
|
+
|
5
|
+
Sth = Striuct.new do
|
6
|
+
member :foo
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_unassign
|
10
|
+
sth = Sth.new
|
11
|
+
assert_equal false, sth.assign?(:foo)
|
12
|
+
sth.foo = nil
|
13
|
+
assert_equal true, sth.assign?(:foo)
|
14
|
+
sth.unassign :foo
|
15
|
+
assert_equal false, sth.assign?(:foo)
|
16
|
+
sth.foo = nil
|
17
|
+
assert_equal true, sth.assign?(:foo)
|
18
|
+
sth.clear_at 0
|
19
|
+
assert_equal false, sth.assign?(:foo)
|
20
|
+
|
21
|
+
assert_raises NameError do
|
22
|
+
sth.unassign :var
|
23
|
+
end
|
24
|
+
|
25
|
+
assert_raises IndexError do
|
26
|
+
sth.unassign 1
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
class TestStriuctClassLock < Test::Unit::TestCase
|
4
|
+
|
5
|
+
Sth = Striuct.new do
|
6
|
+
member :foo
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_class_lock
|
10
|
+
sth = Sth.new
|
11
|
+
|
12
|
+
assert_equal true, sth.member?(:foo)
|
13
|
+
|
14
|
+
Sth.class_eval do
|
15
|
+
member :bar
|
16
|
+
end
|
17
|
+
|
18
|
+
assert_equal true, sth.member?(:bar)
|
19
|
+
assert_equal [:foo, :bar], sth.members
|
20
|
+
|
21
|
+
assert_equal false, Sth.closed?
|
22
|
+
|
23
|
+
Sth.__send__ :close
|
24
|
+
|
25
|
+
assert_equal true, Sth.closed?
|
26
|
+
|
27
|
+
assert_raises RuntimeError do
|
28
|
+
Sth.class_eval do
|
29
|
+
member :var2
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
assert_equal false, sth.member?(:var2)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
class TestStriuctSubclassClassMethods < 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
|
+
User2 = Striuct.define do
|
14
|
+
member :name, AND(String, NOT(''))
|
15
|
+
member :age, Fixnum
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_builder
|
19
|
+
klass = Striuct.new
|
20
|
+
assert_kind_of Striuct, klass.new
|
21
|
+
|
22
|
+
klass = Striuct.new :name, :age
|
23
|
+
|
24
|
+
assert_equal klass.members, [:name, :age]
|
25
|
+
|
26
|
+
klass = Striuct.new :foo do
|
27
|
+
member :var
|
28
|
+
end
|
29
|
+
|
30
|
+
assert_equal klass.members, [:foo, :var]
|
31
|
+
assert_equal User.members, [:id, :last_name, :family_name, :address, :age]
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_define
|
35
|
+
user = User2.define{|r|r.age = 1; r.name = 'a'}
|
36
|
+
assert_same 1, user.age
|
37
|
+
|
38
|
+
assert_raises RuntimeError do
|
39
|
+
user.age = 1
|
40
|
+
end
|
41
|
+
|
42
|
+
user = User2.define{|r|r.age = 1; r.name = 'a'}
|
43
|
+
assert_same 1, user.age
|
44
|
+
assert_same true, user.lock?
|
45
|
+
assert_same false, user.frozen?
|
46
|
+
|
47
|
+
assert_raises RuntimeError do
|
48
|
+
User2.define{|r|r.age = 1}
|
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 Validation::InvalidWritingError 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?
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_restrict?
|
68
|
+
klass = Striuct.new :foo do
|
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
|
79
|
+
|
80
|
+
def test_add_members
|
81
|
+
klass = Striuct.new :foo do
|
82
|
+
add_members :aaa, 'bbb', :ccc
|
83
|
+
end
|
84
|
+
|
85
|
+
assert_equal [:foo, :aaa, :bbb, :ccc], klass.members
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
$VERBOSE = true
|
2
|
+
require_relative 'helper'
|
3
|
+
|
4
|
+
class TestStriuctCloning < Test::Unit::TestCase
|
5
|
+
|
6
|
+
class Sth < Striuct.new
|
7
|
+
member :sth
|
8
|
+
end
|
9
|
+
|
10
|
+
def setup
|
11
|
+
@sth = Sth.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_clone
|
15
|
+
sth2 = @sth.dup
|
16
|
+
@sth.sth = 1
|
17
|
+
assert_equal false, (@sth.sth == sth2.sth)
|
18
|
+
|
19
|
+
sth2 = @sth.clone
|
20
|
+
@sth.sth = 2
|
21
|
+
assert_equal false, (@sth.sth == sth2.sth)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_class_dup
|
25
|
+
klass = Sth.dup
|
26
|
+
Sth.__send__ :member, :dummy1
|
27
|
+
assert_equal false, klass.member?(:dummy1)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_class_clone
|
31
|
+
klass = Sth.clone
|
32
|
+
Sth.__send__ :member, :dummy2
|
33
|
+
assert_equal false, klass.member?(:dummy2)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
class TestStriuctDefaultValue < Test::Unit::TestCase
|
4
|
+
|
5
|
+
Sth = Striuct.new do
|
6
|
+
member :lank, OR(Bignum, Fixnum)
|
7
|
+
default :lank, 1
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_default
|
11
|
+
sth = Sth.new 2
|
12
|
+
assert_equal 2, sth.lank
|
13
|
+
sth = Sth.new
|
14
|
+
assert_equal 1, sth.lank
|
15
|
+
assert_equal true, sth.default?(:lank)
|
16
|
+
sth.lank = 2
|
17
|
+
assert_equal false, sth.default?(:lank)
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_define_default
|
21
|
+
assert_raises NameError do
|
22
|
+
Sth.class_eval do
|
23
|
+
default :anything, 10
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
klass = Striuct.define do
|
28
|
+
member :lank2, Integer
|
29
|
+
default :lank2, '10'
|
30
|
+
end
|
31
|
+
|
32
|
+
assert_raises Validation::InvalidWritingError do
|
33
|
+
klass.new
|
34
|
+
end
|
35
|
+
|
36
|
+
scope = self
|
37
|
+
seef = nil
|
38
|
+
klass = Striuct.define do
|
39
|
+
member :lank, Integer
|
40
|
+
|
41
|
+
scope.assert_raises ArgumentError do
|
42
|
+
default :lank, &->own, name, exess{rand}
|
43
|
+
end
|
44
|
+
|
45
|
+
scope.assert_raises ArgumentError do
|
46
|
+
default :lank, '10', &->own, name{rand}
|
47
|
+
end
|
48
|
+
|
49
|
+
scope.assert_raises ArgumentError do
|
50
|
+
default :lank, '10', &->own{rand}
|
51
|
+
end
|
52
|
+
|
53
|
+
scope.assert_raises ArgumentError do
|
54
|
+
default :lank, '10', &->{rand}
|
55
|
+
end
|
56
|
+
|
57
|
+
default :lank, &->own, name{(seef = own); rand}
|
58
|
+
end
|
59
|
+
|
60
|
+
assert_raises Validation::InvalidWritingError do
|
61
|
+
klass.new
|
62
|
+
end
|
63
|
+
|
64
|
+
klass = Striuct.define do
|
65
|
+
member :lank, Integer
|
66
|
+
default :lank, &->own, name{(seef = own); 10 - name.length}
|
67
|
+
end
|
68
|
+
|
69
|
+
assert_equal 6, klass.new.lank
|
70
|
+
assert_equal seef, klass.new
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
class TestStriuctDefaultValueinMemberMacro < Test::Unit::TestCase
|
76
|
+
|
77
|
+
Sth = Striuct.new do
|
78
|
+
member :lank, OR(Bignum, Fixnum), default: 1
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_default
|
82
|
+
sth = Sth.new 2
|
83
|
+
assert_equal 2, sth.lank
|
84
|
+
sth = Sth.new
|
85
|
+
assert_equal 1, sth.lank
|
86
|
+
assert_equal true, sth.default?(:lank)
|
87
|
+
sth.lank = 2
|
88
|
+
assert_equal false, sth.default?(:lank)
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_define_default
|
92
|
+
assert_raises NameError do
|
93
|
+
Sth.class_eval do
|
94
|
+
default :anything, 10
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
klass = Striuct.define do
|
99
|
+
member :lank2, Integer, default: '10'
|
100
|
+
end
|
101
|
+
|
102
|
+
assert_raises Validation::InvalidWritingError do
|
103
|
+
klass.new
|
104
|
+
end
|
105
|
+
|
106
|
+
scope = self
|
107
|
+
seef = nil
|
108
|
+
klass = Striuct.define do
|
109
|
+
|
110
|
+
scope.assert_raises ArgumentError do
|
111
|
+
member :lank, Integer, default: '10', default_proc: ->own,name{rand}
|
112
|
+
end
|
113
|
+
|
114
|
+
member :lank, Integer, default_proc: ->own,name{(seef = own); rand}
|
115
|
+
end
|
116
|
+
|
117
|
+
assert_raises Validation::InvalidWritingError do
|
118
|
+
klass.new
|
119
|
+
end
|
120
|
+
|
121
|
+
klass = Striuct.define do
|
122
|
+
member :lank, Integer, default_proc: ->own,name{(seef = own); 10 - name.length}
|
123
|
+
end
|
124
|
+
|
125
|
+
assert_equal 6, klass.new.lank
|
126
|
+
assert_equal seef, klass.new
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
class TestStriuctFreeze < Test::Unit::TestCase
|
4
|
+
|
5
|
+
Sth = Striuct.new :foo
|
6
|
+
|
7
|
+
def test_freeze
|
8
|
+
sth = Sth.new
|
9
|
+
sth.freeze
|
10
|
+
|
11
|
+
assert_raises RuntimeError do
|
12
|
+
sth.foo = 8
|
13
|
+
end
|
14
|
+
|
15
|
+
assert_equal true, sth.frozen?
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
class TestStriuctFunctionalCondition < Test::Unit::TestCase
|
4
|
+
|
5
|
+
Sthlambda = Striuct.new do
|
6
|
+
member :lank, ->lank{lanks.include? lank}
|
7
|
+
member :lanks
|
8
|
+
default :lanks, 1..30
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_lambda
|
12
|
+
sth = Sthlambda.new
|
13
|
+
sth.lank = 2
|
14
|
+
assert_equal 2, sth.lank
|
15
|
+
|
16
|
+
assert_raises Validation::InvalidWritingError do
|
17
|
+
sth.lank = 31
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
max = 9
|
22
|
+
|
23
|
+
SthProc = Striuct.new do
|
24
|
+
member :lank, Proc.new{|n|(3..max) === n}
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_Proc
|
28
|
+
sth = SthProc.new
|
29
|
+
sth.lank = 8
|
30
|
+
assert_equal 8, sth.lank
|
31
|
+
|
32
|
+
assert_raises Validation::InvalidWritingError do
|
33
|
+
sth.lank = 2
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
SthMethod = Striuct.new do
|
38
|
+
member :lank, 7.method(:<)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_Method
|
42
|
+
sth = SthMethod.new
|
43
|
+
sth.lank = 8
|
44
|
+
assert_equal 8, sth.lank
|
45
|
+
|
46
|
+
assert_raises Validation::InvalidWritingError do
|
47
|
+
sth.lank = 6
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
class TestGetterValidation < Test::Unit::TestCase
|
4
|
+
|
5
|
+
Sth = Striuct.define do
|
6
|
+
member :plus_getter, /./, getter_validation: true
|
7
|
+
member :only_getter, /./, getter_validation: true,
|
8
|
+
setter_validation: false
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_getter_validation
|
12
|
+
sth = Sth.new
|
13
|
+
|
14
|
+
assert_raises Validation::InvalidWritingError do
|
15
|
+
sth.plus_getter = ''
|
16
|
+
end
|
17
|
+
|
18
|
+
sth.plus_getter = 'abc'
|
19
|
+
assert_equal 'abc', sth.plus_getter
|
20
|
+
sth.plus_getter.clear
|
21
|
+
|
22
|
+
assert_raises Validation::InvalidReadingError do
|
23
|
+
sth.plus_getter
|
24
|
+
end
|
25
|
+
|
26
|
+
sth.only_getter = ''
|
27
|
+
|
28
|
+
assert_raises Validation::InvalidReadingError do
|
29
|
+
sth.only_getter
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|