markTestSkipped('Cannot run test, base class "SoapClient" does not exist!'); return; } $this->addFile( 'somefile.php', ' $arguments * @param array $options default null * @param array $input_headers default null * @param array $output_headers default null * @return mixed */ public function __soapCall( $function_name, $arguments, $options = [], $input_headers = [], &$output_headers = [] ) { } }' ); $file_checker = new FileChecker('somefile.php', $this->project_checker); $file_checker->visitAndAnalyzeMethods(); $this->project_checker->checkClassReferences(); } /** * @expectedException \Psalm\Exception\CodeException * @expectedExceptionMessage MethodSignatureMismatch * * @return void */ public function testExtendDocblockParamTypeWithWrongParam() { if (class_exists('SoapClient') === false) { $this->markTestSkipped('Cannot run test, base class "SoapClient" does not exist!'); return; } $this->addFile( 'somefile.php', ' $options default null * @param array $input_headers default null * @param array $output_headers default null * @return mixed */ public function __soapCall( $function_name, string $arguments, $options = [], $input_headers = [], &$output_headers = [] ) { } }' ); $file_checker = new FileChecker('somefile.php', $this->project_checker); $file_checker->visitAndAnalyzeMethods(); $this->project_checker->checkClassReferences(); } /** * @return array */ public function providerFileCheckerValidCodeParse() { return [ 'privateArgs' => [ ' [ 'foo(null);', ], 'nullableSubclassParamWithDefault' => [ 'foo();', ], 'allowSubclassesForNonInheritedMethodParams' => [ 'bar(); }', ], 'allowNoReturnInSubclassWithNullableReturnType' => [ ' [ ' 'Method B::fooFoo has more arguments than parent method A::fooFoo', ], 'fewerArguments' => [ ' 'Method B::fooFoo has fewer arguments than parent method A::fooFoo', ], 'differentArguments' => [ ' 'Argument 1 of B::fooFoo has wrong type \'bool\', expecting \'int\' as defined ' . 'by A::fooFoo', ], 'nonNullableSubclassParam' => [ ' 'Argument 1 of B::foo has wrong type \'string\', expecting \'string|null\' as', ], 'mismatchingCovariantReturn' => [ ' 'MethodSignatureMismatch', ], 'mismatchingCovariantReturnWithSelf' => [ ' 'MethodSignatureMismatch', ], 'misplacedRequiredParam' => [ ' 'MisplacedRequiredParam', ], 'clasginByRef' => [ ' 'MethodSignatureMismatch', ], 'disallowSubclassesForNonInheritedMethodParams' => [ 'bar(); } }', 'error_message' => 'MoreSpecificImplementedParamType', ], ]; } }