abstract_graph 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +2 -0
  3. data/lib/abstract_graph/composition/uniquenamecollection/dup.rb +1 -1
  4. data/lib/abstract_graph/composition/uniquenamecollection/rename.rb +28 -0
  5. data/lib/abstract_graph/composition/uniquenamecollection.rb +1 -0
  6. data/lib/abstract_graph/graph/add_edge.rb +2 -2
  7. data/lib/abstract_graph/graph/adjacency_list.rb +28 -0
  8. data/lib/abstract_graph/graph/change_edge_name.rb +15 -0
  9. data/lib/abstract_graph/graph/change_vertex_name.rb +15 -0
  10. data/lib/abstract_graph/graph/dup.rb +9 -2
  11. data/lib/abstract_graph/graph/get_edge_name.rb +24 -0
  12. data/lib/abstract_graph/graph/is_adjacent.rb +20 -0
  13. data/lib/abstract_graph/graph/merge_vertices.rb +84 -0
  14. data/lib/abstract_graph/graph/split_vertex.rb +40 -0
  15. data/lib/abstract_graph/graph/templates/complete_bipartite_graph.rb +40 -0
  16. data/lib/abstract_graph/graph/templates/complete_graph.rb +25 -0
  17. data/lib/abstract_graph/graph/templates/cycle_graph.rb +34 -0
  18. data/lib/abstract_graph/graph/templates/path_graph.rb +28 -0
  19. data/lib/abstract_graph/graph/templates/petersen_graph.rb +36 -0
  20. data/lib/abstract_graph/graph/templates.rb +15 -0
  21. data/lib/abstract_graph/graph.rb +8 -0
  22. data/lib/abstract_graph/version.rb +1 -1
  23. data/spec/abstract_graph/composition/uniquenamecollection/rename_spec.rb +42 -0
  24. data/spec/abstract_graph/graph/adjacency_list_spec.rb +44 -0
  25. data/spec/abstract_graph/graph/change_edge_name_spec.rb +42 -0
  26. data/spec/abstract_graph/graph/change_vertex_name_spec.rb +40 -0
  27. data/spec/abstract_graph/graph/dup_spec.rb +27 -22
  28. data/spec/abstract_graph/graph/get_edge_name_spec.rb +38 -0
  29. data/spec/abstract_graph/graph/has_edge_spec.rb +17 -19
  30. data/spec/abstract_graph/graph/has_vertex_spec.rb +13 -15
  31. data/spec/abstract_graph/graph/is_adjacent_spec.rb +36 -0
  32. data/spec/abstract_graph/graph/merge_vertices_spec.rb +199 -0
  33. data/spec/abstract_graph/graph/split_vertex_spec.rb +104 -0
  34. data/spec/abstract_graph/graph/templates/complete_bipartite_graph_spec.rb +63 -0
  35. data/spec/abstract_graph/graph/templates/complete_graph_spec.rb +36 -0
  36. data/spec/abstract_graph/graph/templates/cycle_graph_spec.rb +36 -0
  37. data/spec/abstract_graph/graph/templates/path_graph_spec.rb +52 -0
  38. data/spec/abstract_graph/graph/templates/petersen_graph_spec.rb +34 -0
  39. metadata +50 -13
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7a6bbd7d12e215a907b79ebaef777d9282f4e283
4
+ data.tar.gz: 8207dfe01745e9a6c50a75bc59f79a2f1248045f
5
+ SHA512:
6
+ metadata.gz: f7c6d5082e389a24a6db96e4c103825803ecfd8ebc1f41117192093a349dfe7104329d14d7c7b1098f04a783f225cfbbffd25242514a0cad5e2b569e61564e3c
7
+ data.tar.gz: 406b2b87218d98b9832fe479791192c38098ca7453a8e9fcb3bb68e9a7050ffee51aa4a4a2fdc97a7a7ab84d268ec1ee80fe35faeca8a1d9745cc90633911e06
data/.gitignore CHANGED
@@ -4,6 +4,8 @@
4
4
  .bundle
5
5
  .config
6
6
  .yardoc
7
+ .ruby-gemset
8
+ .ruby-version
7
9
  Gemfile.lock
8
10
  InstalledFiles
9
11
  _yardoc
@@ -7,7 +7,7 @@ module AbstractGraph
7
7
  # does a deep copy of the object, in otherwords
8
8
  # copies every object in the collection
9
9
  def dup
10
- other = UniqueNameCollection.new
10
+ other = self.class.new
11
11
  # copy each object in our collection over
12
12
  @collection.each_value do |o|
13
13
  other.add o
@@ -0,0 +1,28 @@
1
+ # required in "abstract_graph/composition/uniquenamecollection"
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ class UniqueNameCollection
6
+
7
+ # Change the name of a vertex in our graph
8
+ # p: String oldname represents the current vertex's name
9
+ # String newname represents the new name of our vertex
10
+ # note: the object needs to implement #name=
11
+ def rename( oldname, newname )
12
+ return nil if @collection[oldname].nil?
13
+
14
+ @otherUnique.each do |unc|
15
+ throw Exception if unc[newname]
16
+ end
17
+
18
+ # rename the object itself
19
+ @collection[oldname].name = newname
20
+ # remap the name
21
+ @collection[newname] = @collection[oldname]
22
+ # clear the old name
23
+ @collection.delete oldname
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -19,3 +19,4 @@ require "abstract_graph/composition/uniquenamecollection/add"
19
19
  require "abstract_graph/composition/uniquenamecollection/dup"
20
20
  require "abstract_graph/composition/uniquenamecollection/method_missing"
21
21
  require "abstract_graph/composition/uniquenamecollection/link"
22
+ require "abstract_graph/composition/uniquenamecollection/rename"
@@ -12,14 +12,14 @@ module AbstractGraph
12
12
  v1 = @vertices[v1] or return nil
13
13
  v2 = @vertices[v2] or return nil
14
14
 
15
- raise Exception if v1 == v2
15
+ raise Exception.new( "AddEdge: Same vertices passed, #{v1.name}" ) if v1 == v2
16
16
 
17
17
  # create the edge
18
18
  edge = Edge.new s, v1, v2
19
19
 
20
20
  # check if it's an multiple edge
21
21
  @edges.each_value do |e|
22
- raise Exception if e.is_coincident? edge
22
+ raise Exception.new( "AddEdge: Multiple edge being added between #{v1.name}, #{v2.name}" ) if e.is_coincident? edge
23
23
  end
24
24
 
25
25
  @edges.add edge
@@ -0,0 +1,28 @@
1
+ # required in "abstract_graph/graph"
2
+
3
+ module AbstractGraph
4
+ class Graph
5
+
6
+ # return the adjacent vertices in of a vertex
7
+ # p: String s represents the name of the query vertex
8
+ def adjacency_list( s )
9
+ # this collects all the edges at first
10
+ result = @edges.collect do |id,e|
11
+ e.vertices.collect do |v|
12
+ v.name
13
+ end - [s]
14
+ end.delete_if do |adj|
15
+ # and deletes the ones with only one remaining tracked
16
+ adj.size == 2
17
+ end.flatten
18
+
19
+ # return nil if result is empty
20
+ if result.size == 0
21
+ return nil
22
+ else
23
+ return result
24
+ end
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,15 @@
1
+ # required in "abstract_graph/graph"
2
+
3
+ module AbstractGraph
4
+ class Graph
5
+
6
+ # changes an edge name to another valid name
7
+ # p: String s represents the current edge we want to rename
8
+ # String snew is what we want to rename the edge to
9
+ def change_edge_name( s, snew )
10
+ return nil if @edges.rename(s, snew).nil?
11
+ self
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # required in "abstract_graph/graph"
2
+
3
+ module AbstractGraph
4
+ class Graph
5
+
6
+ # changes a vertex name to another valid name
7
+ # p: String s represents the current vertex we want to rename
8
+ # String snew is what we want to rename the vertex to
9
+ def change_vertex_name( s, snew )
10
+ return nil if @vertices.rename(s, snew).nil?
11
+ self
12
+ end
13
+
14
+ end
15
+ end
@@ -5,8 +5,15 @@ module AbstractGraph
5
5
 
6
6
  # does a deep copy of the graph
7
7
  def dup
8
- other = Graph.new
9
- other.vertices = @vertices.dup
8
+ other = self.class.new
9
+ # cannot call UniqueNameCollection#dup because we'll lose
10
+ # link data
11
+ @vertices.each_value do |v|
12
+ other.vertices.add v
13
+ end
14
+ @edges.each_value do |e|
15
+ other.edges.add e
16
+ end
10
17
  other
11
18
  end
12
19
 
@@ -0,0 +1,24 @@
1
+ # required in "abstract_graph/graph"
2
+
3
+ module AbstractGraph
4
+ class Graph
5
+
6
+ # returns the edge connecting v1 and v2, if there is no
7
+ # edge, then it returns nil
8
+ # p: String v1, v2 represents the names of the vertices
9
+ def get_edge_name( v1, v2 )
10
+ vertices = [v1, v2].sort!
11
+
12
+ @edges.each_value do |e|
13
+ eVertices = e.vertices.map do |v|
14
+ v.name
15
+ end.sort
16
+
17
+ return e.name if eVertices == vertices
18
+ end
19
+
20
+ nil
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,20 @@
1
+ # required in "abstract_graph/graph"
2
+
3
+ module AbstractGraph
4
+ class Graph
5
+
6
+ # returns whether or not v1 and v2 are joined by an edge
7
+ # p: String v1, v2 represents the names of the vertices
8
+ def is_adjacent?( v1, v2 )
9
+ vertices = [v1, v2].sort!
10
+
11
+ ( @edges.each_value.find do |e|
12
+ vertices == e.vertices.map do |v|
13
+ v.name
14
+ end.sort
15
+ end && true ) || false
16
+
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,84 @@
1
+ # required in "abstract_graph/graph"
2
+
3
+ module AbstractGraph
4
+ class Graph
5
+
6
+ # returns a replicated graph where the vertices with names
7
+ # v1 and v2 merge together to a vertex named vmerged and
8
+ # the edges that were adjacent to v1 and v2 are now
9
+ # adjacent to vmerged
10
+ # p: (Array, String)
11
+ # array is the string names of vertices to merge together
12
+ # string is the name of the final vertex
13
+ # (String, String, String)
14
+ # first two strings are the vertices to merge together
15
+ # last string is the name of the merged vertex
16
+ # e: the edges prioritize v1 to v2 if there are any conflicts
17
+ def merge_vertices( *args )
18
+ other = self.dup
19
+ other.merge_vertices!( *args )
20
+ end
21
+
22
+ # same as before except operates on the current graph
23
+ def merge_vertices!( *args )
24
+
25
+ # create a list of vertices we want to merge
26
+ mergeV = []
27
+ if args[0].class == Array
28
+ mergeV = args[0]
29
+ else
30
+ mergeV << args[0] << args[1]
31
+ end
32
+
33
+ # first construct an array of edges in between vertices
34
+ edgesInBetween = []
35
+ if ( args.size == 3 )
36
+ # do not need to go through the array of vertices
37
+ edgesInBetween << get_edge_name( args[0], args[1] )
38
+ else
39
+ edgesInBetween = @edges.values.collect do |e|
40
+ e.name if ( e.vertices.map do |v|
41
+ v.name
42
+ end & mergeV ).count == 2
43
+ end
44
+ end
45
+
46
+ # delete the edges in between vertices
47
+ edgesInBetween.each do |e|
48
+ delete_edge!( e ) if e
49
+ end
50
+
51
+ # get the list of connections we want vmerged to be merged with
52
+ finalConnections = {}
53
+ mergeV.reverse.each do |vCheck|
54
+ @edges.each do |name, e|
55
+ [0,1].each do |edgeVId|
56
+
57
+ # check if the edge contains our vertex
58
+ if e.vertices[edgeVId].name == vCheck
59
+ otherVertex = e.vertices[(edgeVId+1)%2].name
60
+ # track the vertex with the edge name
61
+ finalConnections[otherVertex] = name
62
+ delete_edge! name
63
+ end
64
+
65
+ end
66
+ end
67
+ end
68
+
69
+ # delete the vertices we want to merge
70
+ mergeV.each do |v|
71
+ delete_vertex! v
72
+ end
73
+
74
+ # add vmerged and connect it to adjacent vertices
75
+ add_vertex args.last
76
+ finalConnections.each do | vertexName, name |
77
+ add_edge name, vertexName, args.last
78
+ end
79
+
80
+ self
81
+ end
82
+
83
+ end
84
+ end
@@ -0,0 +1,40 @@
1
+ # required in "abstract_graph/graph"
2
+
3
+ module AbstractGraph
4
+ class Graph
5
+
6
+ # returns a replicated graph where all the vertices are the same but one
7
+ # gets split and all it's adjacent vertices are now connected to two replaced vertices
8
+ # p: String s the name of the vertex that will be split into vertexName-1 and vertexName-2
9
+ # all adjacent edges will also be split and adjacent to the correct vertex
10
+ def split_vertex( s )
11
+ other = self.dup
12
+ other.split_vertex!( s )
13
+ other
14
+ end
15
+
16
+ # same as before except operates on the current graph
17
+ def split_vertex!( s )
18
+ adjacentVertices = @edges.dup.keep_if do |id, e|
19
+ e.vertices.collect(&:name).include? s
20
+ end.collect do |id, e|
21
+ [id, ( e.vertices.collect(&:name) - [s] )[0] ]
22
+ end
23
+
24
+ delete_vertex! s
25
+ adjacentVertices.each do |e|
26
+ delete_edge! e[0]
27
+ end
28
+
29
+ add_vertex "#{s}-1"
30
+ add_vertex "#{s}-2"
31
+ adjacentVertices.each do |e|
32
+ add_edge "#{e[0]}-1", "#{s}-1", e[1]
33
+ add_edge "#{e[0]}-2", "#{s}-2", e[1]
34
+ end
35
+
36
+ self
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ # required in "abstract_graph/graph/template"
2
+
3
+ module AbstractGraph
4
+ class Graph
5
+ class << self
6
+
7
+ # create a connected graph with two sets of vertices where
8
+ # the two sets only have vertices adjacent to the other set
9
+ # p: the number of vertices in the two sets. the first set has
10
+ # n vertices from 2**(0..n-1) and the second set has m
11
+ # vertices from 2**(n**m+n-1)
12
+ def complete_bipartite_graph n, m
13
+ result = new
14
+
15
+ # add the vertices to the graph
16
+ vertexN = (0..n-1).map do |i|
17
+ vName = 2**i
18
+ result.add_vertex "v#{vName}"
19
+ vName
20
+ end
21
+ vertexM = (0..m-1).map do |i|
22
+ vName = 2**(n+i)
23
+ result.add_vertex "v#{vName}"
24
+ vName
25
+ end
26
+
27
+ # add the edges to the graph, and make sure they're
28
+ # connected to the other set
29
+ vertexN.each do |vn|
30
+ vertexM.each do |vm|
31
+ result.add_edge "e#{vn + vm}", "v#{vn}", "v#{vm}"
32
+ end
33
+ end
34
+
35
+ result
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,25 @@
1
+ # required in "abstract_graph/graph/template"
2
+
3
+ module AbstractGraph
4
+ class Graph
5
+ class << self
6
+
7
+ # create a variabled sized complete graph
8
+ # that is, a graph where every vertex is adjacent
9
+ # to every other vertex
10
+ # p: the number of vertices in the desired complete graph
11
+ def complete_graph n
12
+ result = new
13
+ vertexNames = n.times.collect { |i| 2**i }
14
+ vertexNames.each do |i|
15
+ result.add_vertex "v#{i}"
16
+ end
17
+ vertexNames.combination(2).each do |i|
18
+ result.add_edge( "e#{i[0]+i[1]}", "v#{i[0]}", "v#{i[1]}" )
19
+ end
20
+ result
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,34 @@
1
+ # required in "abstract_graph/graph/template"
2
+
3
+ module AbstractGraph
4
+ class Graph
5
+ class << self
6
+
7
+ # create a variabled sized cycle graph,
8
+ # ie, a connected graph such that every vertex has
9
+ # exactly two distinct paths to every other vertex
10
+ # p: the number of vertices in the cycle graph
11
+ # coincidently, also the number of edges
12
+ def cycle_graph n
13
+ result = new
14
+ vertexNames = (n-1).times.collect { |i| 2**(i + 1) }
15
+ lastVertex = 2**(n-1)
16
+
17
+ # insert first vertex
18
+ result.add_vertex "v1"
19
+ vertexNames.each do |i|
20
+ # insert the rest of the vertices
21
+ result.add_vertex "v#{i}"
22
+ # insert the edge with the previous vertex
23
+ result.add_edge "e#{i + i/2}", "v#{i}", "v#{i/2}"
24
+ end
25
+
26
+ #insert the closing loop
27
+ result.add_edge "e#{1 + lastVertex}", "v1", "v#{lastVertex}"
28
+
29
+ result
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,28 @@
1
+ # required in "abstract_graph/graph/template"
2
+
3
+ module AbstractGraph
4
+ class Graph
5
+ class << self
6
+
7
+ # create a variable sized path graph,
8
+ # ie, a connected graph with 2 end vertices and n-2 connector
9
+ # vertices. Each connector vertex has two adjacent vertices
10
+ # p: the number of vertices in the path, n-1 edges
11
+ def path_graph n
12
+ result = new
13
+
14
+ # add the first vertex
15
+ result.add_vertex "v1"
16
+ (1..n-1).each do |i|
17
+ # add the rest of them
18
+ result.add_vertex "v#{2**i}"
19
+ result.add_edge "e#{2**i + 2**(i-1)}", "v#{2**i}", "v#{2**(i-1)}"
20
+ end
21
+
22
+ result
23
+ end
24
+
25
+ end
26
+ end
27
+ end
28
+
@@ -0,0 +1,36 @@
1
+ # required in "abstract_graph/graph/template"
2
+
3
+ module AbstractGraph
4
+ class Graph
5
+ class << self
6
+
7
+ # create a petersen graph.
8
+ # ie, a 3 regular graph with 10 vertices and 15 edges
9
+ def petersen_graph
10
+ result = new
11
+
12
+ vertexNames = []
13
+ # add all the vertices
14
+ 10.times do |i|
15
+ vName = 2**i
16
+ vertexNames << vName
17
+ result.add_vertex "v#{vName}"
18
+ end
19
+
20
+ specifiedEdges = [
21
+ [0, 1], [0, 5], [0, 4],
22
+ [1, 2], [2, 3], [3, 4],
23
+ [1, 6], [2, 7], [3, 8],
24
+ [4, 9], [5, 8], [5, 7],
25
+ [6, 9], [7, 9], [6, 8]]
26
+
27
+ specifiedEdges.each do |edgePair|
28
+ result.add_edge "e#{vertexNames[edgePair[0]] + vertexNames[edgePair[1]]}", "v#{vertexNames[edgePair[0]]}", "v#{vertexNames[edgePair[1]]}"
29
+ end
30
+
31
+ result
32
+ end
33
+
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,15 @@
1
+ # required in "abstract_graph/graph"
2
+
3
+ # Define a bunch of pre-constructed graphs
4
+
5
+ module Abstractgraph
6
+ class Graph
7
+
8
+ end
9
+ end
10
+
11
+ require "abstract_graph/graph/templates/complete_graph"
12
+ require "abstract_graph/graph/templates/cycle_graph"
13
+ require "abstract_graph/graph/templates/path_graph"
14
+ require "abstract_graph/graph/templates/complete_bipartite_graph"
15
+ require "abstract_graph/graph/templates/petersen_graph"
@@ -23,3 +23,11 @@ require "abstract_graph/graph/delete_vertex"
23
23
  require "abstract_graph/graph/add_edge"
24
24
  require "abstract_graph/graph/has_edge"
25
25
  require "abstract_graph/graph/delete_edge"
26
+ require "abstract_graph/graph/change_vertex_name"
27
+ require "abstract_graph/graph/change_edge_name"
28
+ require "abstract_graph/graph/is_adjacent"
29
+ require "abstract_graph/graph/adjacency_list"
30
+ require "abstract_graph/graph/merge_vertices"
31
+ require "abstract_graph/graph/get_edge_name"
32
+ require "abstract_graph/graph/templates"
33
+ require "abstract_graph/graph/split_vertex"
@@ -1,5 +1,5 @@
1
1
  # required in "abstract_graph"
2
2
 
3
3
  module AbstractGraph
4
- VERSION = "1.0.0"
4
+ VERSION = "1.1.0"
5
5
  end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ describe UniqueNameCollection do
6
+
7
+ before :all do
8
+ @name = "name"
9
+ @newname = "newname"
10
+ end
11
+
12
+ before :each do
13
+ @collection = UniqueNameCollection.new
14
+ @dummy = Dummy.new
15
+ @dummy.name = @name
16
+ @collection.add @dummy
17
+ end
18
+
19
+ describe "#rename(String,String)" do
20
+
21
+ it "removes the original name from the hash" do
22
+ @collection.rename @name, @newname
23
+ @collection[@name].should be_nil
24
+ end
25
+
26
+ it "renames the dummy object" do
27
+ @collection.rename @name, @newname
28
+ @dummy.name.should == @newname
29
+ end
30
+
31
+ it "throws an exception if the new name exists" do
32
+ @dummy = Dummy.new
33
+ @dummy.name = @newname
34
+ @collection.add @dummy
35
+ expect { @collection.rename @name, @newname }.to raise_error
36
+ end
37
+
38
+ end
39
+
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ module AbstractGraph
4
+ describe Graph do
5
+
6
+ before :all do
7
+ @vertex1 = "Vertex1"
8
+ @vertex2 = "Vertex2"
9
+ @vertex3 = "Vertex3"
10
+ @vertex4 = "Vertex4"
11
+ @edge1 = "Edge1"
12
+ @edge2 = "Edge2"
13
+ end
14
+
15
+ before :each do
16
+ @graph = Graph.new
17
+ @graph.add_vertex @vertex1
18
+ @graph.add_vertex @vertex2
19
+ @graph.add_vertex @vertex3
20
+ @graph.add_vertex @vertex4
21
+ @graph.add_edge @edge1, @vertex1, @vertex2
22
+ @graph.add_edge @edge2, @vertex2, @vertex3
23
+ end
24
+
25
+ describe "#adjacency_list(String)" do
26
+
27
+ it "returns an array if there are adjacent vertices" do
28
+ @graph.adjacency_list( @vertex1 ).should be_an_instance_of(Array)
29
+ end
30
+
31
+ it "returns nil if there are no adjacent vertices" do
32
+ @graph.adjacency_list( @vertex4).should be_nil
33
+ end
34
+
35
+ it "returns the vertices that are connected with edges" do
36
+ @graph.adjacency_list( @vertex2 ).should include(@vertex1)
37
+ @graph.adjacency_list( @vertex2 ).should include(@vertex3)
38
+ @graph.adjacency_list( @vertex1 ).should include(@vertex2)
39
+ end
40
+
41
+ end
42
+
43
+ end
44
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ module AbstractGraph
4
+ describe Graph do
5
+
6
+ before :all do
7
+ @vertex1 = "Vertex1"
8
+ @vertex2 = "Vertex2"
9
+ @vertex3 = "Vertex3"
10
+ @edge = "MyEdge"
11
+ @edgechanged = "MyChangedName"
12
+ end
13
+
14
+ before :each do
15
+ @graph = Graph.new
16
+ @graph.add_vertex @vertex1
17
+ @graph.add_vertex @vertex2
18
+ @graph.add_vertex @vertex3
19
+ @graph.add_edge @edge, @vertex1, @vertex2
20
+ end
21
+
22
+ describe "#change_edge_name(String,String)" do
23
+
24
+ it "returns an object of class Graph" do
25
+ @graph.change_edge_name( @edge, @edgechanged ).should be_an_instance_of(Graph)
26
+ end
27
+
28
+ it "changes the name of the vertex" do
29
+ @graph.change_edge_name @edge, @edgechanged
30
+ @graph.has_edge?( @edge ).should be_false
31
+ @graph.has_edge?( @edgechanged ).should be_true
32
+ end
33
+
34
+ it "throws an exception if the name has already been taken" do
35
+ @graph.add_edge @edgechanged, @vertex2, @vertex3
36
+ expect { @graph.change_edge_name( @edge, @edgechanged ) }.to raise_error
37
+ end
38
+
39
+ end
40
+
41
+ end
42
+ end