mirror of
https://github.com/Karaka-Management/phpOMS.git
synced 2026-01-11 09:48:40 +00:00
started graph implementation
This commit is contained in:
parent
8c0905c39b
commit
caa78ed9d5
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user