| 
									
										
										
										
											2016-08-25 13:27:14 +00:00
										 |  |  | <?php | 
					
						
							|  |  |  | declare(strict_types = 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace LanguageServer\Tests; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use PHPUnit\Framework\TestCase; | 
					
						
							|  |  |  | use LanguageServer\LanguageServer; | 
					
						
							| 
									
										
										
										
											2016-11-14 09:25:44 +00:00
										 |  |  | use LanguageServer\Protocol\{ | 
					
						
							| 
									
										
										
										
											2016-12-13 00:51:02 +00:00
										 |  |  |     Message, | 
					
						
							|  |  |  |     ClientCapabilities, | 
					
						
							|  |  |  |     TextDocumentSyncKind, | 
					
						
							|  |  |  |     MessageType, | 
					
						
							|  |  |  |     TextDocumentItem, | 
					
						
							|  |  |  |     TextDocumentIdentifier, | 
					
						
							|  |  |  |     InitializeResult, | 
					
						
							|  |  |  |     ServerCapabilities, | 
					
						
							| 
									
										
										
										
											2017-12-04 07:00:52 +00:00
										 |  |  |     CompletionOptions, | 
					
						
							|  |  |  |     SignatureHelpOptions | 
					
						
							| 
									
										
										
										
											2016-12-13 00:51:02 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2016-10-20 01:31:12 +00:00
										 |  |  | use AdvancedJsonRpc; | 
					
						
							| 
									
										
										
										
											2016-11-14 09:25:44 +00:00
										 |  |  | use Webmozart\Glob\Glob; | 
					
						
							|  |  |  | use Webmozart\PathUtil\Path; | 
					
						
							| 
									
										
										
										
											2016-11-07 10:52:24 +00:00
										 |  |  | use Sabre\Event\Promise; | 
					
						
							| 
									
										
										
										
											2016-11-14 09:25:44 +00:00
										 |  |  | use Exception; | 
					
						
							| 
									
										
										
										
											2016-11-07 10:52:24 +00:00
										 |  |  | use function LanguageServer\pathToUri; | 
					
						
							| 
									
										
										
										
											2016-08-25 13:27:14 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class LanguageServerTest extends TestCase | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     public function testInitialize() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-12-13 00:51:02 +00:00
										 |  |  |         $server = new LanguageServer(new MockProtocolStream, new MockProtocolStream); | 
					
						
							|  |  |  |         $result = $server->initialize(new ClientCapabilities, __DIR__, getmypid())->wait(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $serverCapabilities = new ServerCapabilities(); | 
					
						
							|  |  |  |         $serverCapabilities->textDocumentSync = TextDocumentSyncKind::FULL; | 
					
						
							|  |  |  |         $serverCapabilities->documentSymbolProvider = true; | 
					
						
							|  |  |  |         $serverCapabilities->workspaceSymbolProvider = true; | 
					
						
							|  |  |  |         $serverCapabilities->definitionProvider = true; | 
					
						
							|  |  |  |         $serverCapabilities->referencesProvider = true; | 
					
						
							|  |  |  |         $serverCapabilities->hoverProvider = true; | 
					
						
							|  |  |  |         $serverCapabilities->completionProvider = new CompletionOptions; | 
					
						
							|  |  |  |         $serverCapabilities->completionProvider->resolveProvider = false; | 
					
						
							|  |  |  |         $serverCapabilities->completionProvider->triggerCharacters = ['$', '>']; | 
					
						
							| 
									
										
										
										
											2017-12-04 07:00:52 +00:00
										 |  |  |         $serverCapabilities->signatureHelpProvider = new SignatureHelpOptions; | 
					
						
							|  |  |  |         $serverCapabilities->signatureHelpProvider->triggerCharacters = ['(', ',']; | 
					
						
							| 
									
										
										
										
											2017-01-11 01:08:52 +00:00
										 |  |  |         $serverCapabilities->xworkspaceReferencesProvider = true; | 
					
						
							|  |  |  |         $serverCapabilities->xdefinitionProvider = true; | 
					
						
							|  |  |  |         $serverCapabilities->xdependenciesProvider = true; | 
					
						
							| 
									
										
										
										
											2016-12-13 00:51:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $this->assertEquals(new InitializeResult($serverCapabilities), $result); | 
					
						
							| 
									
										
										
										
											2016-08-25 13:27:14 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-11-07 10:52:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-14 09:25:44 +00:00
										 |  |  |     public function testIndexingWithDirectFileAccess() | 
					
						
							| 
									
										
										
										
											2016-11-07 10:52:24 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         $promise = new Promise; | 
					
						
							|  |  |  |         $input = new MockProtocolStream; | 
					
						
							|  |  |  |         $output = new MockProtocolStream; | 
					
						
							|  |  |  |         $output->on('message', function (Message $msg) use ($promise) { | 
					
						
							| 
									
										
										
										
											2016-11-17 21:01:01 +00:00
										 |  |  |             if ($msg->body->method === 'window/logMessage' && $promise->state === Promise::PENDING) { | 
					
						
							| 
									
										
										
										
											2016-11-07 10:52:24 +00:00
										 |  |  |                 if ($msg->body->params->type === MessageType::ERROR) { | 
					
						
							| 
									
										
										
										
											2016-11-17 21:01:01 +00:00
										 |  |  |                     $promise->reject(new Exception($msg->body->params->message)); | 
					
						
							| 
									
										
										
										
											2017-06-10 09:10:15 +00:00
										 |  |  |                 } else if (preg_match('/All \d+ PHP files parsed/', $msg->body->params->message)) { | 
					
						
							| 
									
										
										
										
											2016-11-07 10:52:24 +00:00
										 |  |  |                     $promise->fulfill(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |         $server = new LanguageServer($input, $output); | 
					
						
							|  |  |  |         $capabilities = new ClientCapabilities; | 
					
						
							| 
									
										
										
										
											2016-11-23 17:38:57 +00:00
										 |  |  |         $server->initialize($capabilities, realpath(__DIR__ . '/../fixtures'), getmypid()); | 
					
						
							| 
									
										
										
										
											2016-11-07 10:52:24 +00:00
										 |  |  |         $promise->wait(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-11-14 09:25:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     public function testIndexingWithFilesAndContentRequests() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $promise = new Promise; | 
					
						
							|  |  |  |         $filesCalled = false; | 
					
						
							|  |  |  |         $contentCalled = false; | 
					
						
							|  |  |  |         $rootPath = realpath(__DIR__ . '/../fixtures'); | 
					
						
							|  |  |  |         $input = new MockProtocolStream; | 
					
						
							|  |  |  |         $output = new MockProtocolStream; | 
					
						
							| 
									
										
										
										
											2016-12-13 01:11:29 +00:00
										 |  |  |         $run = 1; | 
					
						
							|  |  |  |         $output->on('message', function (Message $msg) use ($promise, $input, $rootPath, &$filesCalled, &$contentCalled, &$run) { | 
					
						
							| 
									
										
										
										
											2016-11-14 09:25:44 +00:00
										 |  |  |             if ($msg->body->method === 'textDocument/xcontent') { | 
					
						
							|  |  |  |                 // Document content requested
 | 
					
						
							|  |  |  |                 $contentCalled = true; | 
					
						
							|  |  |  |                 $textDocumentItem = new TextDocumentItem; | 
					
						
							|  |  |  |                 $textDocumentItem->uri = $msg->body->params->textDocument->uri; | 
					
						
							|  |  |  |                 $textDocumentItem->version = 1; | 
					
						
							|  |  |  |                 $textDocumentItem->languageId = 'php'; | 
					
						
							|  |  |  |                 $textDocumentItem->text = file_get_contents($msg->body->params->textDocument->uri); | 
					
						
							|  |  |  |                 $input->write(new Message(new AdvancedJsonRpc\SuccessResponse($msg->body->id, $textDocumentItem))); | 
					
						
							|  |  |  |             } else if ($msg->body->method === 'workspace/xfiles') { | 
					
						
							|  |  |  |                 // Files requested
 | 
					
						
							|  |  |  |                 $filesCalled = true; | 
					
						
							|  |  |  |                 $pattern = Path::makeAbsolute('**/*.php', $msg->body->params->base ?? $rootPath); | 
					
						
							|  |  |  |                 $files = []; | 
					
						
							|  |  |  |                 foreach (Glob::glob($pattern) as $path) { | 
					
						
							|  |  |  |                     $files[] = new TextDocumentIdentifier(pathToUri($path)); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 $input->write(new Message(new AdvancedJsonRpc\SuccessResponse($msg->body->id, $files))); | 
					
						
							|  |  |  |             } else if ($msg->body->method === 'window/logMessage') { | 
					
						
							|  |  |  |                 // Message logged
 | 
					
						
							|  |  |  |                 if ($msg->body->params->type === MessageType::ERROR) { | 
					
						
							|  |  |  |                     // Error happened during indexing, fail test
 | 
					
						
							|  |  |  |                     if ($promise->state === Promise::PENDING) { | 
					
						
							|  |  |  |                         $promise->reject(new Exception($msg->body->params->message)); | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2017-06-10 09:10:15 +00:00
										 |  |  |                 } else if (preg_match('/All \d+ PHP files parsed/', $msg->body->params->message)) { | 
					
						
							| 
									
										
										
										
											2017-02-03 23:20:38 +00:00
										 |  |  |                     $promise->fulfill(); | 
					
						
							| 
									
										
										
										
											2016-11-14 09:25:44 +00:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |         $server = new LanguageServer($input, $output); | 
					
						
							|  |  |  |         $capabilities = new ClientCapabilities; | 
					
						
							|  |  |  |         $capabilities->xfilesProvider = true; | 
					
						
							|  |  |  |         $capabilities->xcontentProvider = true; | 
					
						
							| 
									
										
										
										
											2016-11-23 17:38:57 +00:00
										 |  |  |         $server->initialize($capabilities, $rootPath, getmypid()); | 
					
						
							| 
									
										
										
										
											2016-11-14 09:25:44 +00:00
										 |  |  |         $promise->wait(); | 
					
						
							|  |  |  |         $this->assertTrue($filesCalled); | 
					
						
							|  |  |  |         $this->assertTrue($contentCalled); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-08-25 13:27:14 +00:00
										 |  |  | } |