edoors-ruby 0.0.6

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.
@@ -0,0 +1,315 @@
1
+ #! /usr/bin/env ruby
2
+ # -*- coding: UTF-8 -*-
3
+ #
4
+
5
+ require 'spec_helper'
6
+ #
7
+ describe Edoors::Room do
8
+ #
9
+ before (:all) do
10
+ @spin = Edoors::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 = Edoors::Room.new 'room0', @spin
19
+ d0 = Edoors::Door.new 'door0', r0
20
+ lambda { Edoors::Door.new('door0', r0) }.should raise_error(Edoors::Exception)
21
+ lambda { r0.add_iota Edoors::Door.new('door1', r0) }.should raise_error(Edoors::Exception)
22
+ r0.add_link Edoors::Link.new 'door0', 'somewhere'
23
+ lambda { r0.add_link(Edoors::Link.new('nowhere', 'somewhere')) }.should raise_error(Edoors::Exception)
24
+ end
25
+ #
26
+ it "start! and stop! should work" do
27
+ r0 = Edoors::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 = Edoors::Room.new 'r0', @spin
41
+ r1 = Edoors::Room.new 'r1', r0
42
+ r2 = Edoors::Room.new 'r2', r1
43
+ r3 = Edoors::Room.new 'r3', @spin
44
+ r4 = Edoors::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 "routing success (direct add_dst)" do
62
+ room0 = Edoors::Room.new 'room0', @spin
63
+ door0 = Edoors::Door.new 'door0', room0
64
+ p = @spin.require_p Edoors::Particle
65
+ p.init! Fake.new( 'fake', @spin)
66
+ p.add_dst 'get', 'door0'
67
+ room0.send_p p
68
+ p.action.should eql 'get'
69
+ p.dst.should be door0
70
+ end
71
+ #
72
+ it "routing success (direct send to self)" do
73
+ room0 = Edoors::Room.new 'room0', @spin
74
+ door0 = Edoors::Door.new 'door0', room0
75
+ p = @spin.require_p Edoors::Particle
76
+ p.init! Fake.new( 'fake', @spin)
77
+ door0.send_p p, 'get'
78
+ p.action.should eql 'get'
79
+ p.dst.should be door0
80
+ end
81
+ #
82
+ it "routing success (direct send to pointer)" do
83
+ room0 = Edoors::Room.new 'room0', @spin
84
+ door0 = Edoors::Door.new 'door0', room0
85
+ p = @spin.require_p Edoors::Particle
86
+ p.init! Fake.new( 'fake', @spin)
87
+ door0.send_p p, 'get', door0
88
+ p.action.should eql 'get'
89
+ p.dst.should be door0
90
+ end
91
+ #
92
+ it "routing success (direct send to path)" do
93
+ room0 = Edoors::Room.new 'room0', @spin
94
+ door0 = Edoors::Door.new 'door0', room0
95
+ p = @spin.require_p Edoors::Particle
96
+ p.init! Fake.new( 'fake', @spin)
97
+ door0.send_p p, 'get', door0.path
98
+ p.action.should eql 'get'
99
+ p.dst.should be door0
100
+ end
101
+ #
102
+ it "routing success through Spin@world" do
103
+ room0 = Edoors::Room.new 'room0', @spin
104
+ room1 = Edoors::Room.new 'room1', room0
105
+ door0 = Edoors::Door.new 'door0', room1
106
+ p = @spin.require_p Edoors::Particle
107
+ p.init! Fake.new('fake', @spin)
108
+ p.add_dst 'get', 'dom0/room0/room1/door0'
109
+ room0.send_p p
110
+ p.action.should eql 'get'
111
+ p.dst.should be door0
112
+ end
113
+ #
114
+ it "route error: no source" do
115
+ room = Edoors::Room.new 'room', @spin
116
+ p = @spin.require_p Edoors::Particle
117
+ p.add_dst 'get', 'room/door'
118
+ room.send_p p
119
+ p.action.should eql Edoors::ACT_ERROR
120
+ p[Edoors::FIELD_ERROR_MSG].should eql Edoors::ERROR_ROUTE_NS
121
+ p.dst.should be room.spin
122
+ end
123
+ #
124
+ it "route error: no destination no links" do
125
+ room = Edoors::Room.new 'room', @spin
126
+ p = @spin.require_p Edoors::Particle
127
+ p.init! Fake.new('fake', @spin)
128
+ room.send_p p
129
+ p.action.should eql Edoors::ACT_ERROR
130
+ p[Edoors::FIELD_ERROR_MSG].should eql Edoors::ERROR_ROUTE_NDNL
131
+ p.dst.should be p.src
132
+ end
133
+ #
134
+ it "route error: no rooom, wrong door -> right room wrong door" do
135
+ room0 = Edoors::Room.new 'room0', @spin
136
+ p = @spin.require_p Edoors::Particle
137
+ p.init! Fake.new('fake', @spin)
138
+ p.add_dst 'get', 'nodoor'
139
+ room0.send_p p
140
+ p.action.should eql Edoors::ACT_ERROR
141
+ p[Edoors::FIELD_ERROR_MSG].should eql Edoors::ERROR_ROUTE_RRWD
142
+ p.dst.should be p.src
143
+ end
144
+ #
145
+ it "route error: right rooom, wrong door -> right room wrong door" do
146
+ room0 = Edoors::Room.new 'room0', @spin
147
+ p = @spin.require_p Edoors::Particle
148
+ p.init! Fake.new('fake', @spin)
149
+ p.add_dst 'get', 'dom0/room0/nodoor'
150
+ room0.send_p p
151
+ p.action.should eql Edoors::ACT_ERROR
152
+ p[Edoors::FIELD_ERROR_MSG].should eql Edoors::ERROR_ROUTE_RRWD
153
+ p.dst.should be p.src
154
+ end
155
+ #
156
+ it "route error: right room, wrong door through Spin@world -> does not exists" do
157
+ room0 = Edoors::Room.new 'room0', @spin
158
+ room1 = Edoors::Room.new 'room1', room0
159
+ p = @spin.require_p Edoors::Particle
160
+ p.init! Fake.new('fake', room0)
161
+ p.add_dst 'get', 'dom0/room0/nodoor'
162
+ room1.send_p p
163
+ p.action.should eql Edoors::ACT_ERROR
164
+ p[Edoors::FIELD_ERROR_MSG].should eql Edoors::ERROR_ROUTE_DNE
165
+ p.dst.should be p.src
166
+ end
167
+ #
168
+ it "route error: wrong room, right door through Spin@world -> does not exists" do
169
+ room0 = Edoors::Room.new 'room0', @spin
170
+ room1 = Edoors::Room.new 'room1', room0
171
+ p = @spin.require_p Edoors::Particle
172
+ p.init! Fake.new('fake', @spin)
173
+ p.add_dst 'get', 'dom0/noroom/fake'
174
+ room1.send_p p
175
+ p.action.should eql Edoors::ACT_ERROR
176
+ p[Edoors::FIELD_ERROR_MSG].should eql Edoors::ERROR_ROUTE_DNE
177
+ p.dst.should be p.src
178
+ end
179
+ #
180
+ it "routing ~failure: no door name -> src" do
181
+ room0 = Edoors::Room.new 'room0', @spin
182
+ door0 = Edoors::Door.new 'door0', room0
183
+ p = @spin.require_p Edoors::Particle
184
+ p.init! door0
185
+ p.add_dst 'get'
186
+ room0.send_p p
187
+ p.action.should eql 'get'
188
+ p.dst.should be door0
189
+ end
190
+ #
191
+ it "routing success: unconditional link" do
192
+ room0 = Edoors::Room.new 'room0', @spin
193
+ door0 = Edoors::Door.new 'door0', room0
194
+ door1 = Edoors::Door.new 'door1', room0
195
+ room0.add_link Edoors::Link.new('door0', 'door1')
196
+ p = @spin.require_p Edoors::Particle
197
+ door0.send_p p
198
+ p.action.should be_nil
199
+ p.dst.should be door1
200
+ end
201
+ #
202
+ it "routing success: conditional link" do
203
+ room0 = Edoors::Room.new 'room0', @spin
204
+ door0 = Edoors::Door.new 'door0', room0
205
+ door1 = Edoors::Door.new 'door1', room0
206
+ room0.add_link Edoors::Link.new('door0', 'door1', 'fields', 'f0,f1', 'v0v1')
207
+ p = @spin.require_p Edoors::Particle
208
+ p['f0']='v0'
209
+ p['f1']='v1'
210
+ door0.send_p p
211
+ p.action.should be_nil
212
+ p.src.should be door0
213
+ p.dst.should be door1
214
+ end
215
+ #
216
+ it "routing success: more then one matching link" do
217
+ room0 = Edoors::Room.new 'room0', @spin
218
+ door0 = Edoors::Door.new 'door0', room0
219
+ class Out < Edoors::Door
220
+ attr_reader :count
221
+ def receive_p p
222
+ @count||=0
223
+ @count += 1
224
+ end
225
+ end
226
+ door1 = Out.new 'door1', room0
227
+ room0.add_link Edoors::Link.new('door0', 'door1')
228
+ room0.add_link Edoors::Link.new('door0', 'door1', 'fields', 'f0,f1', 'v0v1')
229
+ room0.add_link Edoors::Link.new('door0', 'door1', 'fields', 'f0,f1', 'v0v2')
230
+ p = @spin.require_p Edoors::Particle
231
+ p['f0']='v0'
232
+ p['f1']='v1'
233
+ door0.send_p p
234
+ @spin.spin!
235
+ door1.count.should eql 2
236
+ end
237
+ #
238
+ it "system route error: system no destination" do
239
+ room0 = Edoors::Room.new 'room0', @spin
240
+ p = @spin.require_p Edoors::Particle
241
+ room0.send_sys_p p
242
+ p.action.should eql Edoors::ACT_ERROR
243
+ p[Edoors::FIELD_ERROR_MSG].should eql Edoors::ERROR_ROUTE_SND
244
+ end
245
+ #
246
+ it "system routing success: action only" do
247
+ room0 = Edoors::Room.new 'room0', @spin
248
+ p = @spin.require_p Edoors::Particle
249
+ p.add_dst Edoors::SYS_ACT_ADD_LINK
250
+ room0.send_sys_p p
251
+ p.action.should eql Edoors::SYS_ACT_ADD_LINK
252
+ p.dst.should be room0.spin
253
+ end
254
+ #
255
+ it "system routing success (add_dst)" do
256
+ room0 = Edoors::Room.new 'room0', @spin
257
+ door0 = Edoors::Door.new 'door0', room0
258
+ p = @spin.require_p Edoors::Particle
259
+ p.add_dst Edoors::SYS_ACT_ADD_LINK, 'dom0/room0/door0'
260
+ room0.send_sys_p p
261
+ p.action.should eql Edoors::SYS_ACT_ADD_LINK
262
+ p.dst.should be door0
263
+ end
264
+ #
265
+ it "system routing success (send_sys_p)" do
266
+ room0 = Edoors::Room.new 'room0', @spin
267
+ door0 = Edoors::Door.new 'door0', room0
268
+ p = @spin.require_p Edoors::Particle
269
+ door0.send_sys_p p, Edoors::SYS_ACT_ADD_LINK
270
+ p.action.should eql Edoors::SYS_ACT_ADD_LINK
271
+ p.dst.should be door0
272
+ end
273
+ #
274
+ it "SYS_ACT_ADD_LINK" do
275
+ room0 = Edoors::Room.new 'room0', @spin
276
+ door0 = Edoors::Door.new 'door0', room0
277
+ door1 = Edoors::Door.new 'door1', room0
278
+ p0 = @spin.require_p Edoors::Particle
279
+ p0.set_data Edoors::LNK_SRC, 'door0'
280
+ p0.set_data Edoors::LNK_DSTS, 'door1'
281
+ p0.set_data Edoors::LNK_FIELDS, 'fields'
282
+ p0.set_data Edoors::LNK_CONDF, 'f0,f1'
283
+ p0.set_data Edoors::LNK_CONDV, 'v0v1'
284
+ p0.add_dst Edoors::SYS_ACT_ADD_LINK, room0.path
285
+ room0.send_sys_p p0
286
+ @spin.spin!
287
+ p = @spin.require_p Edoors::Particle
288
+ p['f0']='v0'
289
+ p['f1']='v1'
290
+ door0.send_p p
291
+ p.action.should be_nil
292
+ p.src.should be door0
293
+ p.dst.should be door1
294
+ end
295
+ #
296
+ it "room->json->room" do
297
+ r0 = Edoors::Room.new 'r0', @spin
298
+ r1 = Edoors::Room.new 'r1', r0
299
+ r2 = Edoors::Room.new 'r2', r1
300
+ r3 = Edoors::Room.new 'r3', r1
301
+ r4 = Edoors::Room.new 'r4', r3
302
+ d0 = Edoors::Door.new 'd0', r1
303
+ d1 = Edoors::Door.new 'd1', r1
304
+ d2 = Edoors::Door.new 'd2', r2
305
+ r1.add_link Edoors::Link.new('d0', 'd1', 'fields', 'f0,f1', 'v0v1')
306
+ r1.add_link Edoors::Link.new('d0', 'd2')
307
+ r1.add_link Edoors::Link.new('d1', 'd0')
308
+ r2.add_link Edoors::Link.new('d2', 'd1', 'fies', 'f5,f1', 'v9v1')
309
+ rx = Edoors::Room.json_create( JSON.load( JSON.generate(r0) ) )
310
+ JSON.generate(r0).should eql JSON.generate(rx)
311
+ end#
312
+ #
313
+ end
314
+ #
315
+ # EOF
@@ -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 'edoors'
13
+ #
14
+ class Fake < Edoors::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
@@ -0,0 +1,132 @@
1
+ #! /usr/bin/env ruby
2
+ # -*- coding: UTF-8 -*-
3
+ #
4
+
5
+ require 'spec_helper'
6
+ #
7
+ describe Edoors::Spin do
8
+ #
9
+ class MyP < Edoors::Particle; end
10
+ #
11
+ it "Particles pool" do
12
+ spin = Edoors::Spin.new 'dom0'
13
+ p0 = spin.require_p Edoors::Particle
14
+ p1 = spin.require_p Edoors::Particle
15
+ (p0===p1).should be_false
16
+ spin.release_p p0
17
+ p2 = spin.require_p Edoors::Particle
18
+ (p0===p2).should be_true
19
+ end
20
+ #
21
+ it "different Particles classes in pool" do
22
+ spin = Edoors::Spin.new 'dom0'
23
+ p0 = spin.require_p Edoors::Particle
24
+ p1 = spin.require_p Edoors::Particle
25
+ (p0===p1).should be_false
26
+ spin.release_p p0
27
+ p2 = spin.require_p MyP
28
+ p3 = spin.require_p MyP
29
+ (p2===p3).should be_false
30
+ spin.release_p p2
31
+ p4 = spin.require_p MyP
32
+ (p2===p4).should be_true
33
+ end
34
+ #
35
+ it "release of merged particles" do
36
+ spin = Edoors::Spin.new 'dom0'
37
+ p0 = spin.require_p Edoors::Particle
38
+ p1 = spin.require_p Edoors::Particle
39
+ (p0===p1).should be_false
40
+ p0.merge! p1
41
+ spin.release_p p0
42
+ p2 = spin.require_p Edoors::Particle
43
+ (p2===p0).should be_true
44
+ p3 = spin.require_p Edoors::Particle
45
+ (p3===p1).should be_true
46
+ end
47
+ #
48
+ it "clear!" do
49
+ spin = Edoors::Spin.new 'dom0'
50
+ p0 = spin.require_p Edoors::Particle
51
+ p1 = spin.require_p Edoors::Particle
52
+ spin.send_p p0
53
+ spin.release_p p1
54
+ spin.clear!
55
+ p2 = spin.require_p Edoors::Particle
56
+ (p2==p0).should be_false
57
+ (p2==p1).should be_false
58
+ end
59
+ #
60
+ it "post_p post_sys_p spin!" do
61
+ spin = Edoors::Spin.new 'dom0'
62
+ f = Fake.new 'fake', spin
63
+ p0 = spin.require_p Edoors::Particle
64
+ p0.dst_routed! f
65
+ p1 = spin.require_p Edoors::Particle
66
+ p1.dst_routed! f
67
+ spin.post_p p0
68
+ spin.post_sys_p p1
69
+ spin.run = true
70
+ spin.spin!
71
+ f.p.should be p0
72
+ f.sp.should be p1
73
+ spin.stop!
74
+ end
75
+ #
76
+ it "process_sys" do
77
+ spin = Edoors::Spin.new 'dom0'
78
+ p0 = spin.require_p Edoors::Particle
79
+ p0.add_dst 'unknown'
80
+ spin.send_sys_p p0
81
+ spin.spin!
82
+ p1 = spin.require_p Edoors::Particle
83
+ p0.should be p0
84
+ end
85
+ #
86
+ it "option debug" do
87
+ spin = Edoors::Spin.new 'dom0'
88
+ spin.debug_routing.should be false
89
+ spin.debug_errors.should be false
90
+ spin = Edoors::Spin.new 'dom0', :debug_routing=>true, :debug_errors=>true
91
+ spin.debug_routing.should be true
92
+ spin.debug_errors.should be true
93
+ end
94
+ #
95
+ it "spin->json->spin" do
96
+ spin = Edoors::Spin.new 'dom0', :debug_routing=>true
97
+ r0 = Edoors::Room.new 'r0', spin
98
+ r1 = Edoors::Room.new 'r1', r0
99
+ r2 = Edoors::Room.new 'r2', r1
100
+ r3 = Edoors::Room.new 'r3', r1
101
+ r4 = Edoors::Room.new 'r4', r3
102
+ d0 = Edoors::Door.new 'd0', r1
103
+ d1 = Edoors::Door.new 'd1', r1
104
+ d2 = Edoors::Door.new 'd2', r2
105
+ p0 = spin.require_p Edoors::Particle
106
+ p1 = spin.require_p Edoors::Particle
107
+ p2 = spin.require_p Edoors::Particle
108
+ spin.post_p p0
109
+ spin.post_p p1
110
+ spin.post_sys_p p2
111
+ json = JSON.generate spin
112
+ dom0 = Edoors::Spin.json_create( JSON.load( json ) )
113
+ json.should eql JSON.generate(dom0)
114
+ end
115
+ #
116
+ it "hibernate! resume!" do
117
+ spin = Edoors::Spin.new 'dom0'
118
+ p0 = spin.require_p Edoors::Particle
119
+ p0.add_dst Edoors::SYS_ACT_HIBERNATE
120
+ Edoors::Room.new 'input', spin
121
+ Edoors::Room.new 'output', spin
122
+ spin.add_link Edoors::Link.new('input', 'output', nil, nil, nil)
123
+ spin.send_sys_p p0
124
+ spin.spin!
125
+ dom0 = Edoors::Spin.resume! spin.hibernate_path
126
+ dom0.name.should eql spin.name
127
+ File.unlink dom0.hibernate_path
128
+ end
129
+ #
130
+ end
131
+ #
132
+ #EOF