moosex 0.0.18 → 0.0.19
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changelog +13 -8
- data/Gemfile.lock +1 -1
- data/README.md +180 -17
- data/lib/moosex.rb +4 -1
- data/lib/moosex/attribute.rb +94 -72
- data/lib/moosex/attribute/modifiers.rb +31 -32
- data/lib/moosex/event.rb +1 -1
- data/lib/moosex/meta.rb +12 -3
- data/lib/moosex/traits.rb +115 -0
- data/lib/moosex/types.rb +3 -3
- data/lib/moosex/version.rb +1 -1
- data/samples/events.rb +1 -1
- data/samples/point.rb +1 -1
- data/spec/baz_spec.rb +1 -1
- data/spec/coerce_spec.rb +3 -36
- data/spec/lazy_spec.rb +2 -2
- data/spec/meta_spec.rb +14 -0
- data/spec/modifiers_spec.rb +6 -6
- data/spec/parametric_role_spec.rb +2 -2
- data/spec/plugin_spec.rb +74 -0
- data/spec/point_spec.rb +1 -1
- data/spec/proxy_spec.rb +9 -9
- data/spec/traits_spec.rb +324 -0
- data/spec/trigger_spec.rb +3 -3
- data/spec/types_spec.rb +1 -1
- data/spec/weak_spec.rb +1 -1
- metadata +7 -2
data/spec/coerce_spec.rb
CHANGED
@@ -6,7 +6,7 @@ class CoerceTest
|
|
6
6
|
has attribute_ro: {
|
7
7
|
is: :ro,
|
8
8
|
isa: Integer,
|
9
|
-
coerce:
|
9
|
+
coerce: ->(value) { value.to_i },
|
10
10
|
}
|
11
11
|
|
12
12
|
has attribute_rw: {
|
@@ -18,8 +18,8 @@ class CoerceTest
|
|
18
18
|
has attribute_lazy: {
|
19
19
|
is: :lazy,
|
20
20
|
isa: Integer,
|
21
|
-
coerce:
|
22
|
-
builder:
|
21
|
+
coerce: ->(value) { value.to_i },
|
22
|
+
builder: ->(object) { "2048" },
|
23
23
|
}
|
24
24
|
end
|
25
25
|
|
@@ -45,37 +45,4 @@ describe "CoerceTest" do
|
|
45
45
|
ct.attribute_lazy.should == 2048
|
46
46
|
end
|
47
47
|
end
|
48
|
-
=begin
|
49
|
-
require 'moosex/types'
|
50
48
|
|
51
|
-
class CoerceTest2
|
52
|
-
include MooseX
|
53
|
-
include MooseX::Types
|
54
|
-
|
55
|
-
has a: { is: :rw, coerce: :to_i } # if respond_to? then coerce
|
56
|
-
has b: { is: :rw, coerce: { to_i: true } } # always coerce
|
57
|
-
has c: { is: :rw, coerce: { to_i: false} } # if respond_to? then coerce
|
58
|
-
has d: { is: :rw, coerce: [ :to_s, :to_string ] } # try to apply one of
|
59
|
-
has e: { is: :rw, coerce: [ # if respond_to? then coerce via method/lambda
|
60
|
-
{ to_s: lambda{|x| x.to_s.to_sym } }, # can add more, will be evaluated in order
|
61
|
-
{ to_sym: :to_sym },
|
62
|
-
]
|
63
|
-
}
|
64
|
-
has f: { is: :rw, coerce: [ # should accept one array of
|
65
|
-
{ String => lambda{|x| x.to_sym } }, # type => coerce
|
66
|
-
{ Object => lambda{|x| x.to_s } },
|
67
|
-
]
|
68
|
-
}
|
69
|
-
has g: { is: :rw, coerce: { String => :to_sym } } # should accept one pair
|
70
|
-
has h: { is: :rw, coerce: { # should accept one type validator
|
71
|
-
isArray(String) => lambda{|obj| obj.join(",") }
|
72
|
-
}
|
73
|
-
}
|
74
|
-
has i: {is: :rw, isa: isString(format: /\w+:\w+/) } # validator with autocoerce!
|
75
|
-
|
76
|
-
end
|
77
|
-
|
78
|
-
describe CoerceTest2 do
|
79
|
-
|
80
|
-
end
|
81
|
-
=end
|
data/spec/lazy_spec.rb
CHANGED
@@ -17,14 +17,14 @@ class LazyFox
|
|
17
17
|
|
18
18
|
has lazy_attr_who_accepts_lambda: {
|
19
19
|
is: :lazy,
|
20
|
-
builder:
|
20
|
+
builder: ->(this){ this.something }
|
21
21
|
}
|
22
22
|
|
23
23
|
has lazy_with_default: {
|
24
24
|
is: :lazy,
|
25
25
|
default: 10,
|
26
26
|
clearer: true,
|
27
|
-
builder:
|
27
|
+
builder: ->(this) { 1 },
|
28
28
|
}
|
29
29
|
|
30
30
|
has last_lazy_attr: {
|
data/spec/meta_spec.rb
CHANGED
@@ -22,6 +22,12 @@ class TestMeta2
|
|
22
22
|
}
|
23
23
|
end
|
24
24
|
|
25
|
+
class TestMeta3 < TestMeta
|
26
|
+
|
27
|
+
has :lol, { doc: "lol"}
|
28
|
+
end
|
29
|
+
|
30
|
+
|
25
31
|
describe TestMeta do
|
26
32
|
it "should has 'meta'" do
|
27
33
|
TestMeta.respond_to?(:meta).should be_true
|
@@ -87,4 +93,12 @@ describe TestMeta2 do
|
|
87
93
|
docs[:bar].should == "etc"
|
88
94
|
end
|
89
95
|
|
96
|
+
end
|
97
|
+
|
98
|
+
describe TestMeta3 do
|
99
|
+
it "should inherit meta" do
|
100
|
+
TestMeta3.meta.info[:foo].should == ""
|
101
|
+
TestMeta3.meta.info[:bar].should == "etc"
|
102
|
+
TestMeta3.meta.info[:lol].should == "lol"
|
103
|
+
end
|
90
104
|
end
|
data/spec/modifiers_spec.rb
CHANGED
@@ -1,27 +1,27 @@
|
|
1
1
|
require 'moosex/attribute/modifiers'
|
2
2
|
|
3
|
-
describe MooseX::
|
3
|
+
describe MooseX::AttributeModifiers::Is do
|
4
4
|
it "should accept only valid parameters" do
|
5
5
|
expect {
|
6
|
-
MooseX::
|
6
|
+
MooseX::AttributeModifiers::Is.new.process({is: :forbidden}, :foo)
|
7
7
|
}.to raise_error(MooseX::InvalidAttributeError,
|
8
8
|
"invalid value for field 'foo' is 'forbidden', must be one of :private, :rw, :rwp, :ro or :lazy")
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
-
describe MooseX::
|
12
|
+
describe MooseX::AttributeModifiers::Predicate do
|
13
13
|
it "should accept only valid parameters" do
|
14
14
|
expect {
|
15
|
-
MooseX::
|
15
|
+
MooseX::AttributeModifiers::Predicate.new.process({predicate: 0}, :foo)
|
16
16
|
}.to raise_error(MooseX::InvalidAttributeError,
|
17
17
|
"cannot coerce field predicate to a symbol for foo: undefined method `to_sym' for 0:Fixnum")
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
describe MooseX::
|
21
|
+
describe MooseX::AttributeModifiers::Handles do
|
22
22
|
it "should accept only valid parameters" do
|
23
23
|
expect {
|
24
|
-
MooseX::
|
24
|
+
MooseX::AttributeModifiers::Handles.new.process({handles: BasicObject}, :foo)
|
25
25
|
}.to raise_error(MooseX::InvalidAttributeError,
|
26
26
|
"ops, should not use BasicObject for handles in foo")
|
27
27
|
end
|
data/spec/plugin_spec.rb
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'moosex'
|
2
|
+
require 'moosex/attribute'
|
3
|
+
require 'moosex/attribute/modifiers'
|
4
|
+
|
5
|
+
module MooseX
|
6
|
+
module AttributeModifiers
|
7
|
+
module ThirdParty
|
8
|
+
class Bar
|
9
|
+
def process(options, attr_symbol)
|
10
|
+
!! options.delete(:bar)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module MyPlugin
|
18
|
+
def self.included(x)
|
19
|
+
x.meta.add_plugin(:bar)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module TestAddAttribute
|
24
|
+
class A
|
25
|
+
include MooseX.init(meta: true)
|
26
|
+
include MyPlugin
|
27
|
+
|
28
|
+
has :foo, {
|
29
|
+
bar: true
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
class B < A
|
34
|
+
|
35
|
+
has :foo2, {
|
36
|
+
bar: true
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
class C
|
41
|
+
include MooseX.init(meta: true)
|
42
|
+
|
43
|
+
has :foo, {
|
44
|
+
bar: true
|
45
|
+
}
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe TestAddAttribute do
|
50
|
+
it "A should support the new attribute" do
|
51
|
+
TestAddAttribute::A.new(foo: 1)
|
52
|
+
end
|
53
|
+
|
54
|
+
it "A should support the new attribute in meta" do
|
55
|
+
TestAddAttribute::A.meta.attrs[:foo].attribute_map[:bar].should be_true
|
56
|
+
end
|
57
|
+
|
58
|
+
it "B should support the new attribute" do
|
59
|
+
TestAddAttribute::B.new(foo: 1, foo2: 2)
|
60
|
+
end
|
61
|
+
|
62
|
+
it "B should support the new attribute in meta" do
|
63
|
+
TestAddAttribute::B.meta.attrs[:foo].attribute_map[:bar].should be_true
|
64
|
+
TestAddAttribute::B.meta.attrs[:foo2].attribute_map[:bar].should be_true
|
65
|
+
end
|
66
|
+
|
67
|
+
it "C should support the new attribute" do
|
68
|
+
TestAddAttribute::C.new(foo: 1)
|
69
|
+
end
|
70
|
+
|
71
|
+
it "C should support the new attribute in meta" do
|
72
|
+
TestAddAttribute::C.meta.attrs[:foo].attribute_map[:bar].should be_nil
|
73
|
+
end
|
74
|
+
end
|
data/spec/point_spec.rb
CHANGED
data/spec/proxy_spec.rb
CHANGED
@@ -5,7 +5,7 @@ class ProxyToTarget
|
|
5
5
|
|
6
6
|
has target: {
|
7
7
|
is: :ro,
|
8
|
-
default:
|
8
|
+
default: -> { Target.new }, # default, new instace of Target
|
9
9
|
handles: { # handles is for delegation,
|
10
10
|
my_method_x: :method_x, # inject methods with new names
|
11
11
|
my_method_y: :method_y, # old => obj.target.method_x , now => obj.my_method_x
|
@@ -13,19 +13,19 @@ class ProxyToTarget
|
|
13
13
|
method_y: 1, # call obj.mymethod_z(2,3) is the equivalent to
|
14
14
|
}, # call obj.target.method_z(1,2,3)
|
15
15
|
my_method_y_with_lambda: { # currying!!!
|
16
|
-
method_y:
|
16
|
+
method_y: ->{ 1 }, # call obj.mymethod_z(2,3) is the equivalent to
|
17
17
|
}, # call obj.target.method_z(1,2,3)
|
18
18
|
my_method_z_with_array: {
|
19
|
-
method_z: [1
|
19
|
+
method_z: [1,->{ 2 } ,3]
|
20
20
|
},
|
21
21
|
my_method_k_with_literal_array: {
|
22
22
|
method_k: [[1,2,3]]
|
23
23
|
},
|
24
24
|
my_method_k_with_literal_array2: {
|
25
|
-
method_k: [
|
25
|
+
method_k: [ ->{ [1,2,3] } ]
|
26
26
|
},
|
27
27
|
my_method_k_with_literal_array3: {
|
28
|
-
method_k:
|
28
|
+
method_k: ->{ [[1,2,3]] }
|
29
29
|
}
|
30
30
|
}
|
31
31
|
}
|
@@ -111,7 +111,7 @@ class ProxyToTargetUsingArrayOfMethods
|
|
111
111
|
|
112
112
|
has targetz: {
|
113
113
|
is: :ro,
|
114
|
-
default:
|
114
|
+
default: -> { Target.new },
|
115
115
|
handles: [
|
116
116
|
:method_x, :method_y # will inject all methods with same name
|
117
117
|
]
|
@@ -139,7 +139,7 @@ class ProxyToTargetUsingSingleMethod
|
|
139
139
|
|
140
140
|
has target: {
|
141
141
|
is: :ro,
|
142
|
-
default:
|
142
|
+
default: -> { Target.new },
|
143
143
|
handles: "method_x" # coerce to an array of symbols
|
144
144
|
}
|
145
145
|
end
|
@@ -158,7 +158,7 @@ class ProxyToTargetUsingModule
|
|
158
158
|
|
159
159
|
has target: {
|
160
160
|
is: :ro,
|
161
|
-
default:
|
161
|
+
default: -> { Target.new },
|
162
162
|
handles: TargetModule # will import all methods from module
|
163
163
|
}
|
164
164
|
end
|
@@ -184,7 +184,7 @@ class ProxyToTargetUsingClass
|
|
184
184
|
|
185
185
|
has target: {
|
186
186
|
is: :ro,
|
187
|
-
default:
|
187
|
+
default: -> { Target.new },
|
188
188
|
handles: Target # will use only public methods on Target class
|
189
189
|
} # exclude methods from superclass
|
190
190
|
end
|
data/spec/traits_spec.rb
ADDED
@@ -0,0 +1,324 @@
|
|
1
|
+
require 'moosex'
|
2
|
+
require 'moosex/types'
|
3
|
+
|
4
|
+
module TestTrait
|
5
|
+
class MyHomePage
|
6
|
+
include MooseX
|
7
|
+
include MooseX::Types
|
8
|
+
|
9
|
+
has :counter, {
|
10
|
+
is: :ro,
|
11
|
+
isa: Integer,
|
12
|
+
default: 0,
|
13
|
+
traits: MooseX::Traits::Counter,
|
14
|
+
handles: {
|
15
|
+
inc_counter: :inc,
|
16
|
+
dec_counter: :dec,
|
17
|
+
reset_counter!: :reset,
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
has :counter_rw, {
|
22
|
+
is: :rw,
|
23
|
+
isa: Integer,
|
24
|
+
default: 0,
|
25
|
+
traits: [ MooseX::Traits::Counter ],
|
26
|
+
handles: {
|
27
|
+
inc_counter_rw: :inc,
|
28
|
+
dec_counter_rw: :dec,
|
29
|
+
reset_counter_rw!: :reset,
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
33
|
+
has :lazy_counter, {
|
34
|
+
is: :lazy,
|
35
|
+
isa: Integer,
|
36
|
+
traits: [ MooseX::Traits::Counter ],
|
37
|
+
handles: {
|
38
|
+
lazy_inc_counter: :inc,
|
39
|
+
lazy_dec_counter: :dec,
|
40
|
+
lazy_reset_counter!: :reset,
|
41
|
+
},
|
42
|
+
clearer: true,
|
43
|
+
}
|
44
|
+
|
45
|
+
has surname_name: {
|
46
|
+
is: :private,
|
47
|
+
isa: isTuple(String, String),
|
48
|
+
traits: [ MooseX::Traits::Pair ],
|
49
|
+
handles: {
|
50
|
+
surname: :first,
|
51
|
+
name: :second,
|
52
|
+
:surname= => :first=,
|
53
|
+
:name= => :second=,
|
54
|
+
surname_and_name: { join: ->{","} }
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
58
|
+
has bit: {
|
59
|
+
is: :ro,
|
60
|
+
default: true,
|
61
|
+
traits: MooseX::Traits::Bool,
|
62
|
+
handles: [ :toggle!, :not, :set!, :unset!, :value ],
|
63
|
+
}
|
64
|
+
|
65
|
+
has important: {
|
66
|
+
is: :rw,
|
67
|
+
default: nil,
|
68
|
+
traits: MooseX::Traits::RescueToNil,
|
69
|
+
handles: {
|
70
|
+
plus: :+,
|
71
|
+
minus: :-,
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
has important2: {
|
76
|
+
is: :rw,
|
77
|
+
default: nil,
|
78
|
+
traits: MooseX::Traits::RescueToZero,
|
79
|
+
handles: {
|
80
|
+
plus2: :+,
|
81
|
+
minus2: :-,
|
82
|
+
}
|
83
|
+
}
|
84
|
+
|
85
|
+
has phrase: {
|
86
|
+
is: :rw,
|
87
|
+
default: nil,
|
88
|
+
traits: MooseX::Traits::RescueToEmptyString,
|
89
|
+
handles: {
|
90
|
+
upcase_phrase: :upcase
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
94
|
+
def build_lazy_counter
|
95
|
+
0
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
class ComplexExample
|
100
|
+
include MooseX
|
101
|
+
include MooseX::Types
|
102
|
+
|
103
|
+
has surname_name: {
|
104
|
+
is: :rw,
|
105
|
+
isa: isMaybe(isTuple(String, String)),
|
106
|
+
default: nil,
|
107
|
+
traits: [ MooseX::Traits::RescueToEmptyString, MooseX::Traits::Pair ],
|
108
|
+
handles: {
|
109
|
+
surname: :first,
|
110
|
+
name: :second,
|
111
|
+
:surname= => :first=,
|
112
|
+
:name= => :second=,
|
113
|
+
surname_and_name: { join: ->{", "} }
|
114
|
+
}
|
115
|
+
}
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe TestTrait::ComplexExample do
|
120
|
+
it "should be possible call surname_and_name" do
|
121
|
+
ce = TestTrait::ComplexExample.new(surname_name: ["Asimov", "Isaac"])
|
122
|
+
ce.name.should == "Isaac"
|
123
|
+
ce.surname_and_name.should == "Asimov, Isaac"
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should be possible call surname_and_name if nil" do
|
127
|
+
ce = TestTrait::ComplexExample.new(surname_name: nil)
|
128
|
+
ce.name.should == ""
|
129
|
+
ce.surname_and_name.should == ", "
|
130
|
+
end
|
131
|
+
|
132
|
+
it "should be possible call surname_and_name if nil 2" do
|
133
|
+
ce = TestTrait::ComplexExample.new(surname_name: nil)
|
134
|
+
ce.name.should == ""
|
135
|
+
ce.surname_and_name.should == ", "
|
136
|
+
|
137
|
+
ce.name= "Isaac"
|
138
|
+
ce.surname_and_name.should == ", Isaac"
|
139
|
+
ce.surname= "Asimov"
|
140
|
+
ce.surname_and_name.should == "Asimov, Isaac"
|
141
|
+
|
142
|
+
ce.surname_name= nil
|
143
|
+
ce.name.should == ""
|
144
|
+
ce.surname_and_name.should == ", "
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
describe TestTrait::MyHomePage do
|
149
|
+
it "should increase counter" do
|
150
|
+
page = TestTrait::MyHomePage.new(counter: 0)
|
151
|
+
page.counter.should be_zero
|
152
|
+
page.inc_counter
|
153
|
+
page.counter.should == 1
|
154
|
+
|
155
|
+
page.inc_counter(3)
|
156
|
+
page.counter.should == 4
|
157
|
+
|
158
|
+
page.dec_counter
|
159
|
+
page.counter.should == 3
|
160
|
+
|
161
|
+
page.dec_counter(2)
|
162
|
+
page.counter.should == 1
|
163
|
+
|
164
|
+
page.reset_counter!
|
165
|
+
page.counter.should be_zero
|
166
|
+
|
167
|
+
page.inc_counter(5)
|
168
|
+
(page.counter * 8).should == 40
|
169
|
+
end
|
170
|
+
|
171
|
+
it "should increase counter by default value" do
|
172
|
+
page = TestTrait::MyHomePage.new
|
173
|
+
page.counter.should be_zero
|
174
|
+
page.inc_counter
|
175
|
+
page.counter.should == 1
|
176
|
+
|
177
|
+
page.inc_counter(3)
|
178
|
+
page.counter.should == 4
|
179
|
+
|
180
|
+
page.dec_counter
|
181
|
+
page.counter.should == 3
|
182
|
+
|
183
|
+
page.dec_counter(2)
|
184
|
+
page.counter.should == 1
|
185
|
+
|
186
|
+
page.reset_counter!
|
187
|
+
page.inc_counter
|
188
|
+
page.counter.should == 1
|
189
|
+
end
|
190
|
+
|
191
|
+
it "should increase counter_rw by default value" do
|
192
|
+
page = TestTrait::MyHomePage.new
|
193
|
+
page.counter_rw.should be_zero
|
194
|
+
page.inc_counter_rw
|
195
|
+
page.counter_rw.should == 1
|
196
|
+
|
197
|
+
page.counter_rw = 4
|
198
|
+
page.counter_rw.should == 4
|
199
|
+
|
200
|
+
page.dec_counter_rw
|
201
|
+
page.counter_rw.should == 3
|
202
|
+
|
203
|
+
page.dec_counter_rw(2)
|
204
|
+
page.counter_rw.should == 1
|
205
|
+
|
206
|
+
page.reset_counter_rw!
|
207
|
+
page.counter_rw.should be_zero
|
208
|
+
end
|
209
|
+
|
210
|
+
it "should increase lazy_counter if lazy" do
|
211
|
+
page = TestTrait::MyHomePage.new
|
212
|
+
page.lazy_counter.should be_zero
|
213
|
+
page.lazy_inc_counter
|
214
|
+
page.lazy_counter.should == 1
|
215
|
+
|
216
|
+
page.lazy_inc_counter(3)
|
217
|
+
page.lazy_counter.should == 4
|
218
|
+
|
219
|
+
page.lazy_dec_counter
|
220
|
+
page.lazy_counter.should == 3
|
221
|
+
|
222
|
+
page.lazy_dec_counter(2)
|
223
|
+
page.lazy_counter.should == 1
|
224
|
+
|
225
|
+
page.lazy_reset_counter!
|
226
|
+
page.lazy_counter.should be_zero
|
227
|
+
|
228
|
+
page.clear_lazy_counter!
|
229
|
+
page.lazy_counter.should be_zero
|
230
|
+
page.lazy_inc_counter
|
231
|
+
page.lazy_counter.should == 1
|
232
|
+
end
|
233
|
+
|
234
|
+
it "should store name, surname " do
|
235
|
+
page = TestTrait::MyHomePage.new(surname_name: ["Smith", "John"])
|
236
|
+
|
237
|
+
page.name.should == "John"
|
238
|
+
page.surname.should == "Smith"
|
239
|
+
page.surname_and_name.should == "Smith,John"
|
240
|
+
|
241
|
+
page.name= "Karl"
|
242
|
+
page.surname="Popper"
|
243
|
+
|
244
|
+
page.name.should == "Karl"
|
245
|
+
page.surname.should == "Popper"
|
246
|
+
page.surname_and_name.should == "Popper,Karl"
|
247
|
+
|
248
|
+
expect {
|
249
|
+
page.surname_name.count.should == 2
|
250
|
+
}.to raise_error(NoMethodError)
|
251
|
+
end
|
252
|
+
|
253
|
+
it "bit should act as a boolean" do
|
254
|
+
page = TestTrait::MyHomePage.new
|
255
|
+
page.bit.should == true
|
256
|
+
page.toggle!
|
257
|
+
page.bit.should == false
|
258
|
+
page.not.should == true
|
259
|
+
|
260
|
+
page.set!
|
261
|
+
page.bit.should == true
|
262
|
+
|
263
|
+
unless page.bit
|
264
|
+
raise "should act as a true value"
|
265
|
+
end
|
266
|
+
page.unset!
|
267
|
+
page.bit.should == false
|
268
|
+
|
269
|
+
if !! page.bit # necessary!!!
|
270
|
+
raise "should act as a false value"
|
271
|
+
end
|
272
|
+
|
273
|
+
if page.value
|
274
|
+
raise "should act as a false value"
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
it "important should be converted to integer" do
|
279
|
+
page = TestTrait::MyHomePage.new(important: 1)
|
280
|
+
page.important.should == 1
|
281
|
+
page.plus(1).should == 2
|
282
|
+
page.minus(4).should == -3
|
283
|
+
(page.important + 5).should == 6
|
284
|
+
end
|
285
|
+
|
286
|
+
it "important should be converted to integer returning nil" do
|
287
|
+
page = TestTrait::MyHomePage.new(important: nil)
|
288
|
+
page.important.should == nil
|
289
|
+
page.plus(1).should == nil
|
290
|
+
page.minus(4).should == nil
|
291
|
+
(page.important + 5).should == nil
|
292
|
+
end
|
293
|
+
|
294
|
+
it "important2 should be converted to integer" do
|
295
|
+
page = TestTrait::MyHomePage.new(important2: 1)
|
296
|
+
page.important2.should == 1
|
297
|
+
page.plus2(1).should == 2
|
298
|
+
page.minus2(4).should == -3
|
299
|
+
(page.important2 + 5).should == 6
|
300
|
+
end
|
301
|
+
|
302
|
+
it "important2 should be converted to integer returning 0" do
|
303
|
+
page = TestTrait::MyHomePage.new(important2: nil)
|
304
|
+
page.important2.should be_zero
|
305
|
+
page.plus2(1).should == 0
|
306
|
+
page.minus2(4).should == 0
|
307
|
+
(page.important2 + 5).should == 0
|
308
|
+
end
|
309
|
+
|
310
|
+
it "phrase should be converted to String" do
|
311
|
+
page = TestTrait::MyHomePage.new(phrase: "hello")
|
312
|
+
page.phrase.should == "hello"
|
313
|
+
page.upcase_phrase == "HELLO"
|
314
|
+
(page.upcase_phrase.concat ", WORLD").should == "HELLO, WORLD"
|
315
|
+
end
|
316
|
+
|
317
|
+
it "phrase should returning empty string" do
|
318
|
+
page = TestTrait::MyHomePage.new(phrase: nil)
|
319
|
+
page.phrase.should be_eql? ""
|
320
|
+
page.upcase_phrase == ""
|
321
|
+
(page.upcase_phrase.concat ", WORLD").should == ", WORLD"
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|