iotas 0.0.2
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/.gitignore +2 -0
- data/.travis.yml +7 -0
- data/Changelog +5 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +28 -0
- data/LICENSE +661 -0
- data/README.md +18 -0
- data/Rakefile +6 -0
- data/iotas.gemspec +28 -0
- data/lib/iotas/board.rb +69 -0
- data/lib/iotas/door.rb +91 -0
- data/lib/iotas/iota.rb +64 -0
- data/lib/iotas/link.rb +70 -0
- data/lib/iotas/particle.rb +213 -0
- data/lib/iotas/room.rb +192 -0
- data/lib/iotas/spin.rb +150 -0
- data/lib/iotas.rb +51 -0
- data/lib/version.rb +28 -0
- data/spec/board_spec.rb +95 -0
- data/spec/door_spec.rb +94 -0
- data/spec/link_spec.rb +38 -0
- data/spec/particle_spec.rb +240 -0
- data/spec/room_spec.rb +304 -0
- data/spec/spec_helper.rb +38 -0
- data/spec/spin_spec.rb +129 -0
- data/spec/spot_spec.rb +26 -0
- data/test/test_evendoors.rb +168 -0
- metadata +132 -0
@@ -0,0 +1,240 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
# -*- coding: UTF-8 -*-
|
3
|
+
#
|
4
|
+
|
5
|
+
require 'spec_helper'
|
6
|
+
#
|
7
|
+
describe Iotas::Particle do
|
8
|
+
#
|
9
|
+
it "payload manipulation" do
|
10
|
+
p = Iotas::Particle.new
|
11
|
+
#
|
12
|
+
p['key']=666
|
13
|
+
p['key'].should eql 666
|
14
|
+
p.data('key').should eql 666
|
15
|
+
p.get_data('key').should eql 666
|
16
|
+
#
|
17
|
+
p.set_data 'key', 69
|
18
|
+
p['key'].should eql 69
|
19
|
+
p.data('key').should eql 69
|
20
|
+
p.get_data('key').should eql 69
|
21
|
+
end
|
22
|
+
#
|
23
|
+
it "payload clone" do
|
24
|
+
p = Iotas::Particle.new
|
25
|
+
p['k00'] = { 'k0'=>0,'k1'=>1}
|
26
|
+
p['k11'] = [1,2,3]
|
27
|
+
o = Iotas::Particle.new
|
28
|
+
o.clone_data p
|
29
|
+
p['k00']=nil
|
30
|
+
p['k00'].should be_nil
|
31
|
+
o['k00']['k0'].should eql 0
|
32
|
+
o['k00']['k1'].should eql 1
|
33
|
+
p['k11']=nil
|
34
|
+
p['k11'].should be_nil
|
35
|
+
o['k11'][0].should eql 1
|
36
|
+
o['k11'][1].should eql 2
|
37
|
+
o['k11'][2].should eql 3
|
38
|
+
end
|
39
|
+
#
|
40
|
+
it "particle merge" do
|
41
|
+
p = Iotas::Particle.new
|
42
|
+
q = Iotas::Particle.new
|
43
|
+
o = Iotas::Particle.new
|
44
|
+
p.merge! q
|
45
|
+
p.merge! o
|
46
|
+
p.merged(0).should be q
|
47
|
+
p.merged(1).should be o
|
48
|
+
p.merged(2).should be_nil
|
49
|
+
p.merged_shift.should be q
|
50
|
+
p.merged(0).should be o
|
51
|
+
p.merged(1).should be_nil
|
52
|
+
p.merged_shift.should be o
|
53
|
+
p.merged(0).should be_nil
|
54
|
+
p.merge! q
|
55
|
+
p.merge! o
|
56
|
+
p.merged(0).should be q
|
57
|
+
p.merged(1).should be o
|
58
|
+
p.clear_merged!
|
59
|
+
p.merged(0).should be_nil
|
60
|
+
end
|
61
|
+
#
|
62
|
+
it "routing: add_dsts, next_dst and dst_routed!" do
|
63
|
+
p = Iotas::Particle.new
|
64
|
+
d0 = Iotas::Door.new 'door0', nil
|
65
|
+
d1 = Iotas::Door.new 'door1', nil
|
66
|
+
p.dst.should be_nil
|
67
|
+
p.next_dst.should be_nil
|
68
|
+
p.add_dsts 'some?where,room0/room1/door?action,room/door,door'
|
69
|
+
p.next_dst.should eql 'some?where'
|
70
|
+
p.dst_routed! d0
|
71
|
+
p.dst.should be d0
|
72
|
+
p.next_dst.should eql 'room0/room1/door?action'
|
73
|
+
p.dst_routed! d1
|
74
|
+
p.dst.should be d1
|
75
|
+
p.next_dst.should eql 'room/door'
|
76
|
+
p.dst_routed! nil
|
77
|
+
p.dst.should be_nil
|
78
|
+
p.next_dst.should eql 'door'
|
79
|
+
end
|
80
|
+
#
|
81
|
+
it "wrong path should raise exeption" do
|
82
|
+
p = Iotas::Particle.new
|
83
|
+
lambda { p.set_dst! 'action', '/room' }.should raise_error(Iotas::Exception)
|
84
|
+
lambda { p.set_dst! 'action', 'room/' }.should raise_error(Iotas::Exception)
|
85
|
+
lambda { p.set_dst! '', 'room/' }.should raise_error(Iotas::Exception)
|
86
|
+
lambda { p.set_dst! 'action', 'room//door' }.should raise_error(Iotas::Exception)
|
87
|
+
lambda { p.set_dst! ' ' }.should raise_error(Iotas::Exception)
|
88
|
+
lambda { p.set_dst! ' ', '' }.should raise_error(Iotas::Exception)
|
89
|
+
lambda { p.set_dst! 'f f' }.should raise_error(Iotas::Exception)
|
90
|
+
lambda { p.set_dst! '', ' d' }.should raise_error(Iotas::Exception)
|
91
|
+
lambda { p.set_dst! '' }.should raise_error(Iotas::Exception)
|
92
|
+
lambda { p.set_dst! '', '' }.should raise_error(Iotas::Exception)
|
93
|
+
lambda { p.set_dst! nil }.should raise_error(TypeError)
|
94
|
+
lambda { p.set_dst! 'action', nil }.should raise_error(NoMethodError)
|
95
|
+
end
|
96
|
+
#
|
97
|
+
it "routing: set_dst! and split_dst!" do
|
98
|
+
p = Iotas::Particle.new
|
99
|
+
d0 = Iotas::Door.new 'door0', nil
|
100
|
+
#
|
101
|
+
p.set_dst! 'action', 'room0/room1/door'
|
102
|
+
p.split_dst!
|
103
|
+
p.room.should eql 'room0/room1'
|
104
|
+
p.door.should eql 'door'
|
105
|
+
p.action.should eql 'action'
|
106
|
+
#
|
107
|
+
p.set_dst! 'action', 'room/door'
|
108
|
+
p.split_dst!
|
109
|
+
p.room.should eql 'room'
|
110
|
+
p.door.should eql 'door'
|
111
|
+
p.action.should eql 'action'
|
112
|
+
#
|
113
|
+
p.set_dst! 'action', ''
|
114
|
+
p.split_dst!
|
115
|
+
p.room.should eql nil
|
116
|
+
p.door.should eql nil
|
117
|
+
p.action.should eql 'action'
|
118
|
+
#
|
119
|
+
p.set_dst! 'action'
|
120
|
+
p.split_dst!
|
121
|
+
p.room.should eql nil
|
122
|
+
p.door.should eql nil
|
123
|
+
p.action.should eql 'action'
|
124
|
+
#
|
125
|
+
p.clear_dsts!
|
126
|
+
p.add_dsts 'door?action,?action'
|
127
|
+
p.split_dst!
|
128
|
+
p.room.should eql nil
|
129
|
+
p.door.should eql 'door'
|
130
|
+
p.action.should eql 'action'
|
131
|
+
#
|
132
|
+
p.dst_routed! d0
|
133
|
+
#
|
134
|
+
p.dst.should be d0
|
135
|
+
p.split_dst!
|
136
|
+
p.room.should eql nil
|
137
|
+
p.door.should eql nil
|
138
|
+
p.action.should eql 'action'
|
139
|
+
#
|
140
|
+
end
|
141
|
+
#
|
142
|
+
it "routing: error!" do
|
143
|
+
p = Iotas::Particle.new
|
144
|
+
d = Iotas::Door.new 'door', nil
|
145
|
+
p.src = d
|
146
|
+
p.add_dsts 'door?action,?action'
|
147
|
+
p.next_dst.should eql 'door?action'
|
148
|
+
p.error! 'err_msg'
|
149
|
+
p[Iotas::FIELD_ERROR_MSG].should eql 'err_msg'
|
150
|
+
p.action.should eq Iotas::ACT_ERROR
|
151
|
+
p.dst.should be d
|
152
|
+
end
|
153
|
+
#
|
154
|
+
it "link fields and link value" do
|
155
|
+
p = Iotas::Particle.new
|
156
|
+
p['k0'] = 'v0'
|
157
|
+
p['k1'] = 'v1'
|
158
|
+
p['k2'] = 'v2'
|
159
|
+
p.set_link_fields 'k0,k2'
|
160
|
+
p.link_value.should eql 'v0v2'
|
161
|
+
p.set_link_fields 'k1,k0'
|
162
|
+
p.link_value.should eql 'v1v0'
|
163
|
+
p['k0']='vx'
|
164
|
+
p.link_value.should eql 'v1vx'
|
165
|
+
end
|
166
|
+
#
|
167
|
+
it "apply_link!" do
|
168
|
+
p = Iotas::Particle.new
|
169
|
+
p['k0'] = 'v0'
|
170
|
+
p['k1'] = 'v1'
|
171
|
+
p['k2'] = 'v2'
|
172
|
+
p.set_link_fields 'k0,k2'
|
173
|
+
p.add_dsts 'door?action,?action'
|
174
|
+
p.src.should be_nil
|
175
|
+
p.link_value.should eql 'v0v2'
|
176
|
+
p.next_dst.should eql 'door?action'
|
177
|
+
lnk = Iotas::Link.new('door0', 'door1?get,door2', 'k1', 'f0,f1', 'v0v1')
|
178
|
+
f = Fake.new 'fake', nil
|
179
|
+
lnk.door = f
|
180
|
+
p.apply_link! lnk
|
181
|
+
p.src.should be f
|
182
|
+
p.next_dst.should eql 'door1?get'
|
183
|
+
p.link_value.should eql 'v1'
|
184
|
+
end
|
185
|
+
#
|
186
|
+
it "particle->json->particle" do
|
187
|
+
s0 = Iotas::Spin.new 'top'
|
188
|
+
s1 = Iotas::Room.new 'room0', s0
|
189
|
+
s2 = Iotas::Room.new 'room1', s1
|
190
|
+
s3 = Iotas::Door.new 'doora', s2
|
191
|
+
s4 = Iotas::Door.new 'doorb', s1
|
192
|
+
p0 = Iotas::Particle.new
|
193
|
+
p0['k0'] = 'v0'
|
194
|
+
p0['k1'] = 'v1'
|
195
|
+
p0['k2'] = 'v2'
|
196
|
+
p0.src = s3
|
197
|
+
p0.set_link_fields 'k0,k2'
|
198
|
+
p0.add_dsts 'room0/room1/room2/doorX?myaction,door?action,?action'
|
199
|
+
p0.split_dst!
|
200
|
+
p1 = Iotas::Particle.new
|
201
|
+
p1['k3'] = 'v6'
|
202
|
+
p1['k4'] = 'v7'
|
203
|
+
p1['k5'] = 'v8'
|
204
|
+
p1.src = s3
|
205
|
+
p1.dst_routed! s4
|
206
|
+
p1.set_link_fields 'k5,k4,k3'
|
207
|
+
p1.add_dsts 'room0/room1/door?action,output?action'
|
208
|
+
p0.merge! p1
|
209
|
+
o = JSON.load( JSON.generate(p0) )
|
210
|
+
o['spin'] = s0
|
211
|
+
px = Iotas::Particle.json_create( o )
|
212
|
+
((px.ts-p0.ts)<0.5).should be_true
|
213
|
+
px.src.should be s3
|
214
|
+
px.dst.should be_nil
|
215
|
+
px.room.should eql 'room0/room1/room2'
|
216
|
+
px.door.should eql 'doorX'
|
217
|
+
px.action.should eql 'myaction'
|
218
|
+
px.next_dst.should eql 'room0/room1/room2/doorX?myaction'
|
219
|
+
px.link_value.should eql 'v0v2'
|
220
|
+
px['k0'].should eql 'v0'
|
221
|
+
px['k1'].should eql 'v1'
|
222
|
+
px['k2'].should eql 'v2'
|
223
|
+
py = px.merged(0)
|
224
|
+
((py.ts-p1.ts)<0.5).should be_true
|
225
|
+
py.src.should be s3
|
226
|
+
py.dst.should be s4
|
227
|
+
py.room.should be_nil
|
228
|
+
py.door.should be_nil
|
229
|
+
py.action.should be_nil
|
230
|
+
py.next_dst.should eql 'room0/room1/door?action'
|
231
|
+
py.link_value.should eql 'v8v7v6'
|
232
|
+
py['k3'].should eql 'v6'
|
233
|
+
py['k4'].should eql 'v7'
|
234
|
+
py['k5'].should eql 'v8'
|
235
|
+
JSON.generate(p0).should eql JSON.generate(px)
|
236
|
+
end
|
237
|
+
#
|
238
|
+
end
|
239
|
+
#
|
240
|
+
# EOF
|
data/spec/room_spec.rb
ADDED
@@ -0,0 +1,304 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
# -*- coding: UTF-8 -*-
|
3
|
+
#
|
4
|
+
|
5
|
+
require 'spec_helper'
|
6
|
+
#
|
7
|
+
describe Iotas::Room do
|
8
|
+
#
|
9
|
+
before (:all) do
|
10
|
+
@spin = Iotas::Spin.new 'dom0'
|
11
|
+
end
|
12
|
+
#
|
13
|
+
before(:each) do
|
14
|
+
@spin.clear!
|
15
|
+
end
|
16
|
+
#
|
17
|
+
it "add_iota and add_link correctly" do
|
18
|
+
r0 = Iotas::Room.new 'room0', @spin
|
19
|
+
d0 = Iotas::Door.new 'door0', r0
|
20
|
+
lambda { Iotas::Door.new('door0', r0) }.should raise_error(Iotas::Exception)
|
21
|
+
lambda { r0.add_iota Iotas::Door.new('door1', r0) }.should raise_error(Iotas::Exception)
|
22
|
+
r0.add_link Iotas::Link.new 'door0', 'somewhere'
|
23
|
+
lambda { r0.add_link(Iotas::Link.new('nowhere', 'somewhere')) }.should raise_error(Iotas::Exception)
|
24
|
+
end
|
25
|
+
#
|
26
|
+
it "start! and stop! should work" do
|
27
|
+
r0 = Iotas::Room.new 'room0', @spin
|
28
|
+
d0 = Fake.new 'fake', r0
|
29
|
+
d0.start.should be_nil
|
30
|
+
d0.stop.should be_nil
|
31
|
+
r0.start!
|
32
|
+
d0.start.should be_true
|
33
|
+
d0.stop.should be_nil
|
34
|
+
r0.stop!
|
35
|
+
d0.start.should be_true
|
36
|
+
d0.stop.should be_true
|
37
|
+
end
|
38
|
+
#
|
39
|
+
it "parent, spin and search_down should be ok" do
|
40
|
+
r0 = Iotas::Room.new 'r0', @spin
|
41
|
+
r1 = Iotas::Room.new 'r1', r0
|
42
|
+
r2 = Iotas::Room.new 'r2', r1
|
43
|
+
r3 = Iotas::Room.new 'r3', @spin
|
44
|
+
r4 = Iotas::Room.new 'r4', r3
|
45
|
+
r2.parent.should be r1
|
46
|
+
r1.parent.should be r0
|
47
|
+
r0.parent.should be @spin
|
48
|
+
r0.spin.should be @spin
|
49
|
+
r1.spin.should be @spin
|
50
|
+
r2.spin.should be @spin
|
51
|
+
r3.spin.should be @spin
|
52
|
+
@spin.search_down('dom0/r0/r1/r2').should be r2
|
53
|
+
r0.search_down('dom0/r0/r1/r2').should be r2
|
54
|
+
r1.search_down('dom0/r0/r1/r2').should be r2
|
55
|
+
r2.search_down('dom0/r0/r1/r2').should be r2
|
56
|
+
r1.search_down('dom0/r0/r1/r9').should be nil
|
57
|
+
r3.search_down('dom0/r0/r1/r2').should be nil
|
58
|
+
r4.search_down('dom0/r0/r1/r2').should be nil
|
59
|
+
end
|
60
|
+
#
|
61
|
+
it "route error: no source" do
|
62
|
+
room = Iotas::Room.new 'room', @spin
|
63
|
+
p = @spin.require_p Iotas::Particle
|
64
|
+
p.set_dst! 'get', 'room/door'
|
65
|
+
room.send_p p
|
66
|
+
p.action.should eql Iotas::ACT_ERROR
|
67
|
+
p[Iotas::FIELD_ERROR_MSG].should eql Iotas::ERROR_ROUTE_NS
|
68
|
+
p.dst.should be room.spin
|
69
|
+
end
|
70
|
+
#
|
71
|
+
it "route error: no destination no links" do
|
72
|
+
room = Iotas::Room.new 'room', @spin
|
73
|
+
p = @spin.require_p Iotas::Particle
|
74
|
+
p.src = Fake.new 'fake', @spin
|
75
|
+
room.send_p p
|
76
|
+
p.action.should eql Iotas::ACT_ERROR
|
77
|
+
p[Iotas::FIELD_ERROR_MSG].should eql Iotas::ERROR_ROUTE_NDNL
|
78
|
+
p.dst.should be p.src
|
79
|
+
end
|
80
|
+
#
|
81
|
+
it "route error: top room, wrong room" do
|
82
|
+
room0 = Iotas::Room.new 'room0', @spin
|
83
|
+
room1 = Iotas::Room.new 'room1', room0
|
84
|
+
p = @spin.require_p Iotas::Particle
|
85
|
+
p.src = Fake.new 'fake', @spin
|
86
|
+
p.set_dst! 'get', 'noroom/door'
|
87
|
+
room1.send_p p
|
88
|
+
p.action.should eql Iotas::ACT_ERROR
|
89
|
+
p[Iotas::FIELD_ERROR_MSG].should eql Iotas::ERROR_ROUTE_TRWR
|
90
|
+
p.dst.should be p.src
|
91
|
+
end
|
92
|
+
#
|
93
|
+
it "route error: right room, wrong door" do
|
94
|
+
room = Iotas::Room.new 'room', @spin
|
95
|
+
p = @spin.require_p Iotas::Particle
|
96
|
+
p.src = Fake.new 'fake', @spin
|
97
|
+
p.set_dst! 'get', 'dom0/room/nodoor'
|
98
|
+
room.send_p p
|
99
|
+
p.action.should eql Iotas::ACT_ERROR
|
100
|
+
p[Iotas::FIELD_ERROR_MSG].should eql Iotas::ERROR_ROUTE_RRWD
|
101
|
+
p.dst.should be p.src
|
102
|
+
end
|
103
|
+
#
|
104
|
+
it "route error: right room, wrong door (bubble up)" do
|
105
|
+
room0 = Iotas::Room.new 'room0', @spin
|
106
|
+
room1 = Iotas::Room.new 'room1', room0
|
107
|
+
p = @spin.require_p Iotas::Particle
|
108
|
+
p.src = Fake.new 'fake', @spin
|
109
|
+
p.set_dst! 'get', 'dom0/room0/nodoor'
|
110
|
+
room1.send_p p
|
111
|
+
p.action.should eql Iotas::ACT_ERROR
|
112
|
+
p[Iotas::FIELD_ERROR_MSG].should eql Iotas::ERROR_ROUTE_RRWD
|
113
|
+
p.dst.should be p.src
|
114
|
+
end
|
115
|
+
#
|
116
|
+
it "routing success (direct)" do
|
117
|
+
room0 = Iotas::Room.new 'room0', @spin
|
118
|
+
door0 = Iotas::Door.new 'door0', room0
|
119
|
+
p = @spin.require_p Iotas::Particle
|
120
|
+
p.src = Fake.new 'fake', @spin
|
121
|
+
p.set_dst! 'get', 'door0'
|
122
|
+
room0.send_p p
|
123
|
+
p.action.should eql 'get'
|
124
|
+
p.dst.should be door0
|
125
|
+
end
|
126
|
+
#
|
127
|
+
it "routing success (bubble up the direct door)" do
|
128
|
+
room0 = Iotas::Room.new 'room0', @spin
|
129
|
+
room1 = Iotas::Room.new 'room1', room0
|
130
|
+
door0 = Iotas::Door.new 'door0', room0
|
131
|
+
p = @spin.require_p Iotas::Particle
|
132
|
+
p.src = Fake.new 'fake', @spin
|
133
|
+
p.set_dst! 'get', 'dom0/room0/door0'
|
134
|
+
room1.send_p p
|
135
|
+
p.action.should eql 'get'
|
136
|
+
p.dst.should be door0
|
137
|
+
end
|
138
|
+
#
|
139
|
+
it "route success: bubble up x2, drill down x3" do
|
140
|
+
room00 = Iotas::Room.new 'room00', @spin
|
141
|
+
room01 = Iotas::Room.new 'room01', room00
|
142
|
+
room02 = Iotas::Room.new 'room02', room01
|
143
|
+
door000 = Iotas::Door.new 'door000', room02
|
144
|
+
room10 = Iotas::Room.new 'room10', @spin
|
145
|
+
room11 = Iotas::Room.new 'room11', room10
|
146
|
+
p = @spin.require_p Iotas::Particle
|
147
|
+
p.src = Fake.new 'fake', @spin
|
148
|
+
p.set_dst! 'get', 'dom0/room00/room01/room02/door000'
|
149
|
+
room11.send_p p
|
150
|
+
p.action.should eql 'get'
|
151
|
+
p.dst.should be door000
|
152
|
+
end
|
153
|
+
#
|
154
|
+
it "route error: bubble up x2 drill down x2" do
|
155
|
+
room00 = Iotas::Room.new 'room00', @spin
|
156
|
+
room01 = Iotas::Room.new 'room01', room00
|
157
|
+
room02 = Iotas::Room.new 'room02', room01
|
158
|
+
door000 = Iotas::Door.new 'door000', room02
|
159
|
+
room10 = Iotas::Room.new 'room10', @spin
|
160
|
+
room11 = Iotas::Room.new 'room11', room10
|
161
|
+
p = @spin.require_p Iotas::Particle
|
162
|
+
p.src = Fake.new 'fake', @spin
|
163
|
+
p.set_dst! 'get', 'dom0/room00/room01/wrong/door000'
|
164
|
+
room11.send_p p
|
165
|
+
p.action.should eql Iotas::ACT_ERROR
|
166
|
+
p[Iotas::FIELD_ERROR_MSG].should eql Iotas::ERROR_ROUTE_DDWR
|
167
|
+
p.dst.should be p.src
|
168
|
+
end
|
169
|
+
#
|
170
|
+
it "routing success: no door name -> src" do
|
171
|
+
room0 = Iotas::Room.new 'room0', @spin
|
172
|
+
door0 = Iotas::Door.new 'door0', room0
|
173
|
+
p = @spin.require_p Iotas::Particle
|
174
|
+
p.src = door0
|
175
|
+
p.set_dst! 'get'
|
176
|
+
room0.send_p p
|
177
|
+
p.action.should eql 'get'
|
178
|
+
p.dst.should be door0
|
179
|
+
end
|
180
|
+
#
|
181
|
+
it "routing success: unconditional link" do
|
182
|
+
room0 = Iotas::Room.new 'room0', @spin
|
183
|
+
door0 = Iotas::Door.new 'door0', room0
|
184
|
+
door1 = Iotas::Door.new 'door1', room0
|
185
|
+
room0.add_link Iotas::Link.new('door0', 'door1')
|
186
|
+
p = @spin.require_p Iotas::Particle
|
187
|
+
door0.send_p p
|
188
|
+
p.action.should be_nil
|
189
|
+
p.dst.should be door1
|
190
|
+
end
|
191
|
+
#
|
192
|
+
it "routing success: conditional link" do
|
193
|
+
room0 = Iotas::Room.new 'room0', @spin
|
194
|
+
door0 = Iotas::Door.new 'door0', room0
|
195
|
+
door1 = Iotas::Door.new 'door1', room0
|
196
|
+
room0.add_link Iotas::Link.new('door0', 'door1', 'fields', 'f0,f1', 'v0v1')
|
197
|
+
p = @spin.require_p Iotas::Particle
|
198
|
+
p['f0']='v0'
|
199
|
+
p['f1']='v1'
|
200
|
+
door0.send_p p
|
201
|
+
p.action.should be_nil
|
202
|
+
p.src.should be door0
|
203
|
+
p.dst.should be door1
|
204
|
+
end
|
205
|
+
#
|
206
|
+
it "routing success: more then one matching link" do
|
207
|
+
room0 = Iotas::Room.new 'room0', @spin
|
208
|
+
door0 = Iotas::Door.new 'door0', room0
|
209
|
+
class Out < Iotas::Door
|
210
|
+
attr_reader :ps
|
211
|
+
def receive_p p
|
212
|
+
@ps||=[]
|
213
|
+
@ps << p
|
214
|
+
end
|
215
|
+
end
|
216
|
+
door1 = Out.new 'door1', room0
|
217
|
+
room0.add_link Iotas::Link.new('door0', 'door1')
|
218
|
+
room0.add_link Iotas::Link.new('door0', 'door1', 'fields', 'f0,f1', 'v0v1')
|
219
|
+
p = @spin.require_p Iotas::Particle
|
220
|
+
p['f0']='v0'
|
221
|
+
p['f1']='v1'
|
222
|
+
door0.send_p p
|
223
|
+
@spin.spin!
|
224
|
+
door1.ps.length.should eql 2
|
225
|
+
p0 = door1.ps[0]
|
226
|
+
p0.action.should be_nil
|
227
|
+
p0.src.should be door0
|
228
|
+
p0.dst.should be door1
|
229
|
+
p1 = door1.ps[1]
|
230
|
+
p1.action.should be_nil
|
231
|
+
p1.src.should be door0
|
232
|
+
p1.dst.should be door1
|
233
|
+
p1.should be p
|
234
|
+
end
|
235
|
+
#
|
236
|
+
it "system route error: system no destination" do
|
237
|
+
room0 = Iotas::Room.new 'room0', @spin
|
238
|
+
p = @spin.require_p Iotas::Particle
|
239
|
+
room0.send_sys_p p
|
240
|
+
p.action.should eql Iotas::ACT_ERROR
|
241
|
+
p[Iotas::FIELD_ERROR_MSG].should eql Iotas::ERROR_ROUTE_SND
|
242
|
+
end
|
243
|
+
#
|
244
|
+
it "system routing success: action only" do
|
245
|
+
room0 = Iotas::Room.new 'room0', @spin
|
246
|
+
p = @spin.require_p Iotas::Particle
|
247
|
+
p.set_dst! Iotas::SYS_ACT_ADD_LINK
|
248
|
+
room0.send_sys_p p
|
249
|
+
p.action.should eql Iotas::SYS_ACT_ADD_LINK
|
250
|
+
p.dst.should be room0.spin
|
251
|
+
end
|
252
|
+
#
|
253
|
+
it "system routing success" do
|
254
|
+
room0 = Iotas::Room.new 'room0', @spin
|
255
|
+
door0 = Iotas::Door.new 'door0', room0
|
256
|
+
p = @spin.require_p Iotas::Particle
|
257
|
+
p.set_dst! Iotas::SYS_ACT_ADD_LINK, 'dom0/room0/door0'
|
258
|
+
room0.send_sys_p p
|
259
|
+
p.action.should eql Iotas::SYS_ACT_ADD_LINK
|
260
|
+
p.dst.should be door0
|
261
|
+
end
|
262
|
+
#
|
263
|
+
it "SYS_ACT_ADD_LINK" do
|
264
|
+
room0 = Iotas::Room.new 'room0', @spin
|
265
|
+
door0 = Iotas::Door.new 'door0', room0
|
266
|
+
door1 = Iotas::Door.new 'door1', room0
|
267
|
+
p0 = @spin.require_p Iotas::Particle
|
268
|
+
p0.set_data Iotas::LNK_SRC, 'door0'
|
269
|
+
p0.set_data Iotas::LNK_DSTS, 'door1'
|
270
|
+
p0.set_data Iotas::LNK_FIELDS, 'fields'
|
271
|
+
p0.set_data Iotas::LNK_CONDF, 'f0,f1'
|
272
|
+
p0.set_data Iotas::LNK_CONDV, 'v0v1'
|
273
|
+
p0.set_dst! Iotas::SYS_ACT_ADD_LINK, room0.path
|
274
|
+
room0.send_sys_p p0
|
275
|
+
@spin.spin!
|
276
|
+
p = @spin.require_p Iotas::Particle
|
277
|
+
p['f0']='v0'
|
278
|
+
p['f1']='v1'
|
279
|
+
door0.send_p p
|
280
|
+
p.action.should be_nil
|
281
|
+
p.src.should be door0
|
282
|
+
p.dst.should be door1
|
283
|
+
end
|
284
|
+
#
|
285
|
+
it "room->json->room" do
|
286
|
+
r0 = Iotas::Room.new 'r0', @spin
|
287
|
+
r1 = Iotas::Room.new 'r1', r0
|
288
|
+
r2 = Iotas::Room.new 'r2', r1
|
289
|
+
r3 = Iotas::Room.new 'r3', r1
|
290
|
+
r4 = Iotas::Room.new 'r4', r3
|
291
|
+
d0 = Iotas::Door.new 'd0', r1
|
292
|
+
d1 = Iotas::Door.new 'd1', r1
|
293
|
+
d2 = Iotas::Door.new 'd2', r2
|
294
|
+
r1.add_link Iotas::Link.new('d0', 'd1', 'fields', 'f0,f1', 'v0v1')
|
295
|
+
r1.add_link Iotas::Link.new('d0', 'd2')
|
296
|
+
r1.add_link Iotas::Link.new('d1', 'd0')
|
297
|
+
r2.add_link Iotas::Link.new('d2', 'd1', 'fies', 'f5,f1', 'v9v1')
|
298
|
+
rx = Iotas::Room.json_create( JSON.load( JSON.generate(r0) ) )
|
299
|
+
JSON.generate(r0).should eql JSON.generate(rx)
|
300
|
+
end#
|
301
|
+
#
|
302
|
+
end
|
303
|
+
#
|
304
|
+
# EOF
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
# -*- coding: UTF-8 -*-
|
3
|
+
#
|
4
|
+
begin
|
5
|
+
require 'simplecov'
|
6
|
+
SimpleCov.start do
|
7
|
+
add_filter 'spec'
|
8
|
+
end
|
9
|
+
rescue LoadError
|
10
|
+
end
|
11
|
+
#
|
12
|
+
require 'iotas'
|
13
|
+
#
|
14
|
+
class Fake < Iotas::Iota
|
15
|
+
attr_reader :p, :sp, :start, :stop
|
16
|
+
def process_p p
|
17
|
+
@p = p
|
18
|
+
end
|
19
|
+
def process_sys_p p
|
20
|
+
@sp = p
|
21
|
+
end
|
22
|
+
def send_p p
|
23
|
+
@p = p
|
24
|
+
end
|
25
|
+
def send_sys_p p
|
26
|
+
@sp = p
|
27
|
+
end
|
28
|
+
def add_iota p
|
29
|
+
end
|
30
|
+
def start!
|
31
|
+
@start=true
|
32
|
+
end
|
33
|
+
def stop!
|
34
|
+
@stop=true
|
35
|
+
end
|
36
|
+
end
|
37
|
+
#
|
38
|
+
# EOF
|