| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 | <?php
namespace CG\Tests\Proxy;
use CG\Proxy\LazyInitializerInterface;
use CG\Proxy\InterceptionGenerator;
use CG\Proxy\LazyInitializerGenerator;
use CG\Proxy\Enhancer;
use CG\Tests\Proxy\Fixture\TraceInterceptor;
class EnhancerTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider getGenerationTests
     */
    public function testGenerateClass($class, $generatedClass, array $interfaces, array $generators)
    {
        $enhancer = new Enhancer(new \ReflectionClass($class), $interfaces, $generators);
        $enhancer->setNamingStrategy($this->getNamingStrategy($generatedClass));
        $this->assertEquals($this->getContent(substr($generatedClass, strrpos($generatedClass, '\\') + 1)), $enhancer->generateClass());
    }
    public function getGenerationTests()
    {
        return array(
            array('CG\Tests\Proxy\Fixture\SimpleClass', 'CG\Tests\Proxy\Fixture\SimpleClass__CG__Enhanced', array('CG\Tests\Proxy\Fixture\MarkerInterface'), array()),
            array('CG\Tests\Proxy\Fixture\SimpleClass', 'CG\Tests\Proxy\Fixture\SimpleClass__CG__Sluggable', array('CG\Tests\Proxy\Fixture\SluggableInterface'), array()),
            array('CG\Tests\Proxy\Fixture\Entity', 'CG\Tests\Proxy\Fixture\Entity__CG__LazyInitializing', array(), array(
                new LazyInitializerGenerator(),
            ))
        );
    }
    public function testInterceptionGenerator()
    {
        $enhancer = new Enhancer(new \ReflectionClass('CG\Tests\Proxy\Fixture\Entity'), array(), array(
            $generator = new InterceptionGenerator()
        ));
        $enhancer->setNamingStrategy($this->getNamingStrategy('CG\Tests\Proxy\Fixture\Entity__CG__Traceable_'.sha1(microtime(true))));
        $generator->setPrefix('');
        $traceable = $enhancer->createInstance();
        $traceable->setLoader($this->getLoader(array(
            $interceptor1 = new TraceInterceptor(),
            $interceptor2 = new TraceInterceptor(),
        )));
        $this->assertEquals('foo', $traceable->getName());
        $this->assertEquals('foo', $traceable->getName());
        $this->assertEquals(2, count($interceptor1->getLog()));
        $this->assertEquals(2, count($interceptor2->getLog()));
    }
    public function testLazyInitializerGenerator()
    {
        $enhancer = new Enhancer(new \ReflectionClass('CG\Tests\Proxy\Fixture\Entity'), array(), array(
            $generator = new LazyInitializerGenerator(),
        ));
        $generator->setPrefix('');
        $entity = $enhancer->createInstance();
        $entity->setLazyInitializer($initializer = new Initializer());
        $this->assertEquals('foo', $entity->getName());
        $this->assertSame($entity, $initializer->getLastObject());
    }
    private function getLoader(array $interceptors)
    {
        $loader = $this->getMock('CG\Proxy\InterceptorLoaderInterface');
        $loader
            ->expects($this->any())
            ->method('loadInterceptors')
            ->will($this->returnValue($interceptors))
        ;
        return $loader;
    }
    private function getContent($file)
    {
        return file_get_contents(__DIR__.'/Fixture/generated/'.$file.'.php.gen');
    }
    private function getNamingStrategy($name)
    {
        $namingStrategy = $this->getMock('CG\Core\NamingStrategyInterface');
        $namingStrategy
            ->expects($this->any())
            ->method('getClassName')
            ->will($this->returnValue($name))
        ;
        return $namingStrategy;
    }
}
class Initializer implements LazyInitializerInterface
{
    private $lastObject;
    public function initializeObject($object)
    {
        $this->lastObject = $object;
    }
    public function getLastObject()
    {
        return $this->lastObject;
    }
}
 |