basename(str_replace('\\', '/', $c)), $classesToAnalyze)) . "\n"; $analysisResult = $analyzer->analyzeWithCircularDetection($classesToAnalyze); $graph = $analysisResult->getGraph(); $statistics = $analysisResult->getStatistics(); echo " ✅ Analysis completed successfully\n"; echo " 📊 Statistics:\n"; echo " â€ĸ Total nodes: {$statistics['node_count']}\n"; echo " â€ĸ Total edges: {$statistics['edge_count']}\n"; echo " â€ĸ Circular dependencies: {$statistics['circular_dependencies']}\n"; echo " â€ĸ Leaf nodes: {$statistics['leaf_nodes']}\n"; echo " â€ĸ Root nodes: {$statistics['root_nodes']}\n"; echo " â€ĸ Average complexity: {$statistics['average_complexity']}\n"; echo " â€ĸ Max dependencies: {$statistics['max_dependency_count']}\n\n"; echo " 📈 Type distribution:\n"; foreach ($statistics['type_distribution'] as $type => $count) { echo " â€ĸ {$type}: {$count}\n"; } echo "\n"; if ($analysisResult->hasCircularDependencies()) { echo " âš ī¸ Circular dependencies found:\n"; foreach ($analysisResult->getCircularDependencies() as $cycle) { echo " â€ĸ " . implode(' -> ', $cycle) . "\n"; } echo "\n"; } else { echo " ✅ No circular dependencies found\n\n"; } } catch (\Throwable $e) { echo " ❌ Error: {$e->getMessage()}\n\n"; } echo "2. Testing specific class analysis (DefaultContainer):\n"; try { $containerClass = 'App\\Framework\\DI\\DefaultContainer'; $analyzer = new DependencyAnalyzer($reflectionProvider); $analysisResult = $analyzer->analyzeWithCircularDetection([$containerClass]); $graph = $analysisResult->getGraph(); $node = $graph->getNode(ClassName::create($containerClass)); if ($node !== null) { echo " ✅ DefaultContainer analysis:\n"; echo " â€ĸ Type: {$node->getType()->value}\n"; echo " â€ĸ Dependencies: {$node->getDependencyCount()}\n"; echo " â€ĸ Dependents: {$node->getDependentCount()}\n"; echo " â€ĸ Complexity score: " . round($node->getComplexityScore(), 2) . "\n"; echo " â€ĸ Is leaf: " . ($node->isLeaf() ? 'Yes' : 'No') . "\n"; echo " â€ĸ Is root: " . ($node->isRoot() ? 'Yes' : 'No') . "\n\n"; if (! empty($node->getDependencies())) { echo " 📋 Dependencies:\n"; foreach ($node->getDependencies() as $edge) { echo " â€ĸ {$edge->getTarget()->getShortName()} ({$edge->getRelation()->value}, weight: {$edge->getWeight()})\n"; } echo "\n"; } // Test dependency depth $depth = $graph->getDependencyDepth($node->getClassName()); echo " 📏 Dependency depth: {$depth}\n\n"; } } catch (\Throwable $e) { echo " ❌ Error: {$e->getMessage()}\n\n"; } echo "3. Testing dependency recommendations:\n"; try { $analyzer = new DependencyAnalyzer($reflectionProvider); // Analyze a larger set of framework classes $frameworkClasses = [ 'App\\Framework\\DI\\DefaultContainer', 'App\\Framework\\Router\\ValueObjects\\RoutePath', 'App\\Framework\\Router\\ValueObjects\\RouteGroup', 'App\\Framework\\TypeCaster\\TypeCasterRegistry', 'App\\Framework\\Discovery\\UnifiedDiscoveryService', 'App\\Framework\\Core\\Application', 'App\\Framework\\Http\\Request', 'App\\Framework\\Database\\EntityManager', ]; $analysisResult = $analyzer->analyzeWithCircularDetection($frameworkClasses); $recommendations = $analyzer->getRecommendations($analysisResult->getGraph()); echo " 📝 Recommendations:\n"; if (isset($recommendations['high_complexity'])) { echo " đŸ”ē High Complexity Classes:\n"; foreach ($recommendations['high_complexity'] as $item) { echo " â€ĸ {$item['class']}: {$item['current']} (expected max: {$item['expected_max']})\n"; echo " {$item['suggestion']}\n"; } echo "\n"; } if (isset($recommendations['high_dependencies'])) { echo " 🔗 High Dependency Classes:\n"; foreach ($recommendations['high_dependencies'] as $item) { echo " â€ĸ {$item['class']}: {$item['dependency_count']} dependencies\n"; echo " {$item['suggestion']}\n"; } echo "\n"; } if (isset($recommendations['circular_dependencies'])) { echo " 🔄 Circular Dependencies:\n"; echo " â€ĸ Count: {$recommendations['circular_dependencies']['count']}\n"; echo " â€ĸ {$recommendations['circular_dependencies']['suggestion']}\n"; foreach ($recommendations['circular_dependencies']['cycles'] as $cycle) { echo " Cycle: " . implode(' -> ', $cycle) . "\n"; } echo "\n"; } if (isset($recommendations['potentially_unused'])) { echo " đŸ—‘ī¸ Potentially Unused Classes:\n"; foreach ($recommendations['potentially_unused'] as $item) { echo " â€ĸ {$item['class']}: {$item['suggestion']}\n"; } echo "\n"; } if (empty($recommendations)) { echo " ✅ No major issues found!\n\n"; } } catch (\Throwable $e) { echo " ❌ Error: {$e->getMessage()}\n\n"; } echo "4. Testing dependency path finding:\n"; try { $analyzer = new DependencyAnalyzer($reflectionProvider); $analysisResult = $analyzer->analyzeWithCircularDetection([ 'App\\Framework\\DI\\DefaultContainer', 'App\\Framework\\Reflection\\ReflectionProvider', 'App\\Framework\\Reflection\\CachedReflectionProvider', ]); $graph = $analysisResult->getGraph(); $fromClass = ClassName::create('App\\Framework\\DI\\DefaultContainer'); $toClass = ClassName::create('App\\Framework\\Reflection\\ReflectionProvider'); $path = $graph->getDependencyPath($fromClass, $toClass); if ($path !== null) { echo " ✅ Dependency path found:\n"; echo " 📍 From: {$fromClass->getShortName()}\n"; echo " 📍 To: {$toClass->getShortName()}\n"; echo " đŸ›¤ī¸ Path: " . implode(' -> ', array_map(fn ($class) => basename(str_replace('\\', '/', $class)), $path)) . "\n"; echo " 📏 Length: " . count($path) . "\n\n"; } else { echo " â„šī¸ No dependency path found between DefaultContainer and ReflectionProvider\n\n"; } } catch (\Throwable $e) { echo " ❌ Error: {$e->getMessage()}\n\n"; } echo "5. Testing graph statistics and analysis:\n"; try { $analyzer = new DependencyAnalyzer($reflectionProvider); // Test with more comprehensive class set $allClasses = [ 'App\\Framework\\DI\\DefaultContainer', 'App\\Framework\\Router\\ValueObjects\\RoutePath', 'App\\Framework\\Router\\ValueObjects\\RouteGroup', 'App\\Framework\\Router\\ValueObjects\\GroupRoute', 'App\\Framework\\TypeCaster\\TypeCasterRegistry', 'App\\Framework\\Core\\ValueObjects\\ClassName', 'App\\Framework\\Http\\Method', ]; $analysisResult = $analyzer->analyzeWithCircularDetection($allClasses); $graph = $analysisResult->getGraph(); echo " 📊 Detailed Graph Analysis:\n"; // Top complex nodes $topComplex = $graph->getHighestDependencyNodes(3); echo " đŸ”ē Most Complex Classes:\n"; foreach ($topComplex as $node) { echo " â€ĸ {$node->getClassName()->getShortName()}: complexity {$node->getComplexityScore()}\n"; } echo "\n"; // Most used nodes $mostUsed = $graph->getMostUsedNodes(3); echo " 🌟 Most Used Classes:\n"; foreach ($mostUsed as $node) { echo " â€ĸ {$node->getClassName()->getShortName()}: {$node->getDependentCount()} dependents\n"; } echo "\n"; // Leaf nodes $leafNodes = $graph->getLeafNodes(); echo " 🍃 Leaf Nodes (no dependencies):\n"; foreach (array_slice($leafNodes, 0, 5) as $node) { echo " â€ĸ {$node->getClassName()->getShortName()} ({$node->getType()->value})\n"; } echo "\n"; // Root nodes $rootNodes = $graph->getRootNodes(); echo " đŸŒŗ Root Nodes (no dependents):\n"; foreach (array_slice($rootNodes, 0, 5) as $node) { echo " â€ĸ {$node->getClassName()->getShortName()} ({$node->getType()->value})\n"; } echo "\n"; } catch (\Throwable $e) { echo " ❌ Error: {$e->getMessage()}\n\n"; } echo "=== Dependency Graph Analysis Test Completed ===\n";