83 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			83 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | ||
|  | declare(strict_types = 1); | ||
|  | 
 | ||
|  | namespace LanguageServer\Tests\Diagnostics; | ||
|  | 
 | ||
|  | use PHPUnit\Framework\TestCase; | ||
|  | use phpDocumentor\Reflection\DocBlockFactory; | ||
|  | use LanguageServer\{ | ||
|  |     DefinitionResolver, TreeAnalyzer | ||
|  | }; | ||
|  | use LanguageServer\Index\{Index}; | ||
|  | use LanguageServer\Protocol\{ | ||
|  |     Diagnostic, DiagnosticSeverity, Position, Range | ||
|  | }; | ||
|  | use function LanguageServer\pathToUri; | ||
|  | use Microsoft\PhpParser\Parser; | ||
|  | 
 | ||
|  | class InvalidThisUsageTest extends TestCase | ||
|  | { | ||
|  |     /** | ||
|  |      * Parse the given file and return diagnostics. | ||
|  |      * | ||
|  |      * @param string $path | ||
|  |      * @return Diagnostic[] | ||
|  |      */ | ||
|  |     private function collectDiagnostics(string $path): array | ||
|  |     { | ||
|  |         $uri = pathToUri($path); | ||
|  |         $parser = new Parser(); | ||
|  | 
 | ||
|  |         $docBlockFactory = DocBlockFactory::createInstance(); | ||
|  |         $index = new Index; | ||
|  |         $definitionResolver = new DefinitionResolver($index); | ||
|  |         $content = file_get_contents($path); | ||
|  | 
 | ||
|  |         $treeAnalyzer = new TreeAnalyzer($parser, $content, $docBlockFactory, $definitionResolver, $uri); | ||
|  |         return $treeAnalyzer->getDiagnostics(); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Assertions about a diagnostic. | ||
|  |      * | ||
|  |      * @param Diagnostic|null $diagnostic | ||
|  |      * @param int $message | ||
|  |      * @param string $severity | ||
|  |      * @param Range $range | ||
|  |      */ | ||
|  |     private function assertDiagnostic($diagnostic, $message, $severity, $range) | ||
|  |     { | ||
|  |         $this->assertInstanceOf(Diagnostic::class, $diagnostic); | ||
|  |         $this->assertEquals($message, $diagnostic->message); | ||
|  |         $this->assertEquals($severity, $diagnostic->severity); | ||
|  |         $this->assertEquals($range, $diagnostic->range); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testThisInStaticMethodProducesError() | ||
|  |     { | ||
|  |         $diagnostics = $this->collectDiagnostics( | ||
|  |             __DIR__ . '/../../fixtures/diagnostics/errors/this_in_static_method.php' | ||
|  |         ); | ||
|  | 
 | ||
|  |         $this->assertCount(1, $diagnostics); | ||
|  |         $this->assertDiagnostic( | ||
|  |             $diagnostics[0], | ||
|  |             '$this can not be used in static methods.', | ||
|  |             DiagnosticSeverity::ERROR, | ||
|  |             new Range( | ||
|  |                 new Position(6, 15), | ||
|  |                 new Position(6, 20) | ||
|  |             ) | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testThisInMethodProducesNoError() | ||
|  |     { | ||
|  |         $diagnostics = $this->collectDiagnostics( | ||
|  |             __DIR__ . '/../../fixtures/diagnostics/baselines/this_in_method.php' | ||
|  |         ); | ||
|  | 
 | ||
|  |         $this->assertCount(0, $diagnostics); | ||
|  |     } | ||
|  | } |