<?php 
namespace eMapper\Reflection; 
 
use eMapper\Reflection\Profiler; 
use eMapper\Annotations\Facade; 
 
/** 
 * Tests parsing result map annotations through the Profiler class 
 *   
 * @author emaphp 
 * @group reflection 
 */ 
class ResultMapTest extends \PHPUnit_Framework_TestCase { 
    public function testTypeHandlerAnnotations() { 
        $profile = Profiler::getClassProfile('Acme\\Type\\DummyTypeHandler')->getClassAnnotations(); 
        $this->assertNotNull($profile); 
        $this->assertInstanceOf("eMapper\Annotations\AnnotationsBag", $profile); 
        $this->assertTrue($profile->has('Safe')); 
    } 
     
    public function testResultMapProfile() {         
        $profile = Profiler::getClassProfile('Acme\\Result\\UserResultMap')->getClassAnnotations(); 
        $this->assertNotNull($profile); 
        $this->assertInstanceOf("eMapper\Annotations\AnnotationsBag", $profile); 
         
        $properties = Profiler::getClassProfile('Acme\\Result\\UserResultMap')->getProperties(); 
         
        $this->assertArrayHasKey('user_id', $properties); 
        $annotations = Facade::getAnnotations($properties['user_id']->getReflectionProperty()); 
        $this->assertTrue($annotations->has('Type')); 
        $this->assertEquals('integer', $annotations->get('Type')->getValue()); 
         
        $this->assertArrayHasKey('name', $properties); 
        $annotations = Facade::getAnnotations($properties['name']->getReflectionProperty()); 
        $this->assertTrue($annotations->has('Column')); 
        $this->assertEquals('user_name', $annotations->get('Column')->getValue()); 
         
        $this->assertArrayHasKey('lastLogin', $properties); 
        $annotations = Facade::getAnnotations($properties['lastLogin']->getReflectionProperty()); 
        $this->assertTrue($annotations->has('Type')); 
        $this->assertEquals('string', $annotations->get('Type')->getValue()); 
        $this->assertTrue($annotations->has('Column')); 
        $this->assertEquals('last_login', $annotations->get('Column')->getValue()); 
    } 
     
    public function testEntityAnnotations() { 
        $profile = Profiler::getClassProfile('Acme\\Entity\\Product')->getClassAnnotations(); 
        $this->assertTrue($profile->has('Entity')); 
         
        $properties = Profiler::getClassProfile('Acme\\Entity\\Product')->getProperties(); 
         
        $this->assertArrayHasKey('code', $properties); 
        $this->assertArrayHasKey('category', $properties); 
        $this->assertArrayHasKey('color', $properties); 
         
        $annotations = Facade::getAnnotations($properties['code']->getReflectionProperty()); 
        $this->assertTrue($annotations->has('Column')); 
        $this->assertEquals('product_code', $annotations->get('Column')->getValue()); 
 
        $annotations = Facade::getAnnotations($properties['color']->getReflectionProperty()); 
        $this->assertTrue($annotations->has('Type')); 
        $this->assertEquals('Acme\\RGBColor', $annotations->get('Type')->getValue()); 
    } 
     
    public function testSubclass() { 
        $profile = Profiler::getClassProfile('Acme\\Entity\\Car')->getClassAnnotations(); 
        $this->assertFalse($profile->has('moves')); 
        $this->assertTrue($profile->has('color')); 
        $this->assertEquals('red', $profile->get('color')->getValue()); 
        $this->assertTrue($profile->has('speed')); 
        $this->assertEquals('fast', $profile->get('speed')->getValue()); 
         
        $properties = Facade::getAnnotations(Profiler::getClassProfile('Acme\\Entity\\Car')->getProperty('capacity')->getReflectionProperty()); 
        $this->assertTrue($properties->has('full')); 
        $this->assertEquals(4, $properties->get('full')->getValue()); 
        $this->assertFalse($properties->has('measure')); 
 
        $properties = Facade::getAnnotations(Profiler::getClassProfile('Acme\\Entity\\Car')->getProperty('engine')->getReflectionProperty()); 
        $this->assertTrue($properties->has('requires')); 
        $this->assertEquals('fuel', $properties->get('requires')->getValue()); 
    } 
     
    public function testRelationAnnotations() { 
        $firstOrderAttributes = Profiler::getClassProfile('Acme\Reflection\User')->getFirstOrderAttributes(); 
        $secondOrderAttributes = Profiler::getClassProfile('Acme\Reflection\User')->getSecondOrderAttributes(); 
         
        //full name 
        $fullName = Facade::getAnnotations($firstOrderAttributes['fullName']->getReflectionProperty()); 
        $this->assertTrue($fullName->has('Eval')); 
        $this->assertInternalType('string', $fullName->get('Eval')->getValue()); 
        $this->assertEquals("(. (#surname) ', ' (#name))", $fullName->get('Eval')->getValue()); 
         
        //profiles 
        $profiles = Facade::getAnnotations($secondOrderAttributes['profiles']->getReflectionProperty()); 
        $this->assertTrue($profiles->has('StatementId')); 
        $this->assertInternalType('string', $profiles->get('StatementId')->getValue()); 
        $this->assertEquals("profiles.findByUserId", $profiles->get('StatementId')->getValue()); 
        $this->assertTrue($profiles->has('Parameter')); 
        $this->assertInternalType('boolean', $profiles->get('Parameter')->getValue()); 
        $this->assertEquals(true, $profiles->get('Parameter')->getValue()); 
        $this->assertInternalType('boolean', $profiles->find('Parameter')[0]->getValue()); 
        $this->assertInternalType('integer', $profiles->find('Parameter')[1]->getValue()); 
        $this->assertEquals('id', $profiles->find('Parameter')[0]->getArgument()); 
        $this->assertEquals(3, $profiles->find('Parameter')[1]->getValue()); 
         
        //total profiles 
        $totalProfiles = Facade::getAnnotations($firstOrderAttributes['totalProfiles']->getReflectionProperty()); 
        $this->assertTrue($totalProfiles->has('Eval')); 
        $this->assertInternalType('string', $totalProfiles->get('Eval')->getValue()); 
        $this->assertEquals('(+ (count (#profiles)) (%0))', $totalProfiles->get('Eval')->getValue()); 
        $this->assertTrue($totalProfiles->has('Self')); 
        $this->assertTrue($totalProfiles->has('Parameter')); 
        $this->assertInternalType('integer', $totalProfiles->get('Parameter')->getValue()); 
         
        //last connection 
        $lastConnection = Facade::getAnnotations($firstOrderAttributes['lastConnection']->getReflectionProperty()); 
        $this->assertTrue($lastConnection->has('Query')); 
        $this->assertInternalType('string', $lastConnection->get('Query')->getValue()); 
        $this->assertEquals("SELECT last_login FROM login WHERE user_id = %{i}", $lastConnection->get('Query')->getValue()); 
        $this->assertTrue($lastConnection->has('Parameter')); 
        $this->assertInternalType('boolean', $lastConnection->get('Parameter')->getValue()); 
        $this->assertEquals('id', $lastConnection->get('Parameter')->getArgument()); 
        $this->assertTrue($lastConnection->has('Type')); 
        $this->assertEquals('dt', $lastConnection->get('Type')->getValue()); 
         
        //favorites 
        $favorites = Facade::getAnnotations($secondOrderAttributes['favorites']->getReflectionProperty()); 
        $this->assertTrue($favorites->has('Query')); 
        $this->assertInternalType('string', $favorites->get('Query')->getValue()); 
        $this->assertEquals("SELECT link FROM favorites WHERE user_id = #{id} AND confirmed = %{bool}", $favorites->get('Query')->getValue()); 
        $this->assertTrue($favorites->has('Self')); 
        $this->assertTrue($favorites->has('Parameter')); 
        $this->assertInternalType('boolean', $favorites->get('Parameter')->getValue()); 
        $this->assertTrue($favorites->has('Type')); 
        $this->assertEquals('string[]', $favorites->get('Type')->getValue()); 
    } 
} 
?> 
 
 |