config->throw_exception = true; // or false * ``` * * When `throw_exception` is set to `true`, code execution stops once * the first issue is emitted, thus it may mask any problems after * that point. * * When `throw_exception` is set to `false`, the code will continue * to be executed and we can uncover some additional bugs. * * This is trait allows testing for the second case, when the value of * "throw_exception" will be "false". * * @psalm-type DeprecatedDataProviderArrayNotation = array{ * code: string, * error_message: string, * ignored_issues?: list, * php_version?: string * } * @psalm-type NamedArgumentsDataProviderArrayNotation = array{ * code: string, * error_message: string, * error_levels?: list, * php_version?: string * } */ trait InvalidCodeAnalysisWithIssuesTestTrait { /** * @return iterable< * string, * DeprecatedDataProviderArrayNotation|NamedArgumentsDataProviderArrayNotation * > */ abstract public function providerInvalidCodeParse(): iterable; /** * @dataProvider providerInvalidCodeParse * @small * @param list $error_levels */ public function testInvalidCodeWithIssues( string $code, string $error_message, array $error_levels = [], string $php_version = '7.4' ): void { $test_name = $this->getTestName(); if (strpos($test_name, 'PHP80-') !== false) { if (version_compare(PHP_VERSION, '8.0.0', '<')) { $this->markTestSkipped('Test case requires PHP 8.0.'); } } elseif (strpos($test_name, 'SKIPPED-') !== false) { $this->markTestSkipped('Skipped due to a bug.'); } // sanity check - do we have a PHP tag? if (strpos($code, 'fail('Test case must have a setCustomErrorLevel($issue_name, $error_level); } $this->project_analyzer->setPhpVersion($php_version, 'tests'); $file_path = self::$src_dir_path . 'somefile.php'; $codebase = $this->project_analyzer->getCodebase(); $codebase->enterServerMode(); $codebase->config->visitPreloadedStubFiles($codebase); $codebase->config->throw_exception = false; $this->addFile($file_path, $code); $this->analyzeFile($file_path, new Context()); $this->assertHasIssue($error_message); } }