From a5433b211ae4ed80e4e9c44369986b1fcbbb2cd8 Mon Sep 17 00:00:00 2001 From: Robert Lu Date: Tue, 18 Jun 2019 16:59:40 +0800 Subject: [PATCH] fix tests --- tests/ClientHandlerTest.php | 57 +- tests/LanguageServerTest.php | 194 +-- tests/MockProtocolStream.php | 18 +- tests/PhpDocumentLoaderTest.php | 11 +- tests/ProtocolStreamReaderTest.php | 55 +- tests/ProtocolStreamWriterTest.php | 35 - tests/Server/ServerTestCase.php | 345 ++--- tests/Server/TextDocument/CompletionTest.php | 1215 +++++++++-------- .../Definition/GlobalFallbackTest.php | 51 +- .../TextDocument/Definition/GlobalTest.php | 499 ++++--- .../Definition/NamespacedTest.php | 57 +- tests/Server/TextDocument/DidChangeTest.php | 31 +- tests/Server/TextDocument/DidCloseTest.php | 33 +- .../TextDocument/DocumentSymbolTest.php | 53 +- tests/Server/TextDocument/HoverTest.php | 344 ++--- tests/Server/TextDocument/ParseErrorsTest.php | 213 +-- .../References/GlobalFallbackTest.php | 65 +- .../TextDocument/References/GlobalTest.php | 299 ++-- .../References/NamespacedTest.php | 23 +- .../Server/TextDocument/SignatureHelpTest.php | 19 +- .../Workspace/DidChangeWatchedFilesTest.php | 46 +- tests/Server/Workspace/SymbolTest.php | 115 +- tests/Validation/cases/functionUse2.php | 2 +- .../cases/functionUse2.php.expected.json | 3 - 24 files changed, 2013 insertions(+), 1770 deletions(-) delete mode 100644 tests/ProtocolStreamWriterTest.php diff --git a/tests/ClientHandlerTest.php b/tests/ClientHandlerTest.php index 19114d9..352a599 100644 --- a/tests/ClientHandlerTest.php +++ b/tests/ClientHandlerTest.php @@ -1,43 +1,48 @@ once('message', function (Message $msg) use ($reader) { - // Respond to request - Loop\setTimeout(function () use ($reader, $msg) { - $reader->write(new Message(new AdvancedJsonRpc\SuccessResponse($msg->body->id, 'pong'))); - }, 0); - }); - $handler->request('testMethod', ['ping'])->then(function ($result) { + Loop::run(function () { + $reader = new MockProtocolStream; + $writer = new MockProtocolStream; + $handler = new ClientHandler($reader, $writer); + $writer->addOneTimeListener('message', function (MessageEvent $messageEvent) use ($reader) { + $msg = $messageEvent->getMessage(); + // Respond to request + Loop::defer(function () use ($reader, $msg) { + yield from $reader->write(new Message(new AdvancedJsonRpc\SuccessResponse($msg->body->id, 'pong'))); + }); + }); + $result = yield from $handler->request('testMethod', ['ping']); $this->assertEquals('pong', $result); - })->wait(); - // No event listeners - $this->assertEquals([], $reader->listeners('message')); - $this->assertEquals([], $writer->listeners('message')); + // No event listeners + $this->assertEquals([], $reader->getListeners('message')); + $this->assertEquals([], $writer->getListeners('message')); + }); } public function testNotify() { - $reader = new MockProtocolStream; - $writer = new MockProtocolStream; - $handler = new ClientHandler($reader, $writer); - $handler->notify('testMethod', ['ping'])->wait(); - // No event listeners - $this->assertEquals([], $reader->listeners('message')); - $this->assertEquals([], $writer->listeners('message')); + Loop::run(function () { + $reader = new MockProtocolStream; + $writer = new MockProtocolStream; + $handler = new ClientHandler($reader, $writer); + yield from $handler->notify('testMethod', ['ping']); + // No event listeners + $this->assertEquals([], $reader->getListeners('message')); + $this->assertEquals([], $writer->getListeners('message')); + }); } } diff --git a/tests/LanguageServerTest.php b/tests/LanguageServerTest.php index 10ca3f9..6a9549b 100644 --- a/tests/LanguageServerTest.php +++ b/tests/LanguageServerTest.php @@ -1,122 +1,132 @@ initialize(new ClientCapabilities, __DIR__, getmypid())->wait(); + Loop::run(function () { + $server = new LanguageServer(new MockProtocolStream, new MockProtocolStream); + $result = yield $server->initialize(new ClientCapabilities, __DIR__, getmypid()); - $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 = ['$', '>']; - $serverCapabilities->signatureHelpProvider = new SignatureHelpOptions; - $serverCapabilities->signatureHelpProvider->triggerCharacters = ['(', ',']; - $serverCapabilities->xworkspaceReferencesProvider = true; - $serverCapabilities->xdefinitionProvider = true; - $serverCapabilities->xdependenciesProvider = true; + $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 = ['$', '>']; + $serverCapabilities->signatureHelpProvider = new SignatureHelpOptions; + $serverCapabilities->signatureHelpProvider->triggerCharacters = ['(', ',']; + $serverCapabilities->xworkspaceReferencesProvider = true; + $serverCapabilities->xdefinitionProvider = true; + $serverCapabilities->xdependenciesProvider = true; - $this->assertEquals(new InitializeResult($serverCapabilities), $result); + $this->assertEquals(new InitializeResult($serverCapabilities), $result); + }); } public function testIndexingWithDirectFileAccess() { - $promise = new Promise; - $input = new MockProtocolStream; - $output = new MockProtocolStream; - $output->on('message', function (Message $msg) use ($promise) { - if ($msg->body->method === 'window/logMessage' && $promise->state === Promise::PENDING) { - if ($msg->body->params->type === MessageType::ERROR) { - $promise->reject(new Exception($msg->body->params->message)); - } else if (preg_match('/All \d+ PHP files parsed/', $msg->body->params->message)) { - $promise->fulfill(); - } - } + Loop::run(function () { + $deferred = new Deferred(); + $input = new MockProtocolStream; + $output = new MockProtocolStream; + $output->addListener('message', function (MessageEvent $messageEvent) use ($deferred) { + $msg = $messageEvent->getMessage(); + Loop::defer(function () use ($deferred, $msg) { + if ($msg->body->method === 'window/logMessage') { + if ($msg->body->params->type === MessageType::ERROR) { + $deferred->fail(new Exception($msg->body->params->message)); + } else if (preg_match('/All \d+ PHP files parsed/', $msg->body->params->message)) { + $deferred->resolve(true); + } + } + }); + }); + $server = new LanguageServer($input, $output); + $capabilities = new ClientCapabilities; + yield $server->initialize($capabilities, realpath(__DIR__ . '/../fixtures'), getmypid()); + $this->assertTrue(yield $deferred->promise()); }); - $server = new LanguageServer($input, $output); - $capabilities = new ClientCapabilities; - $server->initialize($capabilities, realpath(__DIR__ . '/../fixtures'), getmypid()); - $promise->wait(); } public function testIndexingWithFilesAndContentRequests() { - $promise = new Promise; - $filesCalled = false; - $contentCalled = false; - $rootPath = realpath(__DIR__ . '/../fixtures'); - $input = new MockProtocolStream; - $output = new MockProtocolStream; - $run = 1; - $output->on('message', function (Message $msg) use ($promise, $input, $rootPath, &$filesCalled, &$contentCalled, &$run) { - 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)); + Loop::run(function () { + $deferred = new Deferred(); + $filesCalled = false; + $contentCalled = false; + $rootPath = realpath(__DIR__ . '/../fixtures'); + $input = new MockProtocolStream; + $output = new MockProtocolStream; + $run = 1; + $output->addListener('message', function (MessageEvent $messageEvent) use ($deferred, $input, $rootPath, &$filesCalled, &$contentCalled, &$run) { + $msg = $messageEvent->getMessage(); + Loop::defer(function () use ($msg, $deferred, $input, $rootPath, &$filesCalled, &$contentCalled, &$run) { + 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); + yield from $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)); + } + yield from $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 + $deferred->fail(new Exception($msg->body->params->message)); + } else if (preg_match('/All \d+ PHP files parsed/', $msg->body->params->message)) { + $deferred->resolve(true); + } } - } else if (preg_match('/All \d+ PHP files parsed/', $msg->body->params->message)) { - $promise->fulfill(); - } - } + }); + }); + $server = new LanguageServer($input, $output); + $capabilities = new ClientCapabilities; + $capabilities->xfilesProvider = true; + $capabilities->xcontentProvider = true; + yield $server->initialize($capabilities, $rootPath, getmypid()); + yield $deferred->promise(); + $this->assertTrue($filesCalled); + $this->assertTrue($contentCalled); }); - $server = new LanguageServer($input, $output); - $capabilities = new ClientCapabilities; - $capabilities->xfilesProvider = true; - $capabilities->xcontentProvider = true; - $server->initialize($capabilities, $rootPath, getmypid()); - $promise->wait(); - $this->assertTrue($filesCalled); - $this->assertTrue($contentCalled); } } diff --git a/tests/MockProtocolStream.php b/tests/MockProtocolStream.php index 9287053..0bf976f 100644 --- a/tests/MockProtocolStream.php +++ b/tests/MockProtocolStream.php @@ -1,11 +1,15 @@ emit('message', [Message::parse((string)$msg)]); + Loop::defer(function () use ($msg) { + $this->emit(new MessageEvent('message', Message::parse((string)$msg))); }); - return Promise\resolve(null); + yield new Delayed(0); } } diff --git a/tests/PhpDocumentLoaderTest.php b/tests/PhpDocumentLoaderTest.php index 348f23f..a26eedd 100644 --- a/tests/PhpDocumentLoaderTest.php +++ b/tests/PhpDocumentLoaderTest.php @@ -1,8 +1,9 @@ loader->getOrLoad(pathToUri(__FILE__))->wait(); + Loop::run(function () { + $document = yield from $this->loader->getOrLoad(pathToUri(__FILE__)); - $this->assertNotNull($document); - $this->assertInstanceOf(PhpDocument::class, $document); + $this->assertNotNull($document); + $this->assertInstanceOf(PhpDocument::class, $document); + }); } public function testGetReturnsOpenedInstance() diff --git a/tests/ProtocolStreamReaderTest.php b/tests/ProtocolStreamReaderTest.php index a0dcad5..621cc33 100644 --- a/tests/ProtocolStreamReaderTest.php +++ b/tests/ProtocolStreamReaderTest.php @@ -1,32 +1,49 @@ on('message', function (Message $message) use (&$msg) { - $msg = $message; + Loop::run(function () { + /** @var ResourceOutputStream $outputStream */ + /** @var ResourceInputStream $inputStream */ + list($outputStream, $inputStream) = $this->getStreamPair(); + + $reader = new ProtocolStreamReader($inputStream); + $deferred = new Deferred(); + $reader->addListener('message', function (MessageEvent $messageEvent) use (&$deferred) { + $deferred->resolve($messageEvent->getMessage()); + }); + + yield $outputStream->write((string)new Message(new RequestBody(1, 'aMethod', ['arg' => 'Hello World']))); + $msg = yield $deferred->promise(); + $this->assertNotNull($msg); + $this->assertInstanceOf(Message::class, $msg); + $this->assertInstanceOf(RequestBody::class, $msg->body); + $this->assertEquals(1, $msg->body->id); + $this->assertEquals('aMethod', $msg->body->method); + $this->assertEquals((object)['arg' => 'Hello World'], $msg->body->params); }); - $ret = fwrite($writeHandle, (string)new Message(new RequestBody(1, 'aMethod', ['arg' => 'Hello World']))); - Loop\tick(); - $this->assertNotNull($msg); - $this->assertInstanceOf(Message::class, $msg); - $this->assertInstanceOf(RequestBody::class, $msg->body); - $this->assertEquals(1, $msg->body->id); - $this->assertEquals('aMethod', $msg->body->method); - $this->assertEquals((object)['arg' => 'Hello World'], $msg->body->params); } } diff --git a/tests/ProtocolStreamWriterTest.php b/tests/ProtocolStreamWriterTest.php deleted file mode 100644 index 8ac94e7..0000000 --- a/tests/ProtocolStreamWriterTest.php +++ /dev/null @@ -1,35 +0,0 @@ - str_repeat('X', 100000)])); - $msgString = (string)$msg; - - $promise = $writer->write($msg); - - Loop\tick(); - - $promise->wait(); - - fclose($writeHandle); - - $this->assertEquals(strlen($msgString), filesize($tmpfile)); - } -} diff --git a/tests/Server/ServerTestCase.php b/tests/Server/ServerTestCase.php index 3331aef..39462f2 100644 --- a/tests/Server/ServerTestCase.php +++ b/tests/Server/ServerTestCase.php @@ -1,8 +1,9 @@ setComplete(); + Loop::run(function () { + $sourceIndex = new Index; + $dependenciesIndex = new DependenciesIndex; + $projectIndex = new ProjectIndex($sourceIndex, $dependenciesIndex); + $projectIndex->setComplete(); - $definitionResolver = new DefinitionResolver($projectIndex); - $client = new LanguageClient(new MockProtocolStream, new MockProtocolStream); - $this->documentLoader = new PhpDocumentLoader(new FileSystemContentRetriever, $projectIndex, $definitionResolver); - $this->textDocument = new Server\TextDocument($this->documentLoader, $definitionResolver, $client, $projectIndex); - $this->workspace = new Server\Workspace($client, $projectIndex, $dependenciesIndex, $sourceIndex, null, $this->documentLoader); + $definitionResolver = new DefinitionResolver($projectIndex); + $client = new LanguageClient(new MockProtocolStream, new MockProtocolStream); + $this->documentLoader = new PhpDocumentLoader(new FileSystemContentRetriever, $projectIndex, $definitionResolver); + $this->textDocument = new Server\TextDocument($this->documentLoader, $definitionResolver, $client, $projectIndex); + $this->workspace = new Server\Workspace($client, $projectIndex, $dependenciesIndex, $sourceIndex, null, $this->documentLoader); - $globalSymbolsUri = pathToUri(realpath(__DIR__ . '/../../fixtures/global_symbols.php')); - $globalReferencesUri = pathToUri(realpath(__DIR__ . '/../../fixtures/global_references.php')); - $symbolsUri = pathToUri(realpath(__DIR__ . '/../../fixtures/symbols.php')); - $referencesUri = pathToUri(realpath(__DIR__ . '/../../fixtures/references.php')); - $useUri = pathToUri(realpath(__DIR__ . '/../../fixtures/use.php')); + $globalSymbolsUri = pathToUri(realpath(__DIR__ . '/../../fixtures/global_symbols.php')); + $globalReferencesUri = pathToUri(realpath(__DIR__ . '/../../fixtures/global_references.php')); + $symbolsUri = pathToUri(realpath(__DIR__ . '/../../fixtures/symbols.php')); + $referencesUri = pathToUri(realpath(__DIR__ . '/../../fixtures/references.php')); + $useUri = pathToUri(realpath(__DIR__ . '/../../fixtures/use.php')); - $this->documentLoader->load($symbolsUri)->wait(); - $this->documentLoader->load($referencesUri)->wait(); - $this->documentLoader->load($globalSymbolsUri)->wait(); - $this->documentLoader->load($globalReferencesUri)->wait(); - $this->documentLoader->load($useUri)->wait(); + yield from $this->documentLoader->load($symbolsUri); + yield from $this->documentLoader->load($referencesUri); + yield from $this->documentLoader->load($globalSymbolsUri); + yield from $this->documentLoader->load($globalReferencesUri); + yield from $this->documentLoader->load($useUri); - // @codingStandardsIgnoreStart - $this->definitionLocations = [ + // @codingStandardsIgnoreStart + $this->definitionLocations = [ - // Global - 'TEST_DEFINE_CONSTANT' => new Location($globalSymbolsUri, new Range(new Position(104, 0), new Position(104, 37))), - 'TEST_CONST' => new Location($globalSymbolsUri, new Range(new Position( 9, 6), new Position( 9, 22))), - 'TestClass' => new Location($globalSymbolsUri, new Range(new Position(20, 0), new Position(61, 1))), - 'ChildClass' => new Location($globalSymbolsUri, new Range(new Position(99, 0), new Position(99, 37))), - 'TestTrait' => new Location($globalSymbolsUri, new Range(new Position(63, 0), new Position(66, 1))), - 'TestInterface' => new Location($globalSymbolsUri, new Range(new Position(68, 0), new Position(71, 1))), - 'TestClass::TEST_CLASS_CONST' => new Location($globalSymbolsUri, new Range(new Position(27, 10), new Position(27, 32))), - 'TestClass::testProperty' => new Location($globalSymbolsUri, new Range(new Position(41, 11), new Position(41, 24))), - 'TestClass::staticTestProperty' => new Location($globalSymbolsUri, new Range(new Position(34, 18), new Position(34, 37))), - 'TestClass::staticTestMethod()' => new Location($globalSymbolsUri, new Range(new Position(46, 4), new Position(49, 5))), - 'TestClass::testMethod()' => new Location($globalSymbolsUri, new Range(new Position(57, 4), new Position(60, 5))), - 'test_function()' => new Location($globalSymbolsUri, new Range(new Position(78, 0), new Position(81, 1))), - 'UnusedClass' => new Location($globalSymbolsUri, new Range(new Position(111, 0), new Position(118, 1))), - 'UnusedClass::unusedProperty' => new Location($globalSymbolsUri, new Range(new Position(113,11), new Position(113, 26))), - 'UnusedClass::unusedMethod' => new Location($globalSymbolsUri, new Range(new Position(115, 4), new Position(117, 5))), - 'whatever()' => new Location($globalReferencesUri, new Range(new Position(21, 0), new Position(23, 1))), + // Global + 'TEST_DEFINE_CONSTANT' => new Location($globalSymbolsUri, new Range(new Position(104, 0), new Position(104, 37))), + 'TEST_CONST' => new Location($globalSymbolsUri, new Range(new Position(9, 6), new Position(9, 22))), + 'TestClass' => new Location($globalSymbolsUri, new Range(new Position(20, 0), new Position(61, 1))), + 'ChildClass' => new Location($globalSymbolsUri, new Range(new Position(99, 0), new Position(99, 37))), + 'TestTrait' => new Location($globalSymbolsUri, new Range(new Position(63, 0), new Position(66, 1))), + 'TestInterface' => new Location($globalSymbolsUri, new Range(new Position(68, 0), new Position(71, 1))), + 'TestClass::TEST_CLASS_CONST' => new Location($globalSymbolsUri, new Range(new Position(27, 10), new Position(27, 32))), + 'TestClass::testProperty' => new Location($globalSymbolsUri, new Range(new Position(41, 11), new Position(41, 24))), + 'TestClass::staticTestProperty' => new Location($globalSymbolsUri, new Range(new Position(34, 18), new Position(34, 37))), + 'TestClass::staticTestMethod()' => new Location($globalSymbolsUri, new Range(new Position(46, 4), new Position(49, 5))), + 'TestClass::testMethod()' => new Location($globalSymbolsUri, new Range(new Position(57, 4), new Position(60, 5))), + 'test_function()' => new Location($globalSymbolsUri, new Range(new Position(78, 0), new Position(81, 1))), + 'UnusedClass' => new Location($globalSymbolsUri, new Range(new Position(111, 0), new Position(118, 1))), + 'UnusedClass::unusedProperty' => new Location($globalSymbolsUri, new Range(new Position(113, 11), new Position(113, 26))), + 'UnusedClass::unusedMethod' => new Location($globalSymbolsUri, new Range(new Position(115, 4), new Position(117, 5))), + 'whatever()' => new Location($globalReferencesUri, new Range(new Position(21, 0), new Position(23, 1))), - // Namespaced - 'TestNamespace' => new Location($symbolsUri, new Range(new Position( 2, 0), new Position( 2, 24))), - 'SecondTestNamespace' => new Location($useUri, new Range(new Position( 2, 0), new Position( 2, 30))), - 'TestNamespace\\TEST_CONST' => new Location($symbolsUri, new Range(new Position( 9, 6), new Position( 9, 22))), - 'TestNamespace\\TestClass' => new Location($symbolsUri, new Range(new Position(20, 0), new Position(61, 1))), - 'TestNamespace\\ChildClass' => new Location($symbolsUri, new Range(new Position(99, 0), new Position(99, 37))), - 'TestNamespace\\TestTrait' => new Location($symbolsUri, new Range(new Position(63, 0), new Position(66, 1))), - 'TestNamespace\\TestInterface' => new Location($symbolsUri, new Range(new Position(68, 0), new Position(71, 1))), - 'TestNamespace\\TestClass::TEST_CLASS_CONST' => new Location($symbolsUri, new Range(new Position(27, 10), new Position(27, 32))), - 'TestNamespace\\TestClass::testProperty' => new Location($symbolsUri, new Range(new Position(41, 11), new Position(41, 24))), - 'TestNamespace\\TestClass::staticTestProperty' => new Location($symbolsUri, new Range(new Position(34, 18), new Position(34, 37))), - 'TestNamespace\\TestClass::staticTestMethod()' => new Location($symbolsUri, new Range(new Position(46, 4), new Position(49, 5))), - 'TestNamespace\\TestClass::testMethod()' => new Location($symbolsUri, new Range(new Position(57, 4), new Position(60, 5))), - 'TestNamespace\\test_function()' => new Location($symbolsUri, new Range(new Position(78, 0), new Position(81, 1))), - 'TestNamespace\\whatever()' => new Location($referencesUri, new Range(new Position(21, 0), new Position(23, 1))), - 'TestNamespace\\Example' => new Location($symbolsUri, new Range(new Position(101, 0), new Position(104, 1))), - 'TestNamespace\\Example::__construct' => new Location($symbolsUri, new Range(new Position(102, 4), new Position(102, 36))), - 'TestNamespace\\Example::__destruct' => new Location($symbolsUri, new Range(new Position(103, 4), new Position(103, 35))), - 'TestNamespace\\InnerNamespace' => new Location($symbolsUri, new Range(new Position(106, 0), new Position(106, 39))), - 'TestNamespace\\InnerNamespace\\InnerClass' => new Location($symbolsUri, new Range(new Position(108, 0), new Position(109, 1))), - ]; + // Namespaced + 'TestNamespace' => new Location($symbolsUri, new Range(new Position(2, 0), new Position(2, 24))), + 'SecondTestNamespace' => new Location($useUri, new Range(new Position(2, 0), new Position(2, 30))), + 'TestNamespace\\TEST_CONST' => new Location($symbolsUri, new Range(new Position(9, 6), new Position(9, 22))), + 'TestNamespace\\TestClass' => new Location($symbolsUri, new Range(new Position(20, 0), new Position(61, 1))), + 'TestNamespace\\ChildClass' => new Location($symbolsUri, new Range(new Position(99, 0), new Position(99, 37))), + 'TestNamespace\\TestTrait' => new Location($symbolsUri, new Range(new Position(63, 0), new Position(66, 1))), + 'TestNamespace\\TestInterface' => new Location($symbolsUri, new Range(new Position(68, 0), new Position(71, 1))), + 'TestNamespace\\TestClass::TEST_CLASS_CONST' => new Location($symbolsUri, new Range(new Position(27, 10), new Position(27, 32))), + 'TestNamespace\\TestClass::testProperty' => new Location($symbolsUri, new Range(new Position(41, 11), new Position(41, 24))), + 'TestNamespace\\TestClass::staticTestProperty' => new Location($symbolsUri, new Range(new Position(34, 18), new Position(34, 37))), + 'TestNamespace\\TestClass::staticTestMethod()' => new Location($symbolsUri, new Range(new Position(46, 4), new Position(49, 5))), + 'TestNamespace\\TestClass::testMethod()' => new Location($symbolsUri, new Range(new Position(57, 4), new Position(60, 5))), + 'TestNamespace\\test_function()' => new Location($symbolsUri, new Range(new Position(78, 0), new Position(81, 1))), + 'TestNamespace\\whatever()' => new Location($referencesUri, new Range(new Position(21, 0), new Position(23, 1))), + 'TestNamespace\\Example' => new Location($symbolsUri, new Range(new Position(101, 0), new Position(104, 1))), + 'TestNamespace\\Example::__construct' => new Location($symbolsUri, new Range(new Position(102, 4), new Position(102, 36))), + 'TestNamespace\\Example::__destruct' => new Location($symbolsUri, new Range(new Position(103, 4), new Position(103, 35))), + 'TestNamespace\\InnerNamespace' => new Location($symbolsUri, new Range(new Position(106, 0), new Position(106, 39))), + 'TestNamespace\\InnerNamespace\\InnerClass' => new Location($symbolsUri, new Range(new Position(108, 0), new Position(109, 1))), + ]; - $this->referenceLocations = [ + $this->referenceLocations = [ - // Namespaced - 'TestNamespace' => [ - 0 => new Location($referencesUri, new Range(new Position(31, 13), new Position(31, 40))), // use function TestNamespace\test_function; - 1 => new Location($useUri, new Range(new Position( 4, 4), new Position( 4, 27))), // use TestNamespace\TestClass; - 2 => new Location($useUri, new Range(new Position( 5, 4), new Position( 5, 18))) // use TestNamespace\{TestTrait, TestInterface}; - ], - 'TestNamespace\\TEST_CONST' => [ - 0 => new Location($referencesUri, new Range(new Position(29, 5), new Position(29, 15))) - ], - 'TestNamespace\\TestClass' => [ - 0 => new Location($symbolsUri, new Range(new Position(48, 13), new Position(48, 17))), // echo self::TEST_CLASS_CONST; - 1 => new Location($symbolsUri , new Range(new Position(99, 25), new Position(99, 34))), // class ChildClass extends TestClass {} - 2 => new Location($referencesUri, new Range(new Position( 4, 11), new Position( 4, 20))), // $obj = new TestClass(); - 3 => new Location($referencesUri, new Range(new Position( 7, 0), new Position( 7, 9))), // TestClass::staticTestMethod(); - 4 => new Location($referencesUri, new Range(new Position( 8, 5), new Position( 8, 14))), // echo TestClass::$staticTestProperty; - 5 => new Location($referencesUri, new Range(new Position( 9, 5), new Position( 9, 14))), // TestClass::TEST_CLASS_CONST; - 6 => new Location($referencesUri, new Range(new Position(21, 18), new Position(21, 27))), // function whatever(TestClass $param) - 7 => new Location($referencesUri, new Range(new Position(21, 37), new Position(21, 46))), // function whatever(TestClass $param): TestClass - 8 => new Location($referencesUri, new Range(new Position(39, 0), new Position(39, 9))), // TestClass::$staticTestProperty[123]->testProperty; - 9 => new Location($useUri, new Range(new Position( 4, 4), new Position( 4, 27))), // use TestNamespace\TestClass; - ], - 'TestNamespace\\TestChild' => [ - 0 => new Location($referencesUri, new Range(new Position(42, 5), new Position(42, 25))), // echo $child->testProperty; - ], - 'TestNamespace\\TestInterface' => [ - 0 => new Location($symbolsUri, new Range(new Position(20, 27), new Position(20, 40))), // class TestClass implements TestInterface - 1 => new Location($symbolsUri, new Range(new Position(57, 48), new Position(57, 61))), // public function testMethod($testParameter): TestInterface - 2 => new Location($referencesUri, new Range(new Position(33, 20), new Position(33, 33))) // if ($abc instanceof TestInterface) - ], - 'TestNamespace\\TestClass::TEST_CLASS_CONST' => [ - 0 => new Location($symbolsUri, new Range(new Position(48, 13), new Position(48, 35))), // echo self::TEST_CLASS_CONSTANT - 1 => new Location($referencesUri, new Range(new Position( 9, 5), new Position( 9, 32))) - ], - 'TestNamespace\\TestClass::testProperty' => [ - 0 => new Location($symbolsUri, new Range(new Position(59, 8), new Position(59, 27))), // $this->testProperty = $testParameter; - 1 => new Location($referencesUri, new Range(new Position( 6, 5), new Position( 6, 23))), // echo $obj->testProperty; - 2 => new Location($referencesUri, new Range(new Position(38, 0), new Position(38, 18))), // $obj->testProperty->testMethod(); - 3 => new Location($referencesUri, new Range(new Position(39, 0), new Position(39, 49))) // TestClass::$staticTestProperty[123]->testProperty; - ], - 'TestNamespace\\TestClass::staticTestProperty' => [ - 0 => new Location($referencesUri, new Range(new Position( 8, 16), new Position( 8, 35))), // echo TestClass::$staticTestProperty; - 1 => new Location($referencesUri, new Range(new Position(39, 11), new Position(39, 30))) // TestClass::$staticTestProperty[123]->testProperty; - ], - 'TestNamespace\\TestClass::staticTestMethod()' => [ - 0 => new Location($referencesUri, new Range(new Position( 7, 0), new Position( 7, 27))) - ], - 'TestNamespace\\TestClass::testMethod()' => [ - 0 => new Location($referencesUri, new Range(new Position( 5, 0), new Position( 5, 16))), // $obj->testMethod(); - 1 => new Location($referencesUri, new Range(new Position(38, 0), new Position(38, 30))), // $obj->testProperty->testMethod(); - 2 => new Location($referencesUri, new Range(new Position(42, 5), new Position(42, 23))) // $child->testMethod(); - ], - 'TestNamespace\\test_function()' => [ - 0 => new Location($referencesUri, new Range(new Position(10, 0), new Position(10, 13))), - 1 => new Location($referencesUri, new Range(new Position(31, 13), new Position(31, 40))) - ], + // Namespaced + 'TestNamespace' => [ + 0 => new Location($referencesUri, new Range(new Position(31, 13), new Position(31, 40))), // use function TestNamespace\test_function; + 1 => new Location($useUri, new Range(new Position(4, 4), new Position(4, 27))), // use TestNamespace\TestClass; + 2 => new Location($useUri, new Range(new Position(5, 4), new Position(5, 18))) // use TestNamespace\{TestTrait, TestInterface}; + ], + 'TestNamespace\\TEST_CONST' => [ + 0 => new Location($referencesUri, new Range(new Position(29, 5), new Position(29, 15))) + ], + 'TestNamespace\\TestClass' => [ + 0 => new Location($symbolsUri, new Range(new Position(48, 13), new Position(48, 17))), // echo self::TEST_CLASS_CONST; + 1 => new Location($symbolsUri, new Range(new Position(99, 25), new Position(99, 34))), // class ChildClass extends TestClass {} + 2 => new Location($referencesUri, new Range(new Position(4, 11), new Position(4, 20))), // $obj = new TestClass(); + 3 => new Location($referencesUri, new Range(new Position(7, 0), new Position(7, 9))), // TestClass::staticTestMethod(); + 4 => new Location($referencesUri, new Range(new Position(8, 5), new Position(8, 14))), // echo TestClass::$staticTestProperty; + 5 => new Location($referencesUri, new Range(new Position(9, 5), new Position(9, 14))), // TestClass::TEST_CLASS_CONST; + 6 => new Location($referencesUri, new Range(new Position(21, 18), new Position(21, 27))), // function whatever(TestClass $param) + 7 => new Location($referencesUri, new Range(new Position(21, 37), new Position(21, 46))), // function whatever(TestClass $param): TestClass + 8 => new Location($referencesUri, new Range(new Position(39, 0), new Position(39, 9))), // TestClass::$staticTestProperty[123]->testProperty; + 9 => new Location($useUri, new Range(new Position(4, 4), new Position(4, 27))), // use TestNamespace\TestClass; + ], + 'TestNamespace\\TestChild' => [ + 0 => new Location($referencesUri, new Range(new Position(42, 5), new Position(42, 25))), // echo $child->testProperty; + ], + 'TestNamespace\\TestInterface' => [ + 0 => new Location($symbolsUri, new Range(new Position(20, 27), new Position(20, 40))), // class TestClass implements TestInterface + 1 => new Location($symbolsUri, new Range(new Position(57, 48), new Position(57, 61))), // public function testMethod($testParameter): TestInterface + 2 => new Location($referencesUri, new Range(new Position(33, 20), new Position(33, 33))) // if ($abc instanceof TestInterface) + ], + 'TestNamespace\\TestClass::TEST_CLASS_CONST' => [ + 0 => new Location($symbolsUri, new Range(new Position(48, 13), new Position(48, 35))), // echo self::TEST_CLASS_CONSTANT + 1 => new Location($referencesUri, new Range(new Position(9, 5), new Position(9, 32))) + ], + 'TestNamespace\\TestClass::testProperty' => [ + 0 => new Location($symbolsUri, new Range(new Position(59, 8), new Position(59, 27))), // $this->testProperty = $testParameter; + 1 => new Location($referencesUri, new Range(new Position(6, 5), new Position(6, 23))), // echo $obj->testProperty; + 2 => new Location($referencesUri, new Range(new Position(38, 0), new Position(38, 18))), // $obj->testProperty->testMethod(); + 3 => new Location($referencesUri, new Range(new Position(39, 0), new Position(39, 49))) // TestClass::$staticTestProperty[123]->testProperty; + ], + 'TestNamespace\\TestClass::staticTestProperty' => [ + 0 => new Location($referencesUri, new Range(new Position(8, 16), new Position(8, 35))), // echo TestClass::$staticTestProperty; + 1 => new Location($referencesUri, new Range(new Position(39, 11), new Position(39, 30))) // TestClass::$staticTestProperty[123]->testProperty; + ], + 'TestNamespace\\TestClass::staticTestMethod()' => [ + 0 => new Location($referencesUri, new Range(new Position(7, 0), new Position(7, 27))) + ], + 'TestNamespace\\TestClass::testMethod()' => [ + 0 => new Location($referencesUri, new Range(new Position(5, 0), new Position(5, 16))), // $obj->testMethod(); + 1 => new Location($referencesUri, new Range(new Position(38, 0), new Position(38, 30))), // $obj->testProperty->testMethod(); + 2 => new Location($referencesUri, new Range(new Position(42, 5), new Position(42, 23))) // $child->testMethod(); + ], + 'TestNamespace\\test_function()' => [ + 0 => new Location($referencesUri, new Range(new Position(10, 0), new Position(10, 13))), + 1 => new Location($referencesUri, new Range(new Position(31, 13), new Position(31, 40))) + ], - // Global - 'TEST_DEFINE_CONSTANT' => [ - 0 => new Location($globalSymbolsUri, new Range(new Position(106, 6), new Position(106, 26))) - ], - 'TEST_CONST' => [ - 0 => new Location($referencesUri, new Range(new Position(29, 5), new Position(29, 15))), - 1 => new Location($globalReferencesUri, new Range(new Position(29, 5), new Position(29, 15))) - ], - 'TestClass' => [ - 0 => new Location($globalSymbolsUri, new Range(new Position(48, 13), new Position(48, 17))), // echo self::TEST_CLASS_CONST; - 1 => new Location($globalSymbolsUri, new Range(new Position(99, 25), new Position(99, 34))), // class ChildClass extends TestClass {} - 2 => new Location($globalReferencesUri, new Range(new Position( 4, 11), new Position( 4, 20))), // $obj = new TestClass(); - 3 => new Location($globalReferencesUri, new Range(new Position( 7, 0), new Position( 7, 9))), // TestClass::staticTestMethod(); - 4 => new Location($globalReferencesUri, new Range(new Position( 8, 5), new Position( 8, 14))), // echo TestClass::$staticTestProperty; - 5 => new Location($globalReferencesUri, new Range(new Position( 9, 5), new Position( 9, 14))), // TestClass::TEST_CLASS_CONST; - 6 => new Location($globalReferencesUri, new Range(new Position(21, 18), new Position(21, 27))), // function whatever(TestClass $param) - 7 => new Location($globalReferencesUri, new Range(new Position(21, 37), new Position(21, 46))), // function whatever(TestClass $param): TestClass - 8 => new Location($globalReferencesUri, new Range(new Position(39, 0), new Position(39, 9))), // TestClass::$staticTestProperty[123]->testProperty; - ], - 'TestChild' => [ - 0 => new Location($globalReferencesUri, new Range(new Position(42, 5), new Position(42, 25))), // echo $child->testProperty; - ], - 'TestInterface' => [ - 0 => new Location($globalSymbolsUri, new Range(new Position(20, 27), new Position(20, 40))), // class TestClass implements TestInterface - 1 => new Location($globalSymbolsUri, new Range(new Position(57, 49), new Position(57, 61))), // public function testMethod($testParameter) : TestInterface - 2 => new Location($globalReferencesUri, new Range(new Position(33, 20), new Position(33, 33))) // if ($abc instanceof TestInterface) - ], - 'TestClass::TEST_CLASS_CONST' => [ - 0 => new Location($globalSymbolsUri, new Range(new Position(48, 13), new Position(48, 35))), // echo self::TEST_CLASS_CONSTANT - 1 => new Location($globalReferencesUri, new Range(new Position( 9, 5), new Position( 9, 32))) - ], - 'TestClass::testProperty' => [ - 0 => new Location($globalSymbolsUri, new Range(new Position(59, 8), new Position(59, 27))), // $this->testProperty = $testParameter; - 1 => new Location($globalReferencesUri, new Range(new Position( 6, 5), new Position( 6, 23))), // echo $obj->testProperty; - 2 => new Location($globalReferencesUri, new Range(new Position(38, 0), new Position(38, 18))), // $obj->testProperty->testMethod(); - 3 => new Location($globalReferencesUri, new Range(new Position(39, 0), new Position(39, 49))) // TestClass::$staticTestProperty[123]->testProperty; - ], - 'TestClass::staticTestProperty' => [ - 0 => new Location($globalReferencesUri, new Range(new Position( 8, 16), new Position( 8, 35))), // echo TestClass::$staticTestProperty; - 1 => new Location($globalReferencesUri, new Range(new Position(39, 11), new Position(39, 30))) // TestClass::$staticTestProperty[123]->testProperty; - ], - 'TestClass::staticTestMethod()' => [ - 0 => new Location($globalReferencesUri, new Range(new Position( 7, 0), new Position( 7, 27))) - ], - 'TestClass::testMethod()' => [ - 0 => new Location($globalReferencesUri, new Range(new Position( 5, 0), new Position( 5, 16))), // $obj->testMethod(); - 1 => new Location($globalReferencesUri, new Range(new Position(38, 0), new Position(38, 30))), // $obj->testProperty->testMethod(); - 2 => new Location($globalReferencesUri, new Range(new Position(42, 5), new Position(42, 23))) // $child->testMethod(); - ], - 'test_function()' => [ - 0 => new Location($globalReferencesUri, new Range(new Position(10, 0), new Position(10, 13))), - 1 => new Location($globalReferencesUri, new Range(new Position(31, 13), new Position(31, 40))) - ] - ]; - // @codingStandardsIgnoreEnd + // Global + 'TEST_DEFINE_CONSTANT' => [ + 0 => new Location($globalSymbolsUri, new Range(new Position(106, 6), new Position(106, 26))) + ], + 'TEST_CONST' => [ + 0 => new Location($referencesUri, new Range(new Position(29, 5), new Position(29, 15))), + 1 => new Location($globalReferencesUri, new Range(new Position(29, 5), new Position(29, 15))) + ], + 'TestClass' => [ + 0 => new Location($globalSymbolsUri, new Range(new Position(48, 13), new Position(48, 17))), // echo self::TEST_CLASS_CONST; + 1 => new Location($globalSymbolsUri, new Range(new Position(99, 25), new Position(99, 34))), // class ChildClass extends TestClass {} + 2 => new Location($globalReferencesUri, new Range(new Position(4, 11), new Position(4, 20))), // $obj = new TestClass(); + 3 => new Location($globalReferencesUri, new Range(new Position(7, 0), new Position(7, 9))), // TestClass::staticTestMethod(); + 4 => new Location($globalReferencesUri, new Range(new Position(8, 5), new Position(8, 14))), // echo TestClass::$staticTestProperty; + 5 => new Location($globalReferencesUri, new Range(new Position(9, 5), new Position(9, 14))), // TestClass::TEST_CLASS_CONST; + 6 => new Location($globalReferencesUri, new Range(new Position(21, 18), new Position(21, 27))), // function whatever(TestClass $param) + 7 => new Location($globalReferencesUri, new Range(new Position(21, 37), new Position(21, 46))), // function whatever(TestClass $param): TestClass + 8 => new Location($globalReferencesUri, new Range(new Position(39, 0), new Position(39, 9))), // TestClass::$staticTestProperty[123]->testProperty; + ], + 'TestChild' => [ + 0 => new Location($globalReferencesUri, new Range(new Position(42, 5), new Position(42, 25))), // echo $child->testProperty; + ], + 'TestInterface' => [ + 0 => new Location($globalSymbolsUri, new Range(new Position(20, 27), new Position(20, 40))), // class TestClass implements TestInterface + 1 => new Location($globalSymbolsUri, new Range(new Position(57, 49), new Position(57, 61))), // public function testMethod($testParameter) : TestInterface + 2 => new Location($globalReferencesUri, new Range(new Position(33, 20), new Position(33, 33))) // if ($abc instanceof TestInterface) + ], + 'TestClass::TEST_CLASS_CONST' => [ + 0 => new Location($globalSymbolsUri, new Range(new Position(48, 13), new Position(48, 35))), // echo self::TEST_CLASS_CONSTANT + 1 => new Location($globalReferencesUri, new Range(new Position(9, 5), new Position(9, 32))) + ], + 'TestClass::testProperty' => [ + 0 => new Location($globalSymbolsUri, new Range(new Position(59, 8), new Position(59, 27))), // $this->testProperty = $testParameter; + 1 => new Location($globalReferencesUri, new Range(new Position(6, 5), new Position(6, 23))), // echo $obj->testProperty; + 2 => new Location($globalReferencesUri, new Range(new Position(38, 0), new Position(38, 18))), // $obj->testProperty->testMethod(); + 3 => new Location($globalReferencesUri, new Range(new Position(39, 0), new Position(39, 49))) // TestClass::$staticTestProperty[123]->testProperty; + ], + 'TestClass::staticTestProperty' => [ + 0 => new Location($globalReferencesUri, new Range(new Position(8, 16), new Position(8, 35))), // echo TestClass::$staticTestProperty; + 1 => new Location($globalReferencesUri, new Range(new Position(39, 11), new Position(39, 30))) // TestClass::$staticTestProperty[123]->testProperty; + ], + 'TestClass::staticTestMethod()' => [ + 0 => new Location($globalReferencesUri, new Range(new Position(7, 0), new Position(7, 27))) + ], + 'TestClass::testMethod()' => [ + 0 => new Location($globalReferencesUri, new Range(new Position(5, 0), new Position(5, 16))), // $obj->testMethod(); + 1 => new Location($globalReferencesUri, new Range(new Position(38, 0), new Position(38, 30))), // $obj->testProperty->testMethod(); + 2 => new Location($globalReferencesUri, new Range(new Position(42, 5), new Position(42, 23))) // $child->testMethod(); + ], + 'test_function()' => [ + 0 => new Location($globalReferencesUri, new Range(new Position(10, 0), new Position(10, 13))), + 1 => new Location($globalReferencesUri, new Range(new Position(31, 13), new Position(31, 40))) + ] + ]; + // @codingStandardsIgnoreEnd + }); } protected function getDefinitionLocation(string $fqn): Location diff --git a/tests/Server/TextDocument/CompletionTest.php b/tests/Server/TextDocument/CompletionTest.php index 516d3b4..d203ea9 100644 --- a/tests/Server/TextDocument/CompletionTest.php +++ b/tests/Server/TextDocument/CompletionTest.php @@ -1,8 +1,9 @@ loader = new PhpDocumentLoader($contentRetriever, $projectIndex, $definitionResolver); - $this->loader->load(pathToUri(__DIR__ . '/../../../fixtures/global_symbols.php'))->wait(); - $this->loader->load(pathToUri(__DIR__ . '/../../../fixtures/symbols.php'))->wait(); - $this->textDocument = new Server\TextDocument($this->loader, $definitionResolver, $client, $projectIndex); + Loop::run(function () { + $client = new LanguageClient(new MockProtocolStream, new MockProtocolStream); + $projectIndex = new ProjectIndex(new Index, new DependenciesIndex); + $definitionResolver = new DefinitionResolver($projectIndex); + $contentRetriever = new FileSystemContentRetriever; + $this->loader = new PhpDocumentLoader($contentRetriever, $projectIndex, $definitionResolver); + yield from $this->loader->load(pathToUri(__DIR__ . '/../../../fixtures/global_symbols.php')); + yield from $this->loader->load(pathToUri(__DIR__ . '/../../../fixtures/symbols.php')); + $this->textDocument = new Server\TextDocument($this->loader, $definitionResolver, $client, $projectIndex); + }); } /** @@ -52,26 +55,28 @@ class CompletionTest extends TestCase */ public function testPropertyAndMethodWithPrefix() { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/property_with_prefix.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(3, 7) - )->wait(); - $this->assertCompletionsListSubset(new CompletionList([ - new CompletionItem( - 'testProperty', - CompletionItemKind::PROPERTY, - '\TestClass', // Type of the property - 'Reprehenderit magna velit mollit ipsum do.' - ), - new CompletionItem( - 'testMethod', - CompletionItemKind::METHOD, - '\TestClass', // Return type of the method - 'Non culpa nostrud mollit esse sunt laboris in irure ullamco cupidatat amet.' - ) - ], true), $items); + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/property_with_prefix.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(3, 7) + ); + $this->assertCompletionsListSubset(new CompletionList([ + new CompletionItem( + 'testProperty', + CompletionItemKind::PROPERTY, + '\TestClass', // Type of the property + 'Reprehenderit magna velit mollit ipsum do.' + ), + new CompletionItem( + 'testMethod', + CompletionItemKind::METHOD, + '\TestClass', // Return type of the method + 'Non culpa nostrud mollit esse sunt laboris in irure ullamco cupidatat amet.' + ) + ], true), $items); + }); } /** @@ -79,23 +84,25 @@ class CompletionTest extends TestCase */ public function testGlobalFunctionInsideNamespaceAndClass() { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/inside_namespace_and_method.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(8, 11) - )->wait(); - $this->assertCompletionsListSubset(new CompletionList([ - new CompletionItem( - 'test_function', - CompletionItemKind::FUNCTION, - 'void', // Return type - 'Officia aliquip adipisicing et nulla et laboris dolore labore.', - null, - null, - '\test_function' - ) - ], true), $items); + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/inside_namespace_and_method.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(8, 11) + ); + $this->assertCompletionsListSubset(new CompletionList([ + new CompletionItem( + 'test_function', + CompletionItemKind::FUNCTION, + 'void', // Return type + 'Officia aliquip adipisicing et nulla et laboris dolore labore.', + null, + null, + '\test_function' + ) + ], true), $items); + }); } /** @@ -103,26 +110,28 @@ class CompletionTest extends TestCase */ public function testPropertyAndMethodWithoutPrefix() { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/property.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(3, 6) - )->wait(); - $this->assertCompletionsListSubset(new CompletionList([ - new CompletionItem( - 'testProperty', - CompletionItemKind::PROPERTY, - '\TestClass', // Type of the property - 'Reprehenderit magna velit mollit ipsum do.' - ), - new CompletionItem( - 'testMethod', - CompletionItemKind::METHOD, - '\TestClass', // Return type of the method - 'Non culpa nostrud mollit esse sunt laboris in irure ullamco cupidatat amet.' - ) - ], true), $items); + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/property.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(3, 6) + ); + $this->assertCompletionsListSubset(new CompletionList([ + new CompletionItem( + 'testProperty', + CompletionItemKind::PROPERTY, + '\TestClass', // Type of the property + 'Reprehenderit magna velit mollit ipsum do.' + ), + new CompletionItem( + 'testMethod', + CompletionItemKind::METHOD, + '\TestClass', // Return type of the method + 'Non culpa nostrud mollit esse sunt laboris in irure ullamco cupidatat amet.' + ) + ], true), $items); + }); } /** @@ -130,34 +139,36 @@ class CompletionTest extends TestCase */ public function testVariable() { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/variable.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(8, 5) - )->wait(); - $this->assertCompletionsListSubset(new CompletionList([ - new CompletionItem( - '$var', - CompletionItemKind::VARIABLE, - 'int', - null, - null, - null, - null, - new TextEdit(new Range(new Position(8, 5), new Position(8, 5)), 'var') - ), - new CompletionItem( - '$param', - CompletionItemKind::VARIABLE, - 'string|null', - 'A parameter', - null, - null, - null, - new TextEdit(new Range(new Position(8, 5), new Position(8, 5)), 'param') - ) - ], true), $items); + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/variable.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(8, 5) + ); + $this->assertCompletionsListSubset(new CompletionList([ + new CompletionItem( + '$var', + CompletionItemKind::VARIABLE, + 'int', + null, + null, + null, + null, + new TextEdit(new Range(new Position(8, 5), new Position(8, 5)), 'var') + ), + new CompletionItem( + '$param', + CompletionItemKind::VARIABLE, + 'string|null', + 'A parameter', + null, + null, + null, + new TextEdit(new Range(new Position(8, 5), new Position(8, 5)), 'param') + ) + ], true), $items); + }); } /** @@ -165,24 +176,26 @@ class CompletionTest extends TestCase */ public function testVariableWithPrefix() { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/variable_with_prefix.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(8, 6) - )->wait(); - $this->assertCompletionsListSubset(new CompletionList([ - new CompletionItem( - '$param', - CompletionItemKind::VARIABLE, - 'string|null', - 'A parameter', - null, - null, - null, - new TextEdit(new Range(new Position(8, 6), new Position(8, 6)), 'aram') - ) - ], true), $items); + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/variable_with_prefix.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(8, 6) + ); + $this->assertCompletionsListSubset(new CompletionList([ + new CompletionItem( + '$param', + CompletionItemKind::VARIABLE, + 'string|null', + 'A parameter', + null, + null, + null, + new TextEdit(new Range(new Position(8, 6), new Position(8, 6)), 'aram') + ) + ], true), $items); + }); } /** @@ -190,53 +203,55 @@ class CompletionTest extends TestCase */ public function testNewInNamespace() { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/used_new.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(6, 10) - )->wait(); - $this->assertCompletionsListSubset(new CompletionList([ - // Global TestClass definition (inserted as \TestClass) - new CompletionItem( - 'TestClass', - CompletionItemKind::CLASS_, - null, - 'Pariatur ut laborum tempor voluptate consequat ea deserunt.' . "\n\n" . - 'Deserunt enim minim sunt sint ea nisi. Deserunt excepteur tempor id nostrud' . "\n" . - 'laboris commodo ad commodo velit mollit qui non officia id. Nulla duis veniam' . "\n" . - 'veniam officia deserunt et non dolore mollit ea quis eiusmod sit non. Occaecat' . "\n" . - 'consequat sunt culpa exercitation pariatur id reprehenderit nisi incididunt Lorem' . "\n" . - 'sint. Officia culpa pariatur laborum nostrud cupidatat consequat mollit.', - null, - null, - '\TestClass' - ), - new CompletionItem( - 'ChildClass', - CompletionItemKind::CLASS_, - null, - null, - null, - null, - '\ChildClass' - ), - // Namespaced, `use`d TestClass definition (inserted as TestClass) - new CompletionItem( - 'TestClass', - CompletionItemKind::CLASS_, - 'TestNamespace', - 'Pariatur ut laborum tempor voluptate consequat ea deserunt.' . "\n\n" . - 'Deserunt enim minim sunt sint ea nisi. Deserunt excepteur tempor id nostrud' . "\n" . - 'laboris commodo ad commodo velit mollit qui non officia id. Nulla duis veniam' . "\n" . - 'veniam officia deserunt et non dolore mollit ea quis eiusmod sit non. Occaecat' . "\n" . - 'consequat sunt culpa exercitation pariatur id reprehenderit nisi incididunt Lorem' . "\n" . - 'sint. Officia culpa pariatur laborum nostrud cupidatat consequat mollit.', - null, - null, - 'TestClass' - ), - ], true), $items); + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/used_new.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(6, 10) + ); + $this->assertCompletionsListSubset(new CompletionList([ + // Global TestClass definition (inserted as \TestClass) + new CompletionItem( + 'TestClass', + CompletionItemKind::CLASS_, + null, + 'Pariatur ut laborum tempor voluptate consequat ea deserunt.' . "\n\n" . + 'Deserunt enim minim sunt sint ea nisi. Deserunt excepteur tempor id nostrud' . "\n" . + 'laboris commodo ad commodo velit mollit qui non officia id. Nulla duis veniam' . "\n" . + 'veniam officia deserunt et non dolore mollit ea quis eiusmod sit non. Occaecat' . "\n" . + 'consequat sunt culpa exercitation pariatur id reprehenderit nisi incididunt Lorem' . "\n" . + 'sint. Officia culpa pariatur laborum nostrud cupidatat consequat mollit.', + null, + null, + '\TestClass' + ), + new CompletionItem( + 'ChildClass', + CompletionItemKind::CLASS_, + null, + null, + null, + null, + '\ChildClass' + ), + // Namespaced, `use`d TestClass definition (inserted as TestClass) + new CompletionItem( + 'TestClass', + CompletionItemKind::CLASS_, + 'TestNamespace', + 'Pariatur ut laborum tempor voluptate consequat ea deserunt.' . "\n\n" . + 'Deserunt enim minim sunt sint ea nisi. Deserunt excepteur tempor id nostrud' . "\n" . + 'laboris commodo ad commodo velit mollit qui non officia id. Nulla duis veniam' . "\n" . + 'veniam officia deserunt et non dolore mollit ea quis eiusmod sit non. Occaecat' . "\n" . + 'consequat sunt culpa exercitation pariatur id reprehenderit nisi incididunt Lorem' . "\n" . + 'sint. Officia culpa pariatur laborum nostrud cupidatat consequat mollit.', + null, + null, + 'TestClass' + ), + ], true), $items); + }); } /** @@ -244,31 +259,33 @@ class CompletionTest extends TestCase */ public function testUsedClass() { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/used_class.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(6, 5) - )->wait(); - $this->assertCompletionsListSubset(new CompletionList([ - new CompletionItem( - 'TestClass', - CompletionItemKind::CLASS_, - 'TestNamespace', - 'Pariatur ut laborum tempor voluptate consequat ea deserunt.' . "\n\n" . + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/used_class.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(6, 5) + ); + $this->assertCompletionsListSubset(new CompletionList([ + new CompletionItem( + 'TestClass', + CompletionItemKind::CLASS_, + 'TestNamespace', + 'Pariatur ut laborum tempor voluptate consequat ea deserunt.' . "\n\n" . 'Deserunt enim minim sunt sint ea nisi. Deserunt excepteur tempor id nostrud' . "\n" . 'laboris commodo ad commodo velit mollit qui non officia id. Nulla duis veniam' . "\n" . 'veniam officia deserunt et non dolore mollit ea quis eiusmod sit non. Occaecat' . "\n" . 'consequat sunt culpa exercitation pariatur id reprehenderit nisi incididunt Lorem' . "\n" . 'sint. Officia culpa pariatur laborum nostrud cupidatat consequat mollit.', - null, - null, - 'TestClass' - ) - ], true), $items); + null, + null, + 'TestClass' + ) + ], true), $items); - $this->assertCompletionsListDoesNotContainLabel('OtherClass', $items); - $this->assertCompletionsListDoesNotContainLabel('TestInterface', $items); + $this->assertCompletionsListDoesNotContainLabel('OtherClass', $items); + $this->assertCompletionsListDoesNotContainLabel('TestInterface', $items); + }); } /** @@ -276,26 +293,28 @@ class CompletionTest extends TestCase */ public function testUsedNamespaceWithPrefix() { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/used_namespace.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(8, 16) - )->wait(); - $this->assertEquals( - new CompletionList([ - new CompletionItem( - 'InnerClass', - CompletionItemKind::CLASS_, - 'TestNamespace\\InnerNamespace', - null, - null, - null, - 'AliasNamespace\\InnerClass' - ) - ], true), - $items - ); + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/used_namespace.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(8, 16) + ); + $this->assertEquals( + new CompletionList([ + new CompletionItem( + 'InnerClass', + CompletionItemKind::CLASS_, + 'TestNamespace\\InnerNamespace', + null, + null, + null, + 'AliasNamespace\\InnerClass' + ) + ], true), + $items + ); + }); } /** @@ -303,26 +322,28 @@ class CompletionTest extends TestCase */ public function testUsedNamespaceWithoutPrefix() { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/used_namespace.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(9, 15) - )->wait(); - $this->assertEquals( - new CompletionList([ - new CompletionItem( - 'InnerClass', - CompletionItemKind::CLASS_, - 'TestNamespace\InnerNamespace', - null, - null, - null, - 'AliasNamespace\InnerClass' - ), - ], true), - $items - ); + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/used_namespace.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(9, 15) + ); + $this->assertEquals( + new CompletionList([ + new CompletionItem( + 'InnerClass', + CompletionItemKind::CLASS_, + 'TestNamespace\InnerNamespace', + null, + null, + null, + 'AliasNamespace\InnerClass' + ), + ], true), + $items + ); + }); } /** @@ -330,23 +351,25 @@ class CompletionTest extends TestCase */ public function testStaticPropertyWithPrefix() { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/static_property_with_prefix.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(2, 14) - )->wait(); - $this->assertCompletionsListSubset(new CompletionList([ - new CompletionItem( - 'staticTestProperty', - CompletionItemKind::PROPERTY, - '\TestClass[]', - 'Lorem excepteur officia sit anim velit veniam enim.', - null, - null, - '$staticTestProperty' - ) - ], true), $items); + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/static_property_with_prefix.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(2, 14) + ); + $this->assertCompletionsListSubset(new CompletionList([ + new CompletionItem( + 'staticTestProperty', + CompletionItemKind::PROPERTY, + '\TestClass[]', + 'Lorem excepteur officia sit anim velit veniam enim.', + null, + null, + '$staticTestProperty' + ) + ], true), $items); + }); } /** @@ -354,35 +377,37 @@ class CompletionTest extends TestCase */ public function testStaticWithoutPrefix() { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/static.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(2, 11) - )->wait(); - $this->assertCompletionsListSubset(new CompletionList([ - new CompletionItem( - 'TEST_CLASS_CONST', - CompletionItemKind::VARIABLE, - 'int', - 'Anim labore veniam consectetur laboris minim quis aute aute esse nulla ad.' - ), - new CompletionItem( - 'staticTestProperty', - CompletionItemKind::PROPERTY, - '\TestClass[]', - 'Lorem excepteur officia sit anim velit veniam enim.', - null, - null, - '$staticTestProperty' - ), - new CompletionItem( - 'staticTestMethod', - CompletionItemKind::METHOD, - 'mixed', // Method return type - 'Do magna consequat veniam minim proident eiusmod incididunt aute proident.' - ) - ], true), $items); + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/static.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(2, 11) + ); + $this->assertCompletionsListSubset(new CompletionList([ + new CompletionItem( + 'TEST_CLASS_CONST', + CompletionItemKind::VARIABLE, + 'int', + 'Anim labore veniam consectetur laboris minim quis aute aute esse nulla ad.' + ), + new CompletionItem( + 'staticTestProperty', + CompletionItemKind::PROPERTY, + '\TestClass[]', + 'Lorem excepteur officia sit anim velit veniam enim.', + null, + null, + '$staticTestProperty' + ), + new CompletionItem( + 'staticTestMethod', + CompletionItemKind::METHOD, + 'mixed', // Method return type + 'Do magna consequat veniam minim proident eiusmod incididunt aute proident.' + ) + ], true), $items); + }); } /** @@ -390,20 +415,22 @@ class CompletionTest extends TestCase */ public function testStaticMethodWithPrefix() { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/static_method_with_prefix.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(2, 13) - )->wait(); - $this->assertCompletionsListSubset(new CompletionList([ - new CompletionItem( - 'staticTestMethod', - CompletionItemKind::METHOD, - 'mixed', - 'Do magna consequat veniam minim proident eiusmod incididunt aute proident.' - ) - ], true), $items); + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/static_method_with_prefix.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(2, 13) + ); + $this->assertCompletionsListSubset(new CompletionList([ + new CompletionItem( + 'staticTestMethod', + CompletionItemKind::METHOD, + 'mixed', + 'Do magna consequat veniam minim proident eiusmod incididunt aute proident.' + ) + ], true), $items); + }); } /** @@ -411,20 +438,22 @@ class CompletionTest extends TestCase */ public function testClassConstWithPrefix() { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/class_const_with_prefix.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(2, 13) - )->wait(); - $this->assertCompletionsListSubset(new CompletionList([ - new CompletionItem( - 'TEST_CLASS_CONST', - CompletionItemKind::VARIABLE, - 'int', - 'Anim labore veniam consectetur laboris minim quis aute aute esse nulla ad.' - ) - ], true), $items); + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/class_const_with_prefix.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(2, 13) + ); + $this->assertCompletionsListSubset(new CompletionList([ + new CompletionItem( + 'TEST_CLASS_CONST', + CompletionItemKind::VARIABLE, + 'int', + 'Anim labore veniam consectetur laboris minim quis aute aute esse nulla ad.' + ) + ], true), $items); + }); } /** @@ -432,29 +461,31 @@ class CompletionTest extends TestCase */ public function testFullyQualifiedClass() { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/fully_qualified_class.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(6, 6) - )->wait(); - $this->assertCompletionsListSubset(new CompletionList([ - new CompletionItem( - 'TestClass', - CompletionItemKind::CLASS_, - null, - 'Pariatur ut laborum tempor voluptate consequat ea deserunt.' . "\n\n" . - 'Deserunt enim minim sunt sint ea nisi. Deserunt excepteur tempor id nostrud' . "\n" . - 'laboris commodo ad commodo velit mollit qui non officia id. Nulla duis veniam' . "\n" . - 'veniam officia deserunt et non dolore mollit ea quis eiusmod sit non. Occaecat' . "\n" . - 'consequat sunt culpa exercitation pariatur id reprehenderit nisi incididunt Lorem' . "\n" . - 'sint. Officia culpa pariatur laborum nostrud cupidatat consequat mollit.' - ) - ], true), $items); - // Assert that all results are non-namespaced. - foreach ($items->items as $item) { - $this->assertSame($item->detail, null); - } + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/fully_qualified_class.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(6, 6) + ); + $this->assertCompletionsListSubset(new CompletionList([ + new CompletionItem( + 'TestClass', + CompletionItemKind::CLASS_, + null, + 'Pariatur ut laborum tempor voluptate consequat ea deserunt.' . "\n\n" . + 'Deserunt enim minim sunt sint ea nisi. Deserunt excepteur tempor id nostrud' . "\n" . + 'laboris commodo ad commodo velit mollit qui non officia id. Nulla duis veniam' . "\n" . + 'veniam officia deserunt et non dolore mollit ea quis eiusmod sit non. Occaecat' . "\n" . + 'consequat sunt culpa exercitation pariatur id reprehenderit nisi incididunt Lorem' . "\n" . + 'sint. Officia culpa pariatur laborum nostrud cupidatat consequat mollit.' + ) + ], true), $items); + // Assert that all results are non-namespaced. + foreach ($items->items as $item) { + $this->assertSame($item->detail, null); + } + }); } /** @@ -462,16 +493,18 @@ class CompletionTest extends TestCase */ public function testKeywords() { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/keywords.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(2, 1) - )->wait(); - $this->assertCompletionsListSubset(new CompletionList([ - new CompletionItem('class', CompletionItemKind::KEYWORD, null, null, null, null, 'class'), - new CompletionItem('clone', CompletionItemKind::KEYWORD, null, null, null, null, 'clone') - ], true), $items); + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/keywords.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(2, 1) + ); + $this->assertCompletionsListSubset(new CompletionList([ + new CompletionItem('class', CompletionItemKind::KEYWORD, null, null, null, null, 'class'), + new CompletionItem('clone', CompletionItemKind::KEYWORD, null, null, null, null, 'clone') + ], true), $items); + }); } /** @@ -479,24 +512,26 @@ class CompletionTest extends TestCase */ public function testHtmlWithoutPrefix() { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/html.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(0, 0) - )->wait(); - $this->assertCompletionsListSubset(new CompletionList([ - new CompletionItem( - 'loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(0, 0) + ); + $this->assertCompletionsListSubset(new CompletionList([ + new CompletionItem( + 'loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(0, 1) - )->wait(); + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/html_with_prefix.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(0, 1) + ); - $this->assertEquals(new CompletionList([], true), $items); + $this->assertEquals(new CompletionList([], true), $items); + }); } /** @@ -519,26 +556,28 @@ class CompletionTest extends TestCase */ public function testHtmlWontBeProposedWithPrefixWithCompletionContext() { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/html_with_prefix.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(0, 1), - new CompletionContext(CompletionTriggerKind::TRIGGER_CHARACTER, '<') - )->wait(); + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/html_with_prefix.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(0, 1), + new CompletionContext(CompletionTriggerKind::TRIGGER_CHARACTER, '<') + ); - $this->assertEquals(new CompletionList([ - new CompletionItem( - 'assertEquals(new CompletionList([ + new CompletionItem( + 'loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(0, 1), - new CompletionContext(CompletionTriggerKind::TRIGGER_CHARACTER, '>') - )->wait(); - $this->assertEquals(new CompletionList([], true), $items); + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/html_no_completion.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(0, 1), + new CompletionContext(CompletionTriggerKind::TRIGGER_CHARACTER, '>') + ); + $this->assertEquals(new CompletionList([], true), $items); + }); } /** @@ -561,25 +602,27 @@ class CompletionTest extends TestCase */ public function testHtmlPrefixShouldTriggerCompletionIfManuallyInvoked() { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/html_no_completion.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(0, 1), - new CompletionContext(CompletionTriggerKind::INVOKED) - )->wait(); - $this->assertEquals(new CompletionList([ - new CompletionItem( - 'loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(0, 1), + new CompletionContext(CompletionTriggerKind::INVOKED) + ); + $this->assertEquals(new CompletionList([ + new CompletionItem( + 'loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(4, 6) - )->wait(); - $this->assertCompletionsListSubset(new CompletionList([ - new CompletionItem( - 'SomeNamespace', - CompletionItemKind::MODULE - ) - ], true), $items); + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/namespace.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(4, 6) + ); + $this->assertCompletionsListSubset(new CompletionList([ + new CompletionItem( + 'SomeNamespace', + CompletionItemKind::MODULE + ) + ], true), $items); + }); } /** @@ -606,34 +651,36 @@ class CompletionTest extends TestCase */ public function testBarePhpVariable() { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/bare_php.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(4, 8) - )->wait(); - $this->assertCompletionsListSubset(new CompletionList([ - new CompletionItem( - '$abc2', - CompletionItemKind::VARIABLE, - 'int', - null, - null, - null, - null, - new TextEdit(new Range(new Position(4, 8), new Position(4, 8)), 'c2') - ), - new CompletionItem( - '$abc', - CompletionItemKind::VARIABLE, - 'int', - null, - null, - null, - null, - new TextEdit(new Range(new Position(4, 8), new Position(4, 8)), 'c') - ) - ], true), $items); + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/bare_php.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(4, 8) + ); + $this->assertCompletionsListSubset(new CompletionList([ + new CompletionItem( + '$abc2', + CompletionItemKind::VARIABLE, + 'int', + null, + null, + null, + null, + new TextEdit(new Range(new Position(4, 8), new Position(4, 8)), 'c2') + ), + new CompletionItem( + '$abc', + CompletionItemKind::VARIABLE, + 'int', + null, + null, + null, + null, + new TextEdit(new Range(new Position(4, 8), new Position(4, 8)), 'c') + ) + ], true), $items); + }); } /** @@ -641,13 +688,15 @@ class CompletionTest extends TestCase */ public function testForeach(Position $position, array $expectedItems) { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/foreach.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - $position - )->wait(); - $this->assertCompletionsListSubset(new CompletionList($expectedItems, true), $items); + Loop::run(function () use ($expectedItems, $position) { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/foreach.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + $position + ); + $this->assertCompletionsListSubset(new CompletionList($expectedItems, true), $items); + }); } public function foreachProvider(): array @@ -793,46 +842,50 @@ class CompletionTest extends TestCase public function testMethodReturnType() { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/method_return_type.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(10, 6) - )->wait(); - $this->assertCompletionsListSubset(new CompletionList([ - new CompletionItem( - 'foo', - CompletionItemKind::METHOD, - '\FooClass', - null, - null, - null, - null, - null - ) - ], true), $items); + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/method_return_type.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(10, 6) + ); + $this->assertCompletionsListSubset(new CompletionList([ + new CompletionItem( + 'foo', + CompletionItemKind::METHOD, + '\FooClass', + null, + null, + null, + null, + null + ) + ], true), $items); + }); } public function testStaticMethodReturnType() { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/static_method_return_type.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(11, 6) - )->wait(); - $this->assertCompletionsListSubset(new CompletionList([ - new CompletionItem( - 'bar', - CompletionItemKind::METHOD, - 'mixed', - null, - null, - null, - null, - null - ) - ], true), $items); + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/static_method_return_type.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(11, 6) + ); + $this->assertCompletionsListSubset(new CompletionList([ + new CompletionItem( + 'bar', + CompletionItemKind::METHOD, + 'mixed', + null, + null, + null, + null, + null + ) + ], true), $items); + }); } private function assertCompletionsListSubset(CompletionList $subsetList, CompletionList $list) @@ -856,38 +909,40 @@ class CompletionTest extends TestCase */ public function testThisWithoutPrefix() { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/this.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(12, 15) - )->wait(); - $this->assertEquals(new CompletionList([ - new CompletionItem( - 'foo', - CompletionItemKind::PROPERTY, - 'mixed', // Type of the property - null - ), - new CompletionItem( - 'bar', - CompletionItemKind::PROPERTY, - 'mixed', // Type of the property - null - ), - new CompletionItem( - 'method', - CompletionItemKind::METHOD, - 'mixed', // Return type of the method - null - ), - new CompletionItem( - 'test', - CompletionItemKind::METHOD, - 'mixed', // Return type of the method - null - ) - ], true), $items); + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/this.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(12, 15) + ); + $this->assertEquals(new CompletionList([ + new CompletionItem( + 'foo', + CompletionItemKind::PROPERTY, + 'mixed', // Type of the property + null + ), + new CompletionItem( + 'bar', + CompletionItemKind::PROPERTY, + 'mixed', // Type of the property + null + ), + new CompletionItem( + 'method', + CompletionItemKind::METHOD, + 'mixed', // Return type of the method + null + ), + new CompletionItem( + 'test', + CompletionItemKind::METHOD, + 'mixed', // Return type of the method + null + ) + ], true), $items); + }); } /** @@ -895,50 +950,52 @@ class CompletionTest extends TestCase */ public function testThisWithPrefix() { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/this_with_prefix.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(12, 16) - )->wait(); - $this->assertEquals(new CompletionList([ - new CompletionItem( - 'foo', - CompletionItemKind::PROPERTY, - 'mixed', // Type of the property - null - ), - new CompletionItem( - 'bar', - CompletionItemKind::PROPERTY, - 'mixed', // Type of the property - null - ), - new CompletionItem( - 'method', - CompletionItemKind::METHOD, - 'mixed', // Return type of the method - null - ), - new CompletionItem( - 'test', - CompletionItemKind::METHOD, - 'mixed', // Return type of the method - null - ), - new CompletionItem( - 'testProperty', - CompletionItemKind::PROPERTY, - '\TestClass', // Type of the property - 'Reprehenderit magna velit mollit ipsum do.' - ), - new CompletionItem( - 'testMethod', - CompletionItemKind::METHOD, - '\TestClass', // Return type of the method - 'Non culpa nostrud mollit esse sunt laboris in irure ullamco cupidatat amet.' - ), - ], true), $items); + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/this_with_prefix.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(12, 16) + ); + $this->assertEquals(new CompletionList([ + new CompletionItem( + 'foo', + CompletionItemKind::PROPERTY, + 'mixed', // Type of the property + null + ), + new CompletionItem( + 'bar', + CompletionItemKind::PROPERTY, + 'mixed', // Type of the property + null + ), + new CompletionItem( + 'method', + CompletionItemKind::METHOD, + 'mixed', // Return type of the method + null + ), + new CompletionItem( + 'test', + CompletionItemKind::METHOD, + 'mixed', // Return type of the method + null + ), + new CompletionItem( + 'testProperty', + CompletionItemKind::PROPERTY, + '\TestClass', // Type of the property + 'Reprehenderit magna velit mollit ipsum do.' + ), + new CompletionItem( + 'testMethod', + CompletionItemKind::METHOD, + '\TestClass', // Return type of the method + 'Non culpa nostrud mollit esse sunt laboris in irure ullamco cupidatat amet.' + ), + ], true), $items); + }); } /** @@ -946,28 +1003,30 @@ class CompletionTest extends TestCase */ public function testThisReturnValue() { - $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/this_return_value.php'); - $this->loader->open($completionUri, file_get_contents($completionUri)); - $items = $this->textDocument->completion( - new TextDocumentIdentifier($completionUri), - new Position(17, 23) - )->wait(); - $this->assertEquals(new CompletionList([ - new CompletionItem( - 'bar', - CompletionItemKind::METHOD, - 'mixed' // Return type of the method - ), - new CompletionItem( - 'qux', - CompletionItemKind::METHOD, - 'mixed' // Return type of the method - ), - new CompletionItem( - 'foo', - CompletionItemKind::METHOD, - '$this' // Return type of the method - ), - ], true), $items); + Loop::run(function () { + $completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/this_return_value.php'); + $this->loader->open($completionUri, file_get_contents($completionUri)); + $items = yield $this->textDocument->completion( + new TextDocumentIdentifier($completionUri), + new Position(17, 23) + ); + $this->assertEquals(new CompletionList([ + new CompletionItem( + 'bar', + CompletionItemKind::METHOD, + 'mixed' // Return type of the method + ), + new CompletionItem( + 'qux', + CompletionItemKind::METHOD, + 'mixed' // Return type of the method + ), + new CompletionItem( + 'foo', + CompletionItemKind::METHOD, + '$this' // Return type of the method + ), + ], true), $items); + }); } } diff --git a/tests/Server/TextDocument/Definition/GlobalFallbackTest.php b/tests/Server/TextDocument/Definition/GlobalFallbackTest.php index cca6d4d..7f79428 100644 --- a/tests/Server/TextDocument/Definition/GlobalFallbackTest.php +++ b/tests/Server/TextDocument/Definition/GlobalFallbackTest.php @@ -1,8 +1,9 @@ textDocument->definition( - new TextDocumentIdentifier('global_fallback'), - new Position(9, 16) - )->wait(); - $this->assertEquals([], $result); + Loop::run(function () { + // $obj = new TestClass(); + // Get definition for TestClass should not fall back to global + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier('global_fallback'), + new Position(9, 16) + ); + $this->assertEquals([], $result); + }); } public function testFallsBackForConstants() { - // echo TEST_CONST; - // Get definition for TEST_CONST - $result = $this->textDocument->definition( - new TextDocumentIdentifier('global_fallback'), - new Position(6, 10) - )->wait(); - $this->assertEquals(new Location('global_symbols', new Range(new Position(9, 6), new Position(9, 22))), $result); + Loop::run(function () { + // echo TEST_CONST; + // Get definition for TEST_CONST + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier('global_fallback'), + new Position(6, 10) + ); + $this->assertEquals(new Location('global_symbols', new Range(new Position(9, 6), new Position(9, 22))), $result); + }); } public function testFallsBackForFunctions() { - // test_function(); - // Get definition for test_function - $result = $this->textDocument->definition( - new TextDocumentIdentifier('global_fallback'), - new Position(5, 6) - )->wait(); - $this->assertEquals(new Location('global_symbols', new Range(new Position(78, 0), new Position(81, 1))), $result); + Loop::run(function () { + // test_function(); + // Get definition for test_function + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier('global_fallback'), + new Position(5, 6) + ); + $this->assertEquals(new Location('global_symbols', new Range(new Position(78, 0), new Position(81, 1))), $result); + }); } } diff --git a/tests/Server/TextDocument/Definition/GlobalTest.php b/tests/Server/TextDocument/Definition/GlobalTest.php index fdfb3b2..39d8d88 100644 --- a/tests/Server/TextDocument/Definition/GlobalTest.php +++ b/tests/Server/TextDocument/Definition/GlobalTest.php @@ -1,8 +1,9 @@ textDocument->definition( - new TextDocumentIdentifier(pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php'))), - new Position(0, 0) - )->wait(); - $this->assertEquals([], $result); + Loop::run(function () { + // |textDocument->definition( + new TextDocumentIdentifier(pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php'))), + new Position(0, 0) + ); + $this->assertEquals([], $result); + }); } public function testDefinitionEmptyResult() { - // namespace keyword - $result = $this->textDocument->definition( - new TextDocumentIdentifier(pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php'))), - new Position(1, 0) - )->wait(); - $this->assertEquals([], $result); + Loop::run(function () { + // namespace keyword + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier(pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php'))), + new Position(1, 0) + ); + $this->assertEquals([], $result); + }); } public function testDefinitionForSelfKeyword() { - // echo self::TEST_CLASS_CONST; - // Get definition for self - $reference = $this->getReferenceLocations('TestClass')[0]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->start - )->wait(); - $this->assertEquals($this->getDefinitionLocation('TestClass'), $result); + Loop::run(function () { + // echo self::TEST_CLASS_CONST; + // Get definition for self + $reference = $this->getReferenceLocations('TestClass')[0]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->start + ); + $this->assertEquals($this->getDefinitionLocation('TestClass'), $result); + }); } public function testDefinitionForClassLike() { - // $obj = new TestClass(); - // Get definition for TestClass - $reference = $this->getReferenceLocations('TestClass')[1]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->start - )->wait(); - $this->assertEquals($this->getDefinitionLocation('TestClass'), $result); + Loop::run(function () { + // $obj = new TestClass(); + // Get definition for TestClass + $reference = $this->getReferenceLocations('TestClass')[1]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->start + ); + $this->assertEquals($this->getDefinitionLocation('TestClass'), $result); + }); } public function testDefinitionForClassOnStaticMethodCall() { - // TestClass::staticTestMethod(); - // Get definition for TestClass - $reference = $this->getReferenceLocations('TestClass')[2]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->start - )->wait(); - $this->assertEquals($this->getDefinitionLocation('TestClass'), $result); + Loop::run(function () { + // TestClass::staticTestMethod(); + // Get definition for TestClass + $reference = $this->getReferenceLocations('TestClass')[2]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->start + ); + $this->assertEquals($this->getDefinitionLocation('TestClass'), $result); + }); } public function testDefinitionForClassOnStaticPropertyFetch() { - // echo TestClass::$staticTestProperty; - // Get definition for TestClass - $reference = $this->getReferenceLocations('TestClass')[3]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->start - )->wait(); - $this->assertEquals($this->getDefinitionLocation('TestClass'), $result); + Loop::run(function () { + // echo TestClass::$staticTestProperty; + // Get definition for TestClass + $reference = $this->getReferenceLocations('TestClass')[3]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->start + ); + $this->assertEquals($this->getDefinitionLocation('TestClass'), $result); + }); } public function testDefinitionForClassOnConstFetch() { - // TestClass::TEST_CLASS_CONST; - // Get definition for TestClass - $reference = $this->getReferenceLocations('TestClass')[4]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->start - )->wait(); - $this->assertEquals($this->getDefinitionLocation('TestClass'), $result); + Loop::run(function () { + // TestClass::TEST_CLASS_CONST; + // Get definition for TestClass + $reference = $this->getReferenceLocations('TestClass')[4]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->start + ); + $this->assertEquals($this->getDefinitionLocation('TestClass'), $result); + }); } public function testDefinitionForImplements() { - // class TestClass implements TestInterface - // Get definition for TestInterface - $reference = $this->getReferenceLocations('TestInterface')[0]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->start - )->wait(); - $this->assertEquals($this->getDefinitionLocation('TestInterface'), $result); + Loop::run(function () { + // class TestClass implements TestInterface + // Get definition for TestInterface + $reference = $this->getReferenceLocations('TestInterface')[0]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->start + ); + $this->assertEquals($this->getDefinitionLocation('TestInterface'), $result); + }); } public function testDefinitionForClassConstants() { - // echo TestClass::TEST_CLASS_CONST; - // Get definition for TEST_CLASS_CONST - $reference = $this->getReferenceLocations('TestClass::TEST_CLASS_CONST')[1]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->end - )->wait(); - $this->assertEquals($this->getDefinitionLocation('TestClass::TEST_CLASS_CONST'), $result); + Loop::run(function () { + // echo TestClass::TEST_CLASS_CONST; + // Get definition for TEST_CLASS_CONST + $reference = $this->getReferenceLocations('TestClass::TEST_CLASS_CONST')[1]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->end + ); + $this->assertEquals($this->getDefinitionLocation('TestClass::TEST_CLASS_CONST'), $result); + }); } public function testDefinitionForClassConstantsOnSelf() { - // echo self::TEST_CLASS_CONST; - // Get definition for TEST_CLASS_CONST - $reference = $this->getReferenceLocations('TestClass::TEST_CLASS_CONST')[0]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->end - )->wait(); - $this->assertEquals($this->getDefinitionLocation('TestClass::TEST_CLASS_CONST'), $result); + Loop::run(function () { + // echo self::TEST_CLASS_CONST; + // Get definition for TEST_CLASS_CONST + $reference = $this->getReferenceLocations('TestClass::TEST_CLASS_CONST')[0]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->end + ); + $this->assertEquals($this->getDefinitionLocation('TestClass::TEST_CLASS_CONST'), $result); + }); } public function testDefinitionForConstants() { - // echo TEST_CONST; - // Get definition for TEST_CONST - $reference = $this->getReferenceLocations('TEST_CONST')[1]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->start - )->wait(); - $this->assertEquals($this->getDefinitionLocation('TEST_CONST'), $result); + Loop::run(function () { + // echo TEST_CONST; + // Get definition for TEST_CONST + $reference = $this->getReferenceLocations('TEST_CONST')[1]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->start + ); + $this->assertEquals($this->getDefinitionLocation('TEST_CONST'), $result); + }); } public function testDefinitionForStaticMethods() { - // TestClass::staticTestMethod(); - // Get definition for staticTestMethod - $reference = $this->getReferenceLocations('TestClass::staticTestMethod()')[0]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->end - )->wait(); - $this->assertEquals($this->getDefinitionLocation('TestClass::staticTestMethod()'), $result); + Loop::run(function () { + // TestClass::staticTestMethod(); + // Get definition for staticTestMethod + $reference = $this->getReferenceLocations('TestClass::staticTestMethod()')[0]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->end + ); + $this->assertEquals($this->getDefinitionLocation('TestClass::staticTestMethod()'), $result); + }); } public function testDefinitionForStaticProperties() { - // echo TestClass::$staticTestProperty; - // Get definition for staticTestProperty - $reference = $this->getReferenceLocations('TestClass::staticTestProperty')[0]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->end - )->wait(); - $this->assertEquals($this->getDefinitionLocation('TestClass::staticTestProperty'), $result); + Loop::run(function () { + // echo TestClass::$staticTestProperty; + // Get definition for staticTestProperty + $reference = $this->getReferenceLocations('TestClass::staticTestProperty')[0]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->end + ); + $this->assertEquals($this->getDefinitionLocation('TestClass::staticTestProperty'), $result); + }); } public function testDefinitionForMethods() { - // $obj->testMethod(); - // Get definition for testMethod - $reference = $this->getReferenceLocations('TestClass::testMethod()')[0]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->end - )->wait(); - $this->assertEquals($this->getDefinitionLocation('TestClass::testMethod()'), $result); + Loop::run(function () { + // $obj->testMethod(); + // Get definition for testMethod + $reference = $this->getReferenceLocations('TestClass::testMethod()')[0]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->end + ); + $this->assertEquals($this->getDefinitionLocation('TestClass::testMethod()'), $result); + }); } public function testDefinitionForMethodOnChildClass() { - // $child->testMethod(); - // Get definition for testMethod - $reference = $this->getReferenceLocations('TestClass::testMethod()')[2]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->end - )->wait(); - $this->assertEquals($this->getDefinitionLocation('TestClass::testMethod()'), $result); + Loop::run(function () { + // $child->testMethod(); + // Get definition for testMethod + $reference = $this->getReferenceLocations('TestClass::testMethod()')[2]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->end + ); + $this->assertEquals($this->getDefinitionLocation('TestClass::testMethod()'), $result); + }); } public function testDefinitionForProperties() { - // echo $obj->testProperty; - // Get definition for testProperty - $reference = $this->getReferenceLocations('TestClass::testProperty')[1]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->end - )->wait(); - $this->assertEquals($this->getDefinitionLocation('TestClass::testProperty'), $result); + Loop::run(function () { + // echo $obj->testProperty; + // Get definition for testProperty + $reference = $this->getReferenceLocations('TestClass::testProperty')[1]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->end + ); + $this->assertEquals($this->getDefinitionLocation('TestClass::testProperty'), $result); + }); } public function testDefinitionForPropertiesOnThis() { - // $this->testProperty = $testParameter; - // Get definition for testProperty - $reference = $this->getReferenceLocations('TestClass::testProperty')[0]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->end - )->wait(); - $this->assertEquals($this->getDefinitionLocation('TestClass::testProperty'), $result); + Loop::run(function () { + // $this->testProperty = $testParameter; + // Get definition for testProperty + $reference = $this->getReferenceLocations('TestClass::testProperty')[0]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->end + ); + $this->assertEquals($this->getDefinitionLocation('TestClass::testProperty'), $result); + }); } public function testDefinitionForVariables() { - // echo $var; - // Get definition for $var - $uri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php')); - $result = $this->textDocument->definition( - new TextDocumentIdentifier($uri), - new Position(13, 7) - )->wait(); - $this->assertEquals(new Location($uri, new Range(new Position(12, 0), new Position(12, 10))), $result); + Loop::run(function () { + // echo $var; + // Get definition for $var + $uri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php')); + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($uri), + new Position(13, 7) + ); + $this->assertEquals(new Location($uri, new Range(new Position(12, 0), new Position(12, 10))), $result); + }); } public function testDefinitionForParamTypeHints() { - // function whatever(TestClass $param) { - // Get definition for TestClass - $reference = $this->getReferenceLocations('TestClass')[5]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->start - )->wait(); - $this->assertEquals($this->getDefinitionLocation('TestClass'), $result); + Loop::run(function () { + // function whatever(TestClass $param) { + // Get definition for TestClass + $reference = $this->getReferenceLocations('TestClass')[5]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->start + ); + $this->assertEquals($this->getDefinitionLocation('TestClass'), $result); + }); } public function testDefinitionForReturnTypeHints() { - // function whatever(TestClass $param): TestClass { - // Get definition for TestClass - $reference = $this->getReferenceLocations('TestClass')[6]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->start - )->wait(); - $this->assertEquals($this->getDefinitionLocation('TestClass'), $result); + Loop::run(function () { + // function whatever(TestClass $param): TestClass { + // Get definition for TestClass + $reference = $this->getReferenceLocations('TestClass')[6]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->start + ); + $this->assertEquals($this->getDefinitionLocation('TestClass'), $result); + }); } public function testDefinitionForMethodReturnTypeHints() { - // public function testMethod($testParameter): TestInterface - // Get definition for TestInterface - $reference = $this->getReferenceLocations('TestInterface')[1]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->start - )->wait(); - $this->assertEquals($this->getDefinitionLocation('TestInterface'), $result); + Loop::run(function () { + // public function testMethod($testParameter): TestInterface + // Get definition for TestInterface + $reference = $this->getReferenceLocations('TestInterface')[1]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->start + ); + $this->assertEquals($this->getDefinitionLocation('TestInterface'), $result); + }); } public function testDefinitionForParams() { - // echo $param; - // Get definition for $param - $uri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php')); - $result = $this->textDocument->definition( - new TextDocumentIdentifier($uri), - new Position(22, 13) - )->wait(); - $this->assertEquals(new Location($uri, new Range(new Position(21, 18), new Position(21, 34))), $result); + Loop::run(function () { + // echo $param; + // Get definition for $param + $uri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php')); + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($uri), + new Position(22, 13) + ); + $this->assertEquals(new Location($uri, new Range(new Position(21, 18), new Position(21, 34))), $result); + }); } public function testDefinitionForUsedVariables() { - // echo $var; - // Get definition for $var - $uri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php')); - $result = $this->textDocument->definition( - new TextDocumentIdentifier($uri), - new Position(26, 11) - )->wait(); - $this->assertEquals(new Location($uri, new Range(new Position(25, 22), new Position(25, 26))), $result); + Loop::run(function () { + // echo $var; + // Get definition for $var + $uri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php')); + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($uri), + new Position(26, 11) + ); + $this->assertEquals(new Location($uri, new Range(new Position(25, 22), new Position(25, 26))), $result); + }); } public function testDefinitionForFunctions() { - // test_function(); - // Get definition for test_function - $reference = $this->getReferenceLocations('test_function()')[0]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->start - )->wait(); - $this->assertEquals($this->getDefinitionLocation('test_function()'), $result); + Loop::run(function () { + // test_function(); + // Get definition for test_function + $reference = $this->getReferenceLocations('test_function()')[0]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->start + ); + $this->assertEquals($this->getDefinitionLocation('test_function()'), $result); + }); } public function testDefinitionForUseFunctions() { - // use function test_function; - // Get definition for test_function - $reference = $this->getReferenceLocations('test_function()')[1]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->start - )->wait(); - $this->assertEquals($this->getDefinitionLocation('test_function()'), $result); + Loop::run(function () { + // use function test_function; + // Get definition for test_function + $reference = $this->getReferenceLocations('test_function()')[1]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->start + ); + $this->assertEquals($this->getDefinitionLocation('test_function()'), $result); + }); } public function testDefinitionForInstanceOf() { - // if ($abc instanceof TestInterface) { - // Get definition for TestInterface - $reference = $this->getReferenceLocations('TestInterface')[2]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->start - )->wait(); - $this->assertEquals($this->getDefinitionLocation('TestInterface'), $result); + Loop::run(function () { + // if ($abc instanceof TestInterface) { + // Get definition for TestInterface + $reference = $this->getReferenceLocations('TestInterface')[2]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->start + ); + $this->assertEquals($this->getDefinitionLocation('TestInterface'), $result); + }); } public function testDefinitionForNestedMethodCall() { - // $obj->testProperty->testMethod(); - // Get definition for testMethod - $reference = $this->getReferenceLocations('TestClass::testMethod()')[1]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->end - )->wait(); - $this->assertEquals($this->getDefinitionLocation('TestClass::testMethod()'), $result); + Loop::run(function () { + // $obj->testProperty->testMethod(); + // Get definition for testMethod + $reference = $this->getReferenceLocations('TestClass::testMethod()')[1]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->end + ); + $this->assertEquals($this->getDefinitionLocation('TestClass::testMethod()'), $result); + }); } public function testDefinitionForPropertyFetchOnArrayDimFetch() { - // TestClass::$staticTestProperty[123]->testProperty; - // Get definition for testProperty - $reference = $this->getReferenceLocations('TestClass::testProperty')[3]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->end - )->wait(); - $this->assertEquals($this->getDefinitionLocation('TestClass::testProperty'), $result); + Loop::run(function () { + // TestClass::$staticTestProperty[123]->testProperty; + // Get definition for testProperty + $reference = $this->getReferenceLocations('TestClass::testProperty')[3]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->end + ); + $this->assertEquals($this->getDefinitionLocation('TestClass::testProperty'), $result); + }); } } diff --git a/tests/Server/TextDocument/Definition/NamespacedTest.php b/tests/Server/TextDocument/Definition/NamespacedTest.php index 0f9a582..17be8ac 100644 --- a/tests/Server/TextDocument/Definition/NamespacedTest.php +++ b/tests/Server/TextDocument/Definition/NamespacedTest.php @@ -1,8 +1,9 @@ getReferenceLocations('TEST_CONST')[0]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->start - )->wait(); - $this->assertEquals($this->getDefinitionLocation('TEST_CONST'), $result); + Loop::run(function () { + // echo TEST_CONST; + // Get definition for TEST_CONST + $reference = $this->getReferenceLocations('TEST_CONST')[0]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->start + ); + $this->assertEquals($this->getDefinitionLocation('TEST_CONST'), $result); + }); } public function testDefinitionForClassLikeUseStatement() { - // use TestNamespace\TestClass; - // Get definition for TestClass - $reference = $this->getReferenceLocations('TestClass')[7]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->start - )->wait(); - $this->assertEquals($this->getDefinitionLocation('TestClass'), $result); + Loop::run(function () { + // use TestNamespace\TestClass; + // Get definition for TestClass + $reference = $this->getReferenceLocations('TestClass')[7]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->start + ); + $this->assertEquals($this->getDefinitionLocation('TestClass'), $result); + }); } public function testDefinitionForClassLikeGroupUseStatement() { - // use TestNamespace\{TestTrait, TestInterface}; - // Get definition for TestInterface - $reference = $this->getReferenceLocations('TestClass')[1]; - $result = $this->textDocument->definition( - new TextDocumentIdentifier($reference->uri), - $reference->range->start - )->wait(); - $this->assertEquals($this->getDefinitionLocation('TestClass'), $result); + Loop::run(function () { + // use TestNamespace\{TestTrait, TestInterface}; + // Get definition for TestInterface + $reference = $this->getReferenceLocations('TestClass')[1]; + $result = yield $this->textDocument->definition( + new TextDocumentIdentifier($reference->uri), + $reference->range->start + ); + $this->assertEquals($this->getDefinitionLocation('TestClass'), $result); + }); } } diff --git a/tests/Server/TextDocument/DidChangeTest.php b/tests/Server/TextDocument/DidChangeTest.php index 0f92ed7..b5bd55c 100644 --- a/tests/Server/TextDocument/DidChangeTest.php +++ b/tests/Server/TextDocument/DidChangeTest.php @@ -1,8 +1,9 @@ open('whatever', "open('whatever', "range = new Range(new Position(0, 0), new Position(9999, 9999)); - $changeEvent->rangeLength = 9999; - $changeEvent->text = "range = new Range(new Position(0, 0), new Position(9999, 9999)); + $changeEvent->rangeLength = 9999; + $changeEvent->text = "didChange($identifier, [$changeEvent]); + yield $textDocument->didChange($identifier, [$changeEvent]); - $this->assertEquals("getContent()); + $this->assertEquals("getContent()); + }); } } diff --git a/tests/Server/TextDocument/DidCloseTest.php b/tests/Server/TextDocument/DidCloseTest.php index 22eb534..2c08bf5 100644 --- a/tests/Server/TextDocument/DidCloseTest.php +++ b/tests/Server/TextDocument/DidCloseTest.php @@ -1,8 +1,9 @@ open('whatever', "open('whatever', "uri = 'whatever'; - $textDocumentItem->languageId = 'php'; - $textDocumentItem->version = 1; - $textDocumentItem->text = 'hello world'; - $textDocument->didOpen($textDocumentItem); + $textDocumentItem = new TextDocumentItem(); + $textDocumentItem->uri = 'whatever'; + $textDocumentItem->languageId = 'php'; + $textDocumentItem->version = 1; + $textDocumentItem->text = 'hello world'; + $textDocument->didOpen($textDocumentItem); - $textDocument->didClose(new TextDocumentIdentifier($textDocumentItem->uri)); + $textDocument->didClose(new TextDocumentIdentifier($textDocumentItem->uri)); - $this->assertFalse($loader->isOpen($textDocumentItem->uri)); + $this->assertFalse($loader->isOpen($textDocumentItem->uri)); + }); } } diff --git a/tests/Server/TextDocument/DocumentSymbolTest.php b/tests/Server/TextDocument/DocumentSymbolTest.php index 1267fd0..ae5d1b1 100644 --- a/tests/Server/TextDocument/DocumentSymbolTest.php +++ b/tests/Server/TextDocument/DocumentSymbolTest.php @@ -1,8 +1,9 @@ textDocument->documentSymbol(new TextDocumentIdentifier($uri))->wait(); - // @codingStandardsIgnoreStart - $this->assertEquals([ - new SymbolInformation('TestNamespace', SymbolKind::NAMESPACE, $this->getDefinitionLocation('TestNamespace'), ''), - new SymbolInformation('TEST_CONST', SymbolKind::CONSTANT, $this->getDefinitionLocation('TestNamespace\\TEST_CONST'), 'TestNamespace'), - new SymbolInformation('TestClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\TestClass'), 'TestNamespace'), - new SymbolInformation('TEST_CLASS_CONST', SymbolKind::CONSTANT, $this->getDefinitionLocation('TestNamespace\\TestClass::TEST_CLASS_CONST'), 'TestNamespace\\TestClass'), - new SymbolInformation('staticTestProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('TestNamespace\\TestClass::staticTestProperty'), 'TestNamespace\\TestClass'), - new SymbolInformation('testProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('TestNamespace\\TestClass::testProperty'), 'TestNamespace\\TestClass'), - new SymbolInformation('staticTestMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestNamespace\\TestClass::staticTestMethod()'), 'TestNamespace\\TestClass'), - new SymbolInformation('testMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestNamespace\\TestClass::testMethod()'), 'TestNamespace\\TestClass'), - new SymbolInformation('TestTrait', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\TestTrait'), 'TestNamespace'), - new SymbolInformation('TestInterface', SymbolKind::INTERFACE, $this->getDefinitionLocation('TestNamespace\\TestInterface'), 'TestNamespace'), - new SymbolInformation('test_function', SymbolKind::FUNCTION, $this->getDefinitionLocation('TestNamespace\\test_function()'), 'TestNamespace'), - new SymbolInformation('ChildClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\ChildClass'), 'TestNamespace'), - new SymbolInformation('Example', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\Example'), 'TestNamespace'), - new SymbolInformation('__construct', SymbolKind::CONSTRUCTOR, $this->getDefinitionLocation('TestNamespace\\Example::__construct'), 'TestNamespace\\Example'), - new SymbolInformation('__destruct', SymbolKind::CONSTRUCTOR, $this->getDefinitionLocation('TestNamespace\\Example::__destruct'), 'TestNamespace\\Example'), - new SymbolInformation('TestNamespace\\InnerNamespace', SymbolKind::NAMESPACE, $this->getDefinitionLocation('TestNamespace\\InnerNamespace'), 'TestNamespace'), - new SymbolInformation('InnerClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\InnerNamespace\\InnerClass'), 'TestNamespace\\InnerNamespace'), - ], $result); - // @codingStandardsIgnoreEnd + Loop::run(function () { + // Request symbols + $uri = pathToUri(realpath(__DIR__ . '/../../../fixtures/symbols.php')); + $result = yield $this->textDocument->documentSymbol(new TextDocumentIdentifier($uri)); + // @codingStandardsIgnoreStart + $this->assertEquals([ + new SymbolInformation('TestNamespace', SymbolKind::NAMESPACE, $this->getDefinitionLocation('TestNamespace'), ''), + new SymbolInformation('TEST_CONST', SymbolKind::CONSTANT, $this->getDefinitionLocation('TestNamespace\\TEST_CONST'), 'TestNamespace'), + new SymbolInformation('TestClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\TestClass'), 'TestNamespace'), + new SymbolInformation('TEST_CLASS_CONST', SymbolKind::CONSTANT, $this->getDefinitionLocation('TestNamespace\\TestClass::TEST_CLASS_CONST'), 'TestNamespace\\TestClass'), + new SymbolInformation('staticTestProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('TestNamespace\\TestClass::staticTestProperty'), 'TestNamespace\\TestClass'), + new SymbolInformation('testProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('TestNamespace\\TestClass::testProperty'), 'TestNamespace\\TestClass'), + new SymbolInformation('staticTestMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestNamespace\\TestClass::staticTestMethod()'), 'TestNamespace\\TestClass'), + new SymbolInformation('testMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestNamespace\\TestClass::testMethod()'), 'TestNamespace\\TestClass'), + new SymbolInformation('TestTrait', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\TestTrait'), 'TestNamespace'), + new SymbolInformation('TestInterface', SymbolKind::INTERFACE, $this->getDefinitionLocation('TestNamespace\\TestInterface'), 'TestNamespace'), + new SymbolInformation('test_function', SymbolKind::FUNCTION, $this->getDefinitionLocation('TestNamespace\\test_function()'), 'TestNamespace'), + new SymbolInformation('ChildClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\ChildClass'), 'TestNamespace'), + new SymbolInformation('Example', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\Example'), 'TestNamespace'), + new SymbolInformation('__construct', SymbolKind::CONSTRUCTOR, $this->getDefinitionLocation('TestNamespace\\Example::__construct'), 'TestNamespace\\Example'), + new SymbolInformation('__destruct', SymbolKind::CONSTRUCTOR, $this->getDefinitionLocation('TestNamespace\\Example::__destruct'), 'TestNamespace\\Example'), + new SymbolInformation('TestNamespace\\InnerNamespace', SymbolKind::NAMESPACE, $this->getDefinitionLocation('TestNamespace\\InnerNamespace'), 'TestNamespace'), + new SymbolInformation('InnerClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\InnerNamespace\\InnerClass'), 'TestNamespace\\InnerNamespace'), + ], $result); + // @codingStandardsIgnoreEnd + }); } } diff --git a/tests/Server/TextDocument/HoverTest.php b/tests/Server/TextDocument/HoverTest.php index 42b69c8..21b5e5f 100644 --- a/tests/Server/TextDocument/HoverTest.php +++ b/tests/Server/TextDocument/HoverTest.php @@ -1,8 +1,9 @@ getReferenceLocations('TestClass')[1]; - $result = $this->textDocument->hover( - new TextDocumentIdentifier($reference->uri), - $reference->range->start - )->wait(); - $this->assertEquals(new Hover([ - new MarkedString('php', "range), $result); + Loop::run(function () { + // $obj = new TestClass(); + // Get hover for TestClass + $reference = $this->getReferenceLocations('TestClass')[1]; + $result = yield $this->textDocument->hover( + new TextDocumentIdentifier($reference->uri), + $reference->range->start + ); + $this->assertEquals(new Hover([ + new MarkedString('php', "range), $result); + }); } public function testHoverForClassLikeDefinition() { - // class TestClass implements TestInterface - // Get hover for TestClass - $definition = $this->getDefinitionLocation('TestClass'); - $result = $this->textDocument->hover( - new TextDocumentIdentifier($definition->uri), - $definition->range->start - )->wait(); - $this->assertEquals(new Hover([ - new MarkedString('php', "range), $result); + Loop::run(function () { + // class TestClass implements TestInterface + // Get hover for TestClass + $definition = $this->getDefinitionLocation('TestClass'); + $result = yield $this->textDocument->hover( + new TextDocumentIdentifier($definition->uri), + $definition->range->start + ); + $this->assertEquals(new Hover([ + new MarkedString('php', "range), $result); + }); } public function testHoverForMethod() { - // $obj->testMethod(); - // Get hover for testMethod - $reference = $this->getReferenceLocations('TestClass::testMethod()')[0]; - $result = $this->textDocument->hover( - new TextDocumentIdentifier($reference->uri), - $reference->range->end - )->wait(); - $this->assertEquals(new Hover([ - new MarkedString('php', "range), $result); + Loop::run(function () { + // $obj->testMethod(); + // Get hover for testMethod + $reference = $this->getReferenceLocations('TestClass::testMethod()')[0]; + $result = yield $this->textDocument->hover( + new TextDocumentIdentifier($reference->uri), + $reference->range->end + ); + $this->assertEquals(new Hover([ + new MarkedString('php', "range), $result); + }); } public function testHoverForProperty() { - // echo $obj->testProperty; - // Get hover for testProperty - $reference = $this->getReferenceLocations('TestClass::testProperty')[0]; - $result = $this->textDocument->hover( - new TextDocumentIdentifier($reference->uri), - $reference->range->end - )->wait(); - $this->assertEquals(new Hover([ - new MarkedString('php', "range), $result); + Loop::run(function () { + // echo $obj->testProperty; + // Get hover for testProperty + $reference = $this->getReferenceLocations('TestClass::testProperty')[0]; + $result = yield $this->textDocument->hover( + new TextDocumentIdentifier($reference->uri), + $reference->range->end + ); + $this->assertEquals(new Hover([ + new MarkedString('php', "range), $result); + }); } public function testHoverForStaticMethod() { - // TestClass::staticTestMethod(); - // Get hover for staticTestMethod - $reference = $this->getReferenceLocations('TestClass::staticTestMethod()')[0]; - $result = $this->textDocument->hover( - new TextDocumentIdentifier($reference->uri), - $reference->range->end - )->wait(); - $this->assertEquals(new Hover([ - new MarkedString('php', "range), $result); + Loop::run(function () { + // TestClass::staticTestMethod(); + // Get hover for staticTestMethod + $reference = $this->getReferenceLocations('TestClass::staticTestMethod()')[0]; + $result = yield $this->textDocument->hover( + new TextDocumentIdentifier($reference->uri), + $reference->range->end + ); + $this->assertEquals(new Hover([ + new MarkedString('php', "range), $result); + }); } public function testHoverForStaticProperty() { - // echo TestClass::staticTestProperty; - // Get hover for staticTestProperty - $reference = $this->getReferenceLocations('TestClass::staticTestProperty')[0]; - $result = $this->textDocument->hover( - new TextDocumentIdentifier($reference->uri), - $reference->range->end - )->wait(); - $this->assertEquals(new Hover([ - new MarkedString('php', "range), $result); + Loop::run(function () { + // echo TestClass::staticTestProperty; + // Get hover for staticTestProperty + $reference = $this->getReferenceLocations('TestClass::staticTestProperty')[0]; + $result = yield $this->textDocument->hover( + new TextDocumentIdentifier($reference->uri), + $reference->range->end + ); + $this->assertEquals(new Hover([ + new MarkedString('php', "range), $result); + }); } public function testHoverForClassConstant() { - // echo TestClass::TEST_CLASS_CONST; - // Get hover for TEST_CLASS_CONST - $reference = $this->getReferenceLocations('TestClass::TEST_CLASS_CONST')[0]; - $result = $this->textDocument->hover( - new TextDocumentIdentifier($reference->uri), - $reference->range->end - )->wait(); - $this->assertEquals(new Hover([ - new MarkedString('php', "range), $result); + Loop::run(function () { + // echo TestClass::TEST_CLASS_CONST; + // Get hover for TEST_CLASS_CONST + $reference = $this->getReferenceLocations('TestClass::TEST_CLASS_CONST')[0]; + $result = yield $this->textDocument->hover( + new TextDocumentIdentifier($reference->uri), + $reference->range->end + ); + $this->assertEquals(new Hover([ + new MarkedString('php', "range), $result); + }); } public function testHoverForFunction() { - // test_function(); - // Get hover for test_function - $reference = $this->getReferenceLocations('test_function()')[0]; - $result = $this->textDocument->hover( - new TextDocumentIdentifier($reference->uri), - $reference->range->end - )->wait(); - $this->assertEquals(new Hover([ - new MarkedString('php', "range), $result); + Loop::run(function () { + // test_function(); + // Get hover for test_function + $reference = $this->getReferenceLocations('test_function()')[0]; + $result = yield $this->textDocument->hover( + new TextDocumentIdentifier($reference->uri), + $reference->range->end + ); + $this->assertEquals(new Hover([ + new MarkedString('php', "range), $result); + }); } public function testHoverForConstant() { - // echo TEST_CONST; - // Get hover for TEST_CONST - $reference = $this->getReferenceLocations('TEST_CONST')[0]; - $result = $this->textDocument->hover( - new TextDocumentIdentifier($reference->uri), - $reference->range->end - )->wait(); - $this->assertEquals(new Hover([ - new MarkedString('php', "range), $result); + Loop::run(function () { + // echo TEST_CONST; + // Get hover for TEST_CONST + $reference = $this->getReferenceLocations('TEST_CONST')[0]; + $result = yield $this->textDocument->hover( + new TextDocumentIdentifier($reference->uri), + $reference->range->end + ); + $this->assertEquals(new Hover([ + new MarkedString('php', "range), $result); + }); } public function testHoverForGlobalConstant() { - // print TEST_DEFINE_CONSTANT ? 'true' : 'false'; - // Get hover for TEST_DEFINE_CONSTANT - $reference = $this->getReferenceLocations('TEST_DEFINE_CONSTANT')[0]; - $result = $this->textDocument->hover( - new TextDocumentIdentifier($reference->uri), - $reference->range->end - )->wait(); - // TODO - should pretty print with fqns, like \define, \false. Not yet supported by tolerant-php-parser - $this->assertEquals(new Hover([ - new MarkedString('php', "range), $result); + Loop::run(function () { + // print TEST_DEFINE_CONSTANT ? 'true' : 'false'; + // Get hover for TEST_DEFINE_CONSTANT + $reference = $this->getReferenceLocations('TEST_DEFINE_CONSTANT')[0]; + $result = yield $this->textDocument->hover( + new TextDocumentIdentifier($reference->uri), + $reference->range->end + ); + // TODO - should pretty print with fqns, like \define, \false. Not yet supported by tolerant-php-parser + $this->assertEquals(new Hover([ + new MarkedString('php', "range), $result); + }); } public function testHoverForVariable() { - // echo $var; - // Get hover for $var - $uri = pathToUri(realpath(__DIR__ . '/../../../fixtures/references.php')); - $result = $this->textDocument->hover(new TextDocumentIdentifier($uri), new Position(13, 7))->wait(); - $this->assertEquals(new Hover( - [new MarkedString('php', "textDocument->hover( + new TextDocumentIdentifier($uri), + new Position(13, 7) + ); + $this->assertEquals(new Hover( + [new MarkedString('php', "textDocument->hover(new TextDocumentIdentifier($uri), new Position(22, 11))->wait(); - $this->assertEquals(new Hover( - [ - new MarkedString('php', "textDocument->hover( + new TextDocumentIdentifier($uri), + new Position(22, 11) + ); + $this->assertEquals(new Hover( + [ + new MarkedString('php', "textDocument->hover(new TextDocumentIdentifier($uri), new Position(59, 11))->wait(); - $this->assertEquals(new Hover([ - new MarkedString('php', "textDocument->hover( + new TextDocumentIdentifier($uri), + new Position(59, 11) + ); + $this->assertEquals(new Hover([ + new MarkedString('php', "textDocument = new class($this->args) extends Client\TextDocument { + $this->args = new Deferred(); + $client->textDocument = new class($this->args) extends Client\TextDocument + { + /** @var Deferred */ private $args; - public function __construct(&$args) + + public function __construct($args) { parent::__construct(new ClientHandler(new MockProtocolStream, new MockProtocolStream), new JsonMapper); - $this->args = &$args; + $this->args = $args; } - public function publishDiagnostics(string $uri, array $diagnostics): Promise + + public function publishDiagnostics(string $uri, array $diagnostics): \Generator { - $this->args = func_get_args(); - return Promise\resolve(null); + $this->args->resolve(func_get_args()); + yield new Delayed(0); + return null; } }; $projectIndex = new ProjectIndex(new Index, new DependenciesIndex); @@ -57,98 +66,102 @@ class ParseErrorsTest extends TestCase public function testParseErrorsArePublishedAsDiagnostics() { - $this->openFile(__DIR__ . '/../../../fixtures/invalid_file.php'); - $this->assertEquals([ - 'whatever', - [[ - 'range' => [ - 'start' => [ - 'line' => 2, - 'character' => 9 + Loop::run(function () { + $this->openFile(__DIR__ . '/../../../fixtures/invalid_file.php'); + $this->assertEquals([ + 'whatever', + [[ + 'range' => [ + 'start' => [ + 'line' => 2, + 'character' => 9 + ], + 'end' => [ + 'line' => 2, + 'character' => 9 + ] ], - 'end' => [ - 'line' => 2, - 'character' => 9 - ] + 'severity' => DiagnosticSeverity::ERROR, + 'code' => null, + 'source' => 'php', + 'message' => "'Name' expected." ], - 'severity' => DiagnosticSeverity::ERROR, - 'code' => null, - 'source' => 'php', - 'message' => "'Name' expected." - ], - [ - 'range' => [ - 'start' => [ - 'line' => 2, - 'character' => 9 + [ + 'range' => [ + 'start' => [ + 'line' => 2, + 'character' => 9 + ], + 'end' => [ + 'line' => 2, + 'character' => 9 + ] + ], + 'severity' => DiagnosticSeverity::ERROR, + 'code' => null, + 'source' => 'php', + 'message' => "'{' expected." ], - 'end' => [ - 'line' => 2, - 'character' => 9 - ] - ], - 'severity' => DiagnosticSeverity::ERROR, - 'code' => null, - 'source' => 'php', - 'message' => "'{' expected." - ], - [ - 'range' => [ - 'start' => [ - 'line' => 2, - 'character' => 9 + [ + 'range' => [ + 'start' => [ + 'line' => 2, + 'character' => 9 + ], + 'end' => [ + 'line' => 2, + 'character' => 9 + ] + ], + 'severity' => DiagnosticSeverity::ERROR, + 'code' => null, + 'source' => 'php', + 'message' => "'}' expected." ], - 'end' => [ - 'line' => 2, - 'character' => 9 - ] - ], - 'severity' => DiagnosticSeverity::ERROR, - 'code' => null, - 'source' => 'php', - 'message' => "'}' expected." - ], - [ - 'range' => [ - 'start' => [ - 'line' => 2, - 'character' => 15 - ], - 'end' => [ - 'line' => 2, - 'character' => 15 - ] - ], - 'severity' => DiagnosticSeverity::ERROR, - 'code' => null, - 'source' => 'php', - 'message' => "'Name' expected." - ]] - ], json_decode(json_encode($this->args), true)); + [ + 'range' => [ + 'start' => [ + 'line' => 2, + 'character' => 15 + ], + 'end' => [ + 'line' => 2, + 'character' => 15 + ] + ], + 'severity' => DiagnosticSeverity::ERROR, + 'code' => null, + 'source' => 'php', + 'message' => "'Name' expected." + ]] + ], json_decode(json_encode(yield $this->args->promise()), true)); + }); } public function testParseErrorsWithOnlyStartLine() { - $this->markTestIncomplete('This diagnostic not yet implemented in tolerant-php-parser'); - $this->openFile(__DIR__ . '/../../../fixtures/namespace_not_first.php'); - $this->assertEquals([ - 'whatever', - [[ - 'range' => [ - 'start' => [ - 'line' => 4, - 'character' => 0 + Loop::run(function () { + $this->markTestIncomplete('This diagnostic not yet implemented in tolerant-php-parser'); + yield $this->openFile(__DIR__ . '/../../../fixtures/namespace_not_first.php'); + $this->assertEquals([ + 'whatever', + [[ + 'range' => [ + 'start' => [ + 'line' => 4, + 'character' => 0 + ], + 'end' => [ + '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)); + '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(yield $this->args->promise()), true)); + }); } } diff --git a/tests/Server/TextDocument/References/GlobalFallbackTest.php b/tests/Server/TextDocument/References/GlobalFallbackTest.php index b1cbdac..2e75280 100644 --- a/tests/Server/TextDocument/References/GlobalFallbackTest.php +++ b/tests/Server/TextDocument/References/GlobalFallbackTest.php @@ -1,8 +1,9 @@ setComplete(); - $definitionResolver = new DefinitionResolver($projectIndex); - $client = new LanguageClient(new MockProtocolStream, new MockProtocolStream); + $definitionResolver = new DefinitionResolver($projectIndex); + $client = new LanguageClient(new MockProtocolStream, new MockProtocolStream); $this->documentLoader = new PhpDocumentLoader(new FileSystemContentRetriever, $projectIndex, $definitionResolver); - $this->textDocument = new Server\TextDocument($this->documentLoader, $definitionResolver, $client, $projectIndex); + $this->textDocument = new Server\TextDocument($this->documentLoader, $definitionResolver, $client, $projectIndex); $this->documentLoader->open('global_fallback', file_get_contents(__DIR__ . '/../../../../fixtures/global_fallback.php')); $this->documentLoader->open('global_symbols', file_get_contents(__DIR__ . '/../../../../fixtures/global_symbols.php')); } public function testClassDoesNotFallback() { - // class TestClass implements TestInterface - // Get references for TestClass - $result = $this->textDocument->references( - new ReferenceContext, - new TextDocumentIdentifier('global_symbols'), - new Position(6, 9) - )->wait(); - $this->assertEquals([], $result); + Loop::run(function () { + // class TestClass implements TestInterface + // Get references for TestClass + $result = yield $this->textDocument->references( + new ReferenceContext, + new TextDocumentIdentifier('global_symbols'), + new Position(6, 9) + ); + $this->assertEquals([], $result); + }); } public function testFallsBackForConstants() { - // const TEST_CONST = 123; - // Get references for TEST_CONST - $result = $this->textDocument->references( - new ReferenceContext, - new TextDocumentIdentifier('global_symbols'), - new Position(9, 13) - )->wait(); - $this->assertEquals([new Location('global_fallback', new Range(new Position(6, 5), new Position(6, 15)))], $result); + Loop::run(function () { + // const TEST_CONST = 123; + // Get references for TEST_CONST + $result = yield $this->textDocument->references( + new ReferenceContext, + new TextDocumentIdentifier('global_symbols'), + new Position(9, 13) + ); + $this->assertEquals([new Location('global_fallback', new Range(new Position(6, 5), new Position(6, 15)))], $result); + }); } public function testFallsBackForFunctions() { - // function test_function() - // Get references for test_function - $result = $this->textDocument->references( - new ReferenceContext, - new TextDocumentIdentifier('global_symbols'), - new Position(78, 16) - )->wait(); - $this->assertEquals([new Location('global_fallback', new Range(new Position(5, 0), new Position(5, 13)))], $result); + Loop::run(function () { + // function test_function() + // Get references for test_function + $result = yield $this->textDocument->references( + new ReferenceContext, + new TextDocumentIdentifier('global_symbols'), + new Position(78, 16) + ); + $this->assertEquals([new Location('global_fallback', new Range(new Position(5, 0), new Position(5, 13)))], $result); + }); } } diff --git a/tests/Server/TextDocument/References/GlobalTest.php b/tests/Server/TextDocument/References/GlobalTest.php index d2550c8..e18d17f 100644 --- a/tests/Server/TextDocument/References/GlobalTest.php +++ b/tests/Server/TextDocument/References/GlobalTest.php @@ -1,8 +1,9 @@ getDefinitionLocation('TestClass'); - $result = $this->textDocument->references( - new ReferenceContext, - new TextDocumentIdentifier($definition->uri), - $definition->range->start - )->wait(); - $this->assertEquals($this->getReferenceLocations('TestClass'), $result); + Loop::run(function () { + // class TestClass implements TestInterface + // Get references for TestClass + $definition = $this->getDefinitionLocation('TestClass'); + $result = yield $this->textDocument->references( + new ReferenceContext, + new TextDocumentIdentifier($definition->uri), + $definition->range->start + ); + $this->assertEquals($this->getReferenceLocations('TestClass'), $result); + }); } public function testReferencesForClassConstants() { - // const TEST_CLASS_CONST = 123; - // Get references for TEST_CLASS_CONST - $definition = $this->getDefinitionLocation('TestClass::TEST_CLASS_CONST'); - $result = $this->textDocument->references( - new ReferenceContext, - new TextDocumentIdentifier($definition->uri), - $definition->range->start - )->wait(); - $this->assertEquals($this->getReferenceLocations('TestClass::TEST_CLASS_CONST'), $result); + Loop::run(function () { + // const TEST_CLASS_CONST = 123; + // Get references for TEST_CLASS_CONST + $definition = $this->getDefinitionLocation('TestClass::TEST_CLASS_CONST'); + $result = yield $this->textDocument->references( + new ReferenceContext, + new TextDocumentIdentifier($definition->uri), + $definition->range->start + ); + $this->assertEquals($this->getReferenceLocations('TestClass::TEST_CLASS_CONST'), $result); + }); } public function testReferencesForConstants() { - // const TEST_CONST = 123; - // Get references for TEST_CONST - $definition = $this->getDefinitionLocation('TEST_CONST'); - $result = $this->textDocument->references( - new ReferenceContext, - new TextDocumentIdentifier($definition->uri), - $definition->range->start - )->wait(); - $this->assertEquals($this->getReferenceLocations('TEST_CONST'), $result); + Loop::run(function () { + // const TEST_CONST = 123; + // Get references for TEST_CONST + $definition = $this->getDefinitionLocation('TEST_CONST'); + $result = yield $this->textDocument->references( + new ReferenceContext, + new TextDocumentIdentifier($definition->uri), + $definition->range->start + ); + $this->assertEquals($this->getReferenceLocations('TEST_CONST'), $result); + }); } public function testReferencesForStaticMethods() { - // public static function staticTestMethod() - // Get references for staticTestMethod - $definition = $this->getDefinitionLocation('TestClass::staticTestMethod()'); - $result = $this->textDocument->references( - new ReferenceContext, - new TextDocumentIdentifier($definition->uri), - $definition->range->start - )->wait(); - $this->assertEquals($this->getReferenceLocations('TestClass::staticTestMethod()'), $result); + Loop::run(function () { + // public static function staticTestMethod() + // Get references for staticTestMethod + $definition = $this->getDefinitionLocation('TestClass::staticTestMethod()'); + $result = yield $this->textDocument->references( + new ReferenceContext, + new TextDocumentIdentifier($definition->uri), + $definition->range->start + ); + $this->assertEquals($this->getReferenceLocations('TestClass::staticTestMethod()'), $result); + }); } public function testReferencesForStaticProperties() { - // public static $staticTestProperty; - // Get references for $staticTestProperty - $definition = $this->getDefinitionLocation('TestClass::staticTestProperty'); - $result = $this->textDocument->references( - new ReferenceContext, - new TextDocumentIdentifier($definition->uri), - $definition->range->start - )->wait(); - $this->assertEquals($this->getReferenceLocations('TestClass::staticTestProperty'), $result); + Loop::run(function () { + // public static $staticTestProperty; + // Get references for $staticTestProperty + $definition = $this->getDefinitionLocation('TestClass::staticTestProperty'); + $result = yield $this->textDocument->references( + new ReferenceContext, + new TextDocumentIdentifier($definition->uri), + $definition->range->start + ); + $this->assertEquals($this->getReferenceLocations('TestClass::staticTestProperty'), $result); + }); } public function testReferencesForMethods() { - // public function testMethod($testParameter) - // Get references for testMethod - $definition = $this->getDefinitionLocation('TestClass::testMethod()'); - $result = $this->textDocument->references( - new ReferenceContext, - new TextDocumentIdentifier($definition->uri), - $definition->range->start - )->wait(); - $this->assertEquals($this->getReferenceLocations('TestClass::testMethod()'), $result); + Loop::run(function () { + // public function testMethod($testParameter) + // Get references for testMethod + $definition = $this->getDefinitionLocation('TestClass::testMethod()'); + $result = yield $this->textDocument->references( + new ReferenceContext, + new TextDocumentIdentifier($definition->uri), + $definition->range->start + ); + $this->assertEquals($this->getReferenceLocations('TestClass::testMethod()'), $result); + }); } public function testReferencesForProperties() { - // public $testProperty; - // Get references for testProperty - $definition = $this->getDefinitionLocation('TestClass::testProperty'); - $result = $this->textDocument->references( - new ReferenceContext, - new TextDocumentIdentifier($definition->uri), - $definition->range->start - )->wait(); - $this->assertEquals($this->getReferenceLocations('TestClass::testProperty'), $result); + Loop::run(function () { + // public $testProperty; + // Get references for testProperty + $definition = $this->getDefinitionLocation('TestClass::testProperty'); + $result = yield $this->textDocument->references( + new ReferenceContext, + new TextDocumentIdentifier($definition->uri), + $definition->range->start + ); + $this->assertEquals($this->getReferenceLocations('TestClass::testProperty'), $result); + }); } public function testReferencesForVariables() { - // $var = 123; - // Get definition for $var - $uri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php')); - $result = $this->textDocument->references( - new ReferenceContext, - new TextDocumentIdentifier($uri), - new Position(12, 3) - )->wait(); - $this->assertEquals([ - new Location($uri, new Range(new Position(12, 0), new Position(12, 4))), - new Location($uri, new Range(new Position(13, 5), new Position(13, 9))), - new Location($uri, new Range(new Position(26, 9), new Position(26, 13))) - ], $result); + Loop::run(function () { + // $var = 123; + // Get definition for $var + $uri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php')); + $result = yield $this->textDocument->references( + new ReferenceContext, + new TextDocumentIdentifier($uri), + new Position(12, 3) + ); + $this->assertEquals([ + new Location($uri, new Range(new Position(12, 0), new Position(12, 4))), + new Location($uri, new Range(new Position(13, 5), new Position(13, 9))), + new Location($uri, new Range(new Position(26, 9), new Position(26, 13))) + ], $result); + }); } public function testReferencesForFunctionParams() { - // function whatever(TestClass $param): TestClass - // Get references for $param - $uri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php')); - $result = $this->textDocument->references( - new ReferenceContext, - new TextDocumentIdentifier($uri), - new Position(21, 32) - )->wait(); - $this->assertEquals([new Location($uri, new Range(new Position(22, 9), new Position(22, 15)))], $result); + Loop::run(function () { + // function whatever(TestClass $param): TestClass + // Get references for $param + $uri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php')); + $result = yield $this->textDocument->references( + new ReferenceContext, + new TextDocumentIdentifier($uri), + new Position(21, 32) + ); + $this->assertEquals([new Location($uri, new Range(new Position(22, 9), new Position(22, 15)))], $result); + }); } public function testReferencesForFunctions() { - // function test_function() - // Get references for test_function - $referencesUri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php')); - $symbolsUri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/symbols.php')); - $result = $this->textDocument->references( - new ReferenceContext, - new TextDocumentIdentifier($symbolsUri), - new Position(78, 16) - )->wait(); - $this->assertEquals([ - new Location($referencesUri, new Range(new Position(10, 0), new Position(10, 13))), - new Location($referencesUri, new Range(new Position(31, 13), new Position(31, 40))) - ], $result); + Loop::run(function () { + // function test_function() + // Get references for test_function + $referencesUri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php')); + $symbolsUri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/symbols.php')); + $result = yield $this->textDocument->references( + new ReferenceContext, + new TextDocumentIdentifier($symbolsUri), + new Position(78, 16) + ); + $this->assertEquals([ + new Location($referencesUri, new Range(new Position(10, 0), new Position(10, 13))), + new Location($referencesUri, new Range(new Position(31, 13), new Position(31, 40))) + ], $result); + }); } public function testReferencesForReference() { - // $obj = new TestClass(); - // Get references for TestClass - $reference = $this->getReferenceLocations('TestClass')[1]; - $result = $this->textDocument->references( - new ReferenceContext, - new TextDocumentIdentifier($reference->uri), - $reference->range->start - )->wait(); - $this->assertEquals($this->getReferenceLocations('TestClass'), $result); + Loop::run(function () { + // $obj = new TestClass(); + // Get references for TestClass + $reference = $this->getReferenceLocations('TestClass')[1]; + $result = yield $this->textDocument->references( + new ReferenceContext, + new TextDocumentIdentifier($reference->uri), + $reference->range->start + ); + $this->assertEquals($this->getReferenceLocations('TestClass'), $result); + }); } public function testReferencesForUnusedClass() { - // class UnusedClass - // Get references for UnusedClass - $symbolsUri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/global_symbols.php')); - $result = $this->textDocument->references( - new ReferenceContext, - new TextDocumentIdentifier($symbolsUri), - new Position(111, 10) - )->wait(); - $this->assertEquals([], $result); + Loop::run(function () { + // class UnusedClass + // Get references for UnusedClass + $symbolsUri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/global_symbols.php')); + $result = yield $this->textDocument->references( + new ReferenceContext, + new TextDocumentIdentifier($symbolsUri), + new Position(111, 10) + ); + $this->assertEquals([], $result); + }); } public function testReferencesForUnusedProperty() { - // public $unusedProperty - // Get references for unusedProperty - $symbolsUri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/global_symbols.php')); - $result = $this->textDocument->references( - new ReferenceContext, - new TextDocumentIdentifier($symbolsUri), - new Position(113, 18) - )->wait(); - $this->assertEquals([], $result); + Loop::run(function () { + // public $unusedProperty + // Get references for unusedProperty + $symbolsUri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/global_symbols.php')); + $result = yield $this->textDocument->references( + new ReferenceContext, + new TextDocumentIdentifier($symbolsUri), + new Position(113, 18) + ); + $this->assertEquals([], $result); + }); } public function testReferencesForUnusedMethod() { - // public function unusedMethod() - // Get references for unusedMethod - $symbolsUri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/global_symbols.php')); - $result = $this->textDocument->references( - new ReferenceContext, - new TextDocumentIdentifier($symbolsUri), - new Position(115, 26) - )->wait(); - $this->assertEquals([], $result); + Loop::run(function () { + // public function unusedMethod() + // Get references for unusedMethod + $symbolsUri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/global_symbols.php')); + $result = yield $this->textDocument->references( + new ReferenceContext, + new TextDocumentIdentifier($symbolsUri), + new Position(115, 26) + ); + $this->assertEquals([], $result); + }); } } diff --git a/tests/Server/TextDocument/References/NamespacedTest.php b/tests/Server/TextDocument/References/NamespacedTest.php index b2bb9bb..723aa79 100644 --- a/tests/Server/TextDocument/References/NamespacedTest.php +++ b/tests/Server/TextDocument/References/NamespacedTest.php @@ -1,8 +1,9 @@ textDocument->references( - new ReferenceContext, - new TextDocumentIdentifier($definition->uri), - $definition->range->end - )->wait(); - $this->assertEquals(parent::getReferenceLocations('TestNamespace'), $result); + Loop::run(function () { + // namespace TestNamespace; + // Get references for TestNamespace + $definition = parent::getDefinitionLocation('TestNamespace'); + $result = yield $this->textDocument->references( + new ReferenceContext, + new TextDocumentIdentifier($definition->uri), + $definition->range->end + ); + $this->assertEquals(parent::getReferenceLocations('TestNamespace'), $result); + }); } } diff --git a/tests/Server/TextDocument/SignatureHelpTest.php b/tests/Server/TextDocument/SignatureHelpTest.php index 83dcb2c..8939c2e 100644 --- a/tests/Server/TextDocument/SignatureHelpTest.php +++ b/tests/Server/TextDocument/SignatureHelpTest.php @@ -1,8 +1,9 @@ loader->open($callsUri, file_get_contents($callsUri)); - $signatureHelp = $this->textDocument->signatureHelp( - new TextDocumentIdentifier($callsUri), - $position - )->wait(); - $this->assertEquals($expectedSignature, $signatureHelp); + Loop::run(function () use ($position, $expectedSignature) { + $callsUri = pathToUri(__DIR__ . '/../../../fixtures/signature_help/calls.php'); + $this->loader->open($callsUri, file_get_contents($callsUri)); + $signatureHelp = yield $this->textDocument->signatureHelp( + new TextDocumentIdentifier($callsUri), + $position + ); + $this->assertEquals($expectedSignature, $signatureHelp); + }); } public function signatureHelpProvider(): array diff --git a/tests/Server/Workspace/DidChangeWatchedFilesTest.php b/tests/Server/Workspace/DidChangeWatchedFilesTest.php index 1f57acd..9aa7a35 100644 --- a/tests/Server/Workspace/DidChangeWatchedFilesTest.php +++ b/tests/Server/Workspace/DidChangeWatchedFilesTest.php @@ -1,42 +1,46 @@ on('message', function (Message $message) use ($fileEvent, &$isDiagnosticsCleared) { - if ($message->body->method === "textDocument/publishDiagnostics") { - $this->assertEquals($message->body->params->uri, $fileEvent->uri); - $this->assertEquals($message->body->params->diagnostics, []); - $isDiagnosticsCleared = true; - } + $isDiagnosticsCleared = false; + $deferred = new Deferred(); + $writer->addListener('message', function (MessageEvent $messageEvent) use ($deferred, $fileEvent, &$isDiagnosticsCleared) { + $message = $messageEvent->getMessage(); + if ($message->body->method === "textDocument/publishDiagnostics") { + $this->assertEquals($message->body->params->uri, $fileEvent->uri); + $this->assertEquals($message->body->params->diagnostics, []); + $deferred->resolve(true); + } + }); + + $workspace->didChangeWatchedFiles([$fileEvent]); + + $this->assertTrue(yield $deferred->promise(), "Deleting file should clear all diagnostics."); }); - - $workspace->didChangeWatchedFiles([$fileEvent]); - Loop\tick(true); - - $this->assertTrue($isDiagnosticsCleared, "Deleting file should clear all diagnostics."); } } diff --git a/tests/Server/Workspace/SymbolTest.php b/tests/Server/Workspace/SymbolTest.php index 74fc92e..5b2790b 100644 --- a/tests/Server/Workspace/SymbolTest.php +++ b/tests/Server/Workspace/SymbolTest.php @@ -1,8 +1,9 @@ workspace->symbol('')->wait(); - $referencesUri = pathToUri(realpath(__DIR__ . '/../../../fixtures/references.php')); + Loop::run(function () { + // Request symbols + $result = yield $this->workspace->symbol(''); + $referencesUri = pathToUri(realpath(__DIR__ . '/../../../fixtures/references.php')); - // @codingStandardsIgnoreStart - $this->assertEquals([ - new SymbolInformation('TestNamespace', SymbolKind::NAMESPACE, new Location($referencesUri, new Range(new Position(2, 0), new Position(2, 24))), ''), - // Namespaced - new SymbolInformation('TEST_CONST', SymbolKind::CONSTANT, $this->getDefinitionLocation('TestNamespace\\TEST_CONST'), 'TestNamespace'), - new SymbolInformation('TestClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\TestClass'), 'TestNamespace'), - new SymbolInformation('TEST_CLASS_CONST', SymbolKind::CONSTANT, $this->getDefinitionLocation('TestNamespace\\TestClass::TEST_CLASS_CONST'), 'TestNamespace\\TestClass'), - new SymbolInformation('staticTestProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('TestNamespace\\TestClass::staticTestProperty'), 'TestNamespace\\TestClass'), - new SymbolInformation('testProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('TestNamespace\\TestClass::testProperty'), 'TestNamespace\\TestClass'), - new SymbolInformation('staticTestMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestNamespace\\TestClass::staticTestMethod()'), 'TestNamespace\\TestClass'), - new SymbolInformation('testMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestNamespace\\TestClass::testMethod()'), 'TestNamespace\\TestClass'), - new SymbolInformation('TestTrait', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\TestTrait'), 'TestNamespace'), - new SymbolInformation('TestInterface', SymbolKind::INTERFACE, $this->getDefinitionLocation('TestNamespace\\TestInterface'), 'TestNamespace'), - new SymbolInformation('test_function', SymbolKind::FUNCTION, $this->getDefinitionLocation('TestNamespace\\test_function()'), 'TestNamespace'), - new SymbolInformation('ChildClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\ChildClass'), 'TestNamespace'), - new SymbolInformation('Example', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\Example'), 'TestNamespace'), - new SymbolInformation('__construct', SymbolKind::CONSTRUCTOR, $this->getDefinitionLocation('TestNamespace\\Example::__construct'), 'TestNamespace\\Example'), - new SymbolInformation('__destruct', SymbolKind::CONSTRUCTOR, $this->getDefinitionLocation('TestNamespace\\Example::__destruct'), 'TestNamespace\\Example'), - new SymbolInformation('TestNamespace\\InnerNamespace', SymbolKind::NAMESPACE, $this->getDefinitionLocation('TestNamespace\\InnerNamespace'), 'TestNamespace'), - new SymbolInformation('InnerClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\InnerNamespace\\InnerClass'), 'TestNamespace\\InnerNamespace'), - new SymbolInformation('whatever', SymbolKind::FUNCTION, $this->getDefinitionLocation('TestNamespace\\whatever()'), 'TestNamespace'), - // Global - new SymbolInformation('TEST_CONST', SymbolKind::CONSTANT, $this->getDefinitionLocation('TEST_CONST'), ''), - new SymbolInformation('TestClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestClass'), ''), - new SymbolInformation('TEST_CLASS_CONST', SymbolKind::CONSTANT, $this->getDefinitionLocation('TestClass::TEST_CLASS_CONST'), 'TestClass'), - new SymbolInformation('staticTestProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('TestClass::staticTestProperty'), 'TestClass'), - new SymbolInformation('testProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('TestClass::testProperty'), 'TestClass'), - new SymbolInformation('staticTestMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestClass::staticTestMethod()'), 'TestClass'), - new SymbolInformation('testMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestClass::testMethod()'), 'TestClass'), - new SymbolInformation('TestTrait', SymbolKind::CLASS_, $this->getDefinitionLocation('TestTrait'), ''), - new SymbolInformation('TestInterface', SymbolKind::INTERFACE, $this->getDefinitionLocation('TestInterface'), ''), - new SymbolInformation('test_function', SymbolKind::FUNCTION, $this->getDefinitionLocation('test_function()'), ''), - new SymbolInformation('ChildClass', SymbolKind::CLASS_, $this->getDefinitionLocation('ChildClass'), ''), - new SymbolInformation('TEST_DEFINE_CONSTANT', SymbolKind::CONSTANT, $this->getDefinitionLocation('TEST_DEFINE_CONSTANT'), ''), - new SymbolInformation('UnusedClass', SymbolKind::CLASS_, $this->getDefinitionLocation('UnusedClass'), ''), - new SymbolInformation('unusedProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('UnusedClass::unusedProperty'), 'UnusedClass'), - new SymbolInformation('unusedMethod', SymbolKind::METHOD, $this->getDefinitionLocation('UnusedClass::unusedMethod'), 'UnusedClass'), - new SymbolInformation('whatever', SymbolKind::FUNCTION, $this->getDefinitionLocation('whatever()'), ''), + // @codingStandardsIgnoreStart + $this->assertEquals([ + new SymbolInformation('TestNamespace', SymbolKind::NAMESPACE, new Location($referencesUri, new Range(new Position(2, 0), new Position(2, 24))), ''), + // Namespaced + new SymbolInformation('TEST_CONST', SymbolKind::CONSTANT, $this->getDefinitionLocation('TestNamespace\\TEST_CONST'), 'TestNamespace'), + new SymbolInformation('TestClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\TestClass'), 'TestNamespace'), + new SymbolInformation('TEST_CLASS_CONST', SymbolKind::CONSTANT, $this->getDefinitionLocation('TestNamespace\\TestClass::TEST_CLASS_CONST'), 'TestNamespace\\TestClass'), + new SymbolInformation('staticTestProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('TestNamespace\\TestClass::staticTestProperty'), 'TestNamespace\\TestClass'), + new SymbolInformation('testProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('TestNamespace\\TestClass::testProperty'), 'TestNamespace\\TestClass'), + new SymbolInformation('staticTestMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestNamespace\\TestClass::staticTestMethod()'), 'TestNamespace\\TestClass'), + new SymbolInformation('testMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestNamespace\\TestClass::testMethod()'), 'TestNamespace\\TestClass'), + new SymbolInformation('TestTrait', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\TestTrait'), 'TestNamespace'), + new SymbolInformation('TestInterface', SymbolKind::INTERFACE, $this->getDefinitionLocation('TestNamespace\\TestInterface'), 'TestNamespace'), + new SymbolInformation('test_function', SymbolKind::FUNCTION, $this->getDefinitionLocation('TestNamespace\\test_function()'), 'TestNamespace'), + new SymbolInformation('ChildClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\ChildClass'), 'TestNamespace'), + new SymbolInformation('Example', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\Example'), 'TestNamespace'), + new SymbolInformation('__construct', SymbolKind::CONSTRUCTOR, $this->getDefinitionLocation('TestNamespace\\Example::__construct'), 'TestNamespace\\Example'), + new SymbolInformation('__destruct', SymbolKind::CONSTRUCTOR, $this->getDefinitionLocation('TestNamespace\\Example::__destruct'), 'TestNamespace\\Example'), + new SymbolInformation('TestNamespace\\InnerNamespace', SymbolKind::NAMESPACE, $this->getDefinitionLocation('TestNamespace\\InnerNamespace'), 'TestNamespace'), + new SymbolInformation('InnerClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\InnerNamespace\\InnerClass'), 'TestNamespace\\InnerNamespace'), + new SymbolInformation('whatever', SymbolKind::FUNCTION, $this->getDefinitionLocation('TestNamespace\\whatever()'), 'TestNamespace'), + // Global + new SymbolInformation('TEST_CONST', SymbolKind::CONSTANT, $this->getDefinitionLocation('TEST_CONST'), ''), + new SymbolInformation('TestClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestClass'), ''), + new SymbolInformation('TEST_CLASS_CONST', SymbolKind::CONSTANT, $this->getDefinitionLocation('TestClass::TEST_CLASS_CONST'), 'TestClass'), + new SymbolInformation('staticTestProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('TestClass::staticTestProperty'), 'TestClass'), + new SymbolInformation('testProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('TestClass::testProperty'), 'TestClass'), + new SymbolInformation('staticTestMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestClass::staticTestMethod()'), 'TestClass'), + new SymbolInformation('testMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestClass::testMethod()'), 'TestClass'), + new SymbolInformation('TestTrait', SymbolKind::CLASS_, $this->getDefinitionLocation('TestTrait'), ''), + new SymbolInformation('TestInterface', SymbolKind::INTERFACE, $this->getDefinitionLocation('TestInterface'), ''), + new SymbolInformation('test_function', SymbolKind::FUNCTION, $this->getDefinitionLocation('test_function()'), ''), + new SymbolInformation('ChildClass', SymbolKind::CLASS_, $this->getDefinitionLocation('ChildClass'), ''), + new SymbolInformation('TEST_DEFINE_CONSTANT', SymbolKind::CONSTANT, $this->getDefinitionLocation('TEST_DEFINE_CONSTANT'), ''), + new SymbolInformation('UnusedClass', SymbolKind::CLASS_, $this->getDefinitionLocation('UnusedClass'), ''), + new SymbolInformation('unusedProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('UnusedClass::unusedProperty'), 'UnusedClass'), + new SymbolInformation('unusedMethod', SymbolKind::METHOD, $this->getDefinitionLocation('UnusedClass::unusedMethod'), 'UnusedClass'), + new SymbolInformation('whatever', SymbolKind::FUNCTION, $this->getDefinitionLocation('whatever()'), ''), - new SymbolInformation('SecondTestNamespace', SymbolKind::NAMESPACE, $this->getDefinitionLocation('SecondTestNamespace'), ''), - ], $result); - // @codingStandardsIgnoreEnd + new SymbolInformation('SecondTestNamespace', SymbolKind::NAMESPACE, $this->getDefinitionLocation('SecondTestNamespace'), ''), + ], $result); + // @codingStandardsIgnoreEnd + }); } public function testQueryFiltersResults() { - // Request symbols - $result = $this->workspace->symbol('testmethod')->wait(); - // @codingStandardsIgnoreStart - $this->assertEquals([ - new SymbolInformation('staticTestMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestNamespace\\TestClass::staticTestMethod()'), 'TestNamespace\\TestClass'), - new SymbolInformation('testMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestNamespace\\TestClass::testMethod()'), 'TestNamespace\\TestClass'), - new SymbolInformation('staticTestMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestClass::staticTestMethod()'), 'TestClass'), - new SymbolInformation('testMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestClass::testMethod()'), 'TestClass') - ], $result); - // @codingStandardsIgnoreEnd + Loop::run(function () { + // Request symbols + $result = yield $this->workspace->symbol('testmethod'); + // @codingStandardsIgnoreStart + $this->assertEquals([ + new SymbolInformation('staticTestMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestNamespace\\TestClass::staticTestMethod()'), 'TestNamespace\\TestClass'), + new SymbolInformation('testMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestNamespace\\TestClass::testMethod()'), 'TestNamespace\\TestClass'), + new SymbolInformation('staticTestMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestClass::staticTestMethod()'), 'TestClass'), + new SymbolInformation('testMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestClass::testMethod()'), 'TestClass') + ], $result); + // @codingStandardsIgnoreEnd + }); } } diff --git a/tests/Validation/cases/functionUse2.php b/tests/Validation/cases/functionUse2.php index 593e6ac..d06de2c 100644 --- a/tests/Validation/cases/functionUse2.php +++ b/tests/Validation/cases/functionUse2.php @@ -1,4 +1,4 @@