2015-09-24 10:26:10 +02:00
< ? php
namespace Doctrine\Tests\ORM\Functional\Ticket ;
2017-06-24 03:32:58 +02:00
use Doctrine\DBAL\Connection ;
use Doctrine\ORM\EntityManagerInterface ;
use Doctrine\Common\EventManager ;
use Doctrine\DBAL\Driver\Statement ;
use Doctrine\ORM\Query\ResultSetMapping ;
use Doctrine\ORM\Internal\Hydration\AbstractHydrator ;
use Doctrine\Tests\OrmFunctionalTestCase ;
2015-09-24 10:26:10 +02:00
/**
* @ group DDC - 3146
* @ author Emiel Nijpels < emiel @ silverstreet . com >
*/
2017-06-24 03:32:58 +02:00
class DDC3146Test extends OrmFunctionalTestCase
2015-09-24 10:26:10 +02:00
{
/**
* Verify that the number of added events to the event listener from the abstract hydrator class is equal to the number of removed events
*/
public function testEventListeners ()
{
2017-06-24 03:32:58 +02:00
$mockConnection = $this -> createMock ( Connection :: class );
$mockEntityManagerInterface = $this -> createMock ( EntityManagerInterface :: class );
$mockEventManager = $this -> createMock ( EventManager :: class );
$mockStatement = $this -> createMock ( Statement :: class );
$mockResultMapping = $this -> getMockBuilder ( ResultSetMapping :: class );
2015-09-24 10:26:10 +02:00
2017-06-24 03:32:58 +02:00
$mockEntityManagerInterface -> expects ( self :: any ()) -> method ( 'getEventManager' ) -> willReturn ( $mockEventManager );
$mockEntityManagerInterface -> expects ( self :: any ()) -> method ( 'getConnection' ) -> willReturn ( $mockConnection );
$mockStatement -> expects ( self :: once ()) -> method ( 'fetch' ) -> willReturn ( false );
2015-09-24 10:26:10 +02:00
2017-06-24 03:32:58 +02:00
$mockAbstractHydrator = $this -> getMockBuilder ( AbstractHydrator :: class )
2015-09-24 10:26:10 +02:00
-> setConstructorArgs ( array ( $mockEntityManagerInterface ))
2017-06-24 03:32:58 +02:00
-> setMethods ([ 'hydrateAllData' ])
2015-09-24 10:26:10 +02:00
-> getMock ();
// Increase counter every time the event listener is added and decrease the counter every time the event listener is removed
$eventCounter = 0 ;
2017-06-24 03:32:58 +02:00
$mockEventManager -> expects ( self :: atLeastOnce ())
2015-09-24 10:26:10 +02:00
-> method ( 'addEventListener' )
2017-06-24 03:32:58 +02:00
-> willReturnCallback ( function () use ( & $eventCounter ) {
$eventCounter ++ ;
});
2015-09-24 10:26:10 +02:00
2017-06-24 03:32:58 +02:00
$mockEventManager -> expects ( self :: atLeastOnce ())
2015-09-24 10:26:10 +02:00
-> method ( 'removeEventListener' )
2017-06-24 03:32:58 +02:00
-> willReturnCallback ( function () use ( & $eventCounter ) {
$eventCounter -- ;
});
2015-09-24 10:26:10 +02:00
// Create iterable result
$iterableResult = $mockAbstractHydrator -> iterate ( $mockStatement , $mockResultMapping , array ());
$iterableResult -> next ();
// Number of added events listeners should be equal or less than the number of removed events
2017-06-24 03:32:58 +02:00
self :: assertSame ( 0 , $eventCounter , 'More events added to the event listener than removed; this can create a memory leak when references are not cleaned up' );
2015-09-24 10:26:10 +02:00
}
}