1+ <?php
2+
3+ use Fhaculty \Graph \Graph ;
4+
5+ use Fhaculty \Graph \Vertex ;
6+ use Fhaculty \Graph \Loader \CompleteGraph as LoaderCompleteGraph ;
7+ use Fhaculty \Graph \Algorithm \MinimumSpanningTree \Base as MstBase ;
8+
9+ abstract class BaseMstTest extends TestCase
10+ {
11+ /**
12+ * @param Vertex $vertex
13+ * @return MstBase
14+ */
15+ abstract protected function createAlg (Vertex $ vertex );
16+
17+ public function testIsolatedVertex ()
18+ {
19+ $ graph = new Graph ();
20+ $ v1 = $ graph ->createVertex (1 );
21+
22+ $ alg = $ this ->createAlg ($ v1 );
23+
24+ $ this ->assertCount (0 , $ alg ->getEdges ());
25+ $ this ->assertEquals (0 , $ alg ->getWeight ());
26+
27+ $ graphMst = $ alg ->createGraph ();
28+ $ this ->assertGraphEquals ($ graph , $ graphMst );
29+ }
30+
31+ public function testSingleEdge ()
32+ {
33+ // 1 --[3]-- 2
34+ $ graph = new Graph ();
35+ $ v1 = $ graph ->createVertex (1 );
36+ $ v2 = $ graph ->createVertex (2 );
37+ $ v1 ->createEdge ($ v2 )->setWeight (3 );
38+
39+ $ alg = $ this ->createAlg ($ v1 );
40+
41+ $ this ->assertCount (1 , $ alg ->getEdges ());
42+ $ this ->assertEquals (3 , $ alg ->getWeight ());
43+ $ this ->assertGraphEquals ($ graph , $ alg ->createGraph ());
44+ }
45+
46+ public function testSimpleGraph ()
47+ {
48+ // 1 --[6]-- 2 --[9]-- 3 --[7]-- 4 --[8]-- 5
49+ $ graph = new Graph ();
50+ $ v1 = $ graph ->createVertex (1 );
51+ $ v2 = $ graph ->createVertex (2 );
52+ $ v3 = $ graph ->createVertex (3 );
53+ $ v4 = $ graph ->createVertex (4 );
54+ $ v5 = $ graph ->createVertex (5 );
55+ $ v1 ->createEdge ($ v2 )->setWeight (6 );
56+ $ v2 ->createEdge ($ v3 )->setWeight (9 );
57+ $ v3 ->createEdge ($ v4 )->setWeight (7 );
58+ $ v4 ->createEdge ($ v5 )->setWeight (8 );
59+
60+ $ alg = $ this ->createAlg ($ v1 );
61+
62+ $ graphMst = $ alg ->createGraph ();
63+ $ this ->assertGraphEquals ($ graph , $ graphMst );
64+ }
65+
66+ public function testFindingCheapestEdge ()
67+ {
68+ // /--[4]--\
69+ // / \
70+ // 1 ---[3]--- 2
71+ // \ /
72+ // \--[5]--/
73+ $ graph = new Graph ();
74+ $ v1 = $ graph ->createVertex (1 );
75+ $ v2 = $ graph ->createVertex (2 );
76+ $ v1 ->createEdge ($ v2 )->setWeight (4 );
77+ $ v1 ->createEdge ($ v2 )->setWeight (3 );
78+ $ v1 ->createEdge ($ v2 )->setWeight (5 );
79+
80+ $ alg = $ this ->createAlg ($ v1 );
81+ $ edges = $ alg ->getEdges ();
82+
83+ $ this ->assertCount (1 , $ edges );
84+ $ this ->assertEquals (3 , $ edges ->getEdgeFirst ()->getWeight ());
85+ $ this ->assertEquals (3 , $ alg ->getWeight ());
86+ }
87+
88+ public function testFindingCheapestTree ()
89+ {
90+ // 1 --[4]-- 2 --[5]-- 3
91+ // \ /
92+ // \-------[6]-----/
93+ $ graph = new Graph ();
94+ $ v1 = $ graph ->createVertex (1 );
95+ $ v2 = $ graph ->createVertex (2 );
96+ $ v3 = $ graph ->createVertex (3 );
97+ $ v1 ->createEdge ($ v2 )->setWeight (4 );
98+ $ v2 ->createEdge ($ v3 )->setWeight (5 );
99+ $ v3 ->createEdge ($ v1 )->setWeight (6 );
100+
101+ // 1 --[4]-- 2 -- [5] -- 3
102+ $ graphExpected = new Graph ();
103+ $ ve1 = $ graphExpected ->createVertex (1 );
104+ $ ve2 = $ graphExpected ->createVertex (2 );
105+ $ ve3 = $ graphExpected ->createVertex (3 );
106+ $ ve1 ->createEdge ($ ve2 )->setWeight (4 );
107+ $ ve2 ->createEdge ($ ve3 )->setWeight (5 );
108+
109+ $ alg = $ this ->createAlg ($ v1 );
110+ $ this ->assertCount (2 , $ alg ->getEdges ());
111+ $ this ->assertEquals (9 , $ alg ->getWeight ());
112+ $ this ->assertGraphEquals ($ graphExpected , $ alg ->createGraph ());
113+ }
114+
115+ public function testMixedGraphDirectionIsIgnored ()
116+ {
117+ // 1 --[6]-> 2 --[7]-- 3 --[8]-- 4 <-[9]-- 5
118+ $ graph = new Graph ();
119+ $ v1 = $ graph ->createVertex (1 );
120+ $ v2 = $ graph ->createVertex (2 );
121+ $ v3 = $ graph ->createVertex (3 );
122+ $ v4 = $ graph ->createVertex (4 );
123+ $ v5 = $ graph ->createVertex (5 );
124+ $ v1 ->createEdgeTo ($ v2 )->setWeight (6 );
125+ $ v2 ->createEdge ($ v3 )->setWeight (7 );
126+ $ v4 ->createEdge ($ v3 )->setWeight (8 );
127+ $ v5 ->createEdgeTo ($ v4 )->setWeight (9 );
128+
129+ $ alg = $ this ->createAlg ($ v1 );
130+
131+ $ this ->assertCount (4 , $ alg ->getEdges ());
132+ $ this ->assertEquals (30 , $ alg ->getWeight ());
133+ $ this ->assertGraphEquals ($ graph , $ alg ->createGraph ());
134+ }
135+
136+ /**
137+ * @expectedException UnexpectedValueException
138+ */
139+ public function testMultipleComponentsFail ()
140+ {
141+ // 1 --[1]-- 2, 3 --[1]-- 4
142+ $ graph = new Graph ();
143+ $ v1 = $ graph ->createVertex (1 );
144+ $ v2 = $ graph ->createVertex (2 );
145+ $ v3 = $ graph ->createVertex (3 );
146+ $ v4 = $ graph ->createVertex (4 );
147+ $ v1 ->createEdge ($ v2 )->setWeight (1 );
148+ $ v3 ->createEdge ($ v4 )->setWeight (1 );
149+
150+ $ alg = $ this ->createAlg ($ v1 );
151+ $ alg ->getEdges ();
152+ }
153+
154+ /**
155+ * @expectedException UnexpectedValueException
156+ */
157+ public function testMultipleIsolatedVerticesFormMultipleComponentsFail ()
158+ {
159+ // 1, 2
160+ $ graph = new Graph ();
161+ $ v1 = $ graph ->createVertex (1 );
162+ $ v2 = $ graph ->createVertex (2 );
163+
164+ $ alg = $ this ->createAlg ($ v1 );
165+ $ alg ->getEdges ();
166+ }
167+
168+
169+ }
0 commit comments