create(ParserFactory::PREFER_PHP7); $config = new TestConfig(); $config->throw_exception = false; $config->stop_on_first_error = false; } public function setUp() { FileChecker::clearCache(); $this->project_checker = new \Psalm\Checker\ProjectChecker(); } public function testJsonOutputForReturnTypeError() { $file_contents = 'registerFile( 'somefile.php', $file_contents ); $file_checker = new FileChecker('somefile.php', $this->project_checker); $file_checker->visitAndAnalyzeMethods(); $issue_data = IssueBuffer::getIssueData()[0]; $this->assertSame('somefile.php', $issue_data['file_path']); $this->assertSame('error', $issue_data['type']); $this->assertSame("The given return type 'string' for fooFoo is incorrect, got 'int'", $issue_data['message']); $this->assertSame(2, $issue_data['line_number']); $this->assertSame( 'string', substr($file_contents, $issue_data['from'], $issue_data['to'] - $issue_data['from']) ); } public function testJsonOutputForUndefinedVar() { $file_contents = 'registerFile( 'somefile.php', $file_contents ); $file_checker = new FileChecker('somefile.php', $this->project_checker); $file_checker->visitAndAnalyzeMethods(); $issue_data = IssueBuffer::getIssueData()[0]; $this->assertSame('somefile.php', $issue_data['file_path']); $this->assertSame('error', $issue_data['type']); $this->assertSame('Cannot find referenced variable $b', $issue_data['message']); $this->assertSame(3, $issue_data['line_number']); $this->assertSame( '$b', substr($file_contents, $issue_data['from'], $issue_data['to'] - $issue_data['from']) ); } public function testJsonOutputForUnknownParamClass() { $file_contents = 'registerFile( 'somefile.php', $file_contents ); $file_checker = new FileChecker('somefile.php', $this->project_checker); $file_checker->visitAndAnalyzeMethods(); $issue_data = IssueBuffer::getIssueData()[0]; $this->assertSame('somefile.php', $issue_data['file_path']); $this->assertSame('error', $issue_data['type']); $this->assertSame('Class or interface Badger\\Bodger does not exist', $issue_data['message']); $this->assertSame(2, $issue_data['line_number']); $this->assertSame( 'Badger\\Bodger', substr($file_contents, $issue_data['from'], $issue_data['to'] - $issue_data['from']) ); } public function testJsonOutputForMissingReturnType() { $file_contents = 'registerFile( 'somefile.php', $file_contents ); $file_checker = new FileChecker('somefile.php', $this->project_checker); $file_checker->visitAndAnalyzeMethods(); $issue_data = IssueBuffer::getIssueData()[0]; $this->assertSame('somefile.php', $issue_data['file_path']); $this->assertSame('error', $issue_data['type']); $this->assertSame('Method fooFoo does not have a return type', $issue_data['message']); $this->assertSame(2, $issue_data['line_number']); $this->assertSame( 'function fooFoo() {', substr($file_contents, $issue_data['from'], $issue_data['to'] - $issue_data['from']) ); } public function testJsonOutputForWrongMultilineReturnType() { $file_contents = 'registerFile( 'somefile.php', $file_contents ); $file_checker = new FileChecker('somefile.php', $this->project_checker); $file_checker->visitAndAnalyzeMethods(); $issue_data = IssueBuffer::getIssueData()[0]; $this->assertSame('somefile.php', $issue_data['file_path']); $this->assertSame('error', $issue_data['type']); $this->assertSame('The given return type \'int\' for fooFoo is incorrect, got \'string\'', $issue_data['message']); $this->assertSame(3, $issue_data['line_number']); $this->assertSame( '@return int', substr($file_contents, $issue_data['from'], $issue_data['to'] - $issue_data['from']) ); } public function testJsonOutputForWrongSingleLineReturnType() { $file_contents = 'registerFile( 'somefile.php', $file_contents ); $file_checker = new FileChecker('somefile.php', $this->project_checker); $file_checker->visitAndAnalyzeMethods(); $issue_data = IssueBuffer::getIssueData()[0]; $this->assertSame('somefile.php', $issue_data['file_path']); $this->assertSame('error', $issue_data['type']); $this->assertSame('The given return type \'int\' for fooFoo is incorrect, got \'string\'', $issue_data['message']); $this->assertSame(2, $issue_data['line_number']); $this->assertSame( '@return int', substr($file_contents, $issue_data['from'], $issue_data['to'] - $issue_data['from']) ); } }