$files_to_check * @param array $files * * @return void */ public function testValidInclude(array $files, array $files_to_check) { $codebase = $this->project_checker->getCodebase(); foreach ($files as $file_path => $contents) { $this->addFile($file_path, $contents); $codebase->scanner->addFilesToShallowScan([$file_path => $file_path]); } foreach ($files_to_check as $file_path) { $codebase->addFilesToAnalyze([$file_path => $file_path]); } $codebase->scanFiles(); $config = $codebase->config; foreach ($files_to_check as $file_path) { $file_checker = new FileChecker($this->project_checker, $file_path, $config->shortenFileName($file_path)); $file_checker->analyze(); } } /** * @dataProvider providerTestInvalidIncludes * * @param array $files_to_check * @param array $files * @param mixed $error_message * * @return void */ public function testInvalidInclude(array $files, array $files_to_check, $error_message) { $codebase = $this->project_checker->getCodebase(); foreach ($files as $file_path => $contents) { $this->addFile($file_path, $contents); $codebase->scanner->addFilesToShallowScan([$file_path => $file_path]); } foreach ($files_to_check as $file_path) { $codebase->addFilesToAnalyze([$file_path => $file_path]); } $codebase->scanFiles(); $this->expectException('\Psalm\Exception\CodeException'); $this->expectExceptionMessageRegexp('/\b' . preg_quote($error_message, '/') . '\b/'); $config = $codebase->config; foreach ($files_to_check as $file_path) { $file_checker = new FileChecker($this->project_checker, $file_path, $config->shortenFileName($file_path)); $file_checker->analyze(); } } /** * @return array */ public function providerTestValidIncludes() { return [ 'basicRequire' => [ 'files' => [ getcwd() . DIRECTORY_SEPARATOR . 'file2.php' => 'fooFoo(); } }', getcwd() . DIRECTORY_SEPARATOR . 'file1.php' => ' [ getcwd() . DIRECTORY_SEPARATOR . 'file2.php', ], ], 'nestedRequire' => [ 'files' => [ getcwd() . DIRECTORY_SEPARATOR . 'file1.php' => ' ' 'fooFoo(); } }', ], 'files_to_check' => [ getcwd() . DIRECTORY_SEPARATOR . 'file3.php', ], ], 'requireNamespace' => [ 'files' => [ getcwd() . DIRECTORY_SEPARATOR . 'file1.php' => ' ' [ getcwd() . DIRECTORY_SEPARATOR . 'file2.php', ], ], 'requireFunction' => [ 'files' => [ getcwd() . DIRECTORY_SEPARATOR . 'file1.php' => ' ' [ getcwd() . DIRECTORY_SEPARATOR . 'file2.php', ], ], 'namespacedRequireFunction' => [ 'files' => [ getcwd() . DIRECTORY_SEPARATOR . 'file1.php' => ' ' [ getcwd() . DIRECTORY_SEPARATOR . 'file2.php', ], ], 'requireConstant' => [ 'files' => [ getcwd() . DIRECTORY_SEPARATOR . 'file1.php' => ' ' [ getcwd() . DIRECTORY_SEPARATOR . 'file2.php', ], ], 'requireNamespacedWithUse' => [ 'files' => [ getcwd() . DIRECTORY_SEPARATOR . 'file1.php' => ' ' [ getcwd() . DIRECTORY_SEPARATOR . 'file2.php', ], ], 'noInfiniteRequireLoop' => [ 'files' => [ getcwd() . DIRECTORY_SEPARATOR . 'file1.php' => 'fooFoo(); } } class C {} new D();', getcwd() . DIRECTORY_SEPARATOR . 'file2.php' => ' ' [ getcwd() . DIRECTORY_SEPARATOR . 'file1.php', getcwd() . DIRECTORY_SEPARATOR . 'file2.php', getcwd() . DIRECTORY_SEPARATOR . 'file3.php', ], ], 'analyzeAllClasses' => [ 'files' => [ getcwd() . DIRECTORY_SEPARATOR . 'file1.php' => 'fooFoo(); } } class C { public function barBar(): void { } }', getcwd() . DIRECTORY_SEPARATOR . 'file2.php' => 'barBar(); } }', ], 'files_to_check' => [ getcwd() . DIRECTORY_SEPARATOR . 'file1.php', getcwd() . DIRECTORY_SEPARATOR . 'file2.php', ], ], 'loopWithInterdependencies' => [ 'files' => [ getcwd() . DIRECTORY_SEPARATOR . 'file1.php' => ' ' [ getcwd() . DIRECTORY_SEPARATOR . 'file1.php', getcwd() . DIRECTORY_SEPARATOR . 'file2.php', ], ], 'variadicArgs' => [ 'files' => [ getcwd() . DIRECTORY_SEPARATOR . 'file1.php' => ' ' [ getcwd() . DIRECTORY_SEPARATOR . 'file1.php', ], ], 'returnNamespacedFunctionCallType' => [ 'files' => [ getcwd() . DIRECTORY_SEPARATOR . 'file1.php' => ' ' 'doThing(); } }', ], 'files_to_check' => [ getcwd() . DIRECTORY_SEPARATOR . 'file3.php', ], ], ]; } /** * @return array */ public function providerTestInvalidIncludes() { return [ 'undefinedMethodInRequire' => [ 'files' => [ getcwd() . DIRECTORY_SEPARATOR . 'file2.php' => 'fooFo(); } }', getcwd() . DIRECTORY_SEPARATOR . 'file1.php' => ' [ getcwd() . DIRECTORY_SEPARATOR . 'file2.php', ], 'error_message' => 'UndefinedMethod', ], ]; } }