Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
GraphTest.php
Go to the documentation of this file.
1 <?php
7 
8 class GraphTest extends \PHPUnit\Framework\TestCase
9 {
16  public function testConstructorError($nodes, $relations)
17  {
18  new \Magento\Framework\Data\Graph($nodes, $relations);
19  }
20 
24  public function constructorErrorDataProvider()
25  {
26  return [
27  'duplicate nodes' => [[1, 2, 2], []],
28  'self-link' => [[1, 2], [[1, 2], [2, 2]]],
29  'broken reference "from"' => [[1, 2], [[1, 2], [3, 1]]],
30  'broken reference "to"' => [[1, 2], [[1, 2], [1, 3]]]
31  ];
32  }
33 
37  public function testAddRelation()
38  {
39  $model = new \Magento\Framework\Data\Graph([1, 2, 3], [[1, 2], [2, 3]]);
40  $this->assertEquals([1 => [2 => 2], 2 => [3 => 3]], $model->getRelations());
41  $this->assertSame($model, $model->addRelation(3, 1));
42  $this->assertEquals([1 => [2 => 2], 2 => [3 => 3], 3 => [1 => 1]], $model->getRelations());
43  }
44 
45  public function testGetRelations()
46  {
47  // directional case is covered by testAddRelation()
48 
49  // inverse
50  $model = new \Magento\Framework\Data\Graph([1, 2, 3], [[1, 2], [2, 3]]);
51  $this->assertEquals(
52  [2 => [1 => 1], 3 => [2 => 2]],
53  $model->getRelations(\Magento\Framework\Data\Graph::INVERSE)
54  );
55 
56  // non-directional
57  $this->assertEquals(
58  [1 => [2 => 2], 2 => [1 => 1, 3 => 3], 3 => [2 => 2]],
59  $model->getRelations(\Magento\Framework\Data\Graph::NON_DIRECTIONAL)
60  );
61  }
62 
63  public function testFindCycle()
64  {
65  $nodes = [1, 2, 3, 4];
66  $model = new \Magento\Framework\Data\Graph($nodes, [[1, 2], [2, 3], [3, 4]]);
67  $this->assertEquals([], $model->findCycle());
68 
69  $model = new \Magento\Framework\Data\Graph($nodes, [[1, 2], [2, 3], [3, 4], [4, 2]]);
70  $this->assertEquals([], $model->findCycle(1));
71  $cycle = $model->findCycle();
72  sort($cycle);
73  $this->assertEquals([2, 2, 3, 4], $cycle);
74  $this->assertEquals([3, 4, 2, 3], $model->findCycle(3));
75 
76  $model = new \Magento\Framework\Data\Graph(
77  $nodes,
78  [[1, 2], [2, 3], [3, 4], [4, 2], [3, 1]]
79  );
80  //find cycles for each node
81  $cycles = $model->findCycle(null, false);
82  $this->assertEquals(
83  [[1, 2, 3, 1], [2, 3, 4, 2], [3, 4, 2, 3], [4, 2, 3, 4]],
84  $cycles
85  );
86  }
87 
88  public function testDfs()
89  {
90  $model = new \Magento\Framework\Data\Graph([1, 2, 3, 4, 5], [[1, 2], [2, 3], [4, 5]]);
91 
92  // directional
93  $this->assertEquals([1, 2, 3], $model->dfs(1, 3));
94  $this->assertEquals([], $model->dfs(3, 1));
95  $this->assertEquals([4, 5], $model->dfs(4, 5));
96  $this->assertEquals([], $model->dfs(1, 5));
97 
98  // inverse
99  $this->assertEquals([3, 2, 1], $model->dfs(3, 1, \Magento\Framework\Data\Graph::INVERSE));
100 
101  // non-directional
102  $model = new \Magento\Framework\Data\Graph([1, 2, 3], [[2, 1], [2, 3]]);
103  $this->assertEquals([], $model->dfs(1, 3, \Magento\Framework\Data\Graph::DIRECTIONAL));
104  $this->assertEquals([], $model->dfs(3, 1, \Magento\Framework\Data\Graph::INVERSE));
105  $this->assertEquals([1, 2, 3], $model->dfs(1, 3, \Magento\Framework\Data\Graph::NON_DIRECTIONAL));
106  }
107 
109  {
110  $model = new \Magento\Framework\Data\Graph([1, 2, 3, 4, 5], [[1, 2], [1, 3], [1, 4], [4, 5]]);
111 
112  // directional
113  $paths = $model->findPathsToReachableNodes(1);
114  ksort($paths);
115  $this->assertEquals([1 => [1], 2 => [1, 2], 3 => [1, 3], 4 => [1, 4], 5 => [1, 4, 5]], $paths);
116 
117  // inverse
118  $paths = $model->findPathsToReachableNodes(5, \Magento\Framework\Data\Graph::INVERSE);
119  ksort($paths);
120  $this->assertEquals([1 => [5, 4, 1], 4 => [5, 4], 5 => [5]], $paths);
121 
122  // non-directional
123  $paths = $model->findPathsToReachableNodes(5, \Magento\Framework\Data\Graph::NON_DIRECTIONAL);
124  ksort($paths);
125  $this->assertEquals([1 => [5, 4, 1], 2 => [5, 4, 1, 2], 3 => [5, 4, 1, 3], 4 => [5, 4], 5 => [5]], $paths);
126  }
127 }
$paths
Definition: _bootstrap.php:83