200 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			PHP
		
	
	
| <?php
 | |
| declare(strict_types = 1);
 | |
| 
 | |
| namespace LanguageServer\Tests\Server\TextDocument;
 | |
| 
 | |
| use PHPUnit\Framework\TestCase;
 | |
| use LanguageServer\Tests\MockProtocolStream;
 | |
| use LanguageServer\{
 | |
|     Server, LanguageClient, PhpDocumentLoader, DefinitionResolver
 | |
| };
 | |
| use LanguageServer\Index\{Index, ProjectIndex, DependenciesIndex};
 | |
| use LanguageServer\ContentRetriever\FileSystemContentRetriever;
 | |
| use LanguageServer\Protocol\{
 | |
|     TextDocumentIdentifier,
 | |
|     TextEdit,
 | |
|     Range,
 | |
|     Position,
 | |
|     SignatureHelp,
 | |
|     SignatureInformation,
 | |
|     ParameterInformation
 | |
| };
 | |
| use function LanguageServer\pathToUri;
 | |
| 
 | |
| class SignatureHelpTest extends TestCase
 | |
| {
 | |
|     /**
 | |
|      * @var Server\TextDocument
 | |
|      */
 | |
|     private $textDocument;
 | |
| 
 | |
|     /**
 | |
|      * @var PhpDocumentLoader
 | |
|      */
 | |
|     private $loader;
 | |
| 
 | |
|     public function setUp()
 | |
|     {
 | |
|         $client = new LanguageClient(new MockProtocolStream, new MockProtocolStream);
 | |
|         $index = new Index();
 | |
|         $projectIndex = new ProjectIndex($index, new DependenciesIndex);
 | |
|         $definitionResolver = new DefinitionResolver($projectIndex);
 | |
|         $contentRetriever = new FileSystemContentRetriever;
 | |
|         $this->loader = new PhpDocumentLoader($contentRetriever, $projectIndex, $definitionResolver);
 | |
|         $this->textDocument = new Server\TextDocument($this->loader, $definitionResolver, $client, $projectIndex);
 | |
|         $index->setComplete();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @dataProvider signatureHelpProvider
 | |
|      */
 | |
|     public function testSignatureHelp(Position $position, SignatureHelp $expectedSignature)
 | |
|     {
 | |
|         $callsUri = pathToUri(__DIR__ . '/../../../fixtures/signature_help/calls.php');
 | |
|         $this->loader->open($callsUri, file_get_contents($callsUri));
 | |
|         $signatureHelp = $this->textDocument->signatureHelp(
 | |
|             new TextDocumentIdentifier($callsUri),
 | |
|             $position
 | |
|         )->wait();
 | |
|         $this->assertEquals($expectedSignature, $signatureHelp);
 | |
|     }
 | |
| 
 | |
|     public function signatureHelpProvider(): array
 | |
|     {
 | |
|         return [
 | |
|             'member call' => [
 | |
|                 new Position(50, 9),
 | |
|                 new SignatureHelp(
 | |
|                     [
 | |
|                         new SignatureInformation(
 | |
|                             '(\\Foo\\SomethingElse $a, int|null $b = null)',
 | |
|                             [
 | |
|                                 new ParameterInformation('\\Foo\\SomethingElse $a', 'A param with a different doc type'),
 | |
|                                 new ParameterInformation('int|null $b = null', 'Param with default value'),
 | |
|                             ],
 | |
|                             'Function doc'
 | |
|                         )
 | |
|                     ],
 | |
|                     0,
 | |
|                     0
 | |
|                 ),
 | |
|             ],
 | |
|             'member call 2nd param active' => [
 | |
|                 new Position(51, 12),
 | |
|                 new SignatureHelp(
 | |
|                     [
 | |
|                         new SignatureInformation(
 | |
|                             '(\\Foo\\SomethingElse $a, int|null $b = null)',
 | |
|                             [
 | |
|                                 new ParameterInformation('\\Foo\\SomethingElse $a', 'A param with a different doc type'),
 | |
|                                 new ParameterInformation('int|null $b = null', 'Param with default value'),
 | |
|                             ],
 | |
|                             'Function doc'
 | |
|                         )
 | |
|                     ],
 | |
|                     0,
 | |
|                     1
 | |
|                 ),
 | |
|             ],
 | |
|             'member call 2nd param active and closing )' => [
 | |
|                 new Position(52, 11),
 | |
|                 new SignatureHelp(
 | |
|                     [
 | |
|                         new SignatureInformation(
 | |
|                             '(\\Foo\\SomethingElse $a, int|null $b = null)',
 | |
|                             [
 | |
|                                 new ParameterInformation('\\Foo\\SomethingElse $a', 'A param with a different doc type'),
 | |
|                                 new ParameterInformation('int|null $b = null', 'Param with default value'),
 | |
|                             ],
 | |
|                             'Function doc'
 | |
|                         )
 | |
|                     ],
 | |
|                     0,
 | |
|                     1
 | |
|                 ),
 | |
|             ],
 | |
|             'method with no params' => [
 | |
|                 new Position(53, 9),
 | |
|                 new SignatureHelp([new SignatureInformation('()', [], 'Method with no params', 0, 0)]),
 | |
|             ],
 | |
|             'constructor' => [
 | |
|                 new Position(48, 14),
 | |
|                 new SignatureHelp(
 | |
|                     [
 | |
|                         new SignatureInformation(
 | |
|                             '(string $first, int $second, \Foo\Test $third)',
 | |
|                             [
 | |
|                                 new ParameterInformation('string $first', 'First param'),
 | |
|                                 new ParameterInformation('int $second', 'Second param'),
 | |
|                                 new ParameterInformation('\Foo\Test $third', 'Third param with a longer description'),
 | |
|                             ],
 | |
|                             'Constructor comment goes here'
 | |
|                         )
 | |
|                     ],
 | |
|                     0,
 | |
|                     0
 | |
|                 ),
 | |
|             ],
 | |
|             'constructor argument expression list' => [
 | |
|                 new Position(49, 16),
 | |
|                 new SignatureHelp(
 | |
|                     [
 | |
|                         new SignatureInformation(
 | |
|                             '(string $first, int $second, \Foo\Test $third)',
 | |
|                             [
 | |
|                                 new ParameterInformation('string $first', 'First param'),
 | |
|                                 new ParameterInformation('int $second', 'Second param'),
 | |
|                                 new ParameterInformation('\Foo\Test $third', 'Third param with a longer description'),
 | |
|                             ],
 | |
|                             'Constructor comment goes here'
 | |
|                         )
 | |
|                     ],
 | |
|                     0,
 | |
|                     1
 | |
|                 ),
 | |
|             ],
 | |
|             'global function' => [
 | |
|                 new Position(57, 15),
 | |
|                 new SignatureHelp(
 | |
|                     [
 | |
|                         new SignatureInformation(
 | |
|                             '(int $i, bool $b = false, \Foo\Test|null ...$things = null)',
 | |
|                             [
 | |
|                                 new ParameterInformation('int $i', 'Global function param one'),
 | |
|                                 new ParameterInformation('bool $b = false', 'Default false param'),
 | |
|                                 new ParameterInformation('\Foo\Test|null ...$things = null', 'Test things'),
 | |
|                             ]
 | |
|                         ),
 | |
|                     ],
 | |
|                     0,
 | |
|                     2
 | |
|                 )
 | |
|             ],
 | |
|             'static method' => [
 | |
|                 new Position(60, 10),
 | |
|                 new SignatureHelp(
 | |
|                     [new SignatureInformation('(mixed $a)', [new ParameterInformation('mixed $a')])],
 | |
|                     0,
 | |
|                     0
 | |
|                 ),
 | |
|             ],
 | |
|             'no signature help' => [
 | |
|                 new Position(0, 0),
 | |
|                 new SignatureHelp([]),
 | |
|             ],
 | |
|             'construct from non fqn (not supported)' => [
 | |
|                 new Position(62, 9),
 | |
|                 new SignatureHelp([]),
 | |
|             ],
 | |
|             'construct from non fqn (not supported) argument expression' => [
 | |
|                 new Position(63, 11),
 | |
|                 new SignatureHelp([]),
 | |
|             ],
 | |
|             'invalid var' => [
 | |
|                 new Position(65, 13),
 | |
|                 new SignatureHelp([]),
 | |
|             ],
 | |
|         ];
 | |
|     }
 | |
| }
 |