$files_to_check * @param array $files * * @return void */ public function testValidInclude(array $files, array $files_to_check) { foreach ($files as $filename => $contents) { $this->addFile($filename, $contents); $this->project_checker->registerAnalyzableFile($filename); } $this->project_checker->scanFiles(); foreach ($files_to_check as $filename) { $file_checker = new FileChecker($filename, $this->project_checker); $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) { foreach ($files as $filename => $contents) { $this->addFile($filename, $contents); $this->project_checker->registerAnalyzableFile($filename); } $this->project_checker->scanFiles(); $this->expectException('\Psalm\Exception\CodeException'); $this->expectExceptionMessageRegexp('/\b' . preg_quote($error_message, '/') . '\b/'); foreach ($files_to_check as $filename) { $file_checker = new FileChecker($filename, $this->project_checker); $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', ], ], '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', ], ], ]; } /** * @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', ], ]; } }