woyo-world 0.0.6 → 0.0.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.
- checksums.yaml +4 -4
- data/lib/woyo/world/actions.rb +24 -0
- data/lib/woyo/world/attributes.rb +105 -154
- data/lib/woyo/world/character.rb +4 -1
- data/lib/woyo/world/{dsl.rb → evaluate.rb} +1 -2
- data/lib/woyo/world/group.rb +21 -6
- data/lib/woyo/world/item.rb +26 -0
- data/lib/woyo/world/location.rb +5 -3
- data/lib/woyo/world/version.rb +1 -1
- data/lib/woyo/world/way.rb +5 -4
- data/lib/woyo/world/world.rb +7 -3
- data/lib/woyo/world/world_object.rb +8 -4
- data/rspec.json +1 -0
- data/spec/spec_doc.haml +68 -0
- data/spec/spec_doc_formatter.rb +89 -0
- data/spec/spec_helper.rb +115 -0
- data/spec/woyo/dsl/dsl_spec.rb +367 -0
- data/spec/woyo/world/actions_spec.rb +71 -0
- data/spec/woyo/world/attributes_spec.rb +300 -382
- data/spec/woyo/world/character_spec.rb +30 -28
- data/spec/woyo/world/evaluate_spec.rb +75 -0
- data/spec/woyo/world/group_spec.rb +45 -44
- data/spec/woyo/world/item_spec.rb +46 -0
- data/spec/woyo/world/location_spec.rb +48 -32
- data/spec/woyo/world/way_spec.rb +54 -45
- data/spec/woyo/world/world_object_spec.rb +48 -6
- data/spec/woyo/world/world_spec.rb +15 -7
- data/todo.txt +2 -2
- data/woyo-world.gemspec +3 -2
- metadata +38 -11
- data/spec/woyo/world/dsl_spec.rb +0 -74
- data/spec/woyo/world/language_spec.rb +0 -350
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'woyo/world/actions'
|
3
|
+
|
4
|
+
describe Woyo::Actions do
|
5
|
+
|
6
|
+
context "may be listed" do
|
7
|
+
|
8
|
+
let( :at ) { class ActionTest ; include Woyo::Actions ; end.new }
|
9
|
+
|
10
|
+
it "intially empty" do
|
11
|
+
expect(at.actions).to be_instance_of Woyo::Attributes::AttributesHash
|
12
|
+
expect(at.actions).to be_empty
|
13
|
+
end
|
14
|
+
|
15
|
+
it "single action" do
|
16
|
+
at.action( :act1 ) { Time.now }
|
17
|
+
expect(at.actions.count).to eq 1
|
18
|
+
expect(at.actions[:act1]). to be_instance_of Proc
|
19
|
+
end
|
20
|
+
|
21
|
+
it "multiple actions" do
|
22
|
+
at.action( :act1 ) { Time.now }
|
23
|
+
at.action( :act2 ) { Time.now }
|
24
|
+
expect(at.actions.count).to eq 2
|
25
|
+
expect(at.actions[:act2]). to be_instance_of Proc
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
context "may be defined" do
|
31
|
+
|
32
|
+
let( :at ) { class ActionTest ; include Woyo::Actions ; end.new }
|
33
|
+
|
34
|
+
it "via a block" do
|
35
|
+
at.action( :sum ) { 1 + 2 }
|
36
|
+
expect(at.actions).to include :sum
|
37
|
+
expect(at.actions[:sum]).to be_instance_of Proc
|
38
|
+
end
|
39
|
+
|
40
|
+
it "via a proc" do
|
41
|
+
at.action sum: proc { 1 + 2 }
|
42
|
+
expect(at.actions).to include :sum
|
43
|
+
expect(at.actions[:sum]).to be_instance_of Proc
|
44
|
+
end
|
45
|
+
|
46
|
+
it "via a lambda" do
|
47
|
+
at.action sum: lambda { |this| 1 + 2 }
|
48
|
+
expect(at.actions).to include :sum
|
49
|
+
expect(at.actions[:sum]).to be_instance_of Proc
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
context "may be invoked" do
|
55
|
+
|
56
|
+
let( :at ) { class ActionTest ; include Woyo::Actions ; end.new }
|
57
|
+
|
58
|
+
it "by name" do
|
59
|
+
at.action( :sum ) { 1 + 2 }
|
60
|
+
expect(at.sum).to eq 3
|
61
|
+
end
|
62
|
+
|
63
|
+
it "via #do :action" do
|
64
|
+
at.action( :sum ) { 1 + 2 }
|
65
|
+
expect(at.do :sum).to eq 3
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'spec_helper'
|
1
2
|
require 'woyo/world/attributes'
|
2
3
|
|
3
4
|
describe Woyo::Attributes do
|
@@ -5,494 +6,411 @@ describe Woyo::Attributes do
|
|
5
6
|
before :all do
|
6
7
|
class AttrTest
|
7
8
|
include Woyo::Attributes
|
8
|
-
attributes :attr1, :attr2, :attr3
|
9
9
|
end
|
10
10
|
end
|
11
|
-
|
12
|
-
it 'names can be listed for class' do
|
13
|
-
attrs = AttrTest.attributes
|
14
|
-
attrs.should be_instance_of Array
|
15
|
-
attrs.count.should eq 3
|
16
|
-
attrs.all? { |a| a.is_a? Symbol }.should be_true
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'hash of names and values can be retrieved for instance' do
|
20
|
-
attr_test = AttrTest.new
|
21
|
-
attr_test.attributes.should be_instance_of Woyo::Attributes::AttributesHash
|
22
|
-
AttrTest.attributes.each do |attr|
|
23
|
-
attr_test.send(attr, attr.to_s.upcase)
|
24
|
-
end
|
25
|
-
attr_test.attributes.keys.should eq [ :attr1, :attr2, :attr3 ]
|
26
|
-
attr_test.attributes.values.should eq [ 'ATTR1', 'ATTR2', 'ATTR3' ]
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'hash of names and nil values can be retrieved for instance before populating' do
|
30
|
-
attr_test = AttrTest.new
|
31
|
-
attr_test.attributes.should be_instance_of Woyo::Attributes::AttributesHash
|
32
|
-
attr_test.attributes.keys.should eq [ :attr1, :attr2, :attr3 ]
|
33
|
-
attr_test.attributes.values.should eq [ nil, nil, nil ]
|
34
|
-
end
|
35
11
|
|
36
|
-
|
37
|
-
expect {
|
38
|
-
class DefTest
|
39
|
-
include Woyo::Attributes
|
40
|
-
attributes one: 1, two: 2, three: proc { 3 }
|
41
|
-
end
|
42
|
-
}.to_not raise_error
|
43
|
-
def_test = DefTest.new
|
44
|
-
def_test.attributes.keys.should eq [ :one, :two, :three ]
|
45
|
-
def_test.attributes.values.should eq [ 1, 2, 3 ]
|
46
|
-
end
|
12
|
+
context '#attributes' do
|
47
13
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
it 'can be written via method with =' do
|
54
|
-
attr_test = AttrTest.new
|
55
|
-
AttrTest.attributes.each do |attr|
|
56
|
-
attr_test.send("#{attr}=", attr.to_s.upcase)
|
57
|
-
end
|
58
|
-
attr_test.attributes.count.should eq AttrTest.attributes.count
|
59
|
-
attr_test.attributes.each do |name,value|
|
60
|
-
value.should eq name.to_s.upcase
|
14
|
+
it 'returns empty AttributesHash for instance with no attributes' do
|
15
|
+
attr_test = AttrTest.new
|
16
|
+
expect(attr_test.attributes).to be_instance_of Woyo::Attributes::AttributesHash
|
17
|
+
expect(attr_test.attributes.count).to eq 0
|
61
18
|
end
|
62
|
-
end
|
63
19
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
attr_test.
|
20
|
+
it 'returns AttributesHash with names and nil values for instance with unpopulated attributes' do
|
21
|
+
attr_test = AttrTest.new
|
22
|
+
attr_test.attributes :attr1, :attr2, :attr3
|
23
|
+
expect(attr_test.attributes).to be_instance_of Woyo::Attributes::AttributesHash
|
24
|
+
expect(attr_test.attributes.keys).to eq [ :attr1, :attr2, :attr3 ]
|
25
|
+
expect(attr_test.attributes.values).to eq [ nil, nil, nil ]
|
68
26
|
end
|
69
|
-
|
70
|
-
|
71
|
-
|
27
|
+
|
28
|
+
it 'returns AttributesHash with names and values for instance with populated attributes' do
|
29
|
+
attr_test = AttrTest.new
|
30
|
+
attr_test.attributes :attr1, :attr2, :attr3
|
31
|
+
expect(attr_test.attributes).to be_instance_of Woyo::Attributes::AttributesHash
|
32
|
+
expect(attr_test.attributes.keys).to eq [ :attr1, :attr2, :attr3 ]
|
33
|
+
attr_test.attributes.keys.each do |attr|
|
34
|
+
attr_test.send(attr, attr.to_s.upcase)
|
35
|
+
end
|
36
|
+
expect(attr_test.attributes.values).to eq [ 'ATTR1', 'ATTR2', 'ATTR3' ]
|
72
37
|
end
|
73
|
-
end
|
74
38
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
attr_test.
|
39
|
+
it 'returns AttributesHash with names and default values for instance with unpopulated attributes' do
|
40
|
+
attr_test = AttrTest.new
|
41
|
+
attr_test.attributes one: 1, two: 2, three: 3
|
42
|
+
expect(attr_test.attributes).to be_instance_of Woyo::Attributes::AttributesHash
|
43
|
+
expect(attr_test.attributes.keys).to eq [ :one, :two, :three ]
|
44
|
+
expect(attr_test.attributes.values).to eq [ 1, 2, 3 ]
|
79
45
|
end
|
80
|
-
|
81
|
-
|
82
|
-
|
46
|
+
|
47
|
+
it 'provides convenience accessor :names for :keys' do
|
48
|
+
attr_test = AttrTest.new
|
49
|
+
attr_test.attributes :attr1, :attr2, :attr3
|
50
|
+
expect(attr_test.attributes.names).to eq [ :attr1, :attr2, :attr3 ]
|
83
51
|
end
|
52
|
+
|
84
53
|
end
|
85
54
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
55
|
+
context 'can be accessed' do
|
56
|
+
|
57
|
+
it 'to write via method with =' do
|
58
|
+
attr_test = AttrTest.new
|
59
|
+
attr_test.attributes :attr1, :attr2, :attr3
|
60
|
+
attr_test.attributes.names.each do |attr|
|
61
|
+
attr_test.send("#{attr}=", attr.to_s.upcase)
|
62
|
+
end
|
63
|
+
attr_test.attributes.each do |name,value|
|
64
|
+
expect(value).to eq name.to_s.upcase
|
90
65
|
end
|
91
|
-
}.to_not raise_error
|
92
|
-
AttrTest.attributes.count.should eq 6
|
93
|
-
attr_test = AttrTest.new
|
94
|
-
AttrTest.attributes.each do |attr|
|
95
|
-
attr_test.send(attr, attr.to_s.upcase)
|
96
66
|
end
|
97
|
-
attr_test.attributes.count.should eq 6
|
98
|
-
end
|
99
67
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
68
|
+
it 'to write via method without =' do
|
69
|
+
attr_test = AttrTest.new
|
70
|
+
attr_test.attributes :attr1, :attr2, :attr3
|
71
|
+
attr_test.attributes.names.each do |attr|
|
72
|
+
attr_test.send(attr, attr.to_s.upcase)
|
104
73
|
end
|
105
|
-
|
106
|
-
|
107
|
-
attr_test.open.should be_nil
|
108
|
-
attr_test.open = true
|
109
|
-
attr_test.open.should be_true
|
110
|
-
end
|
111
|
-
|
112
|
-
it 'can have a default value' do
|
113
|
-
expect {
|
114
|
-
class AttrTest
|
115
|
-
attributes attr_with_array___default: [ 1, 2, 3 ]
|
116
|
-
attributes attr_with_hash____default: { a: 1, b: 2, c: 3 }
|
117
|
-
attributes attr_with_number__default: 12345
|
118
|
-
attributes attr_with_string__default: "abcde"
|
119
|
-
attributes attr_with_boolean_default: true
|
74
|
+
attr_test.attributes.each do |name,value|
|
75
|
+
expect(value).to eq name.to_s.upcase
|
120
76
|
end
|
121
|
-
|
122
|
-
attr_test = AttrTest.new
|
123
|
-
attr_test.attr_with_array___default.should eq [ 1, 2, 3 ]
|
124
|
-
attr_test.attr_with_array___default = :array
|
125
|
-
attr_test.attr_with_array___default.should eq :array
|
126
|
-
attr_test.attr_with_hash____default.should eq ( { a: 1, b: 2, c: 3 } )
|
127
|
-
attr_test.attr_with_hash____default = :hash
|
128
|
-
attr_test.attr_with_hash____default.should eq :hash
|
129
|
-
attr_test.attr_with_number__default.should eq 12345
|
130
|
-
attr_test.attr_with_number__default = :number
|
131
|
-
attr_test.attr_with_number__default.should eq :number
|
132
|
-
attr_test.attr_with_string__default.should eq "abcde"
|
133
|
-
attr_test.attr_with_string__default = :string
|
134
|
-
attr_test.attr_with_string__default.should eq :string
|
135
|
-
attr_test.attr_with_boolean_default.should eq true
|
136
|
-
attr_test.attr_with_boolean_default = :boolean
|
137
|
-
attr_test.attr_with_boolean_default.should eq :boolean
|
138
|
-
end
|
77
|
+
end
|
139
78
|
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
79
|
+
it 'to read via method' do
|
80
|
+
attr_test = AttrTest.new
|
81
|
+
attr_test.attributes :attr1, :attr2, :attr3
|
82
|
+
attr_test.attributes.names.each do |attr|
|
83
|
+
attr_test.send(attr, attr.to_s.upcase)
|
84
|
+
end
|
85
|
+
attr_test.attributes.each do |name,value|
|
86
|
+
expect(eval("attr_test.#{name}")).to eq value
|
144
87
|
end
|
145
|
-
|
146
|
-
|
147
|
-
attr_test.attr_with_proc_default.should be < Time.now
|
88
|
+
end
|
89
|
+
|
148
90
|
end
|
149
91
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
92
|
+
context 'can be defined' do
|
93
|
+
|
94
|
+
it 'via "attribute"' do
|
95
|
+
attr_test = AttrTest.new
|
96
|
+
attr_test.attribute :open
|
97
|
+
expect(attr_test.open).to be_nil
|
98
|
+
attr_test.open = true
|
99
|
+
expect(attr_test.open).to be true
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'attribute list can be added to' do
|
103
|
+
attr_test = AttrTest.new
|
104
|
+
attr_test.attributes :attr1, :attr2, :attr3
|
105
|
+
attr_test.attributes :attr4, :attr5, :attr6
|
106
|
+
expect(attr_test.attributes.count).to eq 6
|
107
|
+
expect(attr_test.attributes.names).to eq [ :attr1, :attr2, :attr3, :attr4, :attr5, :attr6 ]
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'attribute list can be added to without duplication' do
|
111
|
+
attr_test = AttrTest.new
|
112
|
+
attr_test.attributes :attr1, :attr2, :attr3
|
113
|
+
attr_test.attributes :attr2, :attr3, :attr4
|
114
|
+
expect(attr_test.attributes.count).to eq 4
|
115
|
+
expect(attr_test.attributes.names).to eq [ :attr1, :attr2, :attr3, :attr4 ]
|
116
|
+
end
|
117
|
+
|
118
|
+
it 'with a default value' do
|
119
|
+
attr_test = AttrTest.new
|
120
|
+
attr_test.attributes attr_with_array___default: [ 1, 2, 3 ]
|
121
|
+
attr_test.attributes attr_with_hash____default: { a: 1, b: 2, c: 3 }
|
122
|
+
attr_test.attributes attr_with_number__default: 12345
|
123
|
+
attr_test.attributes attr_with_string__default: "abcde"
|
124
|
+
attr_test.attributes attr_with_boolean_default: true
|
125
|
+
expect(attr_test.attr_with_array___default).to eq [ 1, 2, 3 ]
|
126
|
+
expect(attr_test.attr_with_hash____default).to eq ( { a: 1, b: 2, c: 3 } )
|
127
|
+
expect(attr_test.attr_with_number__default).to eq 12345
|
128
|
+
expect(attr_test.attr_with_string__default).to eq "abcde"
|
129
|
+
expect(attr_test.attr_with_boolean_default).to eq true
|
130
|
+
end
|
131
|
+
|
132
|
+
context 'wth a dynamic value' do
|
133
|
+
|
134
|
+
context 'a proc' do
|
135
|
+
|
136
|
+
it 'runs' do
|
137
|
+
attr_test = AttrTest.new
|
138
|
+
attr_test.attributes attr_with_proc_default: proc { Time.now }
|
139
|
+
expect(attr_test.attr_with_proc_default).to be < Time.now
|
156
140
|
end
|
157
|
-
end
|
158
|
-
}.to_not raise_error
|
159
|
-
attr_test = AttrTest.new
|
160
|
-
attr_test.attr_with_proc_default.should eq "okay"
|
161
|
-
end
|
162
141
|
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
142
|
+
it 'runs in instance scope' do
|
143
|
+
attr_test = AttrTest.new
|
144
|
+
attr_test.define_singleton_method(:my_method) { "okay" }
|
145
|
+
attr_test.attributes attr_with_proc_default: proc { |this| this.my_method }
|
146
|
+
expect(attr_test.attr_with_proc_default).to eq "okay"
|
147
|
+
end
|
148
|
+
|
149
|
+
it 'runs on each access via method' do
|
150
|
+
attr_test = AttrTest.new
|
151
|
+
attr_test.attributes time_proc: proc { Time.now }
|
152
|
+
old_time = attr_test.time_proc
|
153
|
+
expect(attr_test.time_proc).to be > old_time
|
154
|
+
end
|
172
155
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
def my_method
|
178
|
-
"okay"
|
156
|
+
it 'is returned on direct access to attribute' do
|
157
|
+
attr_test = AttrTest.new
|
158
|
+
attr_test.attributes time_proc: proc { Time.now }
|
159
|
+
expect(attr_test.attributes[:time_proc]).to respond_to :call
|
179
160
|
end
|
161
|
+
|
180
162
|
end
|
181
|
-
}.to_not raise_error
|
182
|
-
attr_test = AttrTest.new
|
183
|
-
attr_test.attr_with_lambda_default.should eq "okay"
|
184
|
-
end
|
185
163
|
|
186
|
-
|
164
|
+
context 'a lambda' do
|
165
|
+
|
166
|
+
it 'runs' do
|
167
|
+
attr_test = AttrTest.new
|
168
|
+
attr_test.attributes attr_with_lambda_default: lambda { Time.now }
|
169
|
+
expect(attr_test.attr_with_lambda_default).to be < Time.now
|
170
|
+
end
|
187
171
|
|
188
|
-
|
172
|
+
it 'runs in instance scope' do
|
173
|
+
attr_test = AttrTest.new
|
174
|
+
attr_test.define_singleton_method(:my_method) { "okay" }
|
175
|
+
attr_test.attributes attr_with_lambda_default: lambda { |this| this.my_method }
|
176
|
+
expect(attr_test.attr_with_lambda_default).to eq "okay"
|
177
|
+
end
|
189
178
|
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
end
|
197
|
-
}.to_not raise_error
|
198
|
-
end
|
179
|
+
it 'runs on each access via method' do
|
180
|
+
attr_test = AttrTest.new
|
181
|
+
attr_test.attributes time_lambda: lambda { Time.now }
|
182
|
+
old_time = attr_test.time_lambda
|
183
|
+
expect(attr_test.time_lambda).to be > old_time
|
184
|
+
end
|
199
185
|
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
186
|
+
it 'is returned on direct access to attribute' do
|
187
|
+
attr_test = AttrTest.new
|
188
|
+
attr_test.attributes time_lambda: lambda { Time.now }
|
189
|
+
expect(attr_test.attributes[:time_lambda]).to respond_to :call
|
190
|
+
end
|
205
191
|
|
206
|
-
it '#attr!' do
|
207
|
-
attr_test = BooleanAttrTest.new
|
208
|
-
attr_test.open = false
|
209
|
-
attr_test.open.should eq false
|
210
|
-
attr_test.open!.should eq true
|
211
|
-
attr_test.open.should eq true
|
212
192
|
end
|
193
|
+
|
194
|
+
context 'a block' do
|
213
195
|
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
196
|
+
it 'runs' do
|
197
|
+
attr_test = AttrTest.new
|
198
|
+
attr_test.attribute( :attr_with_block_default ) { Time.now }
|
199
|
+
expect(attr_test.attr_with_block_default).to be < Time.now
|
200
|
+
end
|
201
|
+
|
202
|
+
it 'runs in instance scope' do
|
203
|
+
attr_test = AttrTest.new
|
204
|
+
attr_test.define_singleton_method(:my_method) { "okay" }
|
205
|
+
attr_test.attribute( :attr_with_block_default ) { |this| this.my_method }
|
206
|
+
expect(attr_test.attr_with_block_default).to eq "okay"
|
207
|
+
end
|
208
|
+
|
209
|
+
it 'runs on each access via method' do
|
210
|
+
attr_test = AttrTest.new
|
211
|
+
attr_test.attribute( :time_block ) { Time.now }
|
212
|
+
old_time = attr_test.time_block
|
213
|
+
expect(attr_test.time_block).to be > old_time
|
214
|
+
end
|
215
|
+
|
216
|
+
it 'is returned on direct access to attribute' do
|
217
|
+
attr_test = AttrTest.new
|
218
|
+
attr_test.attribute( :time_block ) { Time.now }
|
219
|
+
expect(attr_test.attributes[:time_block]).to respond_to :call
|
220
|
+
end
|
220
221
|
|
221
|
-
it '#is :attr' do
|
222
|
-
attr_test = BooleanAttrTest.new
|
223
|
-
attr_test.light.should eq false
|
224
|
-
attr_test.is(:light)
|
225
|
-
attr_test.light.should eq true
|
226
222
|
end
|
223
|
+
|
227
224
|
end
|
228
225
|
|
229
|
-
|
226
|
+
end
|
230
227
|
|
231
|
-
|
232
|
-
|
233
|
-
it 'that defines new attribute with true default' do
|
234
|
-
expect {
|
235
|
-
class BooleanIsTest1
|
236
|
-
include Woyo::Attributes
|
237
|
-
is :attr1
|
238
|
-
end
|
239
|
-
}.to_not raise_error
|
240
|
-
attr_test = BooleanIsTest1.new
|
241
|
-
attr_test.attr1.should eq true
|
242
|
-
end
|
228
|
+
context 'that are boolean have convenient instance accessors' do
|
243
229
|
|
244
|
-
|
245
|
-
expect {
|
246
|
-
class BooleanIsTest2
|
247
|
-
include Woyo::Attributes
|
248
|
-
attribute :attr2
|
249
|
-
is :attr2
|
250
|
-
end
|
251
|
-
}.to_not raise_error
|
252
|
-
attr_test = BooleanIsTest2.new
|
253
|
-
attr_test.attr2.should eq true
|
254
|
-
end
|
230
|
+
let(:bat) { class BooleanAttrTest; include Woyo::Attributes; end.new }
|
255
231
|
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
include Woyo::Attributes
|
260
|
-
attribute :attr3 => false
|
261
|
-
is :attr3
|
262
|
-
end
|
263
|
-
}.to_not raise_error
|
264
|
-
attr_test = BooleanIsTest3.new
|
265
|
-
attr_test.attr3.should eq true
|
266
|
-
end
|
232
|
+
before :each do
|
233
|
+
bat.attribute open: true
|
234
|
+
end
|
267
235
|
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
attr_test.hot.should eq false
|
280
|
-
attr_test.warm.should eq false
|
281
|
-
attr_test.cool.should eq false
|
282
|
-
attr_test.cold.should eq true
|
283
|
-
end
|
236
|
+
it '#attr?' do
|
237
|
+
expect(bat.open).to eq true
|
238
|
+
expect(bat.open?).to eq true
|
239
|
+
end
|
240
|
+
|
241
|
+
it '#attr!' do
|
242
|
+
bat.open = false
|
243
|
+
expect(bat.open).to eq false
|
244
|
+
expect(bat.open!).to eq true
|
245
|
+
expect(bat.open).to eq true
|
246
|
+
end
|
284
247
|
|
248
|
+
it '#is? :attr' do
|
249
|
+
expect(bat.is?(:open)).to eq true
|
250
|
+
bat.open = false
|
251
|
+
expect(bat.is?(:open)).to eq false
|
252
|
+
end
|
253
|
+
|
254
|
+
it '#is :attr' do
|
255
|
+
bat.open = false
|
256
|
+
expect(bat.open).to eq false
|
257
|
+
bat.is(:open)
|
258
|
+
expect(bat.open).to eq true
|
285
259
|
end
|
286
260
|
|
287
261
|
end
|
288
262
|
|
289
263
|
context 'can be re-defined' do
|
290
264
|
|
265
|
+
let(:ard) { AttrTest.new }
|
266
|
+
|
291
267
|
it 'without duplication' do
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
class AttrReDef1
|
298
|
-
attribute :attr1
|
299
|
-
end
|
300
|
-
}.to_not raise_error
|
301
|
-
AttrReDef1.attributes.count.should eq 1
|
302
|
-
AttrReDef1.attributes.should eq [:attr1]
|
303
|
-
attr_rd1 = AttrReDef1.new
|
304
|
-
attr_rd1.attr1.should be_nil
|
268
|
+
ard.attribute :attr
|
269
|
+
ard.attribute :attr
|
270
|
+
expect(ard.attributes.count).to eq 1
|
271
|
+
expect(ard.attributes.names).to eq [:attr]
|
272
|
+
expect(ard.attr).to eq nil
|
305
273
|
end
|
306
274
|
|
307
275
|
it 'to set default' do
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
class AttrReDef2
|
314
|
-
attribute attr2: 'two'
|
315
|
-
end
|
316
|
-
}.to_not raise_error
|
317
|
-
AttrReDef2.attributes.count.should eq 1
|
318
|
-
AttrReDef2.attributes.should eq [:attr2]
|
319
|
-
attr_rd2 = AttrReDef2.new
|
320
|
-
attr_rd2.attr2.should eq 'two'
|
276
|
+
ard.attribute :attr
|
277
|
+
ard.attribute :attr => 'default'
|
278
|
+
expect(ard.attributes.count).to eq 1
|
279
|
+
expect(ard.attributes.names).to eq [:attr]
|
280
|
+
expect(ard.attr).to eq 'default'
|
321
281
|
end
|
322
282
|
|
323
283
|
it 'to change default' do
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
class AttrReDef3
|
330
|
-
attribute attr3: 'three'
|
331
|
-
end
|
332
|
-
}.to_not raise_error
|
333
|
-
AttrReDef3.attributes.count.should eq 1
|
334
|
-
AttrReDef3.attributes.should eq [:attr3]
|
335
|
-
attr_rd3 = AttrReDef3.new
|
336
|
-
attr_rd3.attr3.should eq 'three'
|
284
|
+
ard.attribute :attr => 'old_default'
|
285
|
+
ard.attribute :attr => 'new_default'
|
286
|
+
expect(ard.attributes.count).to eq 1
|
287
|
+
expect(ard.attributes.names).to eq [:attr]
|
288
|
+
expect(ard.attr).to eq 'new_default'
|
337
289
|
end
|
338
290
|
|
339
291
|
end
|
340
292
|
|
341
293
|
context 'groups' do
|
342
294
|
|
343
|
-
|
344
|
-
class AT
|
345
|
-
include Woyo::Attributes
|
346
|
-
group :stooges, :larry, :curly, :moe
|
347
|
-
group :cars, :mustang, :ferarri, :mini
|
348
|
-
end
|
349
|
-
@at = AT.new
|
350
|
-
end
|
295
|
+
let(:gat) { AttrTest.new }
|
351
296
|
|
352
|
-
|
353
|
-
|
354
|
-
groups.should be_instance_of Hash
|
355
|
-
groups.count.should eq 2
|
356
|
-
groups.keys.should eq [ :stooges, :cars ]
|
357
|
-
groups[:stooges].should eq [ :larry, :curly, :moe ]
|
358
|
-
groups[:cars].should eq [ :mustang, :ferarri, :mini ]
|
297
|
+
before :each do
|
298
|
+
gat.group :stooges, :larry, :curly, :moe
|
359
299
|
end
|
360
300
|
|
361
|
-
it '
|
362
|
-
|
301
|
+
it 'can be accessed by named instance methods' do
|
302
|
+
expect(gat.stooges).to be_instance_of Woyo::Attributes::Group
|
363
303
|
end
|
364
304
|
|
365
|
-
it 'names and nil values can be retrieved
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
305
|
+
it 'names and nil values can be retrieved' do
|
306
|
+
expect(gat.stooges).to be_instance_of Woyo::Attributes::Group
|
307
|
+
expect(gat.stooges.count).to eq 3
|
308
|
+
expect(gat.stooges.names).to eq [ :larry, :curly, :moe ]
|
309
|
+
expect(gat.stooges.values).to eq [ nil, nil, nil ]
|
370
310
|
end
|
371
311
|
|
372
|
-
it 'names and default values can be retrieved
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
}.to_not raise_error
|
379
|
-
def_test = GroupDefTest.new
|
380
|
-
groups = def_test.groups
|
381
|
-
groups.should be_instance_of Hash
|
382
|
-
groups.count.should eq 1
|
383
|
-
groups.names.should eq [ :numbers ]
|
384
|
-
groups[:numbers].should be_instance_of Woyo::Attributes::Group
|
385
|
-
groups[:numbers].names.should eq [ :one, :two, :three ]
|
386
|
-
groups[:numbers].values.should eq [ 1, 2, 3 ]
|
387
|
-
def_test.numbers.names.should eq [ :one, :two, :three ]
|
388
|
-
def_test.numbers.values.should eq [ 1, 2, 3 ]
|
312
|
+
it 'names and default values can be retrieved' do
|
313
|
+
gat.group :numbers, one: 1, two: 2, three: 3
|
314
|
+
expect(gat.numbers).to be_instance_of Woyo::Attributes::Group
|
315
|
+
expect(gat.numbers.count).to eq 3
|
316
|
+
expect(gat.numbers.names).to eq [ :one, :two, :three ]
|
317
|
+
expect(gat.numbers.values).to eq [ 1, 2, 3 ]
|
389
318
|
end
|
390
319
|
|
391
320
|
it 'members can be accessed via group' do
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
end
|
396
|
-
|
397
|
-
it 'members are also attributes' do
|
398
|
-
all_attrs = [ :larry, :curly, :moe, :mustang, :ferarri, :mini ]
|
399
|
-
@at.attributes.keys.should eq all_attrs
|
400
|
-
all_attrs.each do |attr|
|
401
|
-
@at.should respond_to attr
|
402
|
-
end
|
321
|
+
expect(gat.stooges[:curly]).to eq nil
|
322
|
+
gat.stooges[:curly] = 'bald'
|
323
|
+
expect(gat.stooges[:curly]).to eq 'bald'
|
403
324
|
end
|
404
325
|
|
405
326
|
it 'members are attributes' do
|
406
|
-
|
407
|
-
|
408
|
-
|
327
|
+
expect(gat.attributes.keys).to eq [ :larry, :curly, :moe ]
|
328
|
+
gat.stooges[:larry] = 'knucklehead'
|
329
|
+
expect(gat.larry).to eq 'knucklehead'
|
409
330
|
end
|
410
331
|
|
411
332
|
it 'attributes are members' do
|
412
|
-
|
413
|
-
|
414
|
-
|
333
|
+
gat.moe = 'smart'
|
334
|
+
expect(gat.stooges[:moe]).to eq 'smart'
|
335
|
+
end
|
336
|
+
|
337
|
+
it '#groups returns hash with names and groups' do
|
338
|
+
gat.group :numbers, one: 1, two: 2, three: proc { 3 }
|
339
|
+
expect(gat.groups).to eq( { stooges: gat.stooges, numbers: gat.numbers } )
|
415
340
|
end
|
416
341
|
|
417
342
|
end
|
418
343
|
|
419
|
-
context '
|
344
|
+
context 'exclusions' do
|
420
345
|
|
421
|
-
|
422
|
-
class ExGroupTest
|
423
|
-
include Woyo::Attributes
|
424
|
-
group! :temp, :hot, :warm, :cool, :cold
|
425
|
-
group! :light, :dark, :dim, :bright
|
426
|
-
end
|
427
|
-
end
|
346
|
+
let(:xat) { AttrTest.new }
|
428
347
|
|
429
|
-
|
430
|
-
|
431
|
-
groups.should be_instance_of Hash
|
432
|
-
groups.count.should eq 2
|
433
|
-
groups.keys.should eq [ :temp, :light ]
|
434
|
-
groups[:temp].should eq [ :hot, :warm, :cool, :cold ]
|
435
|
-
groups[:light].should eq [ :dark, :dim, :bright ]
|
348
|
+
before :each do
|
349
|
+
xat.exclusion :temp, :warm, :cool, :cold
|
436
350
|
end
|
437
351
|
|
438
|
-
it '
|
439
|
-
|
440
|
-
egt.temp.should be_instance_of Woyo::Attributes::BooleanGroup
|
352
|
+
it 'can be accessed by named instance methods' do
|
353
|
+
expect(xat.temp).to be_instance_of Woyo::Attributes::Exclusion
|
441
354
|
end
|
442
355
|
|
443
356
|
it 'first member is true, rest are false' do
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
357
|
+
expect(xat.temp[:warm]).to eq true
|
358
|
+
expect(xat.temp[:cool]).to eq false
|
359
|
+
expect(xat.temp[:cold]).to eq false
|
360
|
+
end
|
361
|
+
|
362
|
+
it '#value returns true member' do
|
363
|
+
expect(xat.temp.value).to eq :warm
|
364
|
+
xat.temp[:cold] = true
|
365
|
+
expect(xat.temp.value).to eq :cold
|
448
366
|
end
|
449
367
|
|
450
368
|
it 'making group member true affects member attributes' do
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
egt.warm.should be false
|
456
|
-
egt.hot.should be false
|
369
|
+
xat.temp[:cold] = true
|
370
|
+
expect(xat.cold).to be true
|
371
|
+
expect(xat.cool).to be false
|
372
|
+
expect(xat.warm).to be false
|
457
373
|
end
|
458
374
|
|
459
375
|
it 'making attribute true affects group members' do
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
376
|
+
xat.cool = true
|
377
|
+
expect(xat.temp[:cold]).to be false
|
378
|
+
expect(xat.temp[:cool]).to be true
|
379
|
+
expect(xat.temp[:warm]).to be false
|
380
|
+
end
|
381
|
+
|
382
|
+
it '#exclusions returns hash with names and exlcusions' do
|
383
|
+
xat.exclusion :light, :dark, :dim, :bright
|
384
|
+
expect(xat.exclusions).to eq( { temp: xat.temp, light: xat.light } )
|
466
385
|
end
|
467
386
|
|
468
387
|
end
|
469
388
|
|
470
|
-
context '
|
389
|
+
context 'with Hash value' do
|
471
390
|
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
end
|
477
|
-
@aht = AttrHashTest.new
|
391
|
+
let(:hat) { AttrTest.new }
|
392
|
+
|
393
|
+
before :each do
|
394
|
+
hat.attributes :reaction, :hot, :cold
|
478
395
|
end
|
479
396
|
|
480
|
-
it '
|
481
|
-
expect {
|
397
|
+
it 'accept a hash as value' do
|
398
|
+
expect { hat.reaction hot: 'Sweat', cold: 'Shiver' }.to_not raise_error
|
482
399
|
end
|
483
400
|
|
484
|
-
it '
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
401
|
+
it 'return the value of the first key that evaluates as a true attribute' do
|
402
|
+
hat.reaction hot: 'Sweat', cold: 'Shiver'
|
403
|
+
hat.cold = true
|
404
|
+
expect(hat.reaction).to eq 'Shiver'
|
405
|
+
hat.hot = true
|
406
|
+
expect(hat.reaction).to eq 'Sweat'
|
489
407
|
end
|
490
408
|
|
491
|
-
it 'otherwise
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
409
|
+
it 'otherwise return the hash' do
|
410
|
+
hat.reaction hot: 'Sweat', cold: 'Shiver'
|
411
|
+
hat.cold = false
|
412
|
+
hat.hot = false
|
413
|
+
expect(hat.reaction).to eq ( { :hot => 'Sweat', :cold => 'Shiver' } )
|
496
414
|
end
|
497
415
|
|
498
416
|
end
|