2008-08-01 18:46:14 +00:00
|
|
|
<?php
|
2009-01-22 19:38:10 +00:00
|
|
|
|
|
|
|
namespace Doctrine\Tests\ORM;
|
|
|
|
|
2015-11-25 04:20:35 +00:00
|
|
|
use Doctrine\ORM\Internal\CommitOrderCalculator;
|
2009-07-27 09:50:22 +00:00
|
|
|
use Doctrine\ORM\Mapping\ClassMetadata;
|
2016-05-11 01:55:12 +07:00
|
|
|
use Doctrine\Tests\OrmTestCase;
|
2009-07-27 09:50:22 +00:00
|
|
|
|
2008-08-01 18:46:14 +00:00
|
|
|
/**
|
|
|
|
* Tests of the commit order calculation.
|
|
|
|
*
|
|
|
|
* IMPORTANT: When writing tests here consider that a lot of graph constellations
|
|
|
|
* can have many valid orderings, so you may want to build a graph that has only
|
|
|
|
* 1 valid order to simplify your tests.
|
|
|
|
*/
|
2016-05-11 01:55:12 +07:00
|
|
|
class CommitOrderCalculatorTest extends OrmTestCase
|
2008-08-01 18:46:14 +00:00
|
|
|
{
|
|
|
|
private $_calc;
|
2011-12-19 22:56:19 +01:00
|
|
|
|
2008-08-01 18:46:14 +00:00
|
|
|
protected function setUp()
|
|
|
|
{
|
2015-11-25 04:20:35 +00:00
|
|
|
$this->_calc = new CommitOrderCalculator();
|
2008-08-01 18:46:14 +00:00
|
|
|
}
|
2011-12-19 22:56:19 +01:00
|
|
|
|
2008-08-01 18:46:14 +00:00
|
|
|
public function testCommitOrdering1()
|
|
|
|
{
|
2016-12-08 18:01:04 +01:00
|
|
|
$class1 = new ClassMetadata(NodeClass1::class);
|
|
|
|
$class2 = new ClassMetadata(NodeClass2::class);
|
|
|
|
$class3 = new ClassMetadata(NodeClass3::class);
|
|
|
|
$class4 = new ClassMetadata(NodeClass4::class);
|
|
|
|
$class5 = new ClassMetadata(NodeClass5::class);
|
2011-12-19 22:56:19 +01:00
|
|
|
|
2015-11-25 04:20:35 +00:00
|
|
|
$this->_calc->addNode($class1->name, $class1);
|
|
|
|
$this->_calc->addNode($class2->name, $class2);
|
|
|
|
$this->_calc->addNode($class3->name, $class3);
|
|
|
|
$this->_calc->addNode($class4->name, $class4);
|
|
|
|
$this->_calc->addNode($class5->name, $class5);
|
2011-12-19 22:56:19 +01:00
|
|
|
|
2015-11-25 04:20:35 +00:00
|
|
|
$this->_calc->addDependency($class1->name, $class2->name, 1);
|
|
|
|
$this->_calc->addDependency($class2->name, $class3->name, 1);
|
|
|
|
$this->_calc->addDependency($class3->name, $class4->name, 1);
|
|
|
|
$this->_calc->addDependency($class5->name, $class1->name, 1);
|
2008-08-01 18:46:14 +00:00
|
|
|
|
2015-11-25 04:20:35 +00:00
|
|
|
$sorted = $this->_calc->sort();
|
2011-12-19 22:56:19 +01:00
|
|
|
|
2008-08-01 18:46:14 +00:00
|
|
|
// There is only 1 valid ordering for this constellation
|
2016-12-07 23:33:41 +01:00
|
|
|
$correctOrder = [$class5, $class1, $class2, $class3, $class4];
|
2015-11-25 04:20:35 +00:00
|
|
|
|
|
|
|
$this->assertSame($correctOrder, $sorted);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function testCommitOrdering2()
|
|
|
|
{
|
2016-12-08 18:01:04 +01:00
|
|
|
$class1 = new ClassMetadata(NodeClass1::class);
|
|
|
|
$class2 = new ClassMetadata(NodeClass2::class);
|
2015-11-25 04:20:35 +00:00
|
|
|
|
|
|
|
$this->_calc->addNode($class1->name, $class1);
|
|
|
|
$this->_calc->addNode($class2->name, $class2);
|
|
|
|
|
|
|
|
$this->_calc->addDependency($class1->name, $class2->name, 0);
|
|
|
|
$this->_calc->addDependency($class2->name, $class1->name, 1);
|
|
|
|
|
|
|
|
$sorted = $this->_calc->sort();
|
|
|
|
|
|
|
|
// There is only 1 valid ordering for this constellation
|
2016-12-07 23:33:41 +01:00
|
|
|
$correctOrder = [$class2, $class1];
|
2015-11-25 04:20:35 +00:00
|
|
|
|
2008-08-01 18:46:14 +00:00
|
|
|
$this->assertSame($correctOrder, $sorted);
|
|
|
|
}
|
2018-09-20 11:52:35 +02:00
|
|
|
|
|
|
|
public function testCommitOrdering3()
|
|
|
|
{
|
|
|
|
// this test corresponds to the GH7259Test::testPersistFileBeforeVersion functional test
|
|
|
|
$class1 = new ClassMetadata(NodeClass1::class);
|
|
|
|
$class2 = new ClassMetadata(NodeClass2::class);
|
|
|
|
$class3 = new ClassMetadata(NodeClass3::class);
|
|
|
|
$class4 = new ClassMetadata(NodeClass4::class);
|
|
|
|
|
|
|
|
$this->_calc->addNode($class1->name, $class1);
|
|
|
|
$this->_calc->addNode($class2->name, $class2);
|
|
|
|
$this->_calc->addNode($class3->name, $class3);
|
|
|
|
$this->_calc->addNode($class4->name, $class4);
|
|
|
|
|
|
|
|
$this->_calc->addDependency($class4->name, $class1->name, 1);
|
|
|
|
$this->_calc->addDependency($class1->name, $class2->name, 1);
|
|
|
|
$this->_calc->addDependency($class4->name, $class3->name, 1);
|
|
|
|
$this->_calc->addDependency($class1->name, $class4->name, 0);
|
|
|
|
|
|
|
|
$sorted = $this->_calc->sort();
|
|
|
|
|
|
|
|
// There is only multiple valid ordering for this constellation, but
|
|
|
|
// the class4, class1, class2 ordering is important to break the cycle
|
|
|
|
// on the nullable link.
|
|
|
|
$correctOrders = [
|
|
|
|
[$class4, $class1, $class2, $class3],
|
|
|
|
[$class4, $class1, $class3, $class2],
|
|
|
|
[$class4, $class3, $class1, $class2],
|
|
|
|
];
|
|
|
|
|
|
|
|
// We want to perform a strict comparison of the array
|
|
|
|
$this->assertContains($sorted, $correctOrders, '', false, true, true);
|
|
|
|
}
|
2009-07-27 09:50:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
class NodeClass1 {}
|
|
|
|
class NodeClass2 {}
|
|
|
|
class NodeClass3 {}
|
|
|
|
class NodeClass4 {}
|
2014-04-07 14:43:25 +02:00
|
|
|
class NodeClass5 {}
|