GraphTest.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\Data\Test\Unit;
  7. class GraphTest extends \PHPUnit\Framework\TestCase
  8. {
  9. /**
  10. * @param array $nodes
  11. * @param array $relations
  12. * @expectedException \InvalidArgumentException
  13. * @dataProvider constructorErrorDataProvider
  14. */
  15. public function testConstructorError($nodes, $relations)
  16. {
  17. new \Magento\Framework\Data\Graph($nodes, $relations);
  18. }
  19. /**
  20. * @return array
  21. */
  22. public function constructorErrorDataProvider()
  23. {
  24. return [
  25. 'duplicate nodes' => [[1, 2, 2], []],
  26. 'self-link' => [[1, 2], [[1, 2], [2, 2]]],
  27. 'broken reference "from"' => [[1, 2], [[1, 2], [3, 1]]],
  28. 'broken reference "to"' => [[1, 2], [[1, 2], [1, 3]]]
  29. ];
  30. }
  31. /**
  32. * \Exceptions are covered by testConstructorError()
  33. */
  34. public function testAddRelation()
  35. {
  36. $model = new \Magento\Framework\Data\Graph([1, 2, 3], [[1, 2], [2, 3]]);
  37. $this->assertEquals([1 => [2 => 2], 2 => [3 => 3]], $model->getRelations());
  38. $this->assertSame($model, $model->addRelation(3, 1));
  39. $this->assertEquals([1 => [2 => 2], 2 => [3 => 3], 3 => [1 => 1]], $model->getRelations());
  40. }
  41. public function testGetRelations()
  42. {
  43. // directional case is covered by testAddRelation()
  44. // inverse
  45. $model = new \Magento\Framework\Data\Graph([1, 2, 3], [[1, 2], [2, 3]]);
  46. $this->assertEquals(
  47. [2 => [1 => 1], 3 => [2 => 2]],
  48. $model->getRelations(\Magento\Framework\Data\Graph::INVERSE)
  49. );
  50. // non-directional
  51. $this->assertEquals(
  52. [1 => [2 => 2], 2 => [1 => 1, 3 => 3], 3 => [2 => 2]],
  53. $model->getRelations(\Magento\Framework\Data\Graph::NON_DIRECTIONAL)
  54. );
  55. }
  56. public function testFindCycle()
  57. {
  58. $nodes = [1, 2, 3, 4];
  59. $model = new \Magento\Framework\Data\Graph($nodes, [[1, 2], [2, 3], [3, 4]]);
  60. $this->assertEquals([], $model->findCycle());
  61. $model = new \Magento\Framework\Data\Graph($nodes, [[1, 2], [2, 3], [3, 4], [4, 2]]);
  62. $this->assertEquals([], $model->findCycle(1));
  63. $cycle = $model->findCycle();
  64. sort($cycle);
  65. $this->assertEquals([2, 2, 3, 4], $cycle);
  66. $this->assertEquals([3, 4, 2, 3], $model->findCycle(3));
  67. $model = new \Magento\Framework\Data\Graph(
  68. $nodes,
  69. [[1, 2], [2, 3], [3, 4], [4, 2], [3, 1]]
  70. );
  71. //find cycles for each node
  72. $cycles = $model->findCycle(null, false);
  73. $this->assertEquals(
  74. [[1, 2, 3, 1], [2, 3, 4, 2], [3, 4, 2, 3], [4, 2, 3, 4]],
  75. $cycles
  76. );
  77. }
  78. public function testDfs()
  79. {
  80. $model = new \Magento\Framework\Data\Graph([1, 2, 3, 4, 5], [[1, 2], [2, 3], [4, 5]]);
  81. // directional
  82. $this->assertEquals([1, 2, 3], $model->dfs(1, 3));
  83. $this->assertEquals([], $model->dfs(3, 1));
  84. $this->assertEquals([4, 5], $model->dfs(4, 5));
  85. $this->assertEquals([], $model->dfs(1, 5));
  86. // inverse
  87. $this->assertEquals([3, 2, 1], $model->dfs(3, 1, \Magento\Framework\Data\Graph::INVERSE));
  88. // non-directional
  89. $model = new \Magento\Framework\Data\Graph([1, 2, 3], [[2, 1], [2, 3]]);
  90. $this->assertEquals([], $model->dfs(1, 3, \Magento\Framework\Data\Graph::DIRECTIONAL));
  91. $this->assertEquals([], $model->dfs(3, 1, \Magento\Framework\Data\Graph::INVERSE));
  92. $this->assertEquals([1, 2, 3], $model->dfs(1, 3, \Magento\Framework\Data\Graph::NON_DIRECTIONAL));
  93. }
  94. public function testFindPathsToReachableNodes()
  95. {
  96. $model = new \Magento\Framework\Data\Graph([1, 2, 3, 4, 5], [[1, 2], [1, 3], [1, 4], [4, 5]]);
  97. // directional
  98. $paths = $model->findPathsToReachableNodes(1);
  99. ksort($paths);
  100. $this->assertEquals([1 => [1], 2 => [1, 2], 3 => [1, 3], 4 => [1, 4], 5 => [1, 4, 5]], $paths);
  101. // inverse
  102. $paths = $model->findPathsToReachableNodes(5, \Magento\Framework\Data\Graph::INVERSE);
  103. ksort($paths);
  104. $this->assertEquals([1 => [5, 4, 1], 4 => [5, 4], 5 => [5]], $paths);
  105. // non-directional
  106. $paths = $model->findPathsToReachableNodes(5, \Magento\Framework\Data\Graph::NON_DIRECTIONAL);
  107. ksort($paths);
  108. $this->assertEquals([1 => [5, 4, 1], 2 => [5, 4, 1, 2], 3 => [5, 4, 1, 3], 4 => [5, 4], 5 => [5]], $paths);
  109. }
  110. }