Passed
Pull Request — 2.6 (#7260)
by Christophe
08:00
created

CommitOrderCalculatorTest::testCommitOrdering3()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 31
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 18
nc 1
nop 0
dl 0
loc 31
rs 9.6666
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
105
class NodeClass1 {}
106
class NodeClass2 {}
107
class NodeClass3 {}
108
class NodeClass4 {}
109
class NodeClass5 {}
110