Chris@13
|
1 <?php
|
Chris@13
|
2
|
Chris@13
|
3 /*
|
Chris@13
|
4 * This file is part of Psy Shell.
|
Chris@13
|
5 *
|
Chris@13
|
6 * (c) 2012-2018 Justin Hileman
|
Chris@13
|
7 *
|
Chris@13
|
8 * For the full copyright and license information, please view the LICENSE
|
Chris@13
|
9 * file that was distributed with this source code.
|
Chris@13
|
10 */
|
Chris@13
|
11
|
Chris@13
|
12 namespace Psy\Test\Formatter;
|
Chris@13
|
13
|
Chris@13
|
14 use Psy\Formatter\CodeFormatter;
|
Chris@16
|
15 use Psy\Test\Formatter\Fixtures\SomeClass;
|
Chris@13
|
16
|
Chris@13
|
17 class CodeFormatterTest extends \PHPUnit\Framework\TestCase
|
Chris@13
|
18 {
|
Chris@16
|
19 /**
|
Chris@16
|
20 * @dataProvider reflectors
|
Chris@16
|
21 */
|
Chris@16
|
22 public function testFormat($reflector, $expected)
|
Chris@13
|
23 {
|
Chris@16
|
24 $formatted = CodeFormatter::format($reflector);
|
Chris@17
|
25 $formattedWithoutColors = \preg_replace('#' . \chr(27) . '\[\d\d?m#', '', $formatted);
|
Chris@16
|
26
|
Chris@16
|
27 $this->assertEquals($expected, self::trimLines($formattedWithoutColors));
|
Chris@16
|
28 $this->assertNotEquals($expected, self::trimLines($formatted));
|
Chris@13
|
29 }
|
Chris@13
|
30
|
Chris@16
|
31 public function reflectors()
|
Chris@13
|
32 {
|
Chris@16
|
33 $expectClass = <<<'EOS'
|
Chris@16
|
34 > 14| class SomeClass
|
Chris@16
|
35 15| {
|
Chris@16
|
36 16| const SOME_CONST = 'some const';
|
Chris@16
|
37 17| private $someProp = 'some prop';
|
Chris@16
|
38 18|
|
Chris@16
|
39 19| public function someMethod($someParam)
|
Chris@16
|
40 20| {
|
Chris@16
|
41 21| return 'some method';
|
Chris@16
|
42 22| }
|
Chris@16
|
43 23|
|
Chris@16
|
44 24| public static function someClosure()
|
Chris@16
|
45 25| {
|
Chris@16
|
46 26| return function () {
|
Chris@16
|
47 27| return 'some closure';
|
Chris@16
|
48 28| };
|
Chris@16
|
49 29| }
|
Chris@16
|
50 30| }
|
Chris@13
|
51 EOS;
|
Chris@13
|
52
|
Chris@16
|
53 $expectMethod = <<<'EOS'
|
Chris@16
|
54 > 19| public function someMethod($someParam)
|
Chris@16
|
55 20| {
|
Chris@16
|
56 21| return 'some method';
|
Chris@16
|
57 22| }
|
Chris@16
|
58 EOS;
|
Chris@13
|
59
|
Chris@16
|
60 $expectClosure = <<<'EOS'
|
Chris@16
|
61 > 26| return function () {
|
Chris@16
|
62 27| return 'some closure';
|
Chris@16
|
63 28| };
|
Chris@16
|
64 EOS;
|
Chris@16
|
65
|
Chris@16
|
66 return [
|
Chris@16
|
67 [new \ReflectionClass('Psy\Test\Formatter\Fixtures\SomeClass'), $expectClass],
|
Chris@16
|
68 [new \ReflectionObject(new SomeClass()), $expectClass],
|
Chris@16
|
69 [new \ReflectionMethod('Psy\Test\Formatter\Fixtures\SomeClass', 'someMethod'), $expectMethod],
|
Chris@16
|
70 [new \ReflectionFunction(SomeClass::someClosure()), $expectClosure],
|
Chris@16
|
71 ];
|
Chris@16
|
72 }
|
Chris@16
|
73
|
Chris@16
|
74 /**
|
Chris@16
|
75 * @dataProvider invalidReflectors
|
Chris@16
|
76 * @expectedException \Psy\Exception\RuntimeException
|
Chris@16
|
77 */
|
Chris@16
|
78 public function testCodeFormatterThrowsExceptionForReflectorsItDoesntUnderstand($reflector)
|
Chris@16
|
79 {
|
Chris@16
|
80 CodeFormatter::format($reflector);
|
Chris@16
|
81 }
|
Chris@16
|
82
|
Chris@16
|
83 public function invalidReflectors()
|
Chris@16
|
84 {
|
Chris@16
|
85 $reflectors = [
|
Chris@16
|
86 [new \ReflectionExtension('json')],
|
Chris@16
|
87 [new \ReflectionParameter(['Psy\Test\Formatter\Fixtures\SomeClass', 'someMethod'], 'someParam')],
|
Chris@16
|
88 [new \ReflectionProperty('Psy\Test\Formatter\Fixtures\SomeClass', 'someProp')],
|
Chris@16
|
89 ];
|
Chris@16
|
90
|
Chris@17
|
91 if (\version_compare(PHP_VERSION, '7.1.0', '>=')) {
|
Chris@16
|
92 $reflectors[] = [new \ReflectionClassConstant('Psy\Test\Formatter\Fixtures\SomeClass', 'SOME_CONST')];
|
Chris@16
|
93 }
|
Chris@16
|
94
|
Chris@16
|
95 return $reflectors;
|
Chris@13
|
96 }
|
Chris@13
|
97
|
Chris@13
|
98 /**
|
Chris@13
|
99 * @dataProvider filenames
|
Chris@13
|
100 * @expectedException \Psy\Exception\RuntimeException
|
Chris@13
|
101 */
|
Chris@16
|
102 public function testCodeFormatterThrowsExceptionForMissingFile($filename)
|
Chris@13
|
103 {
|
Chris@13
|
104 $reflector = $this->getMockBuilder('ReflectionClass')
|
Chris@13
|
105 ->disableOriginalConstructor()
|
Chris@13
|
106 ->getMock();
|
Chris@13
|
107
|
Chris@13
|
108 $reflector
|
Chris@13
|
109 ->expects($this->once())
|
Chris@13
|
110 ->method('getFileName')
|
Chris@13
|
111 ->will($this->returnValue($filename));
|
Chris@13
|
112
|
Chris@13
|
113 CodeFormatter::format($reflector);
|
Chris@13
|
114 }
|
Chris@13
|
115
|
Chris@13
|
116 public function filenames()
|
Chris@13
|
117 {
|
Chris@17
|
118 if (\defined('HHVM_VERSION')) {
|
Chris@13
|
119 $this->markTestSkipped('We have issues with PHPUnit mocks on HHVM.');
|
Chris@13
|
120 }
|
Chris@13
|
121
|
Chris@13
|
122 return [[null], ['not a file']];
|
Chris@13
|
123 }
|
Chris@16
|
124
|
Chris@16
|
125 private static function trimLines($code)
|
Chris@16
|
126 {
|
Chris@17
|
127 return \rtrim(\implode("\n", \array_map('rtrim', \explode("\n", $code))));
|
Chris@16
|
128 }
|
Chris@13
|
129 }
|