+<?php
+
+namespace Doctrine\Tests\ORM;
+
+require_once __DIR__ . '/../TestInit.php';
+
+class EntityManagerTest extends \Doctrine\Tests\OrmTestCase
+{
+ private $_em;
+
+ function setUp()
+ {
+ parent::setUp();
+ $this->_em = $this->_getTestEntityManager();
+ }
+
+ /**
+ * @group DDC-899
+ */
+ public function testIsOpen()
+ {
+ $this->assertTrue($this->_em->isOpen());
+ $this->_em->close();
+ $this->assertFalse($this->_em->isOpen());
+ }
+
+ public function testGetConnection()
+ {
+ $this->assertInstanceOf('Doctrine\DBAL\Connection', $this->_em->getConnection());
+ }
+
+ public function testGetMetadataFactory()
+ {
+ $this->assertInstanceOf('Doctrine\ORM\Mapping\ClassMetadataFactory', $this->_em->getMetadataFactory());
+ }
+
+ public function testGetConfiguration()
+ {
+ $this->assertInstanceOf('Doctrine\ORM\Configuration', $this->_em->getConfiguration());
+ }
+
+ public function testGetUnitOfWork()
+ {
+ $this->assertInstanceOf('Doctrine\ORM\UnitOfWork', $this->_em->getUnitOfWork());
+ }
+
+ public function testGetProxyFactory()
+ {
+ $this->assertInstanceOf('Doctrine\ORM\Proxy\ProxyFactory', $this->_em->getProxyFactory());
+ }
+
+ public function testGetEventManager()
+ {
+ $this->assertInstanceOf('Doctrine\Common\EventManager', $this->_em->getEventManager());
+ }
+
+ public function testCreateNativeQuery()
+ {
+ $rsm = new \Doctrine\ORM\Query\ResultSetMapping();
+ $query = $this->_em->createNativeQuery('SELECT foo', $rsm);
+
+ $this->assertSame('SELECT foo', $query->getSql());
+ }
+
+ public function testCreateQueryBuilder()
+ {
+ $this->assertInstanceOf('Doctrine\ORM\QueryBuilder', $this->_em->createQueryBuilder());
+ }
+
+ public function testCreateQueryBuilderAliasValid()
+ {
+ $q = $this->_em->createQueryBuilder()
+ ->select('u')->from('Doctrine\Tests\Models\CMS\CmsUser', 'u');
+ $q2 = clone $q;
+
+ $this->assertEquals('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u', $q->getQuery()->getDql());
+ $this->assertEquals('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u', $q2->getQuery()->getDql());
+
+ $q3 = clone $q;
+
+ $this->assertEquals('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u', $q3->getQuery()->getDql());
+ }
+
+ public function testCreateQuery_DqlIsOptional()
+ {
+ $this->assertInstanceOf('Doctrine\ORM\Query', $this->_em->createQuery());
+ }
+
+ public function testGetPartialReference()
+ {
+ $user = $this->_em->getPartialReference('Doctrine\Tests\Models\CMS\CmsUser', 42);
+ $this->assertTrue($this->_em->contains($user));
+ $this->assertEquals(42, $user->id);
+ $this->assertNull($user->getName());
+ }
+
+ public function testCreateQuery()
+ {
+ $q = $this->_em->createQuery('SELECT 1');
+ $this->assertInstanceOf('Doctrine\ORM\Query', $q);
+ $this->assertEquals('SELECT 1', $q->getDql());
+ }
+
+ static public function dataMethodsAffectedByNoObjectArguments()
+ {
+ return array(
+ array('persist'),
+ array('remove'),
+ array('merge'),
+ array('refresh'),
+ array('detach')
+ );
+ }
+
+ /**
+ * @dataProvider dataMethodsAffectedByNoObjectArguments
+ */
+ public function testThrowsExceptionOnNonObjectValues($methodName) {
+ $this->setExpectedException('Doctrine\ORM\ORMInvalidArgumentException',
+ 'EntityManager#'.$methodName.'() expects parameter 1 to be an entity object, NULL given.');
+ $this->_em->$methodName(null);
+ }
+
+ static public function dataAffectedByErrorIfClosedException()
+ {
+ return array(
+ array('flush'),
+ array('persist'),
+ array('remove'),
+ array('merge'),
+ array('refresh'),
+ );
+ }
+
+ /**
+ * @dataProvider dataAffectedByErrorIfClosedException
+ * @param string $methodName
+ */
+ public function testAffectedByErrorIfClosedException($methodName)
+ {
+ $this->setExpectedException('Doctrine\ORM\ORMException', 'closed');
+
+ $this->_em->close();
+ $this->_em->$methodName(new \stdClass());
+ }
+
+ /**
+ * @group DDC-1125
+ */
+ public function testTransactionalAcceptsReturn()
+ {
+ $return = $this->_em->transactional(function ($em) {
+ return 'foo';
+ });
+
+ $this->assertEquals('foo', $return);
+ }
+
+ public function testTransactionalAcceptsVariousCallables()
+ {
+ $this->assertSame('callback', $this->_em->transactional(array($this, 'transactionalCallback')));
+ }
+
+ public function testTransactionalThrowsInvalidArgumentExceptionIfNonCallablePassed()
+ {
+ $this->setExpectedException('InvalidArgumentException', 'Expected argument of type "callable", got "object"');
+ $this->_em->transactional($this);
+ }
+
+ public function transactionalCallback($em)
+ {
+ $this->assertSame($this->_em, $em);
+ return 'callback';
+ }
+}