<?php 
/** 
 * Created by PhpStorm. 
 * Package: org\majkel\tcpdfwarper 
 * User: Micha? (majkel) Kowalik <[email protected]> 
 * Date: 12/28/2014 
 * Time: 22:36 
 */ 
 
namespace org\majkel\tcpdfwarper\generator; 
 
require_once __DIR__.'/../AbstractTestCase.php'; 
require_once __DIR__.'/ClassDefinitionMock.php'; 
require_once __DIR__ . '/ClassDefinitionSampleClass.php'; 
 
use org\majkel\tcpdfwarper\AbstractTestCase; 
 
/** 
 * Class ClassDefinitionTest 
 * @package org\majkel\tcpdfwarper\generator 
 * @coversDefaultClass \org\majkel\tcpdfwarper\generator\ClassDefinition 
 */ 
class ClassDefinitionTest extends AbstractTestCase 
{ 
    const CLS = '\org\majkel\tcpdfwarper\generator\ClassDefinitionMock'; 
    const OCLS = '\org\majkel\tcpdfwarper\generator\ClassDefinition'; 
    const PCLS = '\org\majkel\tcpdfwarper\generator\ClassDefinitionSampleClass'; 
 
    /** 
     * @return ClassDefinition 
     */ 
    protected function getObj() { 
        return $this->mock(self::CLS)->new(); 
    } 
 
    /** 
     * @param ClassDefinition $obj 
     * @return ClassDefinition 
     */ 
    protected function ref($obj = null) { 
        return $this->reflect($obj ? $obj : self::CLS); 
    } 
 
    /** 
     * @covers ::fromConfigItem 
     */ 
    public function testFromConfigItem() { 
 
        $config = new ConfigItem(); 
        $config->name = 'name'; 
        $config->className = 'className'; 
        $config->method = 'Write'; 
        $config->metaMethods = array(); 
        $config->additionalDoc = array( 
            'x' => '1', 
        ); 
 
        $obj = $this->mock(self::CLS) 
                ->parse([], self::once()) 
                ->generateMetaMethods([$config->metaMethods], self::once()) 
                ->new(); 
 
        ClassDefinitionMock::$MOCK = $obj; 
 
        $class = $this->ref() 
                ->fromConfigItem($config); 
 
        self::assertSame($config->name, $class->name); 
        self::assertSame($config->className, $class->className); 
        self::assertSame($config->method, $class->method); 
    } 
 
    /** 
     * @covers ::getClassDoc 
     */ 
    public function testGetClassDoc() { 
        $obj = $this->getObj(); 
        $this->ref($obj)->doc = array('1', '2', '3'); 
        $result = $obj->getClassDoc('x'); 
        self::assertSame('1x2x3', $result); 
    } 
 
    /** 
     * @covers ::findParam 
     */ 
    public function testFindParam() { 
        $comment = <<<EOS 
 * @param \$x (z) dds fds fds 
 * @param \$xxx (type) some description is here 
 * @param \$x (z) dds fds fds 
EOS; 
        $result = $this->reflect(self::CLS)->findParam($comment, 'xxx'); 
        self::assertSame('type', $result[0]); 
    } 
 
    /** 
     * @expectedException \org\majkel\tcpdfwarper\generator\GeneratorException 
     * @covers ::findParam 
     */ 
    public function testFindParamInvalid() { 
        $comment = <<<EOS 
 INVALID 
EOS; 
        $this->reflect(self::CLS)->findParam($comment, 'xxx'); 
    } 
 
    /** 
     * @covers ::setupReturn 
     */ 
    public function testSetupReturn() { 
        $comment = <<<EOS 
 * @return type desc 
EOS; 
        $obj = $this->getObj(); 
        $this->reflect($obj)->setupReturn($comment); 
        self::assertSame('type', $obj->returnType); 
        self::assertSame('desc', $obj->returnDoc); 
    } 
 
    /** 
     * @covers ::setupReturn 
     */ 
    public function testSetupReturnFail() { 
        $comment = <<<EOS 
 * @param type desc 
EOS; 
        $obj = $this->getObj(); 
        $this->reflect($obj)->setupReturn($comment); 
        self::assertSame('void', $obj->returnType); 
        self::assertSame('', $obj->returnDoc); 
    } 
 
    /** 
     * @covers ::cleanComment 
     */ 
    public function testCleanComment() { 
        $comment = <<<EOS 
 * 
 * @param type    desc 
 * fdgfdgfd 
 * 
EOS; 
        $actual = $this->reflect(self::CLS)->cleanComment($comment); 
        self::assertSame('* @param type desc fdgfdgfd', $actual); 
    } 
 
    /** 
     * @covers ::cleanClassDoc 
     */ 
    public function testCleanClassDoc() { 
        $comment = <<<EOS 
 * 1 
 * 2 
 * 
EOS; 
        $actual = $this->reflect(self::CLS)->cleanClassDoc($comment); 
        self::assertSame(array(' * 1', '2', ''), $actual); 
    } 
 
    /** 
     * @covers ::extractFromOffsetToTag 
     */ 
    public function testExtractFromOffsetToTag() { 
        $comment = <<<EOS 
 * @param x 
 * line 1 
 * some text 
 * @param z 
EOS; 
        $excepted = <<<EOS 
 
 * line 1 
 * some text 
 * 
EOS; 
        $actual = $this->reflect(self::CLS)->extractFromOffsetToTag($comment, 11); 
        self::assertSame($excepted, $actual); 
    } 
 
    /** 
     * @covers ::extractFromOffsetToTag 
     */ 
    public function testExtractFromOffsetToTagNotFound() { 
        $comment = <<<EOS 
 * @param x 
 * line 1 
 * some text 
 */ 
EOS; 
        $excepted = <<<EOS 
 
 * line 1 
 * some text 
 */ 
EOS; 
        $actual = $this->reflect(self::CLS)->extractFromOffsetToTag($comment, 11); 
        self::assertSame($excepted, $actual); 
    } 
 
    /** 
     * @return array 
     */ 
    public function snakeToCamelData() { 
        return array( 
                array('sname_to_cammel', 'snameToCammel'), 
                array('_', ''), 
        ); 
    } 
 
    /** 
     * @param $input 
     * @param $output 
     * @dataProvider snakeToCamelData 
     * @covers ::snakeToCamel 
     */ 
    public function testSnakeToCamel($input, $output) { 
        $actual = $this->ref()->snakeToCamel($input); 
        self::assertSame($output, $actual); 
    } 
 
    /** 
     * @covers ::newSelf 
     */ 
    public function testNewSelf() { 
        self::assertTrue($this->reflect(self::OCLS)->newSelf() instanceof ClassDefinition); 
    } 
 
    /** 
     * @expectedException \org\majkel\tcpdfwarper\generator\GeneratorException 
     * @covers ::generateMetaMethods 
     */ 
    public function testGenerateMetaMethodsInvalidArg() { 
        $obj = $this->getObj(); 
        $methodConfig = new ConfigMetaMethod(); 
        $methodConfig->args = array('invalid'); 
        $this->reflect($obj)->generateMetaMethods(array($methodConfig)); 
    } 
 
    /** 
     * @covers ::generateMetaMethods 
     */ 
    public function testGenerateMetaMethods() { 
        $obj = $this->getObj(); 
 
        $xArg = new Argument(); 
 
        $this->reflect($obj)->defaultParameters = array( 
                'x' => $xArg, 
                'y' => new Argument(), 
        ); 
 
        $methodConfig = new ConfigMetaMethod(); 
        $methodConfig->doc = 'DOC'; 
        $methodConfig->name = 'NAME'; 
        $methodConfig->args = array('x'); 
 
        $this->reflect($obj)->generateMetaMethods(array($methodConfig)); 
 
        $metaMethods = $this->reflect($obj)->metaMethods; 
 
        self::assertCount(1, $metaMethods); 
        self::assertSame('DOC', $metaMethods[0]->doc); 
        self::assertSame('NAME', $metaMethods[0]->name); 
        self::assertSame(array('x' => $xArg), $metaMethods[0]->arguments); 
    } 
 
    /** 
     * @covers ::parse 
     */ 
    public function testParse() { 
        $obj = $this->getObj(); 
        $obj->method = 'test'; 
        $obj->className = self::PCLS; 
        $this->reflect($obj)->parse(array( 
                'x' => " additional\ndoc", 
        ), self::PCLS); 
 
        $defParams = $obj->defaultParameters; 
 
        self::assertCount(5, $obj->defaultParameters); 
 
        self::assertSame('X additional doc', $defParams['x']->doc); 
        self::assertSame('Y', $defParams['y']->doc); 
        self::assertSame('Z', $defParams['z']->doc); 
        self::assertSame('W', $defParams['w']->doc); 
        self::assertSame('ARR', $defParams['arr']->doc); 
 
        self::assertSame(true, $defParams['x']->required); 
        self::assertSame(true, $defParams['y']->required); 
        self::assertSame(false, $defParams['z']->required); 
        self::assertSame(false, $defParams['w']->required); 
        self::assertSame(false, $defParams['arr']->required); 
 
        self::assertSame('x', $defParams['x']->name); 
        self::assertSame('y', $defParams['y']->name); 
        self::assertSame('z', $defParams['z']->name); 
        self::assertSame('w', $defParams['w']->name); 
        self::assertSame('arr', $defParams['arr']->name); 
 
        self::assertSame('int', $defParams['x']->type); 
        self::assertSame('float', $defParams['y']->type); 
        self::assertSame('string', $defParams['z']->type); 
        self::assertSame('integer', $defParams['w']->type); 
        self::assertSame('array', $defParams['arr']->type); 
 
        self::assertSame('null', $defParams['x']->value); 
        self::assertSame('null', $defParams['y']->value); 
        self::assertSame('self::TEST', $defParams['z']->value); 
        self::assertSame('1', $defParams['w']->value); 
        self::assertSame('array()', $defParams['arr']->value); 
 
        self::assertSame(array( 
                'x' => $defParams['x'], 
                'y' => $defParams['y'], 
        ), $obj->requiredArguments); 
 
        self::assertSame('string', $obj->returnType); 
        self::assertSame("t\n\t */", $obj->returnDoc); 
    } 
} 
 
 |