CommitOrderCalculatorTest   A
last analyzed

Complexity

Total Complexity 4

Size/Duplication

Total Lines 87
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 47
dl 0
loc 87
rs 10
c 2
b 0
f 0
wmc 4

4 Methods

Rating   Name   Duplication   Size   Complexity  
A testCommitOrdering3() 0 31 1
A testCommitOrdering1() 0 25 1
A setUp() 0 3 1
A testCommitOrdering2() 0 17 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Doctrine\Tests\ORM;
6
7
use Doctrine\ORM\Internal\CommitOrderCalculator;
8
use Doctrine\ORM\Mapping\ClassMetadata;
9
use Doctrine\Tests\OrmTestCase;
10
11
/**
12
 * Tests of the commit order calculation.
13
 *
14
 * IMPORTANT: When writing tests here consider that a lot of graph constellations
15
 * can have many valid orderings, so you may want to build a graph that has only
16
 * 1 valid order to simplify your tests.
17
 */
18
class CommitOrderCalculatorTest extends OrmTestCase
19
{
20
    /** @var CommitOrderCalculator */
21
    private $calc;
22
23
    protected function setUp() : void
24
    {
25
        $this->calc = new CommitOrderCalculator();
26
    }
27
28
    public function testCommitOrdering1() : void
29
    {
30
        $class1 = new ClassMetadata(NodeClass1::class, null);
31
        $class2 = new ClassMetadata(NodeClass2::class, null);
32
        $class3 = new ClassMetadata(NodeClass3::class, null);
33
        $class4 = new ClassMetadata(NodeClass4::class, null);
34
        $class5 = new ClassMetadata(NodeClass5::class, null);
35
36
        $this->calc->addNode($class1->getClassName(), $class1);
37
        $this->calc->addNode($class2->getClassName(), $class2);
38
        $this->calc->addNode($class3->getClassName(), $class3);
39
        $this->calc->addNode($class4->getClassName(), $class4);
40
        $this->calc->addNode($class5->getClassName(), $class5);
41
42
        $this->calc->addDependency($class1->getClassName(), $class2->getClassName(), 1);
43
        $this->calc->addDependency($class2->getClassName(), $class3->getClassName(), 1);
44
        $this->calc->addDependency($class3->getClassName(), $class4->getClassName(), 1);
45
        $this->calc->addDependency($class5->getClassName(), $class1->getClassName(), 1);
46
47
        $sorted = $this->calc->sort();
48
49
        // There is only 1 valid ordering for this constellation
50
        $correctOrder = [$class5, $class1, $class2, $class3, $class4];
51
52
        self::assertSame($correctOrder, $sorted);
53
    }
54
55
    public function testCommitOrdering2() : void
56
    {
57
        $class1 = new ClassMetadata(NodeClass1::class, null);
58
        $class2 = new ClassMetadata(NodeClass2::class, null);
59
60
        $this->calc->addNode($class1->getClassName(), $class1);
61
        $this->calc->addNode($class2->getClassName(), $class2);
62
63
        $this->calc->addDependency($class1->getClassName(), $class2->getClassName(), 0);
64
        $this->calc->addDependency($class2->getClassName(), $class1->getClassName(), 1);
65
66
        $sorted = $this->calc->sort();
67
68
        // There is only 1 valid ordering for this constellation
69
        $correctOrder = [$class2, $class1];
70
71
        self::assertSame($correctOrder, $sorted);
72
    }
73
74
    public function testCommitOrdering3()
75
    {
76
        // this test corresponds to the GH7259Test::testPersistFileBeforeVersion functional test
77
        $class1 = new ClassMetadata(NodeClass1::class, null);
78
        $class2 = new ClassMetadata(NodeClass2::class, null);
79
        $class3 = new ClassMetadata(NodeClass3::class, null);
80
        $class4 = new ClassMetadata(NodeClass4::class, null);
81
82
        $this->calc->addNode($class1->getClassName(), $class1);
83
        $this->calc->addNode($class2->getClassName(), $class2);
84
        $this->calc->addNode($class3->getClassName(), $class3);
85
        $this->calc->addNode($class4->getClassName(), $class4);
86
87
        $this->calc->addDependency($class4->getClassName(), $class1->getClassName(), 1);
88
        $this->calc->addDependency($class1->getClassName(), $class2->getClassName(), 1);
89
        $this->calc->addDependency($class4->getClassName(), $class3->getClassName(), 1);
90
        $this->calc->addDependency($class1->getClassName(), $class4->getClassName(), 0);
91
92
        $sorted = $this->calc->sort();
93
94
        // There is only multiple valid ordering for this constellation, but
95
        // the class4, class1, class2 ordering is important to break the cycle
96
        // on the nullable link.
97
        $correctOrders = [
98
            [$class4, $class1, $class2, $class3],
99
            [$class4, $class1, $class3, $class2],
100
            [$class4, $class3, $class1, $class2],
101
        ];
102
103
        // We want to perform a strict comparison of the array
104
        $this->assertContains($sorted, $correctOrders, '', false, true, true);
105
    }
106
}
107
108
class NodeClass1
109
{
110
}
111
class NodeClass2
112
{
113
}
114
class NodeClass3
115
{
116
}
117
class NodeClass4
118
{
119
}
120
class NodeClass5
121
{
122
}
123