Not got blocks working yet
authorNeil Smith <neil.github@njae.me.uk>
Fri, 6 Jul 2012 07:01:33 +0000 (08:01 +0100)
committerNeil Smith <neil.github@njae.me.uk>
Fri, 6 Jul 2012 07:01:33 +0000 (08:01 +0100)
lib/graph.njae/graph.rb
spec/graph/edge_spec.rb
spec/graph/graph_spec.rb
spec/graph/vertex_spec.rb

index 37b772030053c146f61e14c2c286a3ed60c4bd8a..f3d00328d4a4956087ea0a276604417a74c19b7d 100644 (file)
@@ -36,6 +36,31 @@ module GraphNjae
       edge << vertex1 << vertex2
     end
     
+    def to_dot(opts = {})
+      vertex_args = opts[:vertex_args] || {}
+      vertex_block = opts[:vertex_block] || nil
+      edge_args = opts[:edge_args] || {}
+      edge_block = opts[:edge_block] || nil
+      dot = "graph {\n"
+      self.vertices.each do |v|
+        if vertex_block.nil?
+          dot << v.to_dot(vertex_args)
+        else
+          dot << v.do_dot(&vertex_block)
+        end
+        dot << "\n"
+      end
+      self.edges.each do |e|
+        if edge_block.nil?
+          dot << e.to_dot(edge_args)
+        else
+          dot << e.do_dot(&lambda {edge_block})
+        end
+        dot << "\n"
+      end
+      dot << '}'
+    end
+    
     # Form a product graph of this graph and the other.
     # Return the product graph.
     def product(other)
index bd823bfd919ab882fed7d7267710413018b648e6..938890fcb251f1e333a5305968fd2d2f391d2df6 100644 (file)
@@ -7,30 +7,30 @@ module GraphNjae
     let(:v2) {Vertex.new :name => :v2}
     let(:v3) {Vertex.new :name => :v3}
 
-    describe "#initialize" do
-      it "creates an empty edge" do
+    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 '#<<' do
+      it 'adds a new vertex to an edge (with a connection)' do
         e.connections.should be_empty
         e << v1
         e.should have(1).connections
@@ -45,7 +45,7 @@ module GraphNjae
         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
         e << v1 << v2
         e.vertices.should include(v1)
@@ -53,7 +53,7 @@ module GraphNjae
         e.should have(2).vertices
       end
 
-      it "adds a self-loop" do
+      it 'adds a self-loop' do
         e.connections.should be_empty
         e << v1 << v1
         e.vertices.should include(v1)
@@ -62,8 +62,8 @@ module GraphNjae
       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
         e << v1 << v2
         
@@ -71,14 +71,14 @@ module GraphNjae
         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
         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
         e << v1 << v1
         
@@ -86,8 +86,8 @@ module GraphNjae
       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
         e << v1 << v2
         
@@ -95,44 +95,42 @@ module GraphNjae
         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
         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
         e << v1 << v2
         
         [v1, v2].should include e.other_end(v3)
       end 
       
-      it "returns nil if it can't return something sensible" do
+      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
+    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
+      it 'describes an edge in dot notation, using given attributes' do
         e << v1 << v2
-        #vdot = v1.to_dot :label => :name, :shape => :shape
-        #vdot.should == "#{v.object_id.to_s} {label = \"vertex\", shape = \"house\"};"
+        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
+      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
@@ -141,8 +139,8 @@ module GraphNjae
   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
index 82444db41a08a4e017dc8c4442851ccb6274f628..7da0bb9c599275ed94e9fdcd04a4df427cf3bd3f 100644 (file)
@@ -10,32 +10,32 @@ module GraphNjae
   
   describe Graph do
     let (:g) { Graph.new }
-    describe "#initialize" do
-      it "creates an empty graph" do
+    describe '#initialize' do
+      it 'creates an empty graph' do
         g = Graph.new
         g.edges.should be_empty
         g.vertices.should be_empty
       end
       
-      it "creates a graph with some parameters" do
-        g = Graph.new :value1 => 1, :value2 => "value2", :value3 => :v3
+      it 'creates a graph with some parameters' do
+        g = Graph.new :value1 => 1, :value2 => 'value2', :value3 => :v3
         g.value1.should == 1
-        g.value2.should == "value2"
+        g.value2.should == 'value2'
         g.value3.should == :v3
         g.value4.should be_nil
       end
 
     end # #initialize
       
-    describe "adds attributes" do
-      it "adds then reports arbitrary attributes" do
+    describe 'adds attributes' do
+      it 'adds then reports arbitrary attributes' do
         g.score = 15
         g.score.should == 15
       end
     end # adds attributes
     
-    describe "#<<" do
-      it "adds a set of vertices" do
+    describe '#<<' do
+      it 'adds a set of vertices' do
         g.vertices.should be_empty
         v1 = Vertex.new
         v2 = Vertex.new
@@ -45,7 +45,7 @@ module GraphNjae
         g.vertices.should include(v2)
       end
       
-      it "adds a set of edges" do
+      it 'adds a set of edges' do
         g.edges.should be_empty
         e1 = Edge.new
         e2 = Edge.new
@@ -55,7 +55,7 @@ module GraphNjae
         g.edges.should include(e2)
       end
       
-      it "adds a mixed set of vertices and edges" do
+      it 'adds a mixed set of vertices and edges' do
         g.vertices.should be_empty
         g.edges.should be_empty
         v1 = Vertex.new
@@ -71,7 +71,7 @@ module GraphNjae
         g.edges.should include(e2)
       end
       
-      it "adds a subclass of Vertex" do
+      it 'adds a subclass of Vertex' do
         g.vertices.should be_empty
         v1 = SVertex.new
         v2 = SVertex.new
@@ -82,8 +82,8 @@ module GraphNjae
       end
     end # #<<
 
-    describe "connect" do
-      it "adds and records an edge between vertices" do
+    describe 'connect' do
+      it 'adds and records an edge between vertices' do
         g.vertices.should be_empty
         g.edges.should be_empty
         v1 = Vertex.new(:name => :v1)
@@ -96,7 +96,7 @@ module GraphNjae
         g.should have(1).edges
       end
       
-      it "adds and records an edge with attributes between vertices" do
+      it 'adds and records an edge with attributes between vertices' do
         g.vertices.should be_empty
         g.edges.should be_empty
         v1 = Vertex.new(:name => :v1)
@@ -111,8 +111,34 @@ module GraphNjae
       end
     end # #connect
     
-    describe "product" do
-      it "finds a product graph of a pair of one-vertex graphs" do
+    describe '#to_dot' do
+      it 'gives the dot notation of a simple graph' do
+        v1 = Vertex.new(:name => :v1)
+        v2 = Vertex.new(:name => :v2)
+        g.connect(v1, v2, :type => :edge_type)
+        g.to_dot.should == "graph {\n#{v1.object_id.to_s};\n#{v2.object_id.to_s};\n#{v1.object_id.to_s} -- #{v2.object_id.to_s};\n}"
+      end
+      
+      it "gives the dot notation of a simple graph, with vertex attributes" do
+        v1 = Vertex.new(:name => :v1)
+        v2 = Vertex.new(:name => :v2)
+        g.connect(v1, v2, :type => :edge_type)
+        gdot = g.to_dot(:vertex_args => {:label => :name})
+        gdot.should == "graph {\n#{v1.object_id.to_s} {label = \"#{v1.name}\"};\n#{v2.object_id.to_s} {label = \"#{v2.name}\"};\n#{v1.object_id.to_s} -- #{v2.object_id.to_s};\n}"
+      end
+
+      it "gives the dot notation of a simple graph, with vertices generated by a block" do
+        v1 = Vertex.new(:name => :v1)
+        v2 = Vertex.new(:name => :v2)
+        g.connect(v1, v2, :type => :edge_type)
+        gdot = g.to_dot(:vertex_block => lambda {|v| v.name})
+        gdot.should == "graph {\n#{v1.name};\n#{v2.name};\n#{v1.object_id.to_s} -- #{v2.object_id.to_s};\n}"
+      end
+
+    end # #to_dot
+    
+    describe 'product' do
+      it 'finds a product graph of a pair of one-vertex graphs' do
         g1 = Graph.new
         g2 = Graph.new
         g1v1 = Vertex.new
@@ -127,7 +153,7 @@ module GraphNjae
         product.edges.should be_empty
       end
 
-      it "finds a product graph of a pair of simple graphs" do
+      it 'finds a product graph of a pair of simple graphs' do
         g1 = Graph.new
         g2 = Graph.new
         g1v1 = Vertex.new(:name => :g1v1)
@@ -142,7 +168,7 @@ module GraphNjae
         pg.should have(2).edges
       end
       
-      it "finds a product graph of not-quite-simple graph" do
+      it 'finds a product graph of not-quite-simple graph' do
         g1 = Graph.new
         g2 = Graph.new
         g1v1 = Vertex.new(:name => :g1v1)
@@ -161,7 +187,7 @@ module GraphNjae
         pg.should have(8).edges
       end
 
-      it "finds a product graph of a simple graph with edge types" do
+      it 'finds a product graph of a simple graph with edge types' do
         g1 = Graph.new
         g2 = Graph.new
         g1v1 = Vertex.new(:name => :g1v1)
@@ -180,8 +206,8 @@ module GraphNjae
         pg.should have(4).edges
       end
 
-      it "finds a product graph of the example graph from paper" do
-        pending "implementation of directed graphs as operands of the product graph"
+      it 'finds a product graph of the example graph from paper' do
+        pending 'implementation of directed graphs as operands of the product graph'
         g1 = Graph.new
         g2 = Graph.new
         a = Vertex.new(:name => :a)
@@ -201,11 +227,9 @@ module GraphNjae
         pg.should have(4).edges
         pg.should have(6).vertices
       end
-
-      
     end #product
     
-    describe "initial_similarity" do
+    describe 'initial_similarity' do
       before(:each) do
         g1 = Graph.new
         g2 = Graph.new
@@ -222,7 +246,7 @@ module GraphNjae
         1 - n1.to_s.codepoints.to_a.delete_if {|c| n2.to_s.codepoints.to_a.include? c}.length / n1.to_s.length.to_f
       end
 
-      it "should give all nodes an initial similarity of 1 if no block is given" do
+      it 'should give all nodes an initial similarity of 1 if no block is given' do
         @pg.initial_similarity
         @pg.vertices.each do |v|
           v.initial_similarity.should be_within(0.001).of(1.0)
@@ -230,7 +254,7 @@ module GraphNjae
         end
       end
       
-      it "should give all nodes the similarity as defined by the given block" do
+      it 'should give all nodes the similarity as defined by the given block' do
         @pg.initial_similarity {|v| simple_name_similarity v.g1_vertex.name, v.g2_vertex.name}
         @pg.vertices.each do |v|
           v.initial_similarity.should be_within(0.001).of( simple_name_similarity v.g1_vertex.name, v.g2_vertex.name )
@@ -240,8 +264,8 @@ module GraphNjae
       end
     end #initial similarity
     
-    describe "similarity flood" do
-      it "similarity floods a graph of two nodes" do
+    describe 'similarity flood' do
+      it 'similarity floods a graph of two nodes' do
         g1 = Graph.new
         g2 = Graph.new
         g1v1 = Vertex.new(:name => :g1v1)
@@ -259,7 +283,7 @@ module GraphNjae
         end
       end
         
-      it "similarity floods a graph of three nodes, a -- b -- c" do
+      it 'similarity floods a graph of three nodes, a -- b -- c' do
         g1 = Graph.new
         g2 = Graph.new
         g1v1 = Vertex.new(:name => :g1v1)
@@ -277,27 +301,27 @@ module GraphNjae
         pg.initial_similarity
         pg.similarity_flood
         expected_similarities = {
-          "g1v1:g2v1" => 0.5,
-          "g1v1:g2v2" => 0.6666666666666666,
-          "g1v2:g2v1" => 0.6666666666666666,
-          "g1v2:g2v2" => 1.0,
-          "g1v2:g2v3" => 0.6666666666666666,
-          "g1v3:g2v2" => 0.6666666666666666,
-          "g1v3:g2v3" => 0.5}
+          'g1v1:g2v1' => 0.5,
+          'g1v1:g2v2' => 0.6666666666666666,
+          'g1v2:g2v1' => 0.6666666666666666,
+          'g1v2:g2v2' => 1.0,
+          'g1v2:g2v3' => 0.6666666666666666,
+          'g1v3:g2v2' => 0.6666666666666666,
+          'g1v3:g2v3' => 0.5}
         pg.vertices.each do |v|
-          name = v.g1_vertex.name.to_s + ':' + v.g2_vertex.name.to_s
+          name = "#{v.g1_vertex.name.to_s}:#{v.g2_vertex.name.to_s}"
           v.similarity.should be_within(0.001).of(expected_similarities[name])
         end
       end
         
-      it "simialrity floods the sample graph from the paper" do
+      it 'simialrity floods the sample graph from the paper' do
         pg = Graph.new
-        ab = Vertex.new(:name => "a:b")
-        a1b1 = Vertex.new(:name => "a1:b1")
-        a2b1 = Vertex.new(:name => "a2:b1")
-        a1b2 = Vertex.new(:name => "a1:b2")
-        a1b = Vertex.new(:name => "a1:b")
-        a2b2 = Vertex.new(:name => "a2:b2")
+        ab = Vertex.new(:name => 'a:b')
+        a1b1 = Vertex.new(:name => 'a1:b1')
+        a2b1 = Vertex.new(:name => 'a2:b1')
+        a1b2 = Vertex.new(:name => 'a1:b2')
+        a1b = Vertex.new(:name => 'a1:b')
+        a2b2 = Vertex.new(:name => 'a2:b2')
         pg.connect(ab, a1b1, :type => :l1)
         pg.connect(ab, a2b1, :type => :l1)
         pg.connect(a2b1, a1b2, :type => :l2)
@@ -306,18 +330,18 @@ module GraphNjae
         pg.similarity_flood 
 
         expected_similarities = {
-          "a:b" => 1.0,
-          "a2:b1" => 0.92,
-          "a1:b2" => 0.71,
-          "a1:b1" => 0.38,
-          "a1:b" => 0.0,
-          "a2:b2" => 0.0}
+          'a:b' => 1.0,
+          'a2:b1' => 0.92,
+          'a1:b2' => 0.71,
+          'a1:b1' => 0.38,
+          'a1:b' => 0.0,
+          'a2:b2' => 0.0}
         pg.vertices.each do |v|
           v.similarity.should be_within(0.02).of(expected_similarities[v.name])
         end
       end
       
-      it "similarity floods a graph of three nodes, a -- b -- c, given a block that performs the default update" do
+      it 'similarity floods a graph of three nodes, a -- b -- c, given a block that performs the default update' do
         g1 = Graph.new
         g2 = Graph.new
         g1v1 = Vertex.new(:name => :g1v1)
@@ -344,20 +368,20 @@ module GraphNjae
           v.similarity
         end
         expected_similarities = {
-          "g1v1:g2v1" => 0.5,
-          "g1v1:g2v2" => 0.6666666666666666,
-          "g1v2:g2v1" => 0.6666666666666666,
-          "g1v2:g2v2" => 1.0,
-          "g1v2:g2v3" => 0.6666666666666666,
-          "g1v3:g2v2" => 0.6666666666666666,
-          "g1v3:g2v3" => 0.5}
+          'g1v1:g2v1' => 0.5,
+          'g1v1:g2v2' => 0.6666666666666666,
+          'g1v2:g2v1' => 0.6666666666666666,
+          'g1v2:g2v2' => 1.0,
+          'g1v2:g2v3' => 0.6666666666666666,
+          'g1v3:g2v2' => 0.6666666666666666,
+          'g1v3:g2v3' => 0.5}
         pg.vertices.each do |v|
-          name = v.g1_vertex.name.to_s + ':' + v.g2_vertex.name.to_s
+          name = "#{v.g1_vertex.name.to_s}:#{v.g2_vertex.name.to_s}"
           v.similarity.should be_within(0.001).of(expected_similarities[name])
         end
       end
 
-      it "similarity floods a graph of three nodes, a -- b -- c, given a block that performs a different update (method A)" do
+      it 'similarity floods a graph of three nodes, a -- b -- c, given a block that performs a different update (method A)' do
         g1 = Graph.new
         g2 = Graph.new
         g1v1 = Vertex.new(:name => :g1v1)
@@ -385,20 +409,20 @@ module GraphNjae
           v.similarity
         end
         expected_similarities = {
-          "g1v1:g2v1" => 0.9269662921348315,
-          "g1v1:g2v2" => 1.0,
-          "g1v2:g2v1" => 0.6179775280898876,
-          "g1v2:g2v2" => 1.0,
-          "g1v2:g2v3" => 1.0,
-          "g1v3:g2v2" => 0.6179775280898876,
-          "g1v3:g2v3" => 0.6179775280898876}
+          'g1v1:g2v1' => 0.9269662921348315,
+          'g1v1:g2v2' => 1.0,
+          'g1v2:g2v1' => 0.6179775280898876,
+          'g1v2:g2v2' => 1.0,
+          'g1v2:g2v3' => 1.0,
+          'g1v3:g2v2' => 0.6179775280898876,
+          'g1v3:g2v3' => 0.6179775280898876}
         pg.vertices.each do |v|
-          name = v.g1_vertex.name.to_s + ':' + v.g2_vertex.name.to_s
+          name = "#{v.g1_vertex.name.to_s}:#{v.g2_vertex.name.to_s}"
           v.similarity.should be_within(0.001).of(expected_similarities[name])
         end
       end
 
-      it "similarity floods a graph of three nodes, a -- b -- c, given a block that performs a different update (method B)" do
+      it 'similarity floods a graph of three nodes, a -- b -- c, given a block that performs a different update (method B)' do
         g1 = Graph.new
         g2 = Graph.new
         g1v1 = Vertex.new(:name => :g1v1)
@@ -426,20 +450,20 @@ module GraphNjae
           v.similarity
         end
         expected_similarities = {
-          "g1v1:g2v1" => 1.0,
-          "g1v1:g2v2" => 1.0,
-          "g1v2:g2v1" => 0.0,
-          "g1v2:g2v2" => 1.0,
-          "g1v2:g2v3" => 1.0,
-          "g1v3:g2v2" => 0.0,
-          "g1v3:g2v3" => 0.0}
+          'g1v1:g2v1' => 1.0,
+          'g1v1:g2v2' => 1.0,
+          'g1v2:g2v1' => 0.0,
+          'g1v2:g2v2' => 1.0,
+          'g1v2:g2v3' => 1.0,
+          'g1v3:g2v2' => 0.0,
+          'g1v3:g2v3' => 0.0}
         pg.vertices.each do |v|
-          name = v.g1_vertex.name.to_s + ':' + v.g2_vertex.name.to_s
+          name = "#{v.g1_vertex.name.to_s}:#{v.g2_vertex.name.to_s}"
           v.similarity.should be_within(0.001).of(expected_similarities[name])
         end
       end
 
-      it "similarity floods a graph of three nodes, a -- b -- c, given a block that performs a different update (method C)" do
+      it 'similarity floods a graph of three nodes, a -- b -- c, given a block that performs a different update (method C)' do
         g1 = Graph.new
         g2 = Graph.new
         g1v1 = Vertex.new(:name => :g1v1)
@@ -467,15 +491,15 @@ module GraphNjae
           v.similarity
         end
         expected_similarities = {
-          "g1v1:g2v1" => 0.8282781862745098,
-          "g1v1:g2v2" => 1.0,
-          "g1v2:g2v1" => 0.41421568627450983,
-          "g1v2:g2v2" => 1.0,
-          "g1v2:g2v3" => 1.0,
-          "g1v3:g2v2" => 0.41421568627450983,
-          "g1v3:g2v3" => 0.41421568627450983}
+          'g1v1:g2v1' => 0.8282781862745098,
+          'g1v1:g2v2' => 1.0,
+          'g1v2:g2v1' => 0.41421568627450983,
+          'g1v2:g2v2' => 1.0,
+          'g1v2:g2v3' => 1.0,
+          'g1v3:g2v2' => 0.41421568627450983,
+          'g1v3:g2v3' => 0.41421568627450983}
         pg.vertices.each do |v|
-          name = v.g1_vertex.name.to_s + ':' + v.g2_vertex.name.to_s
+          name = "#{v.g1_vertex.name.to_s}:#{v.g2_vertex.name.to_s}"
           v.similarity.should be_within(0.001).of(expected_similarities[name])
         end
       end
index 3689c0b92faf25b0ec097f732e9b6545128b5f25..9d109db3aced26dfdb072fdea7eed4ca9439985b 100644 (file)
@@ -4,30 +4,30 @@ module GraphNjae
   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 "#<<" 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
         
@@ -49,7 +49,7 @@ module GraphNjae
         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
         
@@ -61,8 +61,8 @@ module GraphNjae
       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
 
@@ -88,14 +88,14 @@ module GraphNjae
         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
@@ -111,21 +111,21 @@ module GraphNjae
         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
@@ -134,7 +134,7 @@ module GraphNjae
         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
@@ -147,14 +147,14 @@ module GraphNjae
         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
@@ -179,7 +179,7 @@ module GraphNjae
         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
@@ -211,7 +211,7 @@ module GraphNjae
         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
@@ -243,23 +243,23 @@ module GraphNjae
       end
     end # #neighbours
     
-    describe "#to_dot" do
-      it "describes a vertex in dot notation" do
+    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
+      it 'describes a vertex in dot notation, using given attributes' do
         v = Vertex.new
-        v.name = "vertex"
-        v.shape = "house"
+        v.name = 'vertex'
+        v.shape = 'house'
         vdot = v.to_dot :label => :name, :shape => :shape
-        vdot.should == "#{v.object_id.to_s} {label = \"vertex\", shape = \"house\"};"
+        vdot.should == "#{v.object_id.to_s} {label = \"#{v.name}\", shape = \"#{v.shape}\"};"
       end
       
-      it "describes a vertex using a block" do
+      it 'describes a vertex using a block' do
         v = Vertex.new
-        v.field1 = "f1"
+        v.field1 = 'f1'
         vdot = v.to_dot {|v| v.field1 + ';'}
         vdot.should == "#{v.field1};"
       end