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.
Files changed (59) hide show
  1. data/.gitignore +18 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +22 -0
  4. data/README.rdoc +43 -0
  5. data/Rakefile +14 -0
  6. data/abstract_graph.gemspec +22 -0
  7. data/lib/abstract_graph.rb +10 -0
  8. data/lib/abstract_graph/composition.rb +11 -0
  9. data/lib/abstract_graph/composition/edge.rb +21 -0
  10. data/lib/abstract_graph/composition/edge/initialize.rb +18 -0
  11. data/lib/abstract_graph/composition/edge/is_coincident.rb +15 -0
  12. data/lib/abstract_graph/composition/uniquenamecollection.rb +21 -0
  13. data/lib/abstract_graph/composition/uniquenamecollection/add.rb +19 -0
  14. data/lib/abstract_graph/composition/uniquenamecollection/dup.rb +20 -0
  15. data/lib/abstract_graph/composition/uniquenamecollection/initialize.rb +14 -0
  16. data/lib/abstract_graph/composition/uniquenamecollection/link.rb +32 -0
  17. data/lib/abstract_graph/composition/uniquenamecollection/method_missing.rb +14 -0
  18. data/lib/abstract_graph/composition/vertex.rb +21 -0
  19. data/lib/abstract_graph/composition/vertex/delete.rb +12 -0
  20. data/lib/abstract_graph/composition/vertex/initialize.rb +14 -0
  21. data/lib/abstract_graph/graph.rb +25 -0
  22. data/lib/abstract_graph/graph/add_edge.rb +30 -0
  23. data/lib/abstract_graph/graph/add_vertex.rb +16 -0
  24. data/lib/abstract_graph/graph/delete_edge.rb +21 -0
  25. data/lib/abstract_graph/graph/delete_vertex.rb +21 -0
  26. data/lib/abstract_graph/graph/dup.rb +14 -0
  27. data/lib/abstract_graph/graph/has_edge.rb +13 -0
  28. data/lib/abstract_graph/graph/has_vertex.rb +13 -0
  29. data/lib/abstract_graph/graph/initialize.rb +16 -0
  30. data/lib/abstract_graph/version.rb +5 -0
  31. data/spec/abstract_graph/composition/edge/initialize_spec.rb +38 -0
  32. data/spec/abstract_graph/composition/edge/is_coincident_spec.rb +33 -0
  33. data/spec/abstract_graph/composition/edge/name_spec.rb +53 -0
  34. data/spec/abstract_graph/composition/edge/vertices_spec.rb +32 -0
  35. data/spec/abstract_graph/composition/edge_spec.rb +8 -0
  36. data/spec/abstract_graph/composition/uniquenamecollection/add_spec.rb +41 -0
  37. data/spec/abstract_graph/composition/uniquenamecollection/dup_spec.rb +29 -0
  38. data/spec/abstract_graph/composition/uniquenamecollection/initialize_spec.rb +21 -0
  39. data/spec/abstract_graph/composition/uniquenamecollection/link_spec.rb +67 -0
  40. data/spec/abstract_graph/composition/uniquenamecollection/method_missing_spec.rb +50 -0
  41. data/spec/abstract_graph/composition/uniquenamecollection_spec.rb +8 -0
  42. data/spec/abstract_graph/composition/vertex/delete_spec.rb +12 -0
  43. data/spec/abstract_graph/composition/vertex/initialize_spec.rb +45 -0
  44. data/spec/abstract_graph/composition/vertex/name_spec.rb +47 -0
  45. data/spec/abstract_graph/composition/vertex/value_spec.rb +46 -0
  46. data/spec/abstract_graph/composition/vertex_spec.rb +8 -0
  47. data/spec/abstract_graph/graph/add_edge_spec.rb +46 -0
  48. data/spec/abstract_graph/graph/add_vertex_spec.rb +29 -0
  49. data/spec/abstract_graph/graph/delete_edge_spec.rb +56 -0
  50. data/spec/abstract_graph/graph/delete_vertex_spec.rb +48 -0
  51. data/spec/abstract_graph/graph/dup_spec.rb +37 -0
  52. data/spec/abstract_graph/graph/has_edge_spec.rb +31 -0
  53. data/spec/abstract_graph/graph/has_vertex_spec.rb +27 -0
  54. data/spec/abstract_graph/graph/intialize_spec.rb +17 -0
  55. data/spec/abstract_graph/graph_spec.rb +6 -0
  56. data/spec/abstract_graph_spec.rb +7 -0
  57. data/spec/dummy_helper.rb +4 -0
  58. data/spec/spec_helper.rb +11 -0
  59. 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,8 @@
1
+ require 'spec_helper'
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ describe UniqueNameCollection do
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ describe Vertex do
6
+
7
+ describe "#delete" do
8
+
9
+ end
10
+ end
11
+ end
12
+ 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,8 @@
1
+ require 'spec_helper'
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ describe Vertex do
6
+ end
7
+ end
8
+ 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