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