iotas 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -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