module GraphNjae
describe Edge do
let (:e) { Edge.new }
- describe "#initialize" do
- it "creates an empty edge" do
+ let(:v1) {Vertex.new :name => :v1}
+ let(:v2) {Vertex.new :name => :v2}
+ let(:v3) {Vertex.new :name => :v3}
+
+ describe '#initialize' do
+ it 'creates an empty edge' do
e = Edge.new
e.connections.should be_empty
end
- it "creates an edge with some parameters" do
- e = Edge.new :value1 => 1, :value2 => "value2", :value3 => :v3
+ it 'creates an edge with some parameters' do
+ e = Edge.new :value1 => 1, :value2 => 'value2', :value3 => :v3
e.value1.should == 1
- e.value2.should == "value2"
+ e.value2.should == 'value2'
e.value3.should == :v3
e.value4.should be_nil
end
end # #initialize
- describe "adds attribues" do
- it "adds then reports arbitrary attributes" do
+ describe 'adds attribues' do
+ it 'adds then reports arbitrary attributes' do
e.score = 15
e.score.should == 15
end
end # adds attributes
- describe '#<<' do
- it 'adds a new vertex to an edge (with a connection)' do
+ describe "#to_s" do
+ it "returns the string form of an edge" do
+ v1 = Vertex.new :name => :v1
+ v2 = Vertex.new :name => :v2
+ e.type = :test
+ e << v1 << v2
+ e.to_s.should == '<E: test [<V: v1>, <V: v2>] >'
+ end
+ end
+
+ describe "#<<" do
+ it "adds a new vertex to an edge (with a connection)" do
e.connections.should be_empty
- v1 = Vertex.new :name => :v1
- v2 = Vertex.new :name => :v2
e << v1
e.should have(1).connections
e.should have(1).vertices
v2.edges.should include(e)
end
- it "adds several vertices to an edge" do
+ it 'adds several vertices to an edge' do
e.connections.should be_empty
- v1 = Vertex.new :name => :v1
- v2 = Vertex.new :name => :v2
e << v1 << v2
e.vertices.should include(v1)
e.vertices.should include(v2)
e.should have(2).vertices
end
- it "adds a self-loop" do
+ it 'adds a self-loop' do
e.connections.should be_empty
- v1 = Vertex.new
e << v1 << v1
e.vertices.should include(v1)
e.should have(2).vertices
end
end # #<<
- describe "connection_at" do
- it "returns the connection that links to a vertex" do
+ describe 'connection_at' do
+ it 'returns the connection that links to a vertex' do
e.connections.should be_empty
- v1 = Vertex.new :name => :v1
- v2 = Vertex.new :name => :v2
e << v1 << v2
e.connection_at(v1).end.should be v1
e.connection_at(v2).end.should be v2
end
- it "returns nil if there is no connection to that vertex" do
+ it 'returns nil if there is no connection to that vertex' do
e.connections.should be_empty
- v1 = Vertex.new :name => :v1
- v2 = Vertex.new :name => :v2
- v3 = Vertex.new :name => :v3
e << v1 << v2
e.connection_at(v3).should be nil
end
- it "returns the vertex for a self-loop" do
+ it 'returns the vertex for a self-loop' do
e.connections.should be_empty
- v1 = Vertex.new :name => :v1
e << v1 << v1
e.connection_at(v1).end.should be v1
end
end # #connection_at
- describe "other_end" do
- it "returns the vertex at the other end of the given one" do
+ describe 'other_end' do
+ it 'returns the vertex at the other end of the given one' do
e.connections.should be_empty
- v1 = Vertex.new :name => :v1
- v2 = Vertex.new :name => :v2
e << v1 << v2
e.other_end(v1).should be v2
e.other_end(v2).should be v1
end
- it "returns the same vertex in a self-loop" do
+ it 'returns the same vertex in a self-loop' do
e.connections.should be_empty
- v1 = Vertex.new :name => :v1
e << v1 << v1
e.other_end(v1).should be v1
end
- it "returns one of the connected edges if given a vertex not connected to it" do
+ it 'returns one of the connected edges if given a vertex not connected to it' do
e.connections.should be_empty
- v1 = Vertex.new :name => :v1
- v2 = Vertex.new :name => :v2
- v3 = Vertex.new :name => :v3
e << v1 << v2
[v1, v2].should include e.other_end(v3)
end
- it "returns nil if it can't return something sensible" do
- v1 = Vertex.new :name => :v1
+ it 'returns nil if it cannot return something sensible' do
e.other_end(v1).should be_nil
e << v1
e.other_end(v1).should be_nil
end
end # other_end
+
+ describe '#to_dot' do
+ it 'describes an edge in dot notation' do
+ e << v1 << v2
+ e.to_dot.should == "#{v1.object_id.to_s} -- #{v2.object_id.to_s};"
+ end
+
+ it 'describes an edge in dot notation, using given attributes' do
+ e << v1 << v2
+ e.name = 'Edge name'
+ edot = e.to_dot :label => :name
+ edot.should == "#{v1.object_id.to_s} -- #{v2.object_id.to_s} {label = \"#{e.name}\"};"
+ end
+
+ it 'describes an edge in dot notation, given a block' do
+ e << v1 << v2
+ e.to_dot {|e| e.object_id.to_s}.should == e.object_id.to_s
+ end
+ end # dot
end # Edge
describe Connection do
let (:c) {Connection.new }
- describe "adds attribues" do
- it "adds then reports arbitrary attributes" do
+ describe 'adds attribues' do
+ it 'adds then reports arbitrary attributes' do
c.score = 15
c.score.should == 15
end
describe Vertex do
let (:v) { Vertex.new }
- describe "#initialize" do
- it "creates an empty vertex" do
+ describe '#initialize' do
+ it 'creates an empty vertex' do
v = Vertex.new
v.edges.should be_empty
end
- it "creates a vertex with some parameters" do
- v = Vertex.new :value1 => 1, :value2 => "value2", :value3 => :v3
+ it 'creates a vertex with some parameters' do
+ v = Vertex.new :value1 => 1, :value2 => 'value2', :value3 => :v3
v.value1.should == 1
- v.value2.should == "value2"
+ v.value2.should == 'value2'
v.value3.should == :v3
v.value4.should be_nil
end
end # #initialize
- describe "adds attribues" do
- it "adds then reports arbitrary attributes" do
+ describe 'adds attribues' do
+ it 'adds then reports arbitrary attributes' do
v.score = 15
v.score.should == 15
end
end # adds attributes
+
+ describe "#to_s" do
+ it "returns the string form of a vertex" do
+ v.name = :v1
+ v.to_s.should == '<V: v1>'
+ end
+ end
+
- describe "#<<" do
- it "adds a single edge between vertices" do
+ describe '#<<' do
+ it 'adds a single edge between vertices' do
v.neighbours.should be_empty
v.edges.should be_empty
v1.neighbours.should_not include(v1)
end
- it "adds a single edge as a self-loop" do
+ it 'adds a single edge as a self-loop' do
v.neighbours.should be_empty
v.edges.should be_empty
end
end # #<<
- describe "connect" do
- it "connects two vertices" do
+ describe 'connect' do
+ it 'connects two vertices' do
v1 = Vertex.new
v1.id = :v1 # Need this to ensure that v != v1
e.should have(2).connections
end
- it "connects two vertices by an edge with attributes" do
+ it 'connects two vertices by an edge with attributes' do
v1 = Vertex.new
v1.id = :v1
e = v.connect(v1, {:type => :edge_type})
e.type.should == :edge_type
end
- it "creates a self-connection" do
+ it 'creates a self-connection' do
e = v.connect v
v.should have(1).neighbours
e.should have(2).connections
end
- it "creates a self-connection with an edge with attributes" do
+ it 'creates a self-connection with an edge with attributes' do
e = v.connect(v, {:type => :edge_type})
e.type.should == :edge_type
end
end # #connect
- describe "#neighbours" do
- it "finds neighbours of a self loop" do
+ describe '#neighbours' do
+ it 'finds neighbours of a self loop' do
v << v
v.should have(1).neighbours
v.neighbours.should include v
end
- it "finds neighbours on an edge" do
+ it 'finds neighbours on an edge' do
v1 = Vertex.new
v << v1
v.should have(1).neighbours
v1.neighbours.should include v
end
- it "finds neighbours with multiple edges" do
+ it 'finds neighbours with multiple edges' do
v1 = Vertex.new
v1.id = :v1
v << v1
v1.neighbours.should_not include v1
end
- it "finds neighbours with multiple self loops" do
+ it 'finds neighbours with multiple self loops' do
v << v << v << v
v.should have(3).neighbours
v.neighbours.should include v
v.neighbours.uniq.length.should == 1
end
- it "finds neighbours with all sorts of edges" do
+ it 'finds neighbours with all sorts of edges' do
v1 = Vertex.new ; v1.id = :v1
v2 = Vertex.new ; v2.id = :v2
v3 = Vertex.new ; v3.id = :v3
v3.neighbours.should include v2
end
- it "finds neighbours in graphs with several vertices" do
+ it 'finds neighbours in graphs with several vertices' do
v1 = Vertex.new ; v1.id = :v1
v2 = Vertex.new ; v2.id = :v2
v3 = Vertex.new ; v3.id = :v3
v4.neighbours.should_not include v4
end
- it "finds neighbours with multiple edges between vertices" do
+ it 'finds neighbours with multiple edges between vertices' do
v1 = Vertex.new ; v1.id = :v1
v2 = Vertex.new ; v2.id = :v2
v3 = Vertex.new ; v3.id = :v3
v3.neighbours.uniq.length.should == 1
end
end # #neighbours
+
+ describe '#to_dot' do
+ it 'describes a vertex in dot notation' do
+ v = Vertex.new
+ v.to_dot.should == "#{v.object_id.to_s};"
+ end
+
+ it 'describes a vertex in dot notation, using given attributes' do
+ v = Vertex.new
+ v.name = 'vertex'
+ v.shape = 'house'
+ vdot = v.to_dot :label => :name, :shape => :shape
+ vdot.should == "#{v.object_id.to_s} {label = \"#{v.name}\", shape = \"#{v.shape}\"};"
+ end
+
+ it 'describes a vertex using a block' do
+ v = Vertex.new
+ v.field1 = 'f1'
+ vdot = v.to_dot {|v| v.field1 + ';'}
+ vdot.should == "#{v.field1};"
+ end
+ end # #to_dot
end
end