fileSystem = new FileSystemService(); $this->extractor = new ClassExtractor($this->fileSystem); $this->tmpDir = '/var/www/html/tests/tmp'; if (! is_dir($this->tmpDir)) { mkdir($this->tmpDir, 0777, true); } $this->createTestFile = function (string $filename, string $content): File { $filepath = $this->tmpDir . '/' . $filename; file_put_contents($filepath, $content); $spl = new SplFileInfo($filepath); return File::fromSplFileInfo($spl); }; }); afterEach(function () { // Clean up test files if (is_dir($this->tmpDir)) { $files = glob($this->tmpDir . '/*'); foreach ($files as $file) { if (is_file($file)) { unlink($file); } } } }); describe('ClassExtractor', function () { it('extracts classes from PHP file', function () { $content = <<<'PHP' createTestFile)('TestClass.php', $content); $classes = $this->extractor->extractFromFile($file); expect($classes)->toHaveCount(1); expect($classes[0]->getFullyQualified())->toBe('App\Test\TestClass'); }); it('returns empty array for HTML template files without PHP tags', function () { $content = <<<'HTML'

Dashboard

Status

HTML; $file = ($this->createTestFile)('template.view.php', $content); $classes = $this->extractor->extractFromFile($file); expect($classes)->toHaveCount(0); }); it('extracts multiple classes from file', function () { $content = <<<'PHP' createTestFile)('Multiple.php', $content); $classes = $this->extractor->extractFromFile($file); expect($classes)->toHaveCount(4); }); it('handles files with short PHP tags', function () { $content = <<<'PHP' createTestFile)('ShortTag.php', $content); $classes = $this->extractor->extractFromFile($file); expect($classes)->toHaveCount(1); }); it('extracts detailed class information', function () { $content = <<<'PHP' createTestFile)('Detailed.php', $content); $detailed = $this->extractor->extractDetailedFromFile($file); expect($detailed)->toHaveCount(1); expect($detailed[0]['type'])->toBe('class'); expect($detailed[0]['name'])->toBe('DetailedClass'); expect($detailed[0]['namespace'])->toBe('App\Test'); expect($detailed[0]['fqn'])->toBe('App\Test\DetailedClass'); }); it('returns empty array for files with syntax errors', function () { $content = <<<'PHP' createTestFile)('Invalid.php', $content); $classes = $this->extractor->extractFromFile($file); expect($classes)->toHaveCount(0); }); it('analyzes complete file structure', function () { $content = <<<'PHP' createTestFile)('Analysis.php', $content); $analysis = $this->extractor->analyzeFile($file); expect($analysis)->toHaveKeys(['classes', 'functions', 'attributes', 'uses']); expect($analysis['classes'])->toHaveCount(1); expect($analysis['uses'])->toHaveCount(1); }); it('does not extract from pure HTML without PHP tags', function () { $content = <<<'HTML' Test

Title

HTML; $file = ($this->createTestFile)('pure.html', $content); $classes = $this->extractor->extractFromFile($file); expect($classes)->toHaveCount(0); }); });