Passed
Pull Request — 2.6 (#7660)
by
unknown
06:26
created

CommitOrderCalculatorTest::testCommitOrdering4()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 47
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 17
nc 1
nop 0
dl 0
loc 47
rs 9.7
c 0
b 0
f 0
1
<?php
2
3
namespace Doctrine\Tests\ORM;
4
5
use Doctrine\ORM\Internal\CommitOrderCalculator;
6
use Doctrine\ORM\Mapping\ClassMetadata;
7
use Doctrine\Tests\OrmTestCase;
8
9
/**
10
 * Tests of the commit order calculation.
11
 *
12
 * IMPORTANT: When writing tests here consider that a lot of graph constellations
13
 * can have many valid orderings, so you may want to build a graph that has only
14
 * 1 valid order to simplify your tests.
15
 */
16
class CommitOrderCalculatorTest extends OrmTestCase
17
{
18
    private $_calc;
19
20
    protected function setUp()
21
    {
22
        $this->_calc = new CommitOrderCalculator();
23
    }
24
25
    public function testCommitOrdering1()
26
    {
27
        $class1 = new ClassMetadata(NodeClass1::class);
28
        $class2 = new ClassMetadata(NodeClass2::class);
29
        $class3 = new ClassMetadata(NodeClass3::class);
30
        $class4 = new ClassMetadata(NodeClass4::class);
31
        $class5 = new ClassMetadata(NodeClass5::class);
32
33
        $this->_calc->addNode($class1->name, $class1);
34
        $this->_calc->addNode($class2->name, $class2);
35
        $this->_calc->addNode($class3->name, $class3);
36
        $this->_calc->addNode($class4->name, $class4);
37
        $this->_calc->addNode($class5->name, $class5);
38
39
        $this->_calc->addDependency($class1->name, $class2->name, 1);
40
        $this->_calc->addDependency($class2->name, $class3->name, 1);
41
        $this->_calc->addDependency($class3->name, $class4->name, 1);
42
        $this->_calc->addDependency($class5->name, $class1->name, 1);
43
44
        $sorted = $this->_calc->sort();
45
46
        // There is only 1 valid ordering for this constellation
47
        $correctOrder = [$class5, $class1, $class2, $class3, $class4];
48
49
        $this->assertSame($correctOrder, $sorted);
50
    }
51
52
    public function testCommitOrdering2()
53
    {
54
        $class1 = new ClassMetadata(NodeClass1::class);
55
        $class2 = new ClassMetadata(NodeClass2::class);
56
57
        $this->_calc->addNode($class1->name, $class1);
58
        $this->_calc->addNode($class2->name, $class2);
59
60
        $this->_calc->addDependency($class1->name, $class2->name, 0);
61
        $this->_calc->addDependency($class2->name, $class1->name, 1);
62
63
        $sorted = $this->_calc->sort();
64
65
        // There is only 1 valid ordering for this constellation
66
        $correctOrder = [$class2, $class1];
67
68
        $this->assertSame($correctOrder, $sorted);
69
    }
70
71
    public function testCommitOrdering3()
72
    {
73
        // this test corresponds to the GH7259Test::testPersistFileBeforeVersion functional test
74
        $class1 = new ClassMetadata(NodeClass1::class);
75
        $class2 = new ClassMetadata(NodeClass2::class);
76
        $class3 = new ClassMetadata(NodeClass3::class);
77
        $class4 = new ClassMetadata(NodeClass4::class);
78
79
        $this->_calc->addNode($class1->name, $class1);
80
        $this->_calc->addNode($class2->name, $class2);
81
        $this->_calc->addNode($class3->name, $class3);
82
        $this->_calc->addNode($class4->name, $class4);
83
84
        $this->_calc->addDependency($class4->name, $class1->name, 1);
85
        $this->_calc->addDependency($class1->name, $class2->name, 1);
86
        $this->_calc->addDependency($class4->name, $class3->name, 1);
87
        $this->_calc->addDependency($class1->name, $class4->name, 0);
88
89
        $sorted = $this->_calc->sort();
90
91
        // There is only multiple valid ordering for this constellation, but
92
        // the class4, class1, class2 ordering is important to break the cycle
93
        // on the nullable link.
94
        $correctOrders = [
95
            [$class4, $class1, $class2, $class3],
96
            [$class4, $class1, $class3, $class2],
97
            [$class4, $class3, $class1, $class2],
98
        ];
99
100
        // We want to perform a strict comparison of the array
101
        $this->assertContains($sorted, $correctOrders, '', false, true, true);
102
    }
103
    
104
    public function testCommitOrdering4()
105
    {
106
        // testing Fixed commit order
107
        $class1 = new ClassMetadata(NodeClass1::class);
108
        $class2 = new ClassMetadata(NodeClass2::class);
109
        $class3 = new ClassMetadata(NodeClass3::class);
110
        $class4 = new ClassMetadata(NodeClass4::class);
111
112
        $this->_calc->addNode($class1->name, $class1);
113
        $this->_calc->addNode($class2->name, $class2);
114
        $this->_calc->addNode($class3->name, $class3);
115
        $this->_calc->addNode($class4->name, $class4);
116
117
        $this->_calc->addDependency($class1->name, $class2->name, 0);
118
        $this->_calc->addDependency($class2->name, $class3->name, 0);
119
        $this->_calc->addDependency($class3->name, $class1->name, 0);
120
        $this->_calc->addDependency($class2->name, $class4->name, 0);
121
        $this->_calc->addDependency($class4->name, $class1->name, 1);
122
123
        /*
124
               +---------+
125
               |         |
126
            +--+ Class 4 <---+
127
            |  |         |   |
128
          1 |  +---------+   | 0
129
            |                |
130
            v                |
131
        +---+-----+    +-----+---+
132
        |         |    |         |
133
        | Class 1 +--->+ Class 2 |
134
        |         | 0  |         |
135
        +---+-----+    +-----+---+
136
            ^                |
137
            |                |
138
          0 |                | 0
139
            |  +---------+   |
140
            |  |         |   |
141
            +--+ Class 3 +<--+
142
               |         |
143
               +---------+
144
        */
145
146
        $sorted = $this->_calc->sort();
147
        $index1 = array_search($class1, $sorted, true);
148
        $index4 = array_search($class4, $sorted, true);
149
150
        $this->assertLessThan($index1, $index4);
151
152
    }
153
}
154
155
class NodeClass1 {}
156
class NodeClass2 {}
157
class NodeClass3 {}
158
class NodeClass4 {}
159
class NodeClass5 {}
160