Completed
Pull Request — 2.6 (#7180)
by Ben
07:43
created

CommitOrderCalculatorTest::testCommitOrdering5()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 22
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 15
nc 1
nop 0
dl 0
loc 22
rs 9.7666
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
    /** @var CommitOrderCalculator */
19
    private $_calc;
20
21
    protected function setUp()
22
    {
23
        $this->_calc = new CommitOrderCalculator();
24
    }
25
26
    public function testCommitOrdering1()
27
    {
28
        $class1 = new ClassMetadata(NodeClass1::class);
29
        $class2 = new ClassMetadata(NodeClass2::class);
30
        $class3 = new ClassMetadata(NodeClass3::class);
31
        $class4 = new ClassMetadata(NodeClass4::class);
32
        $class5 = new ClassMetadata(NodeClass5::class);
33
34
        $this->_calc->addNode($class1->name, $class1);
35
        $this->_calc->addNode($class2->name, $class2);
36
        $this->_calc->addNode($class3->name, $class3);
37
        $this->_calc->addNode($class4->name, $class4);
38
        $this->_calc->addNode($class5->name, $class5);
39
40
        $this->_calc->addDependency($class1->name, $class2->name, 1);
41
        $this->_calc->addDependency($class2->name, $class3->name, 1);
42
        $this->_calc->addDependency($class3->name, $class4->name, 1);
43
        $this->_calc->addDependency($class5->name, $class1->name, 1);
44
45
        $sorted = $this->_calc->sort();
46
47
        // There is only 1 valid ordering for this constellation
48
        $correctOrder = [$class5, $class1, $class2, $class3, $class4];
49
50
        $this->assertSame($correctOrder, $sorted);
51
    }
52
53
    public function testCommitOrdering2()
54
    {
55
        $class1 = new ClassMetadata(NodeClass1::class);
56
        $class2 = new ClassMetadata(NodeClass2::class);
57
58
        $this->_calc->addNode($class1->name, $class1);
59
        $this->_calc->addNode($class2->name, $class2);
60
61
        $this->_calc->addDependency($class1->name, $class2->name, 0);
62
        $this->_calc->addDependency($class2->name, $class1->name, 1);
63
64
        $sorted = $this->_calc->sort();
65
66
        // There is only 1 valid ordering for this constellation
67
        $correctOrder = [$class2, $class1];
68
69
        $this->assertSame($correctOrder, $sorted);
70
    }
71
72
    public function testCommitOrdering3()
73
    {
74
        // this test corresponds to the GH7259Test::testPersistFileBeforeVersion functional test
75
        $class1 = new ClassMetadata(NodeClass1::class);
76
        $class2 = new ClassMetadata(NodeClass2::class);
77
        $class3 = new ClassMetadata(NodeClass3::class);
78
        $class4 = new ClassMetadata(NodeClass4::class);
79
80
        $this->_calc->addNode($class1->name, $class1);
81
        $this->_calc->addNode($class2->name, $class2);
82
        $this->_calc->addNode($class3->name, $class3);
83
        $this->_calc->addNode($class4->name, $class4);
84
85
        $this->_calc->addDependency($class4->name, $class1->name, 1);
86
        $this->_calc->addDependency($class1->name, $class2->name, 1);
87
        $this->_calc->addDependency($class4->name, $class3->name, 1);
88
        $this->_calc->addDependency($class1->name, $class4->name, 0);
89
90
        $sorted = $this->_calc->sort();
91
92
        // There is only multiple valid ordering for this constellation, but
93
        // the class4, class1, class2 ordering is important to break the cycle
94
        // on the nullable link.
95
        $correctOrders = [
96
            [$class4, $class1, $class2, $class3],
97
            [$class4, $class1, $class3, $class2],
98
            [$class4, $class3, $class1, $class2],
99
        ];
100
101
        // We want to perform a strict comparison of the array
102
        $this->assertContains($sorted, $correctOrders, '', false, true, true);
103
    }
104
105
    public function testCommitOrdering4()
106
    {
107
        $class1 = new ClassMetadata(NodeClass1::class);
108
        $class2 = new ClassMetadata(NodeClass2::class);
109
        $class3 = new ClassMetadata(NodeClass3::class);
110
111
        $this->_calc->addNode($class1->name, $class1);
112
        $this->_calc->addNode($class2->name, $class2);
113
        $this->_calc->addNode($class3->name, $class3);
114
115
        $this->_calc->addDependency($class2->name, $class1->name, 1);
116
        $this->_calc->addDependency($class1->name, $class2->name, 0);
117
        $this->_calc->addDependency($class1->name, $class3->name, 1);
118
119
        $sorted = $this->_calc->sort();
120
121
        $correctOrder = [$class2, $class1, $class3];
122
123
        $this->assertSame($correctOrder, $sorted);
124
    }
125
126
    public function testCommitOrdering5()
127
    {
128
        $class1 = new ClassMetadata(NodeClass1::class);
129
        $class2 = new ClassMetadata(NodeClass2::class);
130
        $class3 = new ClassMetadata(NodeClass3::class);
131
        $class4 = new ClassMetadata(NodeClass4::class);
132
133
        $this->_calc->addNode($class1->name, $class1);
134
        $this->_calc->addNode($class2->name, $class2);
135
        $this->_calc->addNode($class3->name, $class3);
136
        $this->_calc->addNode($class4->name, $class4);
137
138
        $this->_calc->addDependency($class1->name, $class4->name, 1);
139
        $this->_calc->addDependency($class1->name, $class3->name, 0);
140
        $this->_calc->addDependency($class2->name, $class1->name, 1);
141
        $this->_calc->addDependency($class3->name, $class2->name, 1);
142
143
        $sorted = $this->_calc->sort();
144
145
        $correctOrder = [$class3, $class2, $class1, $class4];
146
147
        $this->assertSame($correctOrder, $sorted);
148
    }
149
150
}
151
152
class NodeClass1 {}
153
class NodeClass2 {}
154
class NodeClass3 {}
155
class NodeClass4 {}
156
class NodeClass5 {}