Product graphs working initially
[graph.njae.git] / spec / graph / graph_spec.rb
1 require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
3 module GraphNjae
4
5 class SVertex < Vertex
6 end
7
8 class SEdge < Edge
9 end
10
11 describe Graph do
12 let (:g) { Graph.new }
13 describe "#initialize" do
14 it "creates an empty graph" do
15 g = Graph.new
16 g.edges.should be_empty
17 g.vertices.should be_empty
18 end
19
20 it "creates a graph with some parameters" do
21 g = Graph.new :value1 => 1, :value2 => "value2", :value3 => :v3
22 g.value1.should == 1
23 g.value2.should == "value2"
24 g.value3.should == :v3
25 g.value4.should be_nil
26 end
27
28 end # #initialize
29
30 describe "adds attribues" do
31 it "adds then reports arbitrary attributes" do
32 g.score = 15
33 g.score == 15
34 end
35 end # adds attributes
36
37 describe "#<<" do
38 it "adds a set of vertices" do
39 g.vertices.should be_empty
40 v1 = Vertex.new
41 v2 = Vertex.new
42 g << v1 << v2
43 g.should have(2).vertices
44 g.vertices.should include(v1)
45 g.vertices.should include(v2)
46 end
47
48 it "adds a set of edges" do
49 g.edges.should be_empty
50 e1 = Edge.new
51 e2 = Edge.new
52 g << e1 << e2
53 g.should have(2).edges
54 g.edges.should include(e1)
55 g.edges.should include(e2)
56 end
57
58 it "adds a mixed set of vertices and edges" do
59 g.vertices.should be_empty
60 g.edges.should be_empty
61 v1 = Vertex.new
62 v2 = Vertex.new
63 e1 = Edge.new
64 e2 = Edge.new
65 g << v1 << e1 << v2 << e2
66 g.should have(2).vertices
67 g.vertices.should include(v1)
68 g.vertices.should include(v2)
69 g.should have(2).edges
70 g.edges.should include(e1)
71 g.edges.should include(e2)
72 end
73
74 it "adds a subclass of Vertex" do
75 g.vertices.should be_empty
76 v1 = SVertex.new
77 v2 = SVertex.new
78 g << v1 << v2
79 g.should have(2).vertices
80 g.vertices.should include(v1)
81 g.vertices.should include(v2)
82 end
83 end # #<<
84
85 describe "connect" do
86 it "adds and records an edge between vertices" do
87 g.vertices.should be_empty
88 g.edges.should be_empty
89 v1 = Vertex.new(:name => :v1)
90 v2 = Vertex.new(:name => :v2)
91 g.connect(v1, v2)
92
93 g.should have(2).vertices
94 g.vertices.should include(v1)
95 g.vertices.should include(v2)
96 g.should have(1).edges
97 end
98 end # #connect
99
100 describe "product" do
101 it "finds a product graph of a pair of one-vertex graphs" do
102 g1 = Graph.new
103 g2 = Graph.new
104 g1v1 = Vertex.new
105 g1 << g1v1
106 g2v1 = Vertex.new
107 g2 << g2v1
108 product = g1.product g2
109
110 product.should have(1).vertices
111 product.vertices.first.g1_vertex.should == g1v1
112 product.vertices.first.g2_vertex.should == g2v1
113 product.edges.should be_empty
114 end
115
116 it "finds a product graph of a pair of simple graphs" do
117 g1 = Graph.new
118 g2 = Graph.new
119 g1v1 = Vertex.new(:name => :g1v1)
120 g1v2 = Vertex.new(:name => :g1v2)
121 g1.connect(g1v1, g1v2)
122 g2v1 = Vertex.new(:name => :g2v1)
123 g2v2 = Vertex.new(:name => :g2v2)
124 g2.connect(g2v1, g2v2)
125 pg = g1.product g2
126
127 pg.should have(4).vertices
128 pg.should have(2).edges
129 end
130
131 end
132
133 end
134 end