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.
@@ -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