/** * Analize all known classes and validate if all classes are available. */ public function test_known_classes() { $definitions = Autoloader::instance()->getDefinitions(); $files = []; foreach ($definitions as $definition) { $files[] = Framework::$autoloader->getFilename($definition); } $analyzer = new PhpAnalyzer(); foreach (array_unique($files) as $filename) { $analyzer->open($filename); } // Check all used definitions (implements, extends, new, catch, etc) $failed = false; foreach (array_keys($analyzer->usedDefinitions) as $definition) { if (in_array($definition, ['Throwable'])) { continue; } if ($this->tryGetInfo($analyzer, $definition) == false) { $failed = true; } } if ($failed == false) { $this->assertTrue(true, 'All ' . count($analyzer->usedDefinitions) . ' definitions are found'); } }
/** * Analyze the PHP file and check all used classes and functions again the known extension mapping. * * @param string $filename */ private function checkFile($filename) { $analyser = new PhpAnalyzer(); $analyser->open($filename); $definitions = array_merge(array_keys($analyser->usedDefinitions), array_keys($analyser->usedFunctions)); $extentions = []; foreach ($definitions as $definition) { $key = strtolower($definition); if (isset($this->definitionToExtension[$key])) { // function/class belongs to an extension? $extentions[$this->definitionToExtension[$key]] = true; if (function_exists($key) == false && class_exists($key) == false) { $this->missingExtensions[$this->definitionToExtension[$key]] = $key; } } } foreach (array_keys($extentions) as $extention) { $this->extensionUsedIn[$extention][] = $filename; } }