abstract_graph 1.0.0
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.
- data/.gitignore +18 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.rdoc +43 -0
- data/Rakefile +14 -0
- data/abstract_graph.gemspec +22 -0
- data/lib/abstract_graph.rb +10 -0
- data/lib/abstract_graph/composition.rb +11 -0
- data/lib/abstract_graph/composition/edge.rb +21 -0
- data/lib/abstract_graph/composition/edge/initialize.rb +18 -0
- data/lib/abstract_graph/composition/edge/is_coincident.rb +15 -0
- data/lib/abstract_graph/composition/uniquenamecollection.rb +21 -0
- data/lib/abstract_graph/composition/uniquenamecollection/add.rb +19 -0
- data/lib/abstract_graph/composition/uniquenamecollection/dup.rb +20 -0
- data/lib/abstract_graph/composition/uniquenamecollection/initialize.rb +14 -0
- data/lib/abstract_graph/composition/uniquenamecollection/link.rb +32 -0
- data/lib/abstract_graph/composition/uniquenamecollection/method_missing.rb +14 -0
- data/lib/abstract_graph/composition/vertex.rb +21 -0
- data/lib/abstract_graph/composition/vertex/delete.rb +12 -0
- data/lib/abstract_graph/composition/vertex/initialize.rb +14 -0
- data/lib/abstract_graph/graph.rb +25 -0
- data/lib/abstract_graph/graph/add_edge.rb +30 -0
- data/lib/abstract_graph/graph/add_vertex.rb +16 -0
- data/lib/abstract_graph/graph/delete_edge.rb +21 -0
- data/lib/abstract_graph/graph/delete_vertex.rb +21 -0
- data/lib/abstract_graph/graph/dup.rb +14 -0
- data/lib/abstract_graph/graph/has_edge.rb +13 -0
- data/lib/abstract_graph/graph/has_vertex.rb +13 -0
- data/lib/abstract_graph/graph/initialize.rb +16 -0
- data/lib/abstract_graph/version.rb +5 -0
- data/spec/abstract_graph/composition/edge/initialize_spec.rb +38 -0
- data/spec/abstract_graph/composition/edge/is_coincident_spec.rb +33 -0
- data/spec/abstract_graph/composition/edge/name_spec.rb +53 -0
- data/spec/abstract_graph/composition/edge/vertices_spec.rb +32 -0
- data/spec/abstract_graph/composition/edge_spec.rb +8 -0
- data/spec/abstract_graph/composition/uniquenamecollection/add_spec.rb +41 -0
- data/spec/abstract_graph/composition/uniquenamecollection/dup_spec.rb +29 -0
- data/spec/abstract_graph/composition/uniquenamecollection/initialize_spec.rb +21 -0
- data/spec/abstract_graph/composition/uniquenamecollection/link_spec.rb +67 -0
- data/spec/abstract_graph/composition/uniquenamecollection/method_missing_spec.rb +50 -0
- data/spec/abstract_graph/composition/uniquenamecollection_spec.rb +8 -0
- data/spec/abstract_graph/composition/vertex/delete_spec.rb +12 -0
- data/spec/abstract_graph/composition/vertex/initialize_spec.rb +45 -0
- data/spec/abstract_graph/composition/vertex/name_spec.rb +47 -0
- data/spec/abstract_graph/composition/vertex/value_spec.rb +46 -0
- data/spec/abstract_graph/composition/vertex_spec.rb +8 -0
- data/spec/abstract_graph/graph/add_edge_spec.rb +46 -0
- data/spec/abstract_graph/graph/add_vertex_spec.rb +29 -0
- data/spec/abstract_graph/graph/delete_edge_spec.rb +56 -0
- data/spec/abstract_graph/graph/delete_vertex_spec.rb +48 -0
- data/spec/abstract_graph/graph/dup_spec.rb +37 -0
- data/spec/abstract_graph/graph/has_edge_spec.rb +31 -0
- data/spec/abstract_graph/graph/has_vertex_spec.rb +27 -0
- data/spec/abstract_graph/graph/intialize_spec.rb +17 -0
- data/spec/abstract_graph/graph_spec.rb +6 -0
- data/spec/abstract_graph_spec.rb +7 -0
- data/spec/dummy_helper.rb +4 -0
- data/spec/spec_helper.rb +11 -0
- metadata +149 -0
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module AbstractGraph
|
4
|
+
module Composition
|
5
|
+
describe UniqueNameCollection do
|
6
|
+
|
7
|
+
before :each do
|
8
|
+
@collection = UniqueNameCollection.new
|
9
|
+
@dummies = ('a'..'z').map do |c|
|
10
|
+
d = Dummy.new
|
11
|
+
d.name = c
|
12
|
+
d
|
13
|
+
end
|
14
|
+
@dummies.each do |d|
|
15
|
+
@collection.add d
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#size" do
|
20
|
+
|
21
|
+
it "should return the size of the collection" do
|
22
|
+
@collection.size.should == @dummies.count
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "#has_key?(String)" do
|
28
|
+
|
29
|
+
it "should return whether the string is an included name" do
|
30
|
+
@collection.has_key?('d').should be_true
|
31
|
+
@collection.has_key?('saddy').should be_false
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "#each_key" do
|
37
|
+
|
38
|
+
it "goes through every name in the collection" do
|
39
|
+
alphabet = ""
|
40
|
+
@collection.each_key do |c|
|
41
|
+
alphabet += c
|
42
|
+
end
|
43
|
+
alphabet.should == "abcdefghijklmnopqrstuvwxyz"
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module AbstractGraph
|
4
|
+
module Composition
|
5
|
+
describe Vertex do
|
6
|
+
|
7
|
+
describe "#new" do
|
8
|
+
|
9
|
+
before (:each) do
|
10
|
+
@vertex = Vertex.new
|
11
|
+
end
|
12
|
+
|
13
|
+
it "returns an object of class Vertex" do
|
14
|
+
@vertex.should be_an_instance_of(Vertex)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#new(String)" do
|
20
|
+
|
21
|
+
before (:each) do
|
22
|
+
@vertex = Vertex.new("v1")
|
23
|
+
end
|
24
|
+
|
25
|
+
it "allows vertices to be initiated with a string name" do
|
26
|
+
@vertex.should_not be_nil
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#new(String, Object)" do
|
32
|
+
|
33
|
+
before (:each) do
|
34
|
+
@vertex = Vertex.new("v1", "Hello")
|
35
|
+
end
|
36
|
+
|
37
|
+
it "allows vertices to be initiated with name and value" do
|
38
|
+
@vertex.should_not be_nil
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module AbstractGraph
|
4
|
+
module Composition
|
5
|
+
describe Vertex do
|
6
|
+
|
7
|
+
describe "#name" do
|
8
|
+
|
9
|
+
before (:each) do
|
10
|
+
@arbitraryString = "abitraryString"
|
11
|
+
@vertex = Vertex.new(@arbitraryString)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "returns a String (Always)" do
|
15
|
+
@vertex.name.should be_an_instance_of(String)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "equals to the String in #new(String)" do
|
19
|
+
@vertex.name.should eql(@arbitraryString)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "equals to \"\" if nothing was passed as first param" do
|
23
|
+
@vertex2 = Vertex.new()
|
24
|
+
@vertex2.name.should eql("")
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "#name=" do
|
30
|
+
|
31
|
+
before (:each) do
|
32
|
+
@vertex = Vertex.new()
|
33
|
+
end
|
34
|
+
|
35
|
+
it "names the vertex and retrieved by #name" do
|
36
|
+
@vertex.name = "Hello World"
|
37
|
+
@vertex.name.should eql("Hello World")
|
38
|
+
end
|
39
|
+
|
40
|
+
it "doesn't allow a non-String input" do
|
41
|
+
expect { @vertex.name = 100 }.to raise_error
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module AbstractGraph
|
4
|
+
module Composition
|
5
|
+
describe Vertex do
|
6
|
+
|
7
|
+
describe "#value" do
|
8
|
+
|
9
|
+
before (:each) do
|
10
|
+
@arbitraryString = "arbitraryString"
|
11
|
+
@arbitraryObject = Object.new
|
12
|
+
end
|
13
|
+
|
14
|
+
it "equals the object passed in #new(String, Object)" do
|
15
|
+
vertex = Vertex.new(@arbitraryString, @arbitraryObject)
|
16
|
+
vertex.value.should eql(@arbitraryObject)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "equals to nil if nothing was passed as second param" do
|
20
|
+
vertex = Vertex.new()
|
21
|
+
vertex.value.should be_nil
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#value=" do
|
27
|
+
|
28
|
+
before (:each) do
|
29
|
+
@vertex = Vertex.new()
|
30
|
+
end
|
31
|
+
|
32
|
+
it "allows us to change the value of the vertex" do
|
33
|
+
@vertex.value = 2
|
34
|
+
@vertex.value.should eql(2)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "allows us to create two vertices of the same object" do
|
38
|
+
@vertex.value = "Hello"
|
39
|
+
@vertex2 = Vertex.new("v2", "Hello")
|
40
|
+
@vertex.value.should eql(@vertex2.value)
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module AbstractGraph
|
4
|
+
describe Graph do
|
5
|
+
|
6
|
+
before :each do
|
7
|
+
@vertex1 = "Vertex1"
|
8
|
+
@vertex2 = "Vertex2"
|
9
|
+
@vertex3 = "Vertex3"
|
10
|
+
@graph = Graph.new
|
11
|
+
@graph.add_vertex @vertex1
|
12
|
+
@graph.add_vertex @vertex2
|
13
|
+
@graph.add_vertex @vertex3
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#add_edge(String, String, String)" do
|
17
|
+
|
18
|
+
it "returns an object of class Graph" do
|
19
|
+
@graph.add_edge( "MyEdge", @vertex1, @vertex2 ).should be_an_instance_of(Graph)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "throws an exception when adding edge of existing name" do
|
23
|
+
@graph.add_edge( "MyEdge", @vertex1, @vertex2 ).should be_an_instance_of(Graph)
|
24
|
+
expect { @graph.add_edge( "MyEdge", @vertex1, @vertex3 ) }.to raise_error
|
25
|
+
expect { @graph.add_edge( @vertex1, @vertex1, @vertex3) }.to raise_error
|
26
|
+
end
|
27
|
+
|
28
|
+
it "doesn't allow an edge to be a loop" do
|
29
|
+
expect { @graph.add_edge( "MyEdge", @vertex1, @vertex1 ) }.to raise_error
|
30
|
+
end
|
31
|
+
|
32
|
+
it "doesn't allow multiple edges" do
|
33
|
+
@graph.add_edge( "MyEdge", @vertex1, @vertex2 )
|
34
|
+
expect { @graph.add_edge( "MyEdge2", @vertex1, @vertex2 ) }.to raise_error
|
35
|
+
end
|
36
|
+
|
37
|
+
it "returns nil if any of the vertices don't exist" do
|
38
|
+
@graph.add_edge( "MyEdge", @vertex1, "randomString" ).should be_nil
|
39
|
+
@graph.add_edge( "MyEdge", "randomString", @vertex1 ).should be_nil
|
40
|
+
@graph.edges["MyEdge"].should be_nil
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module AbstractGraph
|
4
|
+
describe Graph do
|
5
|
+
|
6
|
+
before :each do
|
7
|
+
@graph = Graph.new
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "#add_vertex(String)" do
|
11
|
+
|
12
|
+
it "returns an object of class Graph" do
|
13
|
+
@graph.add_vertex( "MyVertex" ).should be_an_instance_of(Graph)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "throws an exception when adding vertex of existing name" do
|
17
|
+
@graph.add_vertex( "MyVertex" )
|
18
|
+
expect { @graph.add_vertex( "MyVertex" ) }.to raise_error
|
19
|
+
end
|
20
|
+
|
21
|
+
it "allows two different graphs to have the same names" do
|
22
|
+
graph2 = Graph.new
|
23
|
+
@graph.add_vertex( "MyVertex" )
|
24
|
+
expect { graph2.add_vertex( "MyVertex" ) }.to_not raise_error
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module AbstractGraph
|
4
|
+
describe Graph do
|
5
|
+
|
6
|
+
before :all do
|
7
|
+
@vertex1 = "Vertex1"
|
8
|
+
@vertex2 = "Vertex2"
|
9
|
+
@edge = "MyEdge"
|
10
|
+
end
|
11
|
+
|
12
|
+
before :each do
|
13
|
+
@graph = Graph.new
|
14
|
+
@graph.add_vertex @vertex1
|
15
|
+
@graph.add_vertex @vertex2
|
16
|
+
@graph.add_edge @edge, @vertex1, @vertex2
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#delete_edge(String)" do
|
20
|
+
|
21
|
+
it "returns an object of class Graph" do
|
22
|
+
@graph.delete_edge( @edge ).should be_an_instance_of(Graph)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "returns an object without the edge" do
|
26
|
+
nextGraph = @graph.delete_edge( @edge )
|
27
|
+
nextGraph.has_edge?( @edge ).should be_false
|
28
|
+
end
|
29
|
+
|
30
|
+
it "does not modify the original graph" do
|
31
|
+
@graph.delete_edge( @edge )
|
32
|
+
@graph.has_edge?( @edge ).should be_true
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "#delete_edge!(String)" do
|
38
|
+
|
39
|
+
it "returns an object of class Graph" do
|
40
|
+
@graph.delete_edge!( @edge ).should be_an_instance_of(Graph)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "returns an object without the edge" do
|
44
|
+
nextGraph = @graph.delete_edge!( @edge )
|
45
|
+
nextGraph.has_edge?( @edge ).should be_false
|
46
|
+
end
|
47
|
+
|
48
|
+
it "removes the edge from the original graph" do
|
49
|
+
@graph.delete_edge!( @edge )
|
50
|
+
@graph.has_edge?( @edge ).should be_false
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module AbstractGraph
|
4
|
+
describe Graph do
|
5
|
+
|
6
|
+
before :each do
|
7
|
+
@graph = Graph.new
|
8
|
+
@graph.add_vertex "MyVertex"
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#delete_vertex(String)" do
|
12
|
+
|
13
|
+
it "returns an object of class Graph" do
|
14
|
+
@graph.delete_vertex( "MyVertex" ).should be_an_instance_of(Graph)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "returns an object without the vertex" do
|
18
|
+
nextGraph = @graph.delete_vertex( "MyVertex" )
|
19
|
+
nextGraph.has_vertex?( "MyVertex" ).should be_false
|
20
|
+
end
|
21
|
+
|
22
|
+
it "does not modify the original graph" do
|
23
|
+
@graph.delete_vertex( "MyVertex" )
|
24
|
+
@graph.has_vertex?( "MyVertex" ).should be_true
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "#delete_vertex!(String)" do
|
30
|
+
|
31
|
+
it "returns an object of class Graph" do
|
32
|
+
@graph.delete_vertex!( "MyVertex" ).should be_an_instance_of(Graph)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "returns an object without the vertex" do
|
36
|
+
nextGraph = @graph.delete_vertex!( "MyVertex" )
|
37
|
+
nextGraph.has_vertex?( "MyVertex" ).should be_false
|
38
|
+
end
|
39
|
+
|
40
|
+
it "removes the vertex from the original graph" do
|
41
|
+
@graph.delete_vertex!( "MyVertex" )
|
42
|
+
@graph.has_vertex?( "MyVertex" ).should be_false
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module AbstractGraph
|
4
|
+
module Composition
|
5
|
+
describe Graph do
|
6
|
+
|
7
|
+
before :each do
|
8
|
+
@graph = Graph.new
|
9
|
+
@graph.add_vertex "MyVertex"
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#dup" do
|
13
|
+
|
14
|
+
it "returns a graph object" do
|
15
|
+
@graph.dup.should be_an_instance_of(Graph)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "has a different id than the original graph" do
|
19
|
+
@graph.object_id.should_not == @graph.dup.object_id
|
20
|
+
end
|
21
|
+
|
22
|
+
it "copies over the existing vertices" do
|
23
|
+
graphdup = @graph.dup
|
24
|
+
graphdup.has_vertex?( "MyVertex" ).should be_true
|
25
|
+
end
|
26
|
+
|
27
|
+
it "will not modify the original if it is modified" do
|
28
|
+
graphdup = @graph.dup
|
29
|
+
graphdup.vertices.clear
|
30
|
+
@graph.vertices.size.should == 1
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|