155 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			PHP
		
	
	
<?php
 | 
						|
declare(strict_types = 1);
 | 
						|
 | 
						|
namespace LanguageServer\Tests\Server\TextDocument;
 | 
						|
 | 
						|
use PHPUnit\Framework\TestCase;
 | 
						|
use LanguageServer\Tests\MockProtocolStream;
 | 
						|
use LanguageServer\{
 | 
						|
    Server, Client, LanguageClient, ClientHandler, PhpDocumentLoader, DefinitionResolver
 | 
						|
};
 | 
						|
use LanguageServer\Index\{Index, ProjectIndex, DependenciesIndex};
 | 
						|
use LanguageServer\ContentRetriever\FileSystemContentRetriever;
 | 
						|
use LanguageServer\Protocol\{TextDocumentItem, DiagnosticSeverity};
 | 
						|
use Sabre\Event\Promise;
 | 
						|
use JsonMapper;
 | 
						|
 | 
						|
class ParseErrorsTest extends TestCase
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @var Server\TextDocument
 | 
						|
     */
 | 
						|
    private $textDocument;
 | 
						|
 | 
						|
    private $args;
 | 
						|
 | 
						|
    public function setUp()
 | 
						|
    {
 | 
						|
        $client = new LanguageClient(new MockProtocolStream, new MockProtocolStream);
 | 
						|
        $client->textDocument = new class($this->args) extends Client\TextDocument {
 | 
						|
            private $args;
 | 
						|
            public function __construct(&$args)
 | 
						|
            {
 | 
						|
                parent::__construct(new ClientHandler(new MockProtocolStream, new MockProtocolStream), new JsonMapper);
 | 
						|
                $this->args = &$args;
 | 
						|
            }
 | 
						|
            public function publishDiagnostics(string $uri, array $diagnostics): Promise
 | 
						|
            {
 | 
						|
                $this->args = func_get_args();
 | 
						|
                return Promise\resolve(null);
 | 
						|
            }
 | 
						|
        };
 | 
						|
        $projectIndex = new ProjectIndex(new Index, new DependenciesIndex);
 | 
						|
        $definitionResolver = new DefinitionResolver($projectIndex);
 | 
						|
        $loader = new PhpDocumentLoader(new FileSystemContentRetriever, $projectIndex, $definitionResolver);
 | 
						|
        $this->textDocument = new Server\TextDocument($loader, $definitionResolver, $client, $projectIndex);
 | 
						|
    }
 | 
						|
 | 
						|
    private function openFile($file)
 | 
						|
    {
 | 
						|
        $textDocumentItem = new TextDocumentItem();
 | 
						|
        $textDocumentItem->uri = 'whatever';
 | 
						|
        $textDocumentItem->languageId = 'php';
 | 
						|
        $textDocumentItem->version = 1;
 | 
						|
        $textDocumentItem->text = file_get_contents($file);
 | 
						|
        $this->textDocument->didOpen($textDocumentItem);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testParseErrorsArePublishedAsDiagnostics()
 | 
						|
    {
 | 
						|
        $this->openFile(__DIR__ . '/../../../fixtures/invalid_file.php');
 | 
						|
        $this->assertEquals([
 | 
						|
            'whatever',
 | 
						|
            [[
 | 
						|
                'range' => [
 | 
						|
                    'start' => [
 | 
						|
                        'line' => 2,
 | 
						|
                        'character' => 9
 | 
						|
                    ],
 | 
						|
                    'end' => [
 | 
						|
                        'line' => 2,
 | 
						|
                        'character' => 9
 | 
						|
                    ]
 | 
						|
                ],
 | 
						|
                'severity' => DiagnosticSeverity::ERROR,
 | 
						|
                'code' => null,
 | 
						|
                'source' => 'php',
 | 
						|
                'message' => "'Name' expected."
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'range' => [
 | 
						|
                    'start' => [
 | 
						|
                        'line' => 2,
 | 
						|
                        'character' => 9
 | 
						|
                    ],
 | 
						|
                    'end' => [
 | 
						|
                        'line' => 2,
 | 
						|
                        'character' => 9
 | 
						|
                    ]
 | 
						|
                ],
 | 
						|
                'severity' => DiagnosticSeverity::ERROR,
 | 
						|
                'code' => null,
 | 
						|
                'source' => 'php',
 | 
						|
                'message' => "'{' expected."
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'range' => [
 | 
						|
                    'start' => [
 | 
						|
                        'line' => 2,
 | 
						|
                        'character' => 9
 | 
						|
                    ],
 | 
						|
                    'end' => [
 | 
						|
                        'line' => 2,
 | 
						|
                        'character' => 9
 | 
						|
                    ]
 | 
						|
                ],
 | 
						|
                'severity' => DiagnosticSeverity::ERROR,
 | 
						|
                'code' => null,
 | 
						|
                'source' => 'php',
 | 
						|
                'message' => "'}' expected."
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'range' => [
 | 
						|
                    'start' => [
 | 
						|
                        'line' => 2,
 | 
						|
                        'character' => 15
 | 
						|
                    ],
 | 
						|
                    'end' => [
 | 
						|
                        'line' => 2,
 | 
						|
                        'character' => 15
 | 
						|
                    ]
 | 
						|
                ],
 | 
						|
                'severity' => DiagnosticSeverity::ERROR,
 | 
						|
                'code' => null,
 | 
						|
                'source' => 'php',
 | 
						|
                'message' => "'Name' expected."
 | 
						|
            ]]
 | 
						|
        ], json_decode(json_encode($this->args), 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
 | 
						|
                    ],
 | 
						|
                    '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));
 | 
						|
    }
 | 
						|
}
 |