130 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			130 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * This file is part of Psy Shell.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * (c) 2012-2018 Justin Hileman
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * For the full copyright and license information, please view the LICENSE
							 | 
						||
| 
								 | 
							
								 * file that was distributed with this source code.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace Psy\Test\Formatter;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use Psy\Formatter\CodeFormatter;
							 | 
						||
| 
								 | 
							
								use Psy\Test\Formatter\Fixtures\SomeClass;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class CodeFormatterTest extends \PHPUnit\Framework\TestCase
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @dataProvider reflectors
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function testFormat($reflector, $expected)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $formatted = CodeFormatter::format($reflector);
							 | 
						||
| 
								 | 
							
								        $formattedWithoutColors = \preg_replace('#' . \chr(27) . '\[\d\d?m#', '', $formatted);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->assertEquals($expected, self::trimLines($formattedWithoutColors));
							 | 
						||
| 
								 | 
							
								        $this->assertNotEquals($expected, self::trimLines($formatted));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function reflectors()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $expectClass = <<<'EOS'
							 | 
						||
| 
								 | 
							
								  > 14| class SomeClass
							 | 
						||
| 
								 | 
							
								    15| {
							 | 
						||
| 
								 | 
							
								    16|     const SOME_CONST = 'some const';
							 | 
						||
| 
								 | 
							
								    17|     private $someProp = 'some prop';
							 | 
						||
| 
								 | 
							
								    18|
							 | 
						||
| 
								 | 
							
								    19|     public function someMethod($someParam)
							 | 
						||
| 
								 | 
							
								    20|     {
							 | 
						||
| 
								 | 
							
								    21|         return 'some method';
							 | 
						||
| 
								 | 
							
								    22|     }
							 | 
						||
| 
								 | 
							
								    23|
							 | 
						||
| 
								 | 
							
								    24|     public static function someClosure()
							 | 
						||
| 
								 | 
							
								    25|     {
							 | 
						||
| 
								 | 
							
								    26|         return function () {
							 | 
						||
| 
								 | 
							
								    27|             return 'some closure';
							 | 
						||
| 
								 | 
							
								    28|         };
							 | 
						||
| 
								 | 
							
								    29|     }
							 | 
						||
| 
								 | 
							
								    30| }
							 | 
						||
| 
								 | 
							
								EOS;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $expectMethod = <<<'EOS'
							 | 
						||
| 
								 | 
							
								  > 19|     public function someMethod($someParam)
							 | 
						||
| 
								 | 
							
								    20|     {
							 | 
						||
| 
								 | 
							
								    21|         return 'some method';
							 | 
						||
| 
								 | 
							
								    22|     }
							 | 
						||
| 
								 | 
							
								EOS;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $expectClosure = <<<'EOS'
							 | 
						||
| 
								 | 
							
								  > 26|         return function () {
							 | 
						||
| 
								 | 
							
								    27|             return 'some closure';
							 | 
						||
| 
								 | 
							
								    28|         };
							 | 
						||
| 
								 | 
							
								EOS;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return [
							 | 
						||
| 
								 | 
							
								            [new \ReflectionClass('Psy\Test\Formatter\Fixtures\SomeClass'), $expectClass],
							 | 
						||
| 
								 | 
							
								            [new \ReflectionObject(new SomeClass()), $expectClass],
							 | 
						||
| 
								 | 
							
								            [new \ReflectionMethod('Psy\Test\Formatter\Fixtures\SomeClass', 'someMethod'), $expectMethod],
							 | 
						||
| 
								 | 
							
								            [new \ReflectionFunction(SomeClass::someClosure()), $expectClosure],
							 | 
						||
| 
								 | 
							
								        ];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @dataProvider invalidReflectors
							 | 
						||
| 
								 | 
							
								     * @expectedException \Psy\Exception\RuntimeException
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function testCodeFormatterThrowsExceptionForReflectorsItDoesntUnderstand($reflector)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        CodeFormatter::format($reflector);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function invalidReflectors()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $reflectors = [
							 | 
						||
| 
								 | 
							
								            [new \ReflectionExtension('json')],
							 | 
						||
| 
								 | 
							
								            [new \ReflectionParameter(['Psy\Test\Formatter\Fixtures\SomeClass', 'someMethod'], 'someParam')],
							 | 
						||
| 
								 | 
							
								            [new \ReflectionProperty('Psy\Test\Formatter\Fixtures\SomeClass', 'someProp')],
							 | 
						||
| 
								 | 
							
								        ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (\version_compare(PHP_VERSION, '7.1.0', '>=')) {
							 | 
						||
| 
								 | 
							
								            $reflectors[] = [new \ReflectionClassConstant('Psy\Test\Formatter\Fixtures\SomeClass', 'SOME_CONST')];
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return $reflectors;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @dataProvider filenames
							 | 
						||
| 
								 | 
							
								     * @expectedException \Psy\Exception\RuntimeException
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function testCodeFormatterThrowsExceptionForMissingFile($filename)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $reflector = $this->getMockBuilder('ReflectionClass')
							 | 
						||
| 
								 | 
							
								            ->disableOriginalConstructor()
							 | 
						||
| 
								 | 
							
								            ->getMock();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $reflector
							 | 
						||
| 
								 | 
							
								            ->expects($this->once())
							 | 
						||
| 
								 | 
							
								            ->method('getFileName')
							 | 
						||
| 
								 | 
							
								            ->will($this->returnValue($filename));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        CodeFormatter::format($reflector);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function filenames()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (\defined('HHVM_VERSION')) {
							 | 
						||
| 
								 | 
							
								            $this->markTestSkipped('We have issues with PHPUnit mocks on HHVM.');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return [[null], ['not a file']];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private static function trimLines($code)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return \rtrim(\implode("\n", \array_map('rtrim', \explode("\n", $code))));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |