EnhancerTest.php 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <?php
  2. namespace CG\Tests\Proxy;
  3. use CG\Proxy\LazyInitializerInterface;
  4. use CG\Proxy\InterceptionGenerator;
  5. use CG\Proxy\LazyInitializerGenerator;
  6. use CG\Proxy\Enhancer;
  7. use CG\Tests\Proxy\Fixture\TraceInterceptor;
  8. class EnhancerTest extends \PHPUnit_Framework_TestCase
  9. {
  10. /**
  11. * @dataProvider getGenerationTests
  12. */
  13. public function testGenerateClass($class, $generatedClass, array $interfaces, array $generators)
  14. {
  15. $enhancer = new Enhancer(new \ReflectionClass($class), $interfaces, $generators);
  16. $enhancer->setNamingStrategy($this->getNamingStrategy($generatedClass));
  17. $this->assertEquals($this->getContent(substr($generatedClass, strrpos($generatedClass, '\\') + 1)), $enhancer->generateClass());
  18. }
  19. public function getGenerationTests()
  20. {
  21. return array(
  22. array('CG\Tests\Proxy\Fixture\SimpleClass', 'CG\Tests\Proxy\Fixture\SimpleClass__CG__Enhanced', array('CG\Tests\Proxy\Fixture\MarkerInterface'), array()),
  23. array('CG\Tests\Proxy\Fixture\SimpleClass', 'CG\Tests\Proxy\Fixture\SimpleClass__CG__Sluggable', array('CG\Tests\Proxy\Fixture\SluggableInterface'), array()),
  24. array('CG\Tests\Proxy\Fixture\Entity', 'CG\Tests\Proxy\Fixture\Entity__CG__LazyInitializing', array(), array(
  25. new LazyInitializerGenerator(),
  26. ))
  27. );
  28. }
  29. public function testInterceptionGenerator()
  30. {
  31. $enhancer = new Enhancer(new \ReflectionClass('CG\Tests\Proxy\Fixture\Entity'), array(), array(
  32. $generator = new InterceptionGenerator()
  33. ));
  34. $enhancer->setNamingStrategy($this->getNamingStrategy('CG\Tests\Proxy\Fixture\Entity__CG__Traceable_'.sha1(microtime(true))));
  35. $generator->setPrefix('');
  36. $traceable = $enhancer->createInstance();
  37. $traceable->setLoader($this->getLoader(array(
  38. $interceptor1 = new TraceInterceptor(),
  39. $interceptor2 = new TraceInterceptor(),
  40. )));
  41. $this->assertEquals('foo', $traceable->getName());
  42. $this->assertEquals('foo', $traceable->getName());
  43. $this->assertEquals(2, count($interceptor1->getLog()));
  44. $this->assertEquals(2, count($interceptor2->getLog()));
  45. }
  46. public function testLazyInitializerGenerator()
  47. {
  48. $enhancer = new Enhancer(new \ReflectionClass('CG\Tests\Proxy\Fixture\Entity'), array(), array(
  49. $generator = new LazyInitializerGenerator(),
  50. ));
  51. $generator->setPrefix('');
  52. $entity = $enhancer->createInstance();
  53. $entity->setLazyInitializer($initializer = new Initializer());
  54. $this->assertEquals('foo', $entity->getName());
  55. $this->assertSame($entity, $initializer->getLastObject());
  56. }
  57. private function getLoader(array $interceptors)
  58. {
  59. $loader = $this->getMock('CG\Proxy\InterceptorLoaderInterface');
  60. $loader
  61. ->expects($this->any())
  62. ->method('loadInterceptors')
  63. ->will($this->returnValue($interceptors))
  64. ;
  65. return $loader;
  66. }
  67. private function getContent($file)
  68. {
  69. return file_get_contents(__DIR__.'/Fixture/generated/'.$file.'.php.gen');
  70. }
  71. private function getNamingStrategy($name)
  72. {
  73. $namingStrategy = $this->getMock('CG\Core\NamingStrategyInterface');
  74. $namingStrategy
  75. ->expects($this->any())
  76. ->method('getClassName')
  77. ->will($this->returnValue($name))
  78. ;
  79. return $namingStrategy;
  80. }
  81. }
  82. class Initializer implements LazyInitializerInterface
  83. {
  84. private $lastObject;
  85. public function initializeObject($object)
  86. {
  87. $this->lastObject = $object;
  88. }
  89. public function getLastObject()
  90. {
  91. return $this->lastObject;
  92. }
  93. }