Files
michaelschiemer/tests/debug/test-dependency-simple.php
Michael Schiemer 5050c7d73a docs: consolidate documentation into organized structure
- Move 12 markdown files from root to docs/ subdirectories
- Organize documentation by category:
  • docs/troubleshooting/ (1 file)  - Technical troubleshooting guides
  • docs/deployment/      (4 files) - Deployment and security documentation
  • docs/guides/          (3 files) - Feature-specific guides
  • docs/planning/        (4 files) - Planning and improvement proposals

Root directory cleanup:
- Reduced from 16 to 4 markdown files in root
- Only essential project files remain:
  • CLAUDE.md (AI instructions)
  • README.md (Main project readme)
  • CLEANUP_PLAN.md (Current cleanup plan)
  • SRC_STRUCTURE_IMPROVEMENTS.md (Structure improvements)

This improves:
 Documentation discoverability
 Logical organization by purpose
 Clean root directory
 Better maintainability
2025-10-05 11:05:04 +02:00

214 lines
8.3 KiB
PHP

<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use App\Framework\Discovery\ValueObjects\DependencyNode;
use App\Framework\Discovery\ValueObjects\DependencyEdge;
use App\Framework\Discovery\ValueObjects\DependencyGraph;
use App\Framework\Discovery\ValueObjects\DependencyType;
use App\Framework\Discovery\ValueObjects\DependencyRelation;
use App\Framework\Core\ValueObjects\ClassName;
echo "=== Testing Dependency Graph Value Objects ===\n\n";
echo "1. Testing DependencyNode creation:\n";
try {
$className = ClassName::create('App\\Framework\\Router\\ValueObjects\\RoutePath');
$type = DependencyType::VALUE_OBJECT;
$node = DependencyNode::create($className, $type);
echo " ✅ Created dependency node:\n";
echo " • Class: {$node->getClassName()->toString()}\n";
echo " • Type: {$node->getType()->value}\n";
echo " • Complexity: {$node->getComplexityScore()}\n";
echo " • Is leaf: " . ($node->isLeaf() ? 'Yes' : 'No') . "\n";
echo " • Is root: " . ($node->isRoot() ? 'Yes' : 'No') . "\n\n";
} catch (\Throwable $e) {
echo " ❌ Error: {$e->getMessage()}\n\n";
}
echo "2. Testing DependencyEdge creation:\n";
try {
$source = ClassName::create('App\\Framework\\Router\\ValueObjects\\RouteGroup');
$target = ClassName::create('App\\Framework\\Router\\ValueObjects\\RoutePath');
$relation = DependencyRelation::CONSTRUCTOR_INJECTION;
$edge = DependencyEdge::create($source, $target, $relation, 10);
echo " ✅ Created dependency edge:\n";
echo " • Source: {$edge->getSource()->getShortName()}\n";
echo " • Target: {$edge->getTarget()->getShortName()}\n";
echo " • Relation: {$edge->getRelation()->value}\n";
echo " • Weight: {$edge->getWeight()}\n";
echo " • Is strong: " . ($edge->isStrong() ? 'Yes' : 'No') . "\n";
echo " • Description: {$edge->getRelation()->getDescription()}\n\n";
} catch (\Throwable $e) {
echo " ❌ Error: {$e->getMessage()}\n\n";
}
echo "3. Testing DependencyGraph operations:\n";
try {
$graph = DependencyGraph::empty();
// Create some nodes
$routePathNode = DependencyNode::create(
ClassName::create('App\\Framework\\Router\\ValueObjects\\RoutePath'),
DependencyType::VALUE_OBJECT
);
$routeGroupNode = DependencyNode::create(
ClassName::create('App\\Framework\\Router\\ValueObjects\\RouteGroup'),
DependencyType::VALUE_OBJECT
);
$placeholderNode = DependencyNode::create(
ClassName::create('App\\Framework\\Router\\ValueObjects\\Placeholder'),
DependencyType::VALUE_OBJECT
);
// Add nodes to graph
$graph = $graph->addNode($routePathNode);
$graph = $graph->addNode($routeGroupNode);
$graph = $graph->addNode($placeholderNode);
echo " ✅ Added nodes to graph:\n";
echo " • Node count: {$graph->getNodeCount()}\n";
echo " • Edge count: {$graph->getEdgeCount()}\n\n";
// Create dependencies
$edge1 = DependencyEdge::create(
ClassName::create('App\\Framework\\Router\\ValueObjects\\RouteGroup'),
ClassName::create('App\\Framework\\Router\\ValueObjects\\RoutePath'),
DependencyRelation::CONSTRUCTOR_INJECTION,
10
);
$edge2 = DependencyEdge::create(
ClassName::create('App\\Framework\\Router\\ValueObjects\\RoutePath'),
ClassName::create('App\\Framework\\Router\\ValueObjects\\Placeholder'),
DependencyRelation::METHOD_PARAMETER,
5
);
// Add edges
$graph = $graph->addEdge($edge1);
$graph = $graph->addEdge($edge2);
echo " ✅ Added edges to graph:\n";
echo " • Node count: {$graph->getNodeCount()}\n";
echo " • Edge count: {$graph->getEdgeCount()}\n\n";
// Test graph statistics
$statistics = $graph->getStatistics();
echo " 📊 Graph 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 " • Total complexity: {$statistics['total_complexity']}\n\n";
echo " 📈 Type distribution:\n";
foreach ($statistics['type_distribution'] as $type => $count) {
echo "{$type}: {$count}\n";
}
echo "\n";
// Test specific node retrieval
$retrievedNode = $graph->getNode(ClassName::create('App\\Framework\\Router\\ValueObjects\\RouteGroup'));
if ($retrievedNode !== null) {
echo " 🔍 Retrieved RouteGroup node:\n";
echo " • Dependencies: {$retrievedNode->getDependencyCount()}\n";
echo " • Dependents: {$retrievedNode->getDependentCount()}\n";
echo " • Complexity: {$retrievedNode->getComplexityScore()}\n\n";
}
} catch (\Throwable $e) {
echo " ❌ Error: {$e->getMessage()}\n\n";
}
echo "4. Testing dependency type detection:\n";
try {
$testCases = [
'App\\Framework\\DI\\DefaultContainer' => ['service', false, false, false, false],
'App\\Application\\Controllers\\UserController' => ['controller', false, false, false, false],
'App\\Domain\\User\\UserRepository' => ['repository', false, false, false, false],
'App\\Framework\\Core\\ValueObjects\\Email' => ['value_object', false, false, false, false],
'App\\Framework\\Http\\Middleware\\AuthMiddleware' => ['middleware', false, false, false, false],
'App\\Framework\\Events\\UserCreatedHandler' => ['event_handler', false, false, false, false],
'App\\Framework\\Exceptions\\ValidationException' => ['exception', false, false, false, false],
'SomeInterface' => ['interface', true, false, false, false],
'SomeAbstractClass' => ['abstract_class', false, true, false, false],
'SomeTrait' => ['trait', false, false, true, false],
'SomeEnum' => ['enum', false, false, false, true],
];
echo " 🧪 Testing type detection:\n";
foreach ($testCases as $className => [$expectedType, $isInterface, $isAbstract, $isTrait, $isEnum]) {
$detectedType = DependencyType::fromClassName($className, $isInterface, $isAbstract, $isTrait, $isEnum);
$match = $detectedType->value === $expectedType ? '✅' : '❌';
echo " {$match} {$className}: {$detectedType->value} (expected: {$expectedType})\n";
}
echo "\n";
} catch (\Throwable $e) {
echo " ❌ Error: {$e->getMessage()}\n\n";
}
echo "5. Testing circular dependency detection:\n";
try {
$graph = DependencyGraph::empty();
// Create a circular dependency: A -> B -> C -> A
$nodeA = DependencyNode::create(ClassName::create('ClassA'), DependencyType::SERVICE);
$nodeB = DependencyNode::create(ClassName::create('ClassB'), DependencyType::SERVICE);
$nodeC = DependencyNode::create(ClassName::create('ClassC'), DependencyType::SERVICE);
$graph = $graph->addNode($nodeA);
$graph = $graph->addNode($nodeB);
$graph = $graph->addNode($nodeC);
$edgeAB = DependencyEdge::create(
ClassName::create('ClassA'),
ClassName::create('ClassB'),
DependencyRelation::CONSTRUCTOR_INJECTION
);
$edgeBC = DependencyEdge::create(
ClassName::create('ClassB'),
ClassName::create('ClassC'),
DependencyRelation::CONSTRUCTOR_INJECTION
);
$edgeCA = DependencyEdge::create(
ClassName::create('ClassC'),
ClassName::create('ClassA'),
DependencyRelation::CONSTRUCTOR_INJECTION
);
$graph = $graph->addEdge($edgeAB);
$graph = $graph->addEdge($edgeBC);
$graph = $graph->addEdge($edgeCA);
$circularDependencies = $graph->findCircularDependencies();
echo " 🔄 Circular dependency test:\n";
echo " • Cycles found: " . count($circularDependencies) . "\n";
if (!empty($circularDependencies)) {
foreach ($circularDependencies as $cycle) {
echo " • Cycle: " . implode(' -> ', $cycle) . "\n";
}
}
echo "\n";
} catch (\Throwable $e) {
echo " ❌ Error: {$e->getMessage()}\n\n";
}
echo "=== Dependency Graph Value Objects Test Completed ===\n";