| 
									
										
										
										
											2016-10-08 12:51:49 +00:00
										 |  |  | <?php | 
					
						
							|  |  |  | declare(strict_types = 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace LanguageServer\Tests\Server\TextDocument; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use PHPUnit\Framework\TestCase; | 
					
						
							|  |  |  | use LanguageServer\Tests\MockProtocolStream; | 
					
						
							| 
									
										
										
										
											2017-06-09 18:25:30 +00:00
										 |  |  | use LanguageServer\{ | 
					
						
							|  |  |  |     Server, Client, LanguageClient, ClientHandler, PhpDocumentLoader, DefinitionResolver | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2016-12-13 00:51:02 +00:00
										 |  |  | use LanguageServer\Index\{Index, ProjectIndex, DependenciesIndex}; | 
					
						
							| 
									
										
										
										
											2016-12-08 01:33:48 +00:00
										 |  |  | use LanguageServer\ContentRetriever\FileSystemContentRetriever; | 
					
						
							| 
									
										
										
										
											2017-06-09 18:25:30 +00:00
										 |  |  | use LanguageServer\Protocol\{TextDocumentItem, DiagnosticSeverity}; | 
					
						
							| 
									
										
										
										
											2016-10-31 10:47:21 +00:00
										 |  |  | use Sabre\Event\Promise; | 
					
						
							| 
									
										
										
										
											2016-11-14 09:25:44 +00:00
										 |  |  | use JsonMapper; | 
					
						
							| 
									
										
										
										
											2016-10-08 12:51:49 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class ParseErrorsTest extends TestCase | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * @var Server\TextDocument | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private $textDocument; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-11 08:15:20 +00:00
										 |  |  |     private $args; | 
					
						
							| 
									
										
										
										
											2016-10-08 12:51:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-11 08:15:20 +00:00
										 |  |  |     public function setUp() | 
					
						
							| 
									
										
										
										
											2016-10-08 12:51:49 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-10-31 10:47:21 +00:00
										 |  |  |         $client = new LanguageClient(new MockProtocolStream, new MockProtocolStream); | 
					
						
							| 
									
										
										
										
											2016-10-11 08:15:20 +00:00
										 |  |  |         $client->textDocument = new class($this->args) extends Client\TextDocument { | 
					
						
							| 
									
										
										
										
											2016-10-08 12:51:49 +00:00
										 |  |  |             private $args; | 
					
						
							|  |  |  |             public function __construct(&$args) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2016-11-14 09:25:44 +00:00
										 |  |  |                 parent::__construct(new ClientHandler(new MockProtocolStream, new MockProtocolStream), new JsonMapper); | 
					
						
							| 
									
										
										
										
											2016-10-08 12:51:49 +00:00
										 |  |  |                 $this->args = &$args; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2016-10-31 10:47:21 +00:00
										 |  |  |             public function publishDiagnostics(string $uri, array $diagnostics): Promise | 
					
						
							| 
									
										
										
										
											2016-10-08 12:51:49 +00:00
										 |  |  |             { | 
					
						
							|  |  |  |                 $this->args = func_get_args(); | 
					
						
							| 
									
										
										
										
											2016-10-31 10:47:21 +00:00
										 |  |  |                 return Promise\resolve(null); | 
					
						
							| 
									
										
										
										
											2016-10-08 12:51:49 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |         }; | 
					
						
							| 
									
										
										
										
											2016-12-13 00:51:02 +00:00
										 |  |  |         $projectIndex = new ProjectIndex(new Index, new DependenciesIndex); | 
					
						
							|  |  |  |         $definitionResolver = new DefinitionResolver($projectIndex); | 
					
						
							|  |  |  |         $loader = new PhpDocumentLoader(new FileSystemContentRetriever, $projectIndex, $definitionResolver); | 
					
						
							|  |  |  |         $this->textDocument = new Server\TextDocument($loader, $definitionResolver, $client, $projectIndex); | 
					
						
							| 
									
										
										
										
											2016-10-11 08:15:20 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-10-08 12:51:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-24 17:35:37 +00:00
										 |  |  |     private function openFile($file) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-10-08 12:51:49 +00:00
										 |  |  |         $textDocumentItem = new TextDocumentItem(); | 
					
						
							|  |  |  |         $textDocumentItem->uri = 'whatever'; | 
					
						
							|  |  |  |         $textDocumentItem->languageId = 'php'; | 
					
						
							|  |  |  |         $textDocumentItem->version = 1; | 
					
						
							| 
									
										
										
										
											2016-10-11 08:15:20 +00:00
										 |  |  |         $textDocumentItem->text = file_get_contents($file); | 
					
						
							|  |  |  |         $this->textDocument->didOpen($textDocumentItem); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function testParseErrorsArePublishedAsDiagnostics() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->openFile(__DIR__ . '/../../../fixtures/invalid_file.php'); | 
					
						
							| 
									
										
										
										
											2016-10-08 12:51:49 +00:00
										 |  |  |         $this->assertEquals([ | 
					
						
							|  |  |  |             'whatever', | 
					
						
							|  |  |  |             [[ | 
					
						
							|  |  |  |                 'range' => [ | 
					
						
							|  |  |  |                     'start' => [ | 
					
						
							|  |  |  |                         'line' => 2, | 
					
						
							| 
									
										
										
										
											2017-06-09 18:25:30 +00:00
										 |  |  |                         'character' => 9 | 
					
						
							|  |  |  |                     ], | 
					
						
							|  |  |  |                     'end' => [ | 
					
						
							|  |  |  |                         'line' => 2, | 
					
						
							|  |  |  |                         'character' => 9 | 
					
						
							|  |  |  |                     ] | 
					
						
							|  |  |  |                 ], | 
					
						
							|  |  |  |                 'severity' => DiagnosticSeverity::ERROR, | 
					
						
							|  |  |  |                 'code' => null, | 
					
						
							|  |  |  |                 'source' => 'php', | 
					
						
							|  |  |  |                 'message' => "'Name' expected." | 
					
						
							|  |  |  |             ], | 
					
						
							|  |  |  |             [ | 
					
						
							|  |  |  |                 'range' => [ | 
					
						
							|  |  |  |                     'start' => [ | 
					
						
							|  |  |  |                         'line' => 2, | 
					
						
							|  |  |  |                         'character' => 9 | 
					
						
							|  |  |  |                     ], | 
					
						
							|  |  |  |                     'end' => [ | 
					
						
							|  |  |  |                         'line' => 2, | 
					
						
							|  |  |  |                         'character' => 9 | 
					
						
							|  |  |  |                     ] | 
					
						
							|  |  |  |                 ], | 
					
						
							|  |  |  |                 'severity' => DiagnosticSeverity::ERROR, | 
					
						
							|  |  |  |                 'code' => null, | 
					
						
							|  |  |  |                 'source' => 'php', | 
					
						
							|  |  |  |                 'message' => "'{' expected." | 
					
						
							|  |  |  |             ], | 
					
						
							|  |  |  |             [ | 
					
						
							|  |  |  |                 'range' => [ | 
					
						
							|  |  |  |                     'start' => [ | 
					
						
							|  |  |  |                         'line' => 2, | 
					
						
							|  |  |  |                         'character' => 9 | 
					
						
							|  |  |  |                     ], | 
					
						
							|  |  |  |                     'end' => [ | 
					
						
							|  |  |  |                         'line' => 2, | 
					
						
							|  |  |  |                         'character' => 9 | 
					
						
							|  |  |  |                     ] | 
					
						
							|  |  |  |                 ], | 
					
						
							|  |  |  |                 'severity' => DiagnosticSeverity::ERROR, | 
					
						
							|  |  |  |                 'code' => null, | 
					
						
							|  |  |  |                 'source' => 'php', | 
					
						
							|  |  |  |                 'message' => "'}' expected." | 
					
						
							|  |  |  |             ], | 
					
						
							|  |  |  |             [ | 
					
						
							|  |  |  |                 'range' => [ | 
					
						
							|  |  |  |                     'start' => [ | 
					
						
							|  |  |  |                         'line' => 2, | 
					
						
							|  |  |  |                         'character' => 15 | 
					
						
							| 
									
										
										
										
											2016-10-08 12:51:49 +00:00
										 |  |  |                     ], | 
					
						
							|  |  |  |                     'end' => [ | 
					
						
							|  |  |  |                         'line' => 2, | 
					
						
							|  |  |  |                         'character' => 15 | 
					
						
							|  |  |  |                     ] | 
					
						
							|  |  |  |                 ], | 
					
						
							|  |  |  |                 'severity' => DiagnosticSeverity::ERROR, | 
					
						
							|  |  |  |                 'code' => null, | 
					
						
							|  |  |  |                 'source' => 'php', | 
					
						
							| 
									
										
										
										
											2017-06-09 18:25:30 +00:00
										 |  |  |                 'message' => "'Name' expected." | 
					
						
							| 
									
										
										
										
											2016-10-08 12:51:49 +00:00
										 |  |  |             ]] | 
					
						
							| 
									
										
										
										
											2016-10-11 08:15:20 +00:00
										 |  |  |         ], json_decode(json_encode($this->args), true)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function testParseErrorsWithOnlyStartLine() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-06-09 18:25:30 +00:00
										 |  |  |         $this->markTestIncomplete('This diagnostic not yet implemented in tolerant-php-parser'); | 
					
						
							| 
									
										
										
										
											2016-10-11 08:15:20 +00:00
										 |  |  |         $this->openFile(__DIR__ . '/../../../fixtures/namespace_not_first.php'); | 
					
						
							|  |  |  |         $this->assertEquals([ | 
					
						
							|  |  |  |             'whatever', | 
					
						
							|  |  |  |             [[ | 
					
						
							|  |  |  |                 'range' => [ | 
					
						
							|  |  |  |                     'start' => [ | 
					
						
							|  |  |  |                         'line' => 4, | 
					
						
							|  |  |  |                         'character' => 0 | 
					
						
							|  |  |  |                     ], | 
					
						
							|  |  |  |                     'end' => [ | 
					
						
							|  |  |  |                         'line' => 4, | 
					
						
							|  |  |  |                         'character' => 0 | 
					
						
							|  |  |  |                     ] | 
					
						
							|  |  |  |                 ], | 
					
						
							|  |  |  |                 'severity' => DiagnosticSeverity::ERROR, | 
					
						
							|  |  |  |                 'code' => null, | 
					
						
							|  |  |  |                 'source' => 'php', | 
					
						
							|  |  |  |                 'message' => "Namespace declaration statement has to be the very first statement in the script" | 
					
						
							|  |  |  |             ]] | 
					
						
							|  |  |  |         ], json_decode(json_encode($this->args), true)); | 
					
						
							| 
									
										
										
										
											2016-10-08 12:51:49 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | } |