From caa78ed9d5cc701ad971514403fd38d2568ab6fc Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 19 Jan 2020 18:53:52 +0100 Subject: [PATCH] started graph implementation --- tests/Stdlib/Graph/EdgeTest.php | 36 +++++++-- tests/Stdlib/Graph/GraphTest.php | 125 +++++++++++++++++++++++++++++-- tests/Stdlib/Graph/NodeTest.php | 51 ++++++++++++- 3 files changed, 197 insertions(+), 15 deletions(-) diff --git a/tests/Stdlib/Graph/EdgeTest.php b/tests/Stdlib/Graph/EdgeTest.php index 0c6d3f470..4163de405 100644 --- a/tests/Stdlib/Graph/EdgeTest.php +++ b/tests/Stdlib/Graph/EdgeTest.php @@ -18,20 +18,46 @@ use phpOMS\Stdlib\Graph\Edge; use phpOMS\Stdlib\Graph\Node; /** + * @testdox phpOMS\tests\Stdlib\Graph\EdgeTest: Edge between nodes + * * @internal */ class EdgeTest extends \PHPUnit\Framework\TestCase { + /** + * @testdox The edge has the expected default values after initialization + * @covers phpOMS\Stdlib\Graph\Edge + * @group framework + */ public function testDefault() : void { - $edge = new Edge(new Node(), new Node()); - self::assertEquals([new Node(), new Node()], $edge->getNodes()); - self::assertEquals(new Node(), $edge->getNode1()); - self::assertEquals(new Node(), $edge->getNode2()); + $edge = new Edge(new Node('1'), new Node('2')); + self::assertEquals([new Node('1'), new Node('2')], $edge->getNodes()); + self::assertTrue($edge->getNode1()->isEqual(new Node('1'))); + self::assertTrue($edge->getNode2()->isEqual(new Node('2'))); self::assertEquals(0.0, $edge->getWeight()); self::assertFalse($edge->isDirected()); + } - $edge = new Edge(new Node(), new Node(), 0.0, true); + /** + * @testdox An edge can be directed + * @covers phpOMS\Stdlib\Graph\Edge + * @group framework + */ + public function testDirected() : void + { + $edge = new Edge(new Node('7'), new Node('8'), 1.0, true); self::assertTrue($edge->isDirected()); } + + /** + * @testdox An edge can have a weight + * @covers phpOMS\Stdlib\Graph\Edge + * @group framework + */ + public function testWeight() : void + { + $edge = new Edge(new Node('7'), new Node('8'), 1.0, true); + self::assertEquals(1.0, $edge->getWeight()); + } } diff --git a/tests/Stdlib/Graph/GraphTest.php b/tests/Stdlib/Graph/GraphTest.php index fa5ed59a4..3f242b9e1 100644 --- a/tests/Stdlib/Graph/GraphTest.php +++ b/tests/Stdlib/Graph/GraphTest.php @@ -15,12 +15,20 @@ declare(strict_types=1); namespace phpOMS\tests\Stdlib\Graph; use phpOMS\Stdlib\Graph\Graph; +use phpOMS\Stdlib\Graph\Node; /** + * @testdox hpOMS\tests\Stdlib\Graph\Graph: Graph + * * @internal */ class GraphTest extends \PHPUnit\Framework\TestCase { + /** + * @testdox The graph has the expected default values after initialization + * @covers phpOMS\Stdlib\Graph\Graph + * @group framework + */ public function testDefault() : void { $graph = new Graph(); @@ -28,13 +36,6 @@ class GraphTest extends \PHPUnit\Framework\TestCase self::assertNull($graph->getNode('invalid')); self::assertEquals([], $graph->getNodes()); - self::assertNull($graph->getEdge('invalid')); - self::assertEquals([], $graph->getEdges()); - - self::assertEquals([], $graph->getEdgesOfNode('invalid')); - self::assertEquals([], $graph->getNeighbors('invalid')); - - self::assertEquals(0, $graph->getDimension()); self::assertEquals(0, $graph->getDiameter()); self::assertEquals(0, $graph->getOrder()); self::assertEquals(0, $graph->getSize()); @@ -58,4 +59,114 @@ class GraphTest extends \PHPUnit\Framework\TestCase self::assertEquals([], $graph->longestPathBetweenNodes('invalid1', 'invalid2')); self::assertEquals([], $graph->getUnconnected()); } + + public function testGraphWithBridge() : void + { + $graph = new Graph(); + + $node0 = new Node('0'); + $node1 = new Node('1'); + $node2 = new Node('2'); + $node3 = new Node('3'); + $node4 = new Node('4'); + $node5 = new Node('5'); + $node6 = new Node('6'); + + $graph->setNode($node0); + $graph->setNode($node1); + $graph->setNode($node2); + $graph->setNode($node3); + $graph->setNode($node4); + $graph->setNode($node5); + $graph->setNode($node6); + + $node0->setNodeRelative($node1); + $node0->setNodeRelative($node2); + $node1->setNodeRelative($node2); + $node1->setNodeRelative($node3); + $node1->setNodeRelative($node4); + $node1->setNodeRelative($node6); + $node3->setNodeRelative($node5); + $node4->setNodeRelative($node5); + + $bridges = $graph->getBridges(); + self::assertCount(1, $bridges); + self::assertEquals('1', $bridges[0]->getNode1()->getId()); + self::assertEquals('6', $bridges[0]->getNode2()->getId()); + } + + public function testGraphWithBridges() : void + { + $graph = new Graph(); + + $node0 = new Node('0'); + $node1 = new Node('1'); + $node2 = new Node('2'); + $node3 = new Node('3'); + + $graph->setNode($node0); + $graph->setNode($node1); + $graph->setNode($node2); + $graph->setNode($node3); + + $node0->setNodeRelative($node1); + $node1->setNodeRelative($node2); + $node2->setNodeRelative($node3); + + $bridges = $graph->getBridges(); + self::assertCount(3, $bridges); + } + + public function testGraphWithoutBridges() : void + { + $graph = new Graph(); + + $node0 = new Node('0'); + $node1 = new Node('1'); + $node2 = new Node('2'); + + $graph->setNode($node0); + $graph->setNode($node1); + $graph->setNode($node2); + + $node0->setNodeRelative($node1); + $node0->setNodeRelative($node2); + $node1->setNodeRelative($node2); + + $bridges = $graph->getBridges(); + self::assertCount(0, $bridges); + } + + public function testEdgesInputOutput() : void + { + $graph = new Graph(); + + $node0 = new Node('0'); + $node1 = new Node('1'); + $node2 = new Node('2'); + $node3 = new Node('3'); + $node4 = new Node('4'); + $node5 = new Node('5'); + $node6 = new Node('6'); + + $graph->setNode($node0); + $graph->setNode($node1); + $graph->setNode($node2); + $graph->setNode($node3); + $graph->setNode($node4); + $graph->setNode($node5); + $graph->setNode($node6); + + $node0->setNodeRelative($node1); + $node0->setNodeRelative($node2); + $node1->setNodeRelative($node2); + $node1->setNodeRelative($node3); + $node1->setNodeRelative($node4); + $node1->setNodeRelative($node6); + $node3->setNodeRelative($node5); + $node4->setNodeRelative($node5); + + $edges = $graph->getEdges(); + self::assertCount(8, $edges); + } } diff --git a/tests/Stdlib/Graph/NodeTest.php b/tests/Stdlib/Graph/NodeTest.php index 01cfecf85..dfcb16349 100644 --- a/tests/Stdlib/Graph/NodeTest.php +++ b/tests/Stdlib/Graph/NodeTest.php @@ -17,22 +17,67 @@ namespace phpOMS\tests\Stdlib\Graph; use phpOMS\Stdlib\Graph\Node; /** + * @testdox phpOMS\tests\Stdlib\Graph\NodeTest: Node in a graph + * * @internal */ class NodeTest extends \PHPUnit\Framework\TestCase { + /** + * @testdox The node has the expected default values after initialization + * @covers phpOMS\Stdlib\Graph\Node + * @group framework + */ public function testDefault() : void { - $node = new Node(); + $node = new Node('A'); + self::assertEquals('A', $node->getId()); self::assertNull($node->getData()); + self::assertNull($node->getEdge(0)); + self::assertEquals([], $node->getEdges()); + self::assertEquals([], $node->getNeighbors()); } - public function testGetSet() : void + /** + * @testdox The node data can be set and returned + * @covers phpOMS\Stdlib\Graph\Node + * @group framework + */ + public function testDataInputOutput() : void { - $node = new Node(1); + $node = new Node('B', 1); self::assertEquals(1, $node->getData()); $node->setData(false); self::assertFalse($node->getData()); } + + /** + * @testdox Two equal nodes are equal + * @covers phpOMS\Stdlib\Graph\Node + * @group framework + */ + public function testNodesEqual() : void + { + $node = new Node('B', 1); + self::assertTrue($node->isEqual($node)); + } + + /** + * @testdox Two different nodes are not equal + * @covers phpOMS\Stdlib\Graph\Node + * @group framework + */ + public function testNodesNotEqual() : void + { + $node = new Node('A', 1); + $node2 = new Node('B', 1); + + self::assertFalse($node->isEqual($node2)); + + $node = new Node('A', 1); + $node2 = new Node('A', 2); + + self::assertFalse($node->isEqual($node2)); + } }