diff options
Diffstat (limited to 'spec/room_spec.rb')
-rw-r--r-- | spec/room_spec.rb | 259 |
1 files changed, 259 insertions, 0 deletions
diff --git a/spec/room_spec.rb b/spec/room_spec.rb new file mode 100644 index 0000000..92ec90a --- /dev/null +++ b/spec/room_spec.rb @@ -0,0 +1,259 @@ +#! /usr/bin/env ruby +# -*- coding: UTF-8 -*- +# + +require 'spec_helper' +# +describe EvenDoors::Room do + # + it "add_spot and add_link correctly" do + r0 = EvenDoors::Room.new 'room0', nil + d0 = EvenDoors::Door.new 'door0', r0 + lambda { EvenDoors::Door.new('door0', r0) }.should raise_error(EvenDoors::Exception) + lambda { r0.add_spot EvenDoors::Door.new('door1', r0) }.should raise_error(EvenDoors::Exception) + r0.add_link EvenDoors::Link.new 'door0', 'somewhere' + lambda { r0.add_link(EvenDoors::Link.new('nowhere', 'somewhere')) }.should raise_error(EvenDoors::Exception) + end + # + it "start! and stop! should work" do + r0 = EvenDoors::Room.new 'room0', nil + d0 = Fake.new + r0.add_spot d0 + d0.start.should be_nil + d0.stop.should be_nil + r0.start! + d0.start.should be_true + d0.stop.should be_nil + r0.stop! + d0.start.should be_true + d0.stop.should be_true + end + # + it "parent and spin should be ok" do + s = EvenDoors::Spin.new 'dom0' + r0 = EvenDoors::Room.new 'r0', s + r1 = EvenDoors::Room.new 'r0', r0 + r2 = EvenDoors::Room.new 'r0', r1 + r2.parent.should be r1 + r1.parent.should be r0 + r0.parent.should be s + r0.spin.should be s + r1.spin.should be s + r2.spin.should be s + end + # + it "route error: no source" do + room = EvenDoors::Room.new 'room', nil + p = EvenDoors::Spin.require_p EvenDoors::Particle + p.set_dst! 'get', 'room/door' + room.send_p p + p.action.should eql EvenDoors::ACT_ERROR + p[EvenDoors::ERROR_FIELD].should eql EvenDoors::ERROR_ROUTE_NS + p.dst.should be room.spin + end + # + it "route error: no destination no links" do + room = EvenDoors::Room.new 'room', nil + p = EvenDoors::Spin.require_p EvenDoors::Particle + p.src = Fake.new + room.send_p p + p.action.should eql EvenDoors::ACT_ERROR + p[EvenDoors::ERROR_FIELD].should eql EvenDoors::ERROR_ROUTE_NDNL + p.dst.should be p.src + end + # + it "route error: top room, wrong room" do + room0 = EvenDoors::Room.new 'room0', nil + room1 = EvenDoors::Room.new 'room1', room0 + p = EvenDoors::Spin.require_p EvenDoors::Particle + p.src = Fake.new + p.set_dst! 'get', 'noroom/door' + room1.send_p p + p.action.should eql EvenDoors::ACT_ERROR + p[EvenDoors::ERROR_FIELD].should eql EvenDoors::ERROR_ROUTE_TRWR + p.dst.should be p.src + end + # + it "route error: right room, wrong door" do + room = EvenDoors::Room.new 'room', nil + p = EvenDoors::Spin.require_p EvenDoors::Particle + p.src = Fake.new + p.set_dst! 'get', 'room/nodoor' + room.send_p p + p.action.should eql EvenDoors::ACT_ERROR + p[EvenDoors::ERROR_FIELD].should eql EvenDoors::ERROR_ROUTE_RRWD + p.dst.should be p.src + end + # + it "route error: right room, wrong door (bubble up)" do + room0 = EvenDoors::Room.new 'room0', nil + room1 = EvenDoors::Room.new 'room1', room0 + p = EvenDoors::Spin.require_p EvenDoors::Particle + p.src = Fake.new + p.set_dst! 'get', 'room0/nodoor' + room1.send_p p + p.action.should eql EvenDoors::ACT_ERROR + p[EvenDoors::ERROR_FIELD].should eql EvenDoors::ERROR_ROUTE_RRWD + p.dst.should be p.src + end + # + it "routing success (direct)" do + room0 = EvenDoors::Room.new 'room0', nil + door0 = EvenDoors::Door.new 'door0', room0 + p = EvenDoors::Spin.require_p EvenDoors::Particle + p.src = Fake.new + p.set_dst! 'get', 'door0' + room0.send_p p + p.action.should eql 'get' + p.dst.should be door0 + end + # + it "routing success (bubble up the direct door)" do + room0 = EvenDoors::Room.new 'room0', nil + room1 = EvenDoors::Room.new 'room1', room0 + door0 = EvenDoors::Door.new 'door0', room0 + p = EvenDoors::Spin.require_p EvenDoors::Particle + p.src = Fake.new + p.set_dst! 'get', 'room0/door0' + room1.send_p p + p.action.should eql 'get' + p.dst.should be door0 + end + # + it "route error: right room, no drill down (2xbubble up)" do + room0 = EvenDoors::Room.new 'room0', nil + room1 = EvenDoors::Room.new 'room1', room0 + room2 = EvenDoors::Room.new 'room2', room0 + room3 = EvenDoors::Room.new 'room3', room2 + door0 = EvenDoors::Door.new 'door01', room1 + p = EvenDoors::Spin.require_p EvenDoors::Particle + p.src = Fake.new + p.set_dst! 'get', 'room0/room1/door01' + room3.send_p p + p.action.should eql EvenDoors::ACT_ERROR + p[EvenDoors::ERROR_FIELD].should eql EvenDoors::ERROR_ROUTE_RRNDD + p.dst.should be p.src + end + # + it "routing success: no door name -> src" do + room0 = EvenDoors::Room.new 'room0', nil + door0 = EvenDoors::Door.new 'door0', room0 + p = EvenDoors::Spin.require_p EvenDoors::Particle + p.src = door0 + p.set_dst! 'get' + room0.send_p p + p.action.should eql 'get' + p.dst.should be door0 + end + # + it "routing success: unconditional link" do + room0 = EvenDoors::Room.new 'room0', nil + door0 = EvenDoors::Door.new 'door0', room0 + door1 = EvenDoors::Door.new 'door1', room0 + room0.add_link EvenDoors::Link.new('door0', 'door1') + p = EvenDoors::Spin.require_p EvenDoors::Particle + door0.send_p p + p.action.should be_nil + p.dst.should be door1 + end + # + it "routing success: conditional link" do + room0 = EvenDoors::Room.new 'room0', nil + door0 = EvenDoors::Door.new 'door0', room0 + door1 = EvenDoors::Door.new 'door1', room0 + room0.add_link EvenDoors::Link.new('door0', 'door1', 'fields', 'f0,f1', 'v0v1') + p = EvenDoors::Spin.require_p EvenDoors::Particle + p['f0']='v0' + p['f1']='v1' + door0.send_p p + p.action.should be_nil + p.src.should be door0 + p.dst.should be door1 + end + # + it "routing success: more then one matching link" do + room0 = EvenDoors::Room.new 'room0', nil + door0 = EvenDoors::Door.new 'door0', room0 + class Out < EvenDoors::Door + attr_reader :ps + def receive_p p + @ps||=[] + @ps << p + end + end + door1 = Out.new 'door1', room0 + room0.add_link EvenDoors::Link.new('door0', 'door1') + room0.add_link EvenDoors::Link.new('door0', 'door1', 'fields', 'f0,f1', 'v0v1') + p = EvenDoors::Spin.require_p EvenDoors::Particle + EvenDoors::Spin.clear! + p['f0']='v0' + p['f1']='v1' + door0.send_p p + EvenDoors::Spin.run = true + EvenDoors::Spin.spin! + door1.ps.length.should eql 2 + p0 = door1.ps[0] + p0.action.should be_nil + p0.src.should be door0 + p0.dst.should be door1 + p1 = door1.ps[1] + p1.action.should be_nil + p1.src.should be door0 + p1.dst.should be door1 + p1.should be p + end + # + it "system route error: system no destination" do + room0 = EvenDoors::Room.new 'room0', nil + p = EvenDoors::Spin.require_p EvenDoors::Particle + room0.send_sys_p p + p.action.should eql EvenDoors::ACT_ERROR + p[EvenDoors::ERROR_FIELD].should eql EvenDoors::ERROR_ROUTE_SND + end + # + it "system routing success: action only" do + room0 = EvenDoors::Room.new 'room0', nil + p = EvenDoors::Spin.require_p EvenDoors::Particle + p.set_dst! EvenDoors::SYS_ACT_ADD_LINK + room0.send_sys_p p + p.action.should eql EvenDoors::SYS_ACT_ADD_LINK + p.dst.should be room0.spin + end + # + it "system routing success" do + room0 = EvenDoors::Room.new 'room0', nil + door0 = EvenDoors::Door.new 'door0', room0 + p = EvenDoors::Spin.require_p EvenDoors::Particle + p.set_dst! EvenDoors::SYS_ACT_ADD_LINK, 'room0/door0' + room0.send_sys_p p + p.action.should eql EvenDoors::SYS_ACT_ADD_LINK + p.dst.should be door0 + end + # + it "SYS_ACT_ADD_LINK" do + EvenDoors::Spin.clear! + spin = EvenDoors::Spin.new 'dom0' # needed to be able to route to door + room0 = EvenDoors::Room.new 'room0', spin + door0 = EvenDoors::Door.new 'door0', room0 + door1 = EvenDoors::Door.new 'door1', room0 + p0 = EvenDoors::Spin.require_p EvenDoors::Particle + p0.set_data EvenDoors::LNK_SRC, 'door0' + p0.set_data EvenDoors::LNK_DSTS, 'door1' + p0.set_data EvenDoors::LNK_FIELDS, 'fields' + p0.set_data EvenDoors::LNK_CONDF, 'f0,f1' + p0.set_data EvenDoors::LNK_CONDV, 'v0v1' + p0.set_dst! EvenDoors::SYS_ACT_ADD_LINK, room0.path + room0.send_sys_p p0 + spin.spin! + p = EvenDoors::Spin.require_p EvenDoors::Particle + p['f0']='v0' + p['f1']='v1' + door0.send_p p + p.action.should be_nil + p.src.should be door0 + p.dst.should be door1 + end + # +end +# +# EOF |